Su tarea, si elige aceptarla, es escribir un programa / función que acepte un entero N como entrada. El programa / función debería generar / devolver una lista de los primeros N números primos. Pero aquí está el truco: no puedes usar caracteres primos en tu código. Un carácter primo es un carácter cuyo punto de código Unicode es un número primo. En el rango ASCII imprimible, estos son:
%)+/5;=CGIOSYaegkmq
Pero la regla también se aplica a caracteres no ASCII si su código los usa.
- Una entrada válida es un número entero N donde 0 <N <= T , donde puede elegir T , pero tiene que ser mayor o igual que 10000. T no tiene que ser finito.
- Para entradas no válidas (no enteros, enteros fuera de rango), arroje una excepción o envíe / devuelva nada / nulo.
- Un número entero con espacios en blanco iniciales / finales como entrada se considera inválido.
- Un entero con un
+
carácter de signo como entrada se considera inválido. - Un entero con ceros a la izquierda como entrada se considera válido.
- Si su idioma le permite pasar un entero ya analizado como entrada, las reglas de análisis anteriores (excepto el rango uno) no se aplican, porque el int ya está analizado.
- La entrada siempre es base-10.
- No se permite el uso de generadores primarios integrados y probadores de primalidades (esto incluye funciones de factorización prima).
- La restricción de origen se impone a los caracteres Unicode, pero el conteo de bytes para la puntuación puede estar en otra codificación si lo desea.
- La salida puede contener una nueva línea final, pero esto no es obligatorio.
- Si genera / devuelve la lista de números primos como una cadena, entonces cada número primo debe estar delimitado por uno o varios caracteres que no sean dígitos. Puede elegir qué delimitador usar.
- Este es un desafío de código de golf , gana el código más corto en bytes.
Fragmento de pila para verificar tu código
Puede usar el siguiente fragmento de pila para verificar que su código no contenga caracteres principales:
var primes=[],max=10000;for(var i=2;i<=max;i++){primes.push(i);}for(var N=2;N<Math.sqrt(max);N++){if(primes.indexOf(N)===-1){continue;}primes=primes.filter(function (x){return x===N||x%N!==0;});}function setText(elem,text){var z=('innerText' in elem)? 'innerText' : 'textContent';elem[z]=text;}function verify(inputCode,resultSpan){var invalidChars=[];var success=true;for(var i=0;i<inputCode.length;i++){var cc = inputCode.charCodeAt(i);if (cc>max){setText(resultSpan,"Uh oh! The char code was bigger than the max. prime number calculated by the snippet.");success = false;break;}if (primes.indexOf(cc)!==-1){invalidChars.push(inputCode[i]);}}if (invalidChars.length===0&&success){setText(resultSpan, "Valid code!");}else if(success) { var uniqueInvalidChars = invalidChars.filter(function (x, i, self){return self.indexOf(x)===i;});setText(resultSpan, "Invalid code! Invalid chars: " + uniqueInvalidChars.join("")); }}document.getElementById("verifyBtn").onclick=function(e){e=e||window.event;e.preventDefault();var code=document.getElementById("codeTxt").value;verify(code,document.getElementById("result"));};
Enter your code snippet here:<br /><textarea id="codeTxt" rows="5" cols="70"></textarea><br /><button id="verifyBtn">Verify</button><br /><span id="result"></span>
code-golf
restricted-source
primes
ProgramFOX
fuente
fuente
;
esté prohibido ...+
, parece decepcionante que se requiera desecharlos manualmente.Respuestas:
CJam,
191830343319172120 bytesPruébalo en línea.
Este es probablemente uno de los algoritmos más terriblemente ineficientes que he implementado. ¡Pero lo hice por el tamaño!
Mi respuesta consiste en un bloque de código, que actúa como una función anónima en CJam. Ejecútelo con un número entero inmediatamente anterior a la pila, y la lista resultante se volcará en la pila. Trato el límite superior en la entrada como infinito, así que no tengo que verificar ese límite.
Mi algoritmo comienza elevando 3 a la
input
potencia th, lo que garantiza un número mayor que elinput
-th prime si la entrada es válida. Luego se genera una lista de los enteros de 2 a este número menos uno, que es una franja lo suficientemente grande como para contener todos los números primos que queremos. Para deshacernos de los números compuestos ... suspiro ... creamos una lista de cada producto por pares, que debería generar todos los números compuestos desde 4 hasta algún valor estúpidamente grande, lo suficientemente grande para nuestros propósitos. Entonces es solo cuestión de eliminar cada elemento de la lista original que está en esta lista compuesta, recortarlo a los primerosinput
elementos y unir los elementos con el carácter de nueva línea.El algoritmo debería funcionar para cualquier entrada. Sin embargo, si el intérprete / computadora tiene suficiente memoria o tiempo es otra cuestión, porque los requisitos de tiempo y espacio son exponenciales con respecto a la entrada. Entonces, si la entrada es mayor que aproximadamente 5 para el intérprete en línea o aproximadamente 8 para el intérprete fuera de línea, entonces la respuesta a esa pregunta es probablemente no.
fuente
S*
?S
un personaje principal?Java. 474 bytes
Toma entrada a través del argumento de función, salidas a través de una excepción lanzada.
Sangrado:
Caracteres escapados eliminados:
Explicación:
Mi solución original usó una
return
declaración. Después de hacer esta pregunta en StackOverflow, regettman tuvo la amabilidad de proporcionar una forma de salida / retorno sin usar letras primas.Como de costumbre, las sugerencias son bienvenidas :)
fuente
Rubí, 74
Explicación:
*o
Inicializa una matriz de salida vacía. hasta que tengan
elementos, encontramos el número más pequeño> = 2 que no divide ningún elemento actualmenteo
, luego lo agregamoso
. Para probar la división, yikes. Todos los buenos operadores no están permitidos, y ni siquiera puedo usarlosdivmod
. Lo mejor que pude ver fue usarx.div y
, que toma x dividido por y y redondea hacia abajo, luego multiplica eso por y nuevamente. Si es igual a x, no hubo redondeo, por lo que y divide x.1.>x.^
es una prueba de igualdad, que verifica si el resultado de xor es 0. El.
antes de cada operador es porque no se pueden mezclar.
llamadas de operador libres y llamadas de método sin paréntesis.Editar: las especificaciones de verificación de rango se agregaron después de publicar esto, creo. Para cumplir requiere 79 caracteres:
fuente
CJam,
383730 bytesPruébalo aquí
Creo que esto debería cumplir con todas las reglas y funciona para cualquier N no negativo (es decir, T es infinito). Sin embargo, es terriblemente ineficiente, así que no lo intentes con grandes cantidades.
Este es un bloque, lo más parecido a una función (sin nombre), que espera un número entero en la pila, imprime todos los números primos y deja la pila sin su entrada. Para todas las entradas no válidas, arrojará un error o no imprimirá nada.
La mayor parte del código es validación de entrada, seguido del tamiz de Eratóstenes. Solo necesitaba evitar la restricción de entrada en 3 lugares:
)
es incremento en CJam. Lo necesitaba una vez, pero podría reemplazarlo con~
(complemento bit a bit) porque estaba cuadrando los números después de todos modos.%
es modulo. Estoy usando en su37c~
lugar, lo que primero crea el personaje%
y luego evalúa eso. Esto hace que el código sea mucho más lento.;
hace estallar y descarta un elemento de la pila. Necesito hacer esto al final. En cambio, estoy usando lo'<(~
que empuja al personaje<
, lo disminuye y evalúa eso.fuente
Bash + coreutils, 227 bytes
Esto fue bastante complicado. Algunas cosas con las que me encontré:
while
yuntil
) no se pueden usar porque están más cerca de lodone
que es una palabra clave de shell y no pueden ser el resultado de una expansión variable (a menos queeval
se use, pero eso también está fuera). El único bucle utilizable esfor
/in
que permite{
/ en}
lugar dedo
/done
.for (( ; ; ))
Tampoco es utilizable.=
está fuera, por lo que necesitamos otra forma de asignar variables.printf -v
es bueno para estojot
genera la lista de factores potenciales en el bucle interno. Si un factor potencial divide un primo potencial, entonces no es primo y salimos tempranobreak
es un shell integrado y no una palabra clave, por lo que puede generarse como resultado de una expansión.dc
convierte un número base 13 en bytestreameak
./
o de%
shell. Entonces esto se subcontrata al operadordc
s~
, que empuja el cociente y el resto a la pila.-lt
- less-than - es el único operador de comparación de shell utilizable.echo
No sirve de nada para la salida.printf
funciona siempre y cuando evitemos%
Obtener la validación de entrada correcta es un poco difícil. Esto no devuelve nada en el caso de una entrada no válida.
Salida:
fuente
Haskell, 90 bytes
Esta es una función anónima que toma un entero
n
como entrada.Cómo funciona:
[p|p<-[2..],not$or[b>p-1&&b-1<p|b<-[u*v|u<-[2..p-1],v<-[2..p-1]]]]
(primer ejemplo de un número primos en la wiki de Haskell pero con laelem
función reemplazada) crea una lista infinita de números primos.zip
con los números de1
an
para hacer una lista de(prime, seq. number)
pares. Eliminar seq. número, de nuevo. El resultado es una lista de números primos de longitudn
.fuente
Óxido, 64897 bytes
(código cortado debido al límite de caracteres, solución completa aquí )
Las siguientes características de óxido no están disponibles debido a la restricción principal:
Lo que técnicamente puedes usar:
Simplemente no pude hacer nada de Turing completo con estas herramientas. Lo siento. Todo lo que quedaba era incluir los primeros 10000 primos completos, limpiados de 5. Al menos puedes cortarlo y tener una solución válida, en el sentido más estricto posible.
¡Me gustaría mucho que los expertos en el buceo en tarpit de Turing (o en Rust!) Me dijeran si podría haber hecho algo mejor!
fuente
GNU APL,
75 68 67 65 59 5655 caracteres⎕IO
debe ser1
.Regresé este mes más tarde dándome cuenta de que tenía un espacio extra.
fuente
Pyth - 12 bytes
Utiliza la función de factorización prima de pyth para ver si # es primo. Utiliza el
!tPT
truco que me sugirieron en mi respuesta para primos con menos de un millón de problemas.Dado que el filtro solo funciona para primos debajo de n y no primero n, solo busqué el inverso de pi (x) para 10,000 y obtuve 104,000, así que uso primos debajo de 10⁶ y obtengo el primer n. En realidad, esto no se ejecuta, por lo que debe probar reemplazando
^T6
con^T3
y restringir n por debajo de 1000. Entrada de stdin y salida a stdout.fuente