Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Eleкtro en 5 Mayo 2012, 12:39 pm



Título: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: Eleкtro en 5 Mayo 2012, 12:39 pm
Aquí pueden comentar todo lo que quieran, sus dudas, avances o soluciones acerca del siguiente reto:

Reto iniciado por 79137913

Reto Nº 5

Nombre:            IsFibonacciNumber (79137913)
Dificultad:        7/10
Objetivo:         Crear un bat que pida un número o una serie de números, Y que compruebe si pertenecen a la secuencia de Fibbonacci
Ejemplo:  
                          Entrada 1 2 3 4 5 6 7 8 9 10 11 12 13
                          Salida: 1 1 1 0 1 0 0 1 0 0 0 0 1


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: -- KiLiaN -- en 5 Mayo 2012, 18:29 pm
Cuanto de larga tiene que ser la cadena? La salida que es binario o que? xD


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: Eleкtro en 5 Mayo 2012, 18:38 pm
Cuanto de larga tiene que ser la cadena? La salida que es binario o que? xD

La idea me la mandó "79137913" por mp, sin muchos más datos...

No se si entendiste esta parte :P, El bat tiene que comprobar un número (O una cadena de números) introducida por el usuario, osea que supongo que vale cualquier número que el user typee...

Lo del 1 y el 0 se entiende:
1 = TRUE
0 = FALSE





Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: -- KiLiaN -- en 5 Mayo 2012, 18:39 pm
Citar
Lo del 1 y el 0 se entiende:
1 = TRUE
0 = FALSE

Se entiende, ahora xD


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: Puntoinfinito en 5 Mayo 2012, 22:30 pm
La serie que debes poner ha de tener una capacidad máxima, o la entrada es infinita?


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: $Edu$ en 5 Mayo 2012, 22:41 pm
Jeje ta bueno este reto. Mientras que las variables en batch o las entradas sean sin limite, la serie tambien.

La idea es que ande para todos los tamaños de entradas que puedan. No soy el que dijo el reto, pero pensando como se haria, no hay problema en eso. Cuando un ejercicio te dicen hacer un programa para separar palabras de una frase, no creo que hagas un programa exactamente para cuando ingresan una frase de 10 de tamaño solamente, sino generico.


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: Eleкtro en 6 Mayo 2012, 07:15 am
Pfff, difícil...

Esto para mi es todo un reto en Batch :/

Sinceramente, No se me ocurre como calcular la operación xD


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: BatchianoISpyxolo en 6 Mayo 2012, 15:01 pm
A ver, el proceso teórico sería...

Teniendo en cuenta que la sucesión de Fibonacci se define recursivamente como:

Si n=0 v n=1, entonces f(n)=1

Si no, f(n)=f(n-1)+f(n-2)


Llamemos h a cada elemento de la secuencia U dada por el usuario. La secuencia puede tener uno o más elementos y debe ser finita.

Llamemos F al conjunto de Naturales de la sucesión de Fibonacci.

Entonces, teniendo en cuenta que la sucesión de Fibonacci es una lista de números en orden ascendente, podemos realizar un bucle para i=1 hasta k de tal manera que si f(i) = h, podemos afirmar que cierto h pertenece a la secuencia de Fibonnaci, por lo tanto, TRUE (1). Por otra parte si f(i) > h, podemos afirmar que, como LA SECUENCIA DE FIBONACCI ES CRECIENTE, cierto h no pertenece F, por tanto devolvemos FALSE (0)


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: raul338 en 6 Mayo 2012, 17:31 pm
che muchos retos batch de una :P

Reto iniciado por 79137913
Da la casualidad que el mismo inicio el mismo reto en la sección vb, por si alguien quiere ver :P
[RETO] IsFibonacciNumber(N as long) as Boolean (http://foro.elhacker.net/programacion_visual_basic/reto_isfibonaccinumbern_as_long-t319480.0.html)


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: BatchianoISpyxolo en 6 Mayo 2012, 17:54 pm
che muchos retos batch de una :P
Da la casualidad que el mismo inicio el mismo reto en la sección vb, por si alguien quiere ver :P
[RETO] IsFibonacciNumber(N as long) as Boolean (http://foro.elhacker.net/programacion_visual_basic/reto_isfibonaccinumbern_as_long-t319480.0.html)

Gracias por la info... En vbs supongo que se puede aplicar recursión a funciones por eso se ve lindo jaja... pero en Batch creo que no se puede. ¡Gracias que se pueden crear funciones :lol:

Saludos... A ver si algún día me apetece y me pongo con vbs XD


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: 79137913 en 9 Mayo 2012, 18:37 pm
HOLA!!!

Tardaron mucho en responder aqui esta mi solucion...

Analicen el codigo:

Código
  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. ECHO VERIFICADOR DE NUMEROS PRIMOS POR 79137913
  4. ECHO EJEMPLO:
  5. ECHO Entrada:1 2 3 4 5 6 7 8 9 10 11 12 13
  6. ECHO Salida: 1 1 1 0 1 0 0 1 0 0 0 0 1
  7. SET PROC=PROCESANDO
  8. SET /P N=INSERTE UNA CADENA DE NUMEROS A VERIFICAR SEPARADOS POR UN ESPACIO:
  9. :NEXTNUM
  10. IF "%FIN%"=="1" GOTO SHOWNUMS
  11. SET RN=
  12. :NEXTCHAR
  13. call set CHAR=%%N:~%NUM%,1%%%
  14. set /a NUM+=1
  15. IF "%CHAR%" EQU " " (GOTO EMPIEZA)
  16. IF "%CHAR%" EQU "" SET FIN=1
  17. IF "%CHAR%" EQU "" (GOTO EMPIEZA)
  18. SET RN=%RN%%CHAR%
  19. GOTO NEXTCHAR
  20. :EMPIEZA
  21. SET X=%RN%
  22. SET Y=%X%
  23. SET CT=0
  24. SET /A Y=(5*%X%*%X%)+4
  25. SET RETURN=POSITIVO
  26. GOTO CHECKROOT
  27. :POSITIVO
  28. IF "%EXACTO%"=="1" GOTO ISFIB
  29. SET RETURN=NEGATIVO
  30. SET /A Y=!Y!-8
  31. GOTO CHECKROOT
  32. :NEGATIVO
  33. IF "%EXACTO%"=="1" GOTO ISFIB
  34. SET OUTP=%OUTP% 0
  35. GOTO NEXTNUM
  36. :ISFIB
  37. SET OUTP=%OUTP% 1
  38. GOTO NEXTNUM
  39. :SHOWNUMS
  40. CLS
  41. ECHO %OUTP%
  42. :CHECKROOT
  43. CLS
  44. SET PROC=%PROC%.
  45. ECHO %PROC%
  46. SET /A DEND=!Y!
  47. SET EXACTO=0
  48. FOR /L %%I IN (%DEND%, -1, 1) DO (
  49.   SET /A SQR=%%I*%%I
  50.   IF !SQR!==% style="color: #448888;">DEND% (SET EXACTO=1)
  51. )
  52. GOTO %RETURN%

por las dudas pastebin
http://pastebin.com/vW61JYzi

GRACIAS POR LEER!!!


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: BatchianoISpyxolo en 14 Mayo 2012, 15:15 pm
Una instantánea del funcionamiento:

(http://img560.imageshack.us/img560/9582/fibor.png)

Y el código:

Código:
@echo off
setlocal enabledelayedexpansion
echo. Introduzca una secuencia de enteros (separados por espacios)
echo. para verificar si pertenencen a la sucesion de Fibonacci.
echo.
set /p seq=Secuencia:
set /a i=0
set "SALIDA="
:seq
if "!seq:~%i%,1!" NEQ "" (
if "!seq:~%i%,1!" NEQ " " (
set num=!num!!seq:~%i%,1!
) else (
call :NUMERO !num!
set "num="
)
set /a i+=1
goto seq
) else (
call :NUMERO !num!
)
echo Salida:  !SALIDA!
pause&exit/b

:NUMERO
set /a NUMERO=%1
set /a inc=0
:GS
call :SucesionFibonacci !inc!
if !NUMERO! GTR !f1! (set /a inc+=1 & goto GS)
if !NUMERO! EQU !f1! (
set SALIDA=!SALIDA! 1
) else (
set SALIDA=!SALIDA! 0
)

:SucesionFibonacci
set /a N=%1
set /a f0=0
set /a f1=1
for /l %%S in (1,1,!N!) do (
set /a f=!f0!+!f1!
set /a f0=!f1!
set /a f1=!f!
)


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: 79137913 en 14 Mayo 2012, 15:56 pm
HOLA!!!

Genial, ahora hace que devuelva la respuesta en una sola linea de ceros y unos y estas!

GRACIAS POR LEER!!!


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: BatchianoISpyxolo en 14 Mayo 2012, 16:28 pm
HOLA!!!

Genial, ahora hace que devuelva la respuesta en una sola linea de ceros y unos y estas!

GRACIAS POR LEER!!!

Ya concatené la salida -_- XD **CODE EDITADO**


Título: Re: [Reto Batch] IsFibonacciNumber (79137913)
Publicado por: Binary_Death en 22 Julio 2012, 03:00 am
Aquí está mi solución:

Código:
@Echo Off
setlocal enableextensions enabledelayedexpansion
set /p "seq=-Input  >> "
set "b_s=" & set /a bgr=0
for %%_ in (%seq%) do if %%_ GTR !bgr! set/a bgr=%%_
call:_fib %bgr%
for %%_ in (%seq%) do (
1>nul 2>&1, (echo:%f_s%|find "$%%_$") && (
set "b_s=!b_s! 1"
) || (
set "b_s=!b_s! 0"
)
)
echo:-Output ^>^>%b_s%
pause 1>nul & exit
:_fib
set "f_s=$1$"
set/a f_n=1,s_n=2
for /l %%_ in (1,1,%~1) do (
set/a n_n=!f_n!+!s_n!
set/a f_n=!s_n!,s_n=!n_n!
set "f_s=!f_s!$!n_n!$"
if !n_n! geq %~1 goto :eof
)
goto :eof

Creo poder hacer un método más rápido... pero no me lo permiten mis escasos conocimientos de matemáticas (¡que aunque se me den bien, todavía recién acabé 4º de ESO!).
Posteé en un foro una duda relacionada, si me la solucionan, podré hacer un algoritmo más eficiente. Mientras, queda esto  :xD