Validador de distribuição de Fibonacci

8

Relacionados: Olá, mundo !!! Distribuição de Fibonacci

Crie um programa que retorne True se uma determinada entrada atender às seguintes especificações e False caso contrário:

  • A contagem de caracteres numéricos (0 a 9) na entrada corresponde a um número de Fibonacci.
  • A contagem de caracteres não numéricos! (0-9) na entrada corresponde ao número de Fibonacci imediatamente anterior à contagem de caracteres numéricos.

Regras adicionais:

  • Seu programa deve usar a sequência de Fibonacci adequada, por OEIS - ou seja, a sequência de Fibonacci deve começar com 0, 1, 1, 2, ...
  • Se a contagem numérica ou não numérica for 1, o seguinte deverá ocorrer:
    • Numéricos 1: A contagem não numérica de 0 ou 1 deve ser tratada como Verdadeira - todas as outras Falso.
    • Não Numéricos 1: a contagem numérica de 1 ou 2 deve ser tratada como Verdadeira - todas as outras Falso.
  • A entrada pode ser obtida como você quiser, mas o programa deve ser capaz de lidar com qualquer texto arbitrário.
  • Verdadeiro / Falso não diferencia maiúsculas de minúsculas e pode ser substituído por 1/0 ou T / F.
  • Você pode codificar apenas até dois números de Fibonacci.
  • A saída pode ser apenas Verdadeiro / Falso ou 1/0 ou T / F. Qualquer texto adicional ou erros visíveis gerados são inaceitáveis.
Iszi
fonte
dê algum exemplo IO
Shubanker
@ Subhanker Veja alguns exemplos de casos reais na pergunta vinculada.
Iszi
Artigo relevante da wikipedia: en.wikipedia.org/wiki/…
Justin
T / F ou T / nil também são aceitáveis?
John Dvorak
2
Você mudou o desafio. Agora você diz que a sequência de fibonacci começa em 0 e fornece casos específicos para 0. A outra pergunta que você vinculou proíbe 0, então eu assumi o mesmo.
Justin

Respostas:

4

Golfscript, 36

:?1 2{.@+.?,<}do?,=@{.48<\58<^},,@=*

Explicação:

  • :?armazena a entrada em ?.
  • 1 2{.@+.?,<}docalcula os dois últimos números de fibonacci até atingir o comprimento de entrada. O bloco diz: "duplique o topo, gire o terceiro valor para o topo, adicione-os, duplique o topo, obtenha a entrada, obtenha seu comprimento, compare".
  • ?,= compara o último número de fibonacci calculado com o comprimento da entrada.
  • @ traz a entrada para o topo
  • {.48<\58<^},filtra apenas dígitos. O bloco lê "é o valor ASCII abaixo de 48 XOR abaixo de 58?"
  • ,@= compara o comprimento da string filtrada com o número mais baixo de fibonacci (contagem de dígitos)
  • * mescla as duas comparações para fornecer um único valor booleano.

Demonstração ao vivo: http://golfscript.apphb.com/?c=OyIvMDU5OiIKOj8xIDJ7LkArLj8sPH1kbz8sPUB7LjQ4PFw1ODxefSwsQD0q

John Dvorak
fonte
4

Javascript, 92 88 86 caracteres

t=prompt()
for(b=c=1;c<t[l='length'];c=a+b)a=b,b=c
alert(c==t[l]&b==t.match(/\d/g)[l])

Espero que você não se importe de ter codificado os três primeiros números de Fibonacci.

John Dvorak
fonte
Ele lida com várias linhas de texto?
Justin justin
O @Quincunx Chrome permite copiar / colar, mas não digitar novas linhas na entrada do prompt; não testei o firefox.
John Dvorak
Acho que aprendo algo novo todos os dias.
Justin
De acordo com o OEIS, os três primeiros números de Fibonacci são 0, 1, 1. De qualquer forma, você só precisa codificar os dois primeiros - por que você fez três?
Iszi
@ Iszi, você está certo - anão precisava de inicialização. Quanto a por que começo com 1,2,3 - o pôster do desafio inicial não foi aceito 1como imediatamente anterior 1.
John Dvorak
3

Python - 128 125

import re
def v(s):
 l=len(re.sub("\d","",s));L=len(s)-l;a,b=1,2
 while a<L:
    if a==l and b==L:
     print 1;return
    b,a=a+b,b
 print 0

Realmente espero que não haja problema em codificar os primeiros números de fibonacci

Justin
fonte
Não há ... muito espaço em branco?
John Dvorak
@JanDvorak esses quatro espaços eram todos guias, então eram contados como 1 caractere por quatro espaços. Eu poderia alternar abas e espaços, fazendo isso agora.
Justin Justin
Parece que eu deveria ter sido um pouco mais claro sobre a codificação dos números. É claro que você precisará preparar a sequência, mas precisará apenas dos dois primeiros para fazê-lo.
Iszi
2

Perl, 92

$_=join"",<>;@_=1;$d=s/\d//g;push@_,$t=$_[-1]+$_[-2]while$t<$d;print$t==$d&$_[-2]==y///c?1:0

Uso:

cat fib-test 
print "Hello world%s"%("!"*int(3.141592653589793238462643383279502884197169399375105820))

perl -e '$_=join"",<>;@_=1;$d=s/\d//g;push@_,$t=$_[-1]+$_[-2]while$t<$d;print$t==$d&$_[-2]==y///c?1:0' fib-test
1
Dom Hastings
fonte
2

Python 3

(105 caracteres)

O nome do arquivo de script é passado para o programa através da linha de comando

import sys
a=[0]*2
for b in open(sys.argv[1]).read():a['/'<b<':']+=1
a,b=a
while a>0:a,b=b-a,a
print(b==1)

(87 caracteres)

O script deve ser gravado em arquivo com o nome 's'

a=[0]*2
for b in open('s').read():a['/'<b<':']+=1
a,b=a
while a>0:a,b=b-a,a
print(b==1)
AMK
fonte
2

Java - 147 145

boolean v(String s){int l=s.replaceAll("\\d","").length(),L=s.length()-l,a=1,b=2,c;while(a<L){if(a==l&&b==L)return 0<1;c=b;b+=a;a=c;}return 0>1;}

Eu diria que isso não é ruim para Java.

Editar : Obrigado a Chris Hayes por sugerir 0>1 falso e 0<1verdadeiro.

Justin
fonte
4
Enquanto estivermos usando 1==0para economizar personagens, você pode usar 0<1no lugar de truee 0>1para false.
Chris Hayes
1

APL, 34 caracteres / bytes *

{n←+/⍵∘.=⍞∊⎕D⋄n≡+\∘⌽⍣{≥/+/⊃⍺n}⍵}⍳2

Espera a sequência de entrada na entrada padrão e imprime 0 ou 1, conforme necessário. ⎕IOdeve ser definido como 0 (o padrão depende da implementação).

Ungolfed

s←⍞                ⍝ read input string
d←s∊⎕D             ⍝ vector with 1 for each digit, 0 for each non-digit in s
n←+/0 1∘.=d        ⍝ 2-vector with number of non-digits and number of digits in s
f←+\∘⌽             ⍝ a function that computes a fibonacci step (f 2 3 → 3 5)
t←f⍣{≥/+/⊃⍺n}0 1   ⍝ apply f repeatedly, starting with 0 1, until we get two fibonacci
                   ⍝   terms whose sum is ≥ the length of the input string (sum of n)
n≡t                ⍝ return 1 if the fibonacci terms match the no. of digits and non-digits

Exemplos

      {n←+/⍵∘.=⍞∊⎕D⋄n≡+\∘⌽⍣{≥/+/⊃⍺n}⍵}⍳2
%~n01234
1
      {n←+/⍵∘.=⍞∊⎕D⋄n≡+\∘⌽⍣{≥/+/⊃⍺n}⍵}⍳2
x'48656C6C6F20776F726C642121'||'!'
1
      {n←+/⍵∘.=⍞∊⎕D⋄n≡+\∘⌽⍣{≥/+/⊃⍺n}⍵}⍳2
[72 101 108 108 111 32 119 111 114 108 100 33 {.}2*]''+
1
      {n←+/⍵∘.=⍞∊⎕D⋄n≡+\∘⌽⍣{≥/+/⊃⍺n}⍵}⍳2
What?12345
0

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL pode ser escrito na sua própria (legado) de conjunto de caracteres de byte único que mapeia símbolos APL para os 128 valores de bytes superiores. Portanto, para fins de pontuação, um programa de N caracteres que usa apenas caracteres ASCII e símbolos APL pode ser considerado como N bytes.

Tobia
fonte
0

Ruby, 85

d=-(n=(i=$<.read).gsub(/\d/,'').size)+i.size
a=b=1;while b<d;b=a+a=b end;p b==d&&a==n

Aceita entrada STDINcomo argumento de nome de arquivo.

A saída é "true"ou "false".

Darren Stone
fonte