Resumen
Inspirado por la reciente popularidad de los desafíos de arte ASCII, el propósito de este desafío es dibujar un tablero ASCII, como uno en el que se pueda jugar Ajedrez.
Escriba un programa que tome un entero positivo n
como argumento, en stdin
o como entrada del usuario, y genere un tablero de ajedrez con n
x n
cuadrados, junto con un borde de 1 carácter de grosor.
Cada cuadrado debe tener 2x2 caracteres. Los cuadrados deben seguir el patrón alternativo normal blanco-negro (blanco primero, como en la esquina superior izquierda) de un tablero de ajedrez. Los cuadrados blancos deben estar hechos de caracteres de espacio ( ), y los cuadrados negros deben estar hechos de
#
caracteres de libra ( ).
El borde debe estar hecho de guiones ( -
) con un signo más ( +
) en el borde o punto perpendicular de un cuadrado.
Entrada
Entero positivo en la representación del número de cuadrados (dimensiones en cuadrados) para dibujar en el tablero de ajedrez, con cada cuadrado de 2x2 caracteres.
Resultados de ejemplo
n=2
+--+--+
| |##|
| |##|
+--+--+
|##| |
|##| |
+--+--+
n=3
+--+--+--+
| |##| |
| |##| |
+--+--+--+
|##| |##|
|##| |##|
+--+--+--+
| |##| |
| |##| |
+--+--+--+
n=4
+--+--+--+--+
| |##| |##|
| |##| |##|
+--+--+--+--+
|##| |##| |
|##| |##| |
+--+--+--+--+
| |##| |##|
| |##| |##|
+--+--+--+--+
|##| |##| |
|##| |##| |
+--+--+--+--+
... y así.
Notas
- Los espacios finales y las nuevas líneas son aceptables.
- Puede escribir un programa completo o una función.
- Sin espacios principales.
- Su programa debe mostrar resultados correctos para n = 15.
- Para idiomas esotéricos menos conocidos y similares, proporcione un enlace al idioma.
n=0
debe producir+
. (opcional, pero altamente recomendado y recomendado).- El código más corto en bytes gana, ya que este es el código golf.
+
paran=0
.Respuestas:
J, 24 bytes
Una función anónima:
Uso:
fuente
&.>
es uno más corto queeach
. Vale la pena señalar que funciona solo siBoxForm
está configurado enASCII
.Pitón 2, 79
Para cada fila, selecciona uno de los patrones
e imprime
3*n+1
personajes de ella. El patrón se elige repitiendo sus primeros 6 caracteres, seleccionados con el truco de entrelazado de cuerdas, que también sirve para extraer un fragmento de la longitud correcta.El patrón correcto se selecciona en función del valor del
i
módulo de índice de fila 6 mediante una expresión aritmética3**i%7/2%3
que proporciona el patrón repetitivo [0,1,1,0,2,2]. Lo encontré usando el hecho de quex**i%7
tiene punto6
, luego probé diferentes valoresx
y diferentes postprocesos para obtener el patrón correcto.fuente
Pyth, 37
Más bien pirateados juntos, pero cortos.
Demostración.
fuente
CJam,
4342 bytesPruébalo en línea .
Cada coordenada se asigna a un carácter, por ejemplo, la esquina superior izquierda es
(0, 0) -> "+"
. Específicamente, calculamose indexar en la cadena en
"#|-+ "
consecuencia.fuente
Retina , 106 bytes
Toma información como unaria (basada en esta meta discusión ).
Cada línea debe ir a su propio archivo y
n
debe cambiarse a nueva línea en los archivos. Esto no es práctico, pero puede ejecutar el código tal cual, como un archivo, con la-s
bandera, manteniendo losn
marcadores. Puede cambiar losn
's a nuevas líneas en la salida para facilitar la lectura si lo desea. P.ej:Más golf y alguna explicación viene más tarde.
fuente
JavaScript (ES6), 117
Retazo:
Función anónima. Inicia con una completa variedad de
+--+--+--...
líneas, y en las líneas apropiadas, sustituye a la+
por|
y-
parao
#
como sea apropiado.La expresión que decide el carácter de reemplazo,
"| |##| "[x%6+(i%6>2)*3]
probablemente podría desarrollarse aún más, pero descubrí que usar una cadena redundante más larga ahorra más caracteres que un cálculo complejo.fuente
CJam, 59 bytes
Esto es demasiado largo ..
Pruébalo en línea aquí
fuente
CoffeeScript con ES6, 106 bytes
JavaScript (ES6), 111 bytes
Las nuevas líneas son significativas y cuentan como 1 byte cada una.
El retorno explícito lo hizo un poco más largo:
Manifestación
Al momento de escribir, Firefox es el único navegador importante compatible con ES6.
fuente
Python 3,
114 108100Soluciones anteriores
108
114
118 (no presentado)
fuente
CJam, 46 bytes
Pruébalo en línea
Bueno, esperaba tener al menos una solución original (normalmente no busco otras respuestas antes de trabajar por mi cuenta). Resulta que @ Sp3000 ya había hecho algo muy similar, solo que mejor. Pero como ya hice el trabajo, pensé en publicarlo de todos modos.
Explicación:
fuente
HackVM , 158 bytes
Definitivamente no es un ganador, pero parecía un buen desafío en HVM.
Coloque el tamaño en la primera celda de memoria y use el siguiente código:
Nota: El código debe estar exactamente en una línea para funcionar.
Explicación:
El código llama a 2 funciones
PLUSHDASHLINE
yNORMALLINE
mantiene un estado global para las paridades (es decir, si se debe colocar a' '
o a'#'
en una celda).Explicación para
PLUSDASHLINE
:Explicación para
NORMALLINE
:Agradecería que alguien diera consejos para mejorarlo aún más :)
fuente
Pitón 2, 98
No es el camino más corto, sino un método divertido. La función
f
toma dos cadenasa,b
y un separadors
y entrelaza sus argumentos comosaasbbsaasbbsaas
. Las filas del tablero se crean de esta forma con sus respectivos caracteres, luego se entrelazan de esta manera para producir el resultado.fuente
n=0
. La mayoría de las soluciones (que serán aceptadas) producen "+". Esta solución produce "++ (nueva línea) ++", excluyendo las 2 nuevas líneas normales (que está permitido).Ruby: 83 caracteres
Ejecución de muestra:
fuente
Ruby, 87
Esta es una función anónima. Llámalo así (todas las posibilidades de 0 a 5)
Hace uso del
ljust
método en una cadena vacía. Ruby permite que se especifique una cadena de relleno para justificación, por lo que la usamosljust
con una de las tres posibles cadenas de rellenob,c,d
por matriza
, ordenadas comobccbdd
.fuente
Julia, 124 bytes
Esto crea una función sin nombre que acepta un número entero e imprime en stdout.
Ungolfed + explicación:
fuente
Javascript, ES6 149
Muy divertido de escribir aunque es un poco largo
Funciona en firefox
1 - Consola abierta
2 - Escriba lo siguiente
Salida (n = 15):
fuente
join('\n')
conjoin` `
, donde el espacio que escribí denota un nuevo carácter de línea real.Haskell, 99
Esto está parcialmente inspirado en la respuesta anterior de Haskell por catgocat ; Escribí mi propia versión, luego la miré y luego escribí otra. Estoy jugando con las mismas reglas: la entrada es un argumento, pero la salida es estándar. (Si pudiera ser una función pura, resta 7 caracteres
putStr$
).Solíamos
t
tomar una región de 3 n + 1 caracteres de un tablero de ajedrez infinito construido usandocycle
, y eso es todo. La idea principal que tomé de la otra respuesta es la de poner los patrones de las células tanto en la frontera y corrector juntos en las cadenas.Mi primera versión (140 caracteres) utilizó la estrategia de calcular el personaje en cada punto, lo que podría ser mejor para un problema más complejo que este.
fuente
cat <<EOF > sol1.hs
y contando condu -b sol1.hs
.wc
está de acuerdo, y verifiqué si hay caracteres no imprimibles. ¿Se ejecuta esta versión de 84 bytes ? Si es así, lo tomaré :)Haskell, 118
Esta es mi primera respuesta de golf de código haskell y aquí está:
Versión más legible:
Salida
fuente
f 1
debe producir 1 caja vacía,f 0
produce solo el signo más.C -
119101Utiliza ahora el cálculo similar a la respuesta @ Sp3000. También optimizaciones de pareja.
Creo que
?:
es una extensión de GCC ...Vieja respuesta:
Mantiene 2 coordenadas y honestamente calcula qué personaje imprimir para cada par. La lista de caracteres para imprimir se almacena en una matriz y esto solo imprime una cuadrícula "sin color". El primer elemento de la matriz se modifica para dibujar cuadrados negros.
Podría cambiar esto para que en lugar de dos coordenadas independientes sea un valor contando hacia arriba o (tal vez incluso mejor) hacia abajo, pero no puedo entenderlo ahora.
Bonificación: reemplazar 3 con cualquier otro número da como resultado un programa que dibuja cuadros de ajedrez válidos con diferentes tamaños de celda.
fuente
awk - 91
Fue una gran lucha para llegar por debajo de 100. Contando hacia atrás y usando el operador del partido fueron los avances;) El resto es una lógica bastante sencilla.
fuente
Pyke, 47 bytes, no competidor
Pruébalo aquí!
fuente