[Reto Batch] Generador de numeros primos

Iniciado por Stakewinner00, 11 Mayo 2012, 20:13 PM

0 Miembros y 1 Visitante están viendo este tema.

Stakewinner00

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



79137913

HOLA!!!

no es solucoin del reto pero es para que vean el codigo ;)

Código (DOS) [Seleccionar]
@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!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Stakewinner00

Cita de: 79137913 en 11 Mayo 2012, 20:41 PM
HOLA!!!

no es solucoin del reto pero es para que vean el codigo ;)

Código (DOS) [Seleccionar]
@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)

79137913

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!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

BatchianoISpyxolo

#4
He aquí el código...

Código (dos) [Seleccionar]
@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
)
Puede que desees aprender a programar desde 0: www.espascal.es

Binary_Death

#5
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

Stakewinner00

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.

Binary_Death

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

AgnesBlack

#8
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