Creemos una cuadrícula N × N de espacios y guiones bajos que se puedan usar para determinar visualmente si un número es primo. (N puede ser cualquier número entero positivo).
Esta cuadrícula tiene tres reglas simples:
- La enésima columna contiene el patrón repetido de n - 1 guiones bajos seguido de un espacio. Este patrón comienza en la primera fila y se detiene, posiblemente a mitad del patrón, en la fila N. (Las filas y las columnas están indexadas en 1).
- La primera columna se reemplaza con todos los guiones bajos en lugar de todos los espacios.
- Si ocurre un espacio en algún lugar, el índice de la fila es igual al índice de la columna, se reemplaza con un guión bajo.
Ejemplo: N = 10
1
1234567890 <-- column indices
1__________
2__________
3__________
4_ ________
5__________
6_ _______
7__________
8_ _ ______
9__ _______
10_ __ _____
^ row indices
Los índices son solo por claridad. La cuadrícula simple (lo que debe generar su programa) es:
__________
__________
__________
_ ________
__________
_ _______
__________
_ _ ______
__ _______
_ __ _____
Darse cuenta de:
- La primera columna es todos los guiones bajos.
- La segunda columna va en subrayado, subrayado, etc., excepto el subrayado en la fila 2.
- La tercera columna va en subrayado, subrayado, subrayado, subrayado, subrayado, etc., excepto el subrayado en la fila 3.
- etc.
Observe también que, además de 1, solo las filas con números primos tienen guiones bajos en cada columna.
Como los guiones bajos abarcan todo el ancho de la fuente, cada fila numerada principal forma una línea continua continua. Por lo tanto, verificar si un número es primo o no es bastante fácil visualmente; solo verifique si su línea es sólida en todas las columnas. (De hecho, mirar hacia la raíz cuadrada del índice de fila es suficiente, pero generar esa cuadrícula parece menos elegante).
Programa
Escriba un programa que dibuje estas cuadrículas dado N a través de stdin (o la alternativa más cercana). La salida va a stdout (o la alternativa más cercana) y solo debe contener espacios, guiones bajos y nuevas líneas, con una nueva línea final opcional.
El código más corto gana.
n
línea th, haga que elk
carácter th sea un espacio sik
es un divisor dem
eso no es 1 om
.Respuestas:
CJam,
332827 bytesPruébalo en línea.
Cómo funciona
Ejecución de ejemplo
fuente
Ruby,
7773 caracteresAlgunos trucos que utilicé:
El
..
operador tiene casi la precedencia más baja de todos los operadores en Ruby, por lo que(1..n=gets.to_i)
simplemente funciona.En lugar de agregar una
a!=1
condición adicional al verificar para ver si el carácter debe ser un espacio en lugar de un guión bajo (dado que la primera fila es todos los guiones bajos), acabo de comenzar el rango2
y agregué un extra?_
.La línea A puede convertirse en la línea B:
porque tengo que tener un espacio extra entre
b
y?
en la línea A, pero eso no es necesario entre0
y?
en la línea B.b?
Es un método válido de Ruby, pero0?
no lo es.puts
automáticamente unirá matrices con nuevas líneas para usted, eliminando la necesidad de un extra*"\n"
.Salida para
n=100
:Ahora incluye Extra-Special ™ Mega-Colorful Red © Highlight-Magic ™ ® Extended Edition ©: (haga clic en la miniatura para ampliarla)
Rubí con color, 110 caracteres.
fuente
' '
. Probablemente estropea su resaltador de sintaxis, pero aún funciona correctamente. Además,a%b<1
*''
funcionará igual que join, y puede verificarlo ena<b
lugar de hacerlo,a!=b
ya que ningún factor de a es mayor que a. También podría haber ahorros al cortar en una cadena de dos caracteres con el resultado de algunas matemáticas en ayb en lugar de usar un ternario.J - 28 char
Explicado por explosión:
Cómo se ve:
fuente
Pitón 2,
7671No estoy seguro si puede conseguir nada más corto que esto ... Estas palabras clave:
range
,input
yprint
cuesta mucho.fuente
i>j>1and i%j<1
coni>j>1>i%j
i%j<1<j<i
:-P. Entonces, tal vez realmente no se acorte más.i%j<1
. Implicai>=j
.i>j
noi>=j
evitar espacios en blanco en la diagonal.APL (28)
Explicación:
⍳2⍴⎕
: lee un número N y crea una matriz de coordenadas N-por-N(
...)/¨
: para cada par de coordenadas, aplique la siguiente función:0=|⍨
: ymod
x = 0, y≠
: x no es igual a y, y1≠⊢
: x no lo es1
.1+
: Agregue1
a la matriz de bits resultante porque las matrices APL comienzan en 1.'_ '[
...]
: reemplace cada uno1
con un guión bajo y2
con un espacio.fuente
Perl,
6961Versión actualizada (¡gracias, Dennis !)
Versión original:
fuente
join
tampoco2..$n
necesitan paréntesis. 2. Con el-n
interruptor, puede usar en$_
lugar de$n
. 3._
es una palabra válida, por lo que no necesita comillas. 4. Puede usar en$"
lugar de" "
. 5. Puede usar en|
lugar de||
.-n
cosa porque quería mantenerlo como un programa autónomo y no tener que decirlo$^N=1
. El uso de_
como una palabra simple funcionó en el caso de,$i==_
pero no funcionó$i%_
porque el analizador pensó que%_
era un hash.#!/bin/perl -n
generalmente se cuenta como 1 byte), pero eso obviamente depende de usted. No tengo idea de lo que$^N=1
hace ... 2.$i==_
no funcionará correctamente; probará si$i == "_"
. Lo que quise decir es usar en_
lugar de"_"
, es decir,say _
y$i==$_?_:$"
._
="_"
ahora. Desafortunadamente, funciona en el último caso, pero me da un error al ladosay
porque parece pensar que es un controlador de archivo.CJam, 27 bytes
Pruébalo en línea.
Este enfoque logra el mismo número de bytes que mi otra respuesta, pero pensé que valía la pena publicarlo de todos modos. En lugar de marcar los múltiplos adecuados en cada fila, hace exactamente lo que dice la especificación.
Cómo funciona
Ejecución de ejemplo
fuente
C, 143
C obviamente no es la elección correcta del lenguaje para esto. Pero para completar, aquí hay una forma posible de hacerlo en C. Funciona para valores de n hasta 1048575. Lee n de la entrada estándar.
Sin embargo, es muy rápido.
El tiempo de ejecución para n = 1,000,000 (que produce una cuadrícula de 1,000,000,000,000 elementos) es de aproximadamente 55 minutos en mi sistema.
El tiempo de ejecución para n = 1000 (que produce una cuadrícula de 1,000,000 de elementos) es inferior a 1/100 de segundo.
fuente
int
, para que pueda usarchar x[1<<20];n,i,j;main...
. 3.for(scanf("%d",&n);i++<n;)
ahorra dos bytesscanf("%d",&n);for(;++i<=n;)
.