Aquí pueden comentar todo lo que quieran, sus dudas, avances o soluciones acerca del siguiente reto:
Reto
Nombre: Generador de numeros primos
Dificultad: 2/10
Objetivo: Crear un bat que genere numeros primos lo mas rapido possible y numeros primos aleatorios lo mas rapido possible
Pista: No os compliqueis la vida
HOLA!!!
no es solucoin del reto pero es para que vean 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 1 0 0 0 1 0 1
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
:LOOP
SET /A Y=%Y%-1
IF !Y!==0 GOTO ISPRIME
SET /A CHECK= %X% %% Y
IF !CHECK!==0 (SET /A CT=%CT%+1)
IF !CT!==2 GOTO NOTPRIME
GOTO LOOP
:NOTPRIME
SET OUTP=%OUTP% 0
GOTO NEXTNUM
:ISPRIME
SET OUTP=%OUTP% 1
GOTO NEXTNUM
:SHOWNUMS
ECHO %OUTP%
PAUSE
GRACIAS POR LEER!!!
Cita de: 79137913 en 11 Mayo 2012, 20:41 PM
HOLA!!!
no es solucoin del reto pero es para que vean 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 1 0 0 0 1 0 1
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
:LOOP
SET /A Y=%Y%-1
IF !Y!==0 GOTO ISPRIME
SET /A CHECK= %X% %% Y
IF !CHECK!==0 (SET /A CT=%CT%+1)
IF !CT!==2 GOTO NOTPRIME
GOTO LOOP
:NOTPRIME
SET OUTP=%OUTP% 0
GOTO NEXTNUM
:ISPRIME
SET OUTP=%OUTP% 1
GOTO NEXTNUM
:SHOWNUMS
ECHO %OUTP%
PAUSE
GRACIAS POR LEER!!!
Me tira error (le falta un operador)
HOLA!!!
Es por que pusiste mal la entrada pone la entrada como corresponde como por ejemplo: "1 2 3 4 5 6 7 8 9 10 11 12 13" y va a andar
GRACIAS POR LEER!!!
He aquí el código...
@echo off
::Generar números primos aleatoriamente by batchiano :)
setlocal enabledelayedexpansion
:Secuencia
set /a HIGHLIMIT=100
for /l %%S in (2,1,!HIGHLIMIT!) do (
call :NumeroPrimo %%S
if "!PRIMO!"=="TRUE" (
echo Secuencia: %%S es PRIMO
)
)
pause&echo.
:Aleatorio
::La arbitrariedad de aparición de los primos no es equiprobable.
set /a key=%random:~0,2%
call :NumeroPrimo !key!
if "!PRIMO!"=="TRUE" (
echo Aleatorio: !key! es PRIMO
pause>nul
)
goto Aleatorio
:NumeroPrimo
set /a NUMERO=%1
set PRIMO=TRUE
set /a ICM=1
:EsPrimo
set /a ICM+=1
set /a MOD = %NUMERO% %% !ICM!
if !MOD! EQU 0 (
if !ICM! LSS !NUMERO! (
set PRIMO=FALSE
)
) else (
goto EsPrimo
)
Pues no es la mejor manera de hacerlo, pero yo había hecho una cosilla hace un tiempo que para este reto me irá como anillo al dedo :rolleyes:
@Echo Off
SetLocal EnableDelayedExpansion
Title Criba de Eratostenes
::Coded By Binary_Death
Set/P "Utl=Until >> "
:_Main
Set/A "ActN=1"
For /l %%z in (2,1,%Utl%) do (
Set "Lst=!Lst! %%z"
)
:_LoopA
For /f "Tokens=%ActN% Delims= " %%n in ("%Lst%") do (
Set/A "Qrd=%%n*%%n"
If !Qrd! GTR %Utl% GoTo:_EndA
For %%l in (%Lst%) Do (
Set/A "Rst=%%l%%%%n"
If %%l EQU %%n Set/A "Rst=1"
If !Rst! NEQ 0 Set "NLst=!NLst! %%l"
)
Set "Lst=!NLst!" & Set "NLst=" & Set/A "ActN+=1"
)
Goto:_LoopA
:_EndA
Echo.&Echo.%Lst%
Pause > NUL
Exit
Ale, espero que se me dé por válido.
PD: "Until >> " es hasta el número que vas a extraer los primos. Por ejemplo, si pones 100, obtendrás todos los primos del 1 al 100. Si pones 1000, pues lo dicho.
Tiene un límite, no puesto por mí, sino por la cmd y los métodos que usa el programa. Ese límite es "1851". Un número más grande rompe el programa :P
Cita de: Binary_Death en 22 Julio 2012, 00:46 AM
Pues no es la mejor manera de hacerlo, pero yo había hecho una cosilla hace un tiempo que para este reto me irá como anillo al dedo :rolleyes:
@Echo Off
SetLocal EnableDelayedExpansion
Title Criba de Eratostenes
::Coded By Binary_Death
Set/P "Utl=Until >> "
:_Main
Set/A "ActN=1"
For /l %%z in (2,1,%Utl%) do (
Set "Lst=!Lst! %%z"
)
:_LoopA
For /f "Tokens=%ActN% Delims= " %%n in ("%Lst%") do (
Set/A "Qrd=%%n*%%n"
If !Qrd! GTR %Utl% GoTo:_EndA
For %%l in (%Lst%) Do (
Set/A "Rst=%%l%%%%n"
If %%l EQU %%n Set/A "Rst=1"
If !Rst! NEQ 0 Set "NLst=!NLst! %%l"
)
Set "Lst=!NLst!" & Set "NLst=" & Set/A "ActN+=1"
)
Goto:_LoopA
:_EndA
Echo.&Echo.%Lst%
Pause > NUL
Exit
Ale, espero que se me dé por válido.
PD: "Until >> " es hasta el número que vas a extraer los primos. Por ejemplo, si pones 100, obtendrás todos los primos del 1 al 100. Si pones 1000, pues lo dicho.
Tiene un límite, no puesto por mí, sino por la cmd y los métodos que usa el programa. Ese límite es "1851". Un número más grande rompe el programa :P
Buen script genera los numeros de forma muy rapida, lastima que tenga ese tope.
Pero de todas formas lo considero valido.
PD:Pensaba que este tena ya se havia quedado olvidado jaja.
Se puede arreglar el límite, al fin y al cabo. Sería sólo partir la lista de números en trozos.
Eso se lo dejo a cada uno. Yo este script lo hice un día que no tenía la tabla a mano y necesitaba trabajar con ellos :xD
bueno aun poco se de bath pero lo hice en pascal y decidi dejarlo en pseucodigo para no ser sucio en mezclar lenguaje
bueno este es en pseucodigo
Iniciar x=2,cont=0,s=1
Ingresar CP(Cantidad de primos)
Iniciar m=0
Mientras cont<cp
hacer pd[m+1]=1
iniciar r=1
Mientras mod[x,[pd]]<>0
hacer r=r+1
preguntar si r>m
si es verdadero
mostrar x + mensaje"es primo"
hacer m=m+1
hacer pd[m]=x
hacer cont=cont+1
preguntar x=3
si es verdadero s=2
si es falso (queda vacio)
si es falso (queda vacio)
hacer x=x+s (aca vuelve al ciclo de arriba)
y una mejora que le hice y es mas eficiente corre mas rapido en pascal es el siguiente
iniciar x=2 , cont=0
ingresar lim (el limite de primos ah buscar)
iniciar m=0
mientras cont<lim
hacer pd[m+1]=1
iniciar r=1
mientras mod[x;pd[r]]<>0
hacer r=r+1
preguntar r>m
si es verdadero
muestro x y mensaje "es primo"
hacer m=m÷1
hacer pd[m]=x
si es falso queda vacio
hacer x=x+1
hacer cont =cont+1
y de aca vuelve al ciclo
bueno es lo que haria para generar el limite de numeros primos lo probe y en pascal bueno funciona hasta 32000 lo max hay que usar el longint para generar numeros mayores bueno saludos y disculpen por no pasarlo a bath