Dibuja un tablero de damas ASCII

25

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 ncomo argumento, en stdino como entrada del usuario, y genere un tablero de ajedrez con nx ncuadrados, 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=0debe producir +. (opcional, pero altamente recomendado y recomendado).
  • El código más corto en bytes gana, ya que este es el código golf.
kdragon
fuente
2
¡Bienvenido a Programming Puzzles y Code Golf! Buen trabajo aquí, especialmente para tu primer desafío. Espero ver más de tus cosas.
Alex A.
Supongo que "Su programa debería mostrar resultados correctos para n = 15". significa "hasta n = 15"?
John Dvorak
"Su programa debería mostrar resultados correctos para n = 10". significa que si su programa no puede procesar correctamente hasta n = 15, no debe publicarse. Pero eso no significa que deba explotar / abusar de eso y escribir un programa que solo pueda llegar a n = 15.
kdragon
Voté las respuestas de trabajo probadas, incluso si no producen +para n=0.
kdragon
Lo siento, nunca acepté al ganador. Aceptando ahora.
kdragon

Respuestas:

16

J, 24 bytes

Una función anónima:

2 2&$&.>@(' #'{~2|+/~@i.)

Uso:

   f =: 2 2&$&.>@(' #'{~2|+/~@i.)
   f 4
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
Lynn
fuente
1
&.>es uno más corto que each. Vale la pena señalar que funciona solo si BoxFormestá configurado en ASCII.
randomra
10

Pitón 2, 79

N=3*input()+1
for i in range(N):print('+||- #- #+||-# -# '*N)[3**i%7/2%3:3*N:3]

Para cada fila, selecciona uno de los patrones

+--+--+--+--+--+
|  |##|  |##|  |
|##|  |##|  |##|

e imprime 3*n+1personajes 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 imódulo de índice de fila 6 mediante una expresión aritmética 3**i%7/2%3que proporciona el patrón repetitivo [0,1,1,0,2,2]. Lo encontré usando el hecho de que x**i%7tiene punto 6, luego probé diferentes valores xy diferentes postprocesos para obtener el patrón correcto.

xnor
fuente
9

Pyth, 37

VJh*3Qsm@?+\|*2@" #"+/N3/d3%N3"+--"dJ

Más bien pirateados juntos, pero cortos.

Demostración.

isaacg
fuente
9

CJam, 43 42 bytes

ri3*)_2m*{_3f%:!2b\3f/:+2%(e|"#|-+ "=}%/N*

Pruébalo en línea .

Cada coordenada se asigna a un carácter, por ejemplo, la esquina superior izquierda es (0, 0) -> "+". Específicamente, calculamos

[(y%3 == 0)*2 + (x%3 == 0)] or [(x//3 + y//3) % 2 - 1]

e indexar en la cadena en "#|-+ "consecuencia.

Sp3000
fuente
6

Retina , 106 bytes

1
$_0$_x
1(?=1*0)
+--
1(?=1*x)
s
(0s.*?0)s
$1o
(s\D*?)s
$1o
s
|  
o
|##
\D*?x
$0$0
0
+n
x
|n
(.*?n).*
$0$1

Toma información como unaria (basada en esta meta discusión ).

Cada línea debe ir a su propio archivo y ndebe 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 -sbandera, manteniendo los nmarcadores. Puede cambiar los n's a nuevas líneas en la salida para facilitar la lectura si lo desea. P.ej:

> echo -n 111|retina -s checkerboard|tr n '\n'
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+
|##|  |##|
|##|  |##|
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+

Más golf y alguna explicación viene más tarde.

randomra
fuente
4

JavaScript (ES6), 117

n=>Array(n*3+1).fill("+--".repeat(n)+"+").map((v,i)=>v.replace(/./g,(k,x)=>i%3?"|  |##|  "[x%6+(i%6>2)*3]:k)).join`
`

Retazo:

<input type="range" min=2 max=15 step=1 value=1 id="i" oninput="o.textContent=f(this.value)"><pre id="o"></pre><script>function f(n){ return Array.apply(0,Array(n*3+1)).map(function(){return "+--".repeat(n)+"+"}).map(function(v,i){ return v.replace(/./g,function(k,x) { return i%3?"|  |##|  "[x%6+(i%6>2)*3]:k}) }).join("\n") };o.textContent=f(2)</script>

Función anónima. Inicia con una completa variedad de +--+--+--...líneas, y en las líneas apropiadas, sustituye a la +por |y -para o #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.

apsillers
fuente
¡Buen uso de ES6! El efecto del control deslizante en el fragmento es una buena adición. ¿Podrías dar una explicación y una versión sin golf?
kdragon
3

CoffeeScript con ES6, 106 bytes

f=(n,y=z='+--'[r='repeat'](n)+'+\n')->y+=('|##|  '[r](n).substr(i%2*3,n*3)+'|\n')[r](2)+z for i in[1..n];y

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:

f=n=>{for(i=0,y=z='+--'[r='repeat'](n)+`+
`;i<n;)y+=('|##|  '[r](n).substr(++i%2*3,n*3)+`|
`)[r](2)+z;return y}

Manifestación

Al momento de escribir, Firefox es el único navegador importante compatible con ES6.

f=n=>{for(i=0,y=z='+--'[r='repeat'](n)+`+
`;i<n;)y+=('|##|  '[r](n).substr(++i%2*3,n*3)+`|
`)[r](2)+z;return y}

// Demonstration related things
document.getElementById('O').innerHTML = f(document.getElementById('n').value);

document.getElementById('n').addEventListener('change', function () {
  document.getElementById('O').innerHTML = f(this.value);
});
<p><input id=n type=number min=0 step=1 value=6></p>
<pre><output id=O></output></pre>

rink.attendant.6
fuente
3

Python 3, 114 108 100

def f(n):
 for i in range(3*n+1):print(("|##|  "*n+"|")[::i//3%2*2-1][:3*n+1]if i%3 else"+--"*n+"+")


Soluciones anteriores

108

def f(n):
 for i in range(3*n+1):
  a=("|##|  "*n+"|")[::i//3%2*2-1][:3*n+1];print(a if i%3 else"+--"*n+"+")

114

def f(n):a="+--"*n+"+\n";b="|  |##"*n+"|";print(a+a.join(([(b[:3*n+1]+"\n")*2,(b[::-1][:3*n+1]+"\n")*2]*n)[:n])+a)

118 (no presentado)

def f(n):
 for i in range(3*n+1):print((("|##|  "*n)[:3*n+1]if i//3%2 else("|  |##"*n)[:3*n+1])if i%3 else"+--"*n+"+")
monopolo
fuente
3

CJam, 46 bytes

li3*)_2m*[{_3f/2f%:=\3f%:g+2b"+-|#+-| "=}/]/N*

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:

li    Get input n.
3*)   Calculate 3*n+1, which is the total width/height.
_     Copy size. We'll need it at the end to insert the newlines.
2m*   Calculate cartesian power with 2. This enumerates all coordinate pairs.
[     Wrap characters in array for split operation at the end.
  {     Loop over all coordinate pairs.
    _     Copy coordinate pair.
    3f/   Divide coordinates by 3.
    2f%   Modulo 2. This characterizes even/odd squares.
    :=    Compare the two coordinates. This gives 0/1 for white/black squares.
    \3f%  Grab second copy of coordinates, and calculate modulo 3.
    :g    Sign. This gives 0 for grid lines, 1 for interior of squares.
    +     Concatenate the two results. We now have a 3 bit code.
    2b    Convert the 3 bits to a number in range 0..7.
    "+-|#+-| "
          Lookup table to convert 0..7 number to character.
    =     Lookup character.
  }/    End loop over coordinate pairs.
]     End wrapping characters.
/     Split character array into lines.
N*    And join them with newlines.
Reto Koradi
fuente
2

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:

77*1+c0<0^84*1+?1-11<-1>99*85++0^cc77*1+c066*5+-g!0<0^45*2+?1-95*0^0^2-PPP064*-6-gd95*2-P25*P$1<2>555**1-P0<0^76*6-?1-12<-2>2<3*48*+0^PP555**1-P076*2+-gd25*P$

Nota: El código debe estar exactamente en una línea para funcionar.

Explicación:

Call PLUSHDASHLINE
77*2+c

Read the cell and skip if done
0<0^84*1+?1-

  Flip row parity
  11<-1>

  Call NORMALLINE twice
  99*85++0^cc

  Call PLUSHDASHLINE
  77*1+c

Jump back to start of loop
066*5+-g!


DEFINE_PLUSDASHLINE
0<0^45*2+?1-95*0^0^2-PPP064*-6-gd95*2-P25*P$

DEFINE_NORMALLINE
1<2>555**1-P0<0^76*6-?1-12<-2>2<3*48*+0^PP555**1-P076*2+-gd25*P$

El código llama a 2 funciones PLUSHDASHLINEy NORMALLINEmantiene un estado global para las paridades (es decir, si se debe colocar a ' 'o a '#'en una celda).

Explicación para PLUSDASHLINE:

Repeat N times
0<0^45*2+?1-

  Print "+--"
  95*0^0^2-PPP

End Repeat
064*-6-g

Print "+"
d95*2-P

Print "\n"
25*P

Return
$

Explicación para NORMALLINE:

Copy Parity into Cell 2
1<2>

Print '|'
555**1-P

Repeat N times
0<0^76*6-?1-

  Flip Cell 2 (i.e. Flip Column Parity)
  12<-2>

  Calculate ' ' or '#' based upon parity
  2<3*48*+0^

  Print it twice
  PP

  Print '|'
  555**1-P

End Repeat
076*2+-g

Print "\n"
d25*P

Return
$

Agradecería que alguien diera consejos para mejorarlo aún más :)

Jay Bosamiya
fuente
2

Pitón 2, 98

n=input()
f=lambda a,b,s:s+s.join(([a*2,b*2]*n)[:n])+s+'\n'
print f(f(*' #|'),f(*'# |'),f(*'--+'))

No es el camino más corto, sino un método divertido. La función ftoma dos cadenas a,by un separador sy entrelaza sus argumentos como saasbbsaasbbsaas. Las filas del tablero se crean de esta forma con sus respectivos caracteres, luego se entrelazan de esta manera para producir el resultado.

xnor
fuente
Esto produce una salida no válida para 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).
kdragon
@DragonGuy El problema dice que la entrada es un número entero positivo.
xnor
Pero debería haber un retroceso de al menos 0. No se requieren retrocesos negativos. No habrá una regla para números menores que 0. Esta solución parece dar "++ (nueva línea) ++" para cualquier cosa menor que 1.
kdragon
@DragonGuy Cuando especifica los requisitos de entrada, significa que la entrada está garantizada para cumplir con esos requisitos y puede actuar arbitrariamente cuando no sea el caso. Noté que editó la pregunta para agregar "n = 0 debería producir +" después de que esto fue publicado, pero se desaconseja cambiar las reglas después de que las respuestas ya estén disponibles .
xnor
Estaba pensando en esa regla (lea muchas preguntas antes) antes de editar la pregunta, pero como no iba a afectar a la gran mayoría de las respuestas, no pensé que sería un problema. Pregunta editada para proporcionar claridad y hacer esto opcional.
kdragon
2

Ruby: 83 caracteres

f=->n{puts d=?++'--+'*n,(0...n).map{|i|[?|+'%2s|'*n%(['','##',''][i%2,2]*n)]*2<<d}}

Ejecución de muestra:

irb(main):001:0> f=->n{puts d=?++'--+'*n,(0...n).map{|i|[?|+'%2s|'*n%(['','##',''][i%2,2]*n)]*2<<d}}
=> #<Proc:0x000000007c51a0@(irb):1 (lambda)>

irb(main):002:0> f[0]
+
=> nil

irb(main):003:0> f[1]
+--+
|  |
|  |
+--+
=> nil

irb(main):004:0> f[2]
+--+--+
|  |##|
|  |##|
+--+--+
|##|  |
|##|  |
+--+--+
=> nil

irb(main):005:0> f[3]
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+
|##|  |##|
|##|  |##|
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+
=> nil
hombre trabajando
fuente
2

Ruby, 87

->n{a=[b="+--",c="|  |##",c,b,d="|##|  ",d]
0.upto(n*3){|i|puts"".ljust(n*3+1,a[i%6])}}

Esta es una función anónima. Llámalo así (todas las posibilidades de 0 a 5)

f=->n{a=[b="+--",c="|  |##",c,b,d="|##|  ",d]
0.upto(n*3){|i|puts"".ljust(n*3+1,a[i%6])}}

6.times{|j|f.call(j)}

Hace uso del ljustmétodo en una cadena vacía. Ruby permite que se especifique una cadena de relleno para justificación, por lo que la usamos ljustcon una de las tres posibles cadenas de relleno b,c,dpor matriz a, ordenadas como bccbdd.

Level River St
fuente
1

Julia, 124 bytes

n->(t="+--"^n*"+";a="|  ";b="|##";m=n÷2;c=n%2>0;p=println;p(t);for i=1:n p(((i%2<1?(b*a)^m*b^c:(a*b)^m*a^c)*"|\n")^2*t)end)

Esto crea una función sin nombre que acepta un número entero e imprime en stdout.

Ungolfed + explicación:

function f(n)
    # Define the portions of the board
    t = "+--"^n * "+"
    a = "|  "
    b = "|##"

    # There will be n÷2 repeated a*b or b*a per line
    m = n ÷ 2

    # If n is odd, there will be an extra a or b
    c = n % 2 != 0

    # Print the top
    println(t)

    # Print each horizontal section of the board
    for i = 1:n
        # In even numbered sections, b precedes a
        j = (i % 2 == 0 ? (b*a)^m * b^c : (a*b)^m * a^c) * "|\n"
        println(j^2 * t)
    end
end
Alex A.
fuente
1

Javascript, ES6 149

n=>(r="+--".repeat(n)+"+",[...r].map((_,i)=>i%3?(x=i%6&&i%6<3?" ":"#",[...r].map((_,e)=>e%3?e%6&&e%6<3?x:"#"==x?" ":"#":"|").join('')):r).join('\n'))

Muy divertido de escribir aunque es un poco largo

Funciona en firefox

1 - Consola abierta

2 - Escriba lo siguiente

console.log((n=>(r="+--".repeat(n)+"+",[...r].map((_,i)=>i%3?(x=i%6&&i%6<3?" ":"#",[...r].map((_,e)=>e%3?e%6&&e%6<3?x:"#"==x?" ":"#":"|").join('')):r).join('\n')))(15));

Salida (n = 15):

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Afonso Matos
fuente
¿Podría agregar un fragmento como las otras soluciones ES6? Esto facilitaría las pruebas.
kdragon
Iba a editar mi comentario en el rango de 5 minutos, pero mi conexión era defectuosa. ¿Podría agregar un fragmento como las otras soluciones ES6? Esto facilitaría las pruebas. Para un novato de JavaScript pro y ES6, esto no funciona en el Bloc de notas de Firefox.
kdragon
@DragonGuy Hecho, mira si te funciona.
Afonso Matos
1
Justo al final, aún puede guardar tres bytes sustituyendo join('\n')con join` `, donde el espacio que escribí denota un nuevo carácter de línea real.
Chiru
1

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$).

f n=putStr$unlines$t$map t$y[a,b,b,a,c,c]where t=take(n*3+1)
a=y"+--"
b=y"|  |##"
c=drop 3b
y=cycle

Solíamos ttomar una región de 3 n + 1 caracteres de un tablero de ajedrez infinito construido usando cycle, 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.

f n=putStr$unlines$map(\y->map(g y)r)r where r=[0..n*3]
g y x=s(s '+'y '|')x$s '-'y$cycle" #"!!(x`div`3+y`div`3)
s c i d|i`mod`3==0=c|True=d
Kevin Reid
fuente
Me alegra que tu inspiración haya llevado a una respuesta tan inteligente :)
Afonso Matos
Obtengo 84 bytes al escribir esto en un archivo con cat <<EOF > sol1.hsy contando con du -b sol1.hs.
kdragon
@DragonGuy Acabo de hacer lo mismo y sigo obteniendo 99. wcestá de acuerdo, y verifiqué si hay caracteres no imprimibles. ¿Se ejecuta esta versión de 84 bytes ? Si es así, lo tomaré :)
Kevin Reid
1

Haskell, 118

Esta es mi primera respuesta de golf de código haskell y aquí está:

f n=mapM_(putStrLn.s)[0..3*n]where;d x=(++)$take(3*n)$cycle x;s x|x`mod`3<1=d"+--""+"|x`mod`6<3=d"|  |##""|"|1<2=d"|##|  ""|"

Versión más legible:

func num = do
    let -- Range
        rag = 3 * num
        -- `+--+`
        a = d "+--" "+"
        -- `|  |##`
        b = d "|  |##" "|"
        -- `|##|  `
        c = d "|##|  " "|"
        -- generate line
        d x y = take rag (cycle x) ++ y
        -- step
        step x
            | x `mod` 6 `elem` [1, 2] = b
            | x `mod` 3 == 0          = a
            | otherwise               = c

    mapM_ (putStrLn . step) [0..rag]

Salida

*Main> :load test
[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> f 1
+
*Main> f 4
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
*Main> f 15
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Afonso Matos
fuente
f 1debe producir 1 caja vacía, f 0produce solo el signo más.
Kade
@ Vioz- Mi mal, así que esto hace que el código sea aún más corto: P
Afonso Matos
1

C - 119 101

Utiliza ahora el cálculo similar a la respuesta @ Sp3000. También optimizaciones de pareja.

i,j;f(n){for(i=j=0;j<=n*3;i++)putchar(i-n*3-1?" -|+#"[!(j%3)+2*!(i%3)?:(i/3+j/3)%2*4]:(j-=i=-1,10));}

Creo que ?:es una extensión de GCC ...

Vieja respuesta:

f(n){int i,j;char p[]=" -|+";for(i=j=0;j<=n*3;*p=" #"[(i++/3+j/3)%2])putchar(i-n*3-1?p[!(j%3)+2*!(i%3)]:(j-=i=-1,10));}

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.

aragaer
fuente
1

awk - 91

{
    for(k=i=3*$0+1;i--;print"")
        for(j=k;j--;)printf i%3?j%3?234~(i+j)%6?FS:"#":j%3?"-":"|":"+"
}

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.

Cabbie407
fuente
0

Pyke, 47 bytes, no competidor

"+--"Q*\+j+i
QQ]Uas 2%" #"@2*)F\|JjR+"+
"+2*pi
<Newline needed>

Pruébalo aquí!

Azul
fuente