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
Cuanto de larga tiene que ser la cadena? La salida que es binario o que? xD
Cita de: -- KiLiaN -- en 5 Mayo 2012, 18:29 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
CitarLo del 1 y el 0 se entiende:
1 = TRUE
0 = FALSE
Se entiende, ahora xD
La serie que debes poner ha de tener una capacidad máxima, o la entrada es infinita?
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.
Cita de: puntoinfinito en 5 Mayo 2012, 22:44 PM
Pfff, difícil...
Esto para mi es todo un reto en Batch :/
Sinceramente, No se me ocurre como calcular la operación xD
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)
che muchos retos batch de una :P
Cita de: EleKtro H@cker en 5 Mayo 2012, 12:39 PM
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)
Cita de: raul338 en 6 Mayo 2012, 17:31 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
HOLA!!!
Tardaron mucho en responder aqui esta mi solucion...
Analicen el codigo:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO VERIFICADOR DE NUMEROS PRIMOS POR 79137913
ECHO EJEMPLO:
ECHO Entrada:1 2 3 4 5 6 7 8 9 10 11 12 13
ECHO Salida: 1 1 1 0 1 0 0 1 0 0 0 0 1
SET PROC=PROCESANDO
SET /P N=INSERTE UNA CADENA DE NUMEROS A VERIFICAR SEPARADOS POR UN ESPACIO:
:NEXTNUM
IF "%FIN%"=="1" GOTO SHOWNUMS
SET RN=
:NEXTCHAR
call set CHAR=%%N:~%NUM%,1%%%
set /a NUM+=1
IF "%CHAR%" EQU " " (GOTO EMPIEZA)
IF "%CHAR%" EQU "" SET FIN=1
IF "%CHAR%" EQU "" (GOTO EMPIEZA)
SET RN=%RN%%CHAR%
GOTO NEXTCHAR
:EMPIEZA
SET X=%RN%
SET Y=%X%
SET CT=0
SET /A Y=(5*%X%*%X%)+4
SET RETURN=POSITIVO
GOTO CHECKROOT
:POSITIVO
IF "%EXACTO%"=="1" GOTO ISFIB
SET RETURN=NEGATIVO
SET /A Y=!Y!-8
GOTO CHECKROOT
:NEGATIVO
IF "%EXACTO%"=="1" GOTO ISFIB
SET OUTP=%OUTP% 0
GOTO NEXTNUM
:ISFIB
SET OUTP=%OUTP% 1
GOTO NEXTNUM
:SHOWNUMS
CLS
ECHO %OUTP%
PAUSE
EXIT
:CHECKROOT
CLS
SET PROC=%PROC%.
ECHO %PROC%
SET /A DEND=!Y!
SET EXACTO=0
FOR /L %%I IN (%DEND%, -1, 1) DO (
SET /A SQR=%%I*%%I
IF !SQR!==%DEND% (SET EXACTO=1)
)
GOTO %RETURN%
por las dudas pastebin
http://pastebin.com/vW61JYzi
GRACIAS POR LEER!!!
Una instantánea del funcionamiento:
(http://img560.imageshack.us/img560/9582/fibor.png)
Y el 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!
)
HOLA!!!
Genial, ahora hace que devuelva la respuesta en una sola linea de ceros y unos y estas!
GRACIAS POR LEER!!!
Cita de: 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!!!
Ya concatené la salida -_- XD **CODE EDITADO**
Aquí está mi solución:
@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