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.

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


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.


¿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


¿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

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)

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.


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.


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".

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.