Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Stakewinner00 en 11 Mayo 2012, 20:13 pm



Título: [Reto Batch] Generador de numeros primos
Publicado por: Stakewinner00 en 11 Mayo 2012, 20:13 pm
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




Título: Re: [Reto Batch]
Publicado por: 79137913 en 11 Mayo 2012, 20:41 pm
HOLA!!!

no es solucoin del reto pero es para que vean 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 1 0 0 0 1 0 1
  7. SET /P N=INSERTE UNA CADENA DE NUMEROS A VERIFICAR SEPARADOS POR UN ESPACIO:
  8. :NEXTNUM
  9. IF "%FIN%"=="1" GOTO SHOWNUMS
  10. SET RN=
  11. :NEXTCHAR
  12. call set CHAR=%%N:~%NUM%,1%%%
  13. set /a NUM+=1
  14. IF "%CHAR%" EQU " " (GOTO EMPIEZA)
  15. IF "%CHAR%" EQU "" SET FIN=1
  16. IF "%CHAR%" EQU "" (GOTO EMPIEZA)
  17. SET RN=%RN%%CHAR%
  18. GOTO NEXTCHAR
  19. :EMPIEZA
  20. SET X=%RN%
  21. SET Y=%X%
  22. SET CT=0
  23. :LOOP
  24. SET /A Y=%Y%-1
  25. IF !Y!==0 GOTO ISPRIME
  26. SET /A CHECK= %X% %% Y
  27. IF !CHECK!==0 (SET /A CT=%CT%+1)
  28. IF !CT!==2 GOTO NOTPRIME
  29. GOTO LOOP
  30. :NOTPRIME
  31. SET OUTP=%OUTP% 0
  32. GOTO NEXTNUM
  33. :ISPRIME
  34. SET OUTP=%OUTP% 1
  35. GOTO NEXTNUM
  36. :SHOWNUMS
  37. ECHO %OUTP%

GRACIAS POR LEER!!!


Título: Re: [Reto Batch]
Publicado por: Stakewinner00 en 11 Mayo 2012, 20:43 pm
HOLA!!!

no es solucoin del reto pero es para que vean 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 1 0 0 0 1 0 1
  7. SET /P N=INSERTE UNA CADENA DE NUMEROS A VERIFICAR SEPARADOS POR UN ESPACIO:
  8. :NEXTNUM
  9. IF "%FIN%"=="1" GOTO SHOWNUMS
  10. SET RN=
  11. :NEXTCHAR
  12. call set CHAR=%%N:~%NUM%,1%%%
  13. set /a NUM+=1
  14. IF "%CHAR%" EQU " " (GOTO EMPIEZA)
  15. IF "%CHAR%" EQU "" SET FIN=1
  16. IF "%CHAR%" EQU "" (GOTO EMPIEZA)
  17. SET RN=%RN%%CHAR%
  18. GOTO NEXTCHAR
  19. :EMPIEZA
  20. SET X=%RN%
  21. SET Y=%X%
  22. SET CT=0
  23. :LOOP
  24. SET /A Y=%Y%-1
  25. IF !Y!==0 GOTO ISPRIME
  26. SET /A CHECK= %X% %% Y
  27. IF !CHECK!==0 (SET /A CT=%CT%+1)
  28. IF !CT!==2 GOTO NOTPRIME
  29. GOTO LOOP
  30. :NOTPRIME
  31. SET OUTP=%OUTP% 0
  32. GOTO NEXTNUM
  33. :ISPRIME
  34. SET OUTP=%OUTP% 1
  35. GOTO NEXTNUM
  36. :SHOWNUMS
  37. ECHO %OUTP%

GRACIAS POR LEER!!!

Me tira error (le falta un operador)


Título: Re: [Reto Batch]
Publicado por: 79137913 en 11 Mayo 2012, 22:58 pm
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!!!


Título: Re: [Reto Batch]
Publicado por: BatchianoISpyxolo en 14 Mayo 2012, 05:14 am
He aquí el código...

Código
  1. @echo off
  2. ::Generar números primos aleatoriamente by batchiano :)
  3. setlocal enabledelayedexpansion
  4.  
  5. :Secuencia
  6. set /a HIGHLIMIT=100
  7. for /l %%S in (2,1,!HIGHLIMIT!) do (
  8. call :NumeroPrimo %%S
  9. if "!PRIMO!"=="TRUE" (
  10. echo Secuencia: %%S es PRIMO
  11. )
  12. )
  13.  
  14. pause&echo.
  15.  
  16. :Aleatorio
  17. ::La arbitrariedad de aparición de los primos no es equiprobable.
  18. set /a key=%random:~0,2%
  19. call :NumeroPrimo !key!
  20. if "!PRIMO!"=="TRUE" (
  21. echo Aleatorio: !key! es PRIMO
  22. pause>nul
  23. )
  24. goto Aleatorio
  25.  
  26. :NumeroPrimo
  27. set /a NUMERO=%1
  28. set PRIMO=TRUE
  29. set /a ICM=1
  30. :EsPrimo
  31. set /a ICM+=1
  32. set /a MOD = %NUMERO% %% !ICM!
  33. if !MOD! EQU 0 (
  34. if !ICM! LSS !NUMERO! (
  35. set PRIMO=FALSE
  36. )
  37. ) else (
  38. goto EsPrimo
  39. )


Título: Re: [Reto Batch] Generador de numeros primos
Publicado por: 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:

Código:
@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


Título: Re: [Reto Batch] Generador de numeros primos
Publicado por: Stakewinner00 en 22 Julio 2012, 09:15 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:

Código:
@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.


Título: Re: [Reto Batch] Generador de numeros primos
Publicado por: Binary_Death en 22 Julio 2012, 16:08 pm
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


Título: Re: [Reto Batch] Generador de numeros primos
Publicado por: AgnesBlack en 23 Julio 2012, 02:51 am
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

Código:
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

Código:
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