Dado un número N , dibuje una tabla de números N x N alineada a la izquierda , dejando 1 en blanco (como un espacio) (mostraré diagramas con N = 5)
2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
Tu trabajo es construir el Tamiz de Eratóstenes, paso a paso. Primero, comience con 2. Es primo, así que déjelo allí y reemplace todos los demás números divisibles por 2 con el número adecuado de espacios.
2 3 5
7 9
11 13 15
17 19
21 23 25
A continuación, vaya al siguiente número sin imprimir ( 3
en este caso) y haga lo mismo.
2 3 5
7
11 13
17 19
23 25
Y así sucesivamente, hasta llegar a N .
Primero debe imprimir la cuadrícula completa, y cada vez que vaya a un nuevo número, imprima el tablero con los múltiplos eliminados. ¡Asegúrese de imprimir una línea en blanco en el medio!
Ejemplos
El texto entre paréntesis ()
es solo para referencia, no necesita imprimirlo
N = 2:
2 (complete grid)
3 4
2 (remove multiples of 2)
3
N = 3:
2 3 (complete grid)
4 5 6
7 8 9
2 3 (remove multiples of 2)
5
7 9
2 3 (remove multiples of 3)
5
7
Recuerde, este es el código de golf , por lo que gana el código con el menor número de bytes.
N=10
,100
no es primo, por lo que será eliminado en algún momento. ¿Deben completarse todos los números con 3 caracteres porque100
tiene 3 dígitos?Respuestas:
Jalea , 34 bytes
Pruébalo en línea!
Cómo funciona
fuente
Perl,
250243231202157 bytesPrueba el golf actual en línea! (asegúrese de correr como
perl -M5.010 main.pl
)Las dos nuevas líneas literales guardan cada una 1 byte en lugar de \ n.
Salida de muestra (entrada de 7):
Estoy seguro de que no lo jugué muy bien, así que cuando llegue a casa volveré a mirarlo para ver cuánto puedo afeitarme.
Edición 1: -7 bytes (cambiando "print sprintf" por el obvio "printf")
Edición 2: guarde 12 bytes usando $ d explícitamente en el lugar donde se llamó en lugar de crear una variable separada, combinando algunas declaraciones y eliminando una de mis condiciones para la
next
declaración dentro del primerforeach
ciclo agregando un espacio en otro lugar . Se desarrollaron 29 bytes adicionales al reelaborar dos bucles for en un solo bucle, eliminando dos declaraciones de variables y convirtiendo lasunless
declaraciones en declaraciones if-not. Declararmy$e=$n*$n;
luego reemplazar las tres instancias de $ n * $ n con $ e (lo que me permite colocar un par para uno de ellos) resultó en un rendimiento de ± 0 bytes, pero lo mantuve de todos modos.Edición 3: Gracias a @Dada, se desarrollaron otros 40 bytes (declaraciones variables, 'foreach' convirtiéndose en 'for', $ _ implícito en varias ubicaciones y reduciendo el tamaño de la declaración printf). Se eliminó 1 byte adicional convirtiéndolo
if!($c%$p||$c==$p||$p==1)
enif!($p~~[(1,$_)]||$_%$p)
. Desafortunadamente, el [] alrededor de la matriz es necesario, porque el operador smartmatch ~~ todavía es experimental y no parece funcionar correctamente en las matrices reales, pero sí funciona en referencias a ellas. Se eliminaron 4 bytes más al eliminar dos puntos y comas y un conjunto vacío de comillas después del últimosay
.fuente
my
). Use la-p
bandera para tenerN
adentro en$_
lugar de usar$n=<>
. Escriba enfor
lugar deforeach
(esta instrucción son equivalentes). Coloque el paréntesis alrededor de la condición deif
que está en la posición del modificador de la declaración (por ejemplo, enif!$c%$n
lugar deif(!$c%$n)
. No se necesita paréntesis para inicializar@a
:.@a=0..$e
Puede colocar lafor
variable y$_
se utilizará en su lugar. Escribaprintf"%*s",1+length$e,$a[$c]
(el documento `` sprintf '' para obtener detalles sobre eso)*
)$"
lugar de" "
.say""
en lugar deprint"\n"
(tiene una nueva línea literal en su código pero no puedo escribirla en el comentario) (agregará para agregar-M5.010
a la línea de comando, pero eso no cuenta en el recuento de bytes). Probablemente pueda usar0..$e=$n*$n
para guardar un byte en la inicialización de$e
. Eche un vistazo a los consejos de golf de Perl , contiene muchos consejos útiles. Pero es bueno ver a un nuevo golfista perl, ¡bienvenido! :) (y perdone mis errores ortográficos, es posible que haya escrito mi comentario anterior demasiado rápido)if!$c%$n
, el! El operador tiene precedencia sobre el operador%, por lo que técnicamente esto seríaif((!$c)%$n)
falso para cualquier cosa que no sea $ c = 0 (que no quiero). En cuanto a tus otros consejos, ¡veré qué puedo hacer! ¡Muchas gracias!!
, no estaba en mi computadora para verificarlo. Debería poder llegar a 160 caracteres, creo.PHP, 155 bytes
@Crypto -3 Bytes Gracias @Titus -6 Bytes Gracias
Intentalo
Primera vez que uso print en una condición de bucle posterior
Descompostura
Versión anterior 174 Bytes
fuente
!($d<2||$a[$d]>0)
=>$d>1&&$a[$d]<1
$l=strlen($m)+1
para$l=log10($m)+2
$i=$d*$x=$d>1
lugar de$i=$d<2?0:$d
y$x
para las otras dos ocurrencias de$d>1
$n*$n>=$i+=$d
lugar de($i+=$d)<=$m=$n**2
y$n*$n
para la otra ocurrencia de$m
Maravilloso,
201195191 BytesEste es un grupo absoluto ... La alineación izquierda asesinó mi cuenta de bytes. Pero bueno, funciona. Aquí está la salida para 4:
Sin golf:
fuente
Perl,
115114113112 bytesIncluye +1 para
-a
Ejecutar con el número de entrada en STDIN:
sieving.pl
:Necesita un perl lo suficientemente reciente para que eso
-a
implique-n
. Si su perl es demasiado viejo, agregue una-n
opción.Imprime una nueva línea final que está permitida.
fuente
Python 2,
199202201bytes+3 bytes (no me detenía antes)
-1 byte gracias a @Oliver (perdí un espacio)
repl.it
fuente
1
yfor
JavaScript (ES6),
190189 bytesImprime directamente a la consola.
Manifestación
Mostrar fragmento de código
fuente
Lote, 464 bytes.
Esto fue algo laborioso. Explicación: Comienza por cuadrar las líneas y se agrega una línea en blanco adicional al final de la cuadrícula. La etiqueta denota la subrutina de verificación de factores; f (x, y) agrega 1 a
n
para que pueda calcular el ancho de columna deseadoc
y la cantidad adecuada de rellenop
, utilizando el bucle:l
. El bucle externo de1
an
se ejecuta una vez para cada cuadrícula, llamando a la subrutina:i
. Primero se verifica el valor para ver si es 1 o primo; de lo contrario, se omite esa cuadrícula. El bucle interno de1
an*n
maneja las filas y columnas de la cuadrícula, llamando a la subrutina:j
. Cada valor se verifica para ver si es uno de los números primos encontrados hasta ahora, o si ninguno de los números primos encontrados hasta ahora lo divide. Si es así, el valor se concatena al búfer de salida, que luego se rellena al ancho de columna deseado. El búfer se imprime y borra todas las para cada número entero entre 2 y que divide , excluyéndose a sí mismo.n
:f
f
x
y
y
fuente
R,
195191185204 bytes¡Gracias a @Billywob por 6 bytes adicionales guardados!
Sangrado, con nuevas líneas:
Uso:
fuente
^
es el único que no está vectorizado al generar secuencias usando lo:
que significa que puede usar, por ejemplo,1:2^2
para obtener1 2 3 4
. En segundo lugar, si definea=b=1:n^2
, puede usarlo enfor(j in b)
lugar de definir otro vector para recorrer. Debería ahorrarte un par de bytes.J, 125 bytes
Esto es explícito, no tácito J, pero debería haber una forma de jugarlo tácitamente.
Uso
fuente
Mathematica, 133 bytes
fuente
PHP,
155150147145142140 bytesDescompostura
fuente
$a[$i]="";
en lugar deunset($a[$i]);
ahorrar 4 bytes$i%$k<1
en lugar de!($i%$k)
guardar un byte