Validador de distribución de Fibonacci

8

Relacionado: Hola mundo !!! Distribución de Fibonacci

Cree un programa que devuelva True si una entrada determinada cumple con las siguientes especificaciones, y False en caso contrario:

  • El recuento de caracteres numéricos (0-9) en la entrada coincide con un número de Fibonacci.
  • El recuento de caracteres no numéricos (0-9) en la entrada coincide con el número de Fibonacci que precede inmediatamente al recuento de caracteres numéricos.

Reglas Adicionales:

  • Su programa debe usar la secuencia de Fibonacci adecuada, según OEIS, es decir, la secuencia de Fibonacci debe comenzar con 0, 1, 1, 2, ...
  • Si el recuento numérico o no numérico es 1, debe ocurrir lo siguiente:
    • Numérico 1: el recuento no numérico de 0 o 1 debe manejarse como verdadero, todos los demás son falsos.
    • No numéricos 1: el recuento numérico de 1 o 2 debe manejarse como verdadero, todos los demás son falsos.
  • La entrada se puede tomar como desee, pero el programa debe ser capaz de manejar cualquier texto arbitrario.
  • Verdadero / Falso no distingue entre mayúsculas y minúsculas, y puede sustituirse con 1/0 o T / F.
  • Solo puede codificar hasta dos números de Fibonacci.
  • La salida solo puede ser Verdadero / Falso o 1/0 o T / F. Cualquier texto adicional o errores visibles generados es inaceptable.
Iszi
fuente
dar un ejemplo IO
Shubanker
@Subhanker Consulte la pregunta vinculada para ver algunos ejemplos de casos verdaderos.
Iszi
Artículo relevante de Wikipedia: en.wikipedia.org/wiki/…
Justin
¿T / F o T / nil también son aceptables?
John Dvorak
2
Ugh, cambiaste el desafío. Ahora dice que la secuencia de Fibonacci comienza en 0 y da casos específicos para 0. La otra pregunta que vinculó a prohíbe 0, por lo que supuse lo mismo.
Justin

Respuestas:

4

Golfscript, 36

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

Explicación:

  • :?almacena la entrada en ?.
  • 1 2{.@+.?,<}docalcula los dos últimos números de Fibonacci hasta que alcanza la longitud de entrada. El bloque dice: "duplique la parte superior, gire el tercer valor hacia la parte superior, agréguelos, duplique la parte superior, obtenga la entrada, obtenga su longitud, compare".
  • ?,= compara el último número de Fibonacci calculado con la longitud de entrada.
  • @ trae la entrada a la cima
  • {.48<\58<^},filtra solo dígitos. El bloque dice "¿es el valor ASCII por debajo de 48 XOR por debajo de 58?"
  • ,@= compara la longitud de la cuerda filtrada con el número de fibonacci inferior (recuento de dígitos)
  • * combina las dos comparaciones para proporcionar un único valor booleano.

Demostración en vivo: http://golfscript.apphb.com/?c=OyIvMDU5OiIKOj8xIDJ7LkArLj8sPH1kbz8sPUB7LjQ4PFw1ODxefSwsQD0q

John Dvorak
fuente
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 no te importe, he codificado los primeros tres números de Fibonacci.

John Dvorak
fuente
¿Maneja múltiples líneas de texto?
Justin
@Quincunx Chrome le permite copiar / pegar pero no escribir líneas nuevas en la entrada de solicitud; No he probado Firefox.
John Dvorak
Supongo que aprendo algo nuevo todos los días.
Justin
Según OEIS, los primeros tres números de Fibonacci son 0, 1, 1. En cualquier caso, solo debería codificar los dos primeros. ¿Por qué hizo tres?
Iszi
@Iszi tienes razón: ano necesitaba inicialización. En cuanto a por qué empiezo en 1,2,3, el póster del desafío inicial no aceptó 1como inmediatamente 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 no haya ningún problema con codificar los primeros números de Fibonacci

Justin
fuente
¿No hay ... demasiado espacio en blanco?
John Dvorak
@ JanDvorak esos cuatro espacios eran todas pestañas, por lo que se contaban como 1 carácter por cada cuatro espacios. Podría alternar pestañas y espacios, haciendo eso ahora.
Justin
Parece que debería haber sido un poco más claro sobre codificar los números. Por supuesto, necesitará cebar la secuencia, pero solo necesitará los dos primeros para hacerlo.
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
fuente
2

Python 3

(105 caracteres)

El nombre del archivo de script se pasa al programa a través de la línea 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)

El script debe escribirse en un archivo con el nombre '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
fuente
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;}

Yo diría que esto no es malo para Java.

Editar : Gracias a Chris Hayes por sugerir 0>1 falso y 0<1verdadero.

Justin
fuente
44
Mientras 1==0lo usemos para ahorrar en caracteres, puede usarlo 0<1en lugar de truey 0>1para false.
Chris Hayes
1

APL, 34 caracteres / bytes *

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

Espera la cadena de entrada en la entrada estándar e imprime 0 o 1 según sea necesario. ⎕IOdebe establecerse en 0 (el valor predeterminado depende de la implementación).

Sin golf

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

Ejemplos

      {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 puede escribirse en su propio juego de
caracteres de un solo byte (heredado) que asigna símbolos APL a los valores superiores de 128 bytes. Por lo tanto, para fines de puntuación, un programa de N caracteres que solo usa caracteres ASCII y símbolos APL puede considerarse que tiene N bytes de longitud.

Tobia
fuente
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

Toma la entrada en STDINo como argumento de nombre de archivo.

La salida es "true"o "false".

Piedra de Darren
fuente