Disegna una scacchiera ASCII


25

Sommario

Ispirato dalla recente popolarità delle sfide artistiche ASCII, lo scopo di questa sfida è quello di disegnare una scacchiera ASCII, come una su cui è possibile giocare a scacchi.

Scrivi un programma che accetta un numero intero positivo ncome argomento, in stdino come input dell'utente e genera una scacchiera con nx nquadrati, insieme a un bordo spesso 1 carattere.

Ogni quadrato dovrebbe contenere 2 x 2 caratteri. I quadrati dovrebbero seguire la normale alternanza bianco-nero (prima bianco, come nell'angolo in alto a sinistra) di una scacchiera. I quadrati bianchi dovrebbero essere fatti di caratteri spazio ( ) e i quadrati neri dovrebbero essere fatti di caratteri sterlina ( #).

Il bordo deve essere costituito da trattini ( -) con un segno più ( +) sul bordo o punto perpendicolare di un quadrato.

Ingresso

Numero intero positivo nel rappresentare il numero di quadrati (dimensioni in quadrati) da disegnare nella scacchiera, con ogni quadrato di 2x2 caratteri.

Risultati di esempio

n=2

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

n=3

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

n=4

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

... e così via.


Gli appunti

  • Gli spazi finali e le nuove linee sono accettabili.
  • È possibile scrivere un intero programma o una funzione.
  • Nessuno spazio iniziale.
  • Il tuo programma dovrebbe visualizzare i risultati corretti per n = 15.
  • Per le lingue esoteriche meno conosciute e simili, fornire un collegamento alla lingua.
  • n=0dovrebbe produrre +. (facoltativo, ma altamente raccomandato e incoraggiato.)
  • Il codice più corto in byte vince, poiché si tratta di codice golf.

2
Benvenuti in Puzzle di programmazione e Code Golf! Bel lavoro qui, soprattutto per la tua prima sfida. Non vedo l'ora di vedere altre tue cose.
Alex A.

Immagino "Il tuo programma dovrebbe mostrare i risultati corretti per n = 15". significa "fino a n = 15"?
John Dvorak,

"Il tuo programma dovrebbe visualizzare i risultati corretti per n = 10." significa che se il programma non può essere visualizzato correttamente fino a n = 15, non dovrebbe essere pubblicato. Ma ciò non significa che dovresti sfruttarlo / abusarlo e scrivere un programma che può arrivare solo a n = 15.
kdragon,

Ho valutato le risposte di lavoro testate, anche se non producono +per n=0.
kdragon,

Mi dispiace non ho mai accettato il vincitore. Accetto adesso.
kdragon,

Risposte:


16

J, 24 byte

Una funzione anonima:

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

Uso:

   f =: 2 2&$&.>@(' #'{~2|+/~@i.)
   f 4
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+

1
&.>è uno più corto di each. Vale la pena notare che funziona solo se BoxFormimpostato su ASCII.
randomra,

10

Python 2, 79

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

Per ogni riga, seleziona uno dei motivi

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

e stampa 3*n+1personaggi da esso. Il modello viene scelto ripetendo i suoi primi 6 caratteri, selezionati con il trucco di interlacciamento della stringa, che serve anche per estrarre uno snippet della lunghezza corretta.

Il modello corretto viene selezionato in base al valore dell'indice di riga imodulo 6 da un'espressione aritmetica 3**i%7/2%3che fornisce il modello ripetuto [0,1,1,0,2,2]. L'ho trovato usando il fatto che x**i%7ha periodo 6, quindi ho provato diversi valori xe diversi postprocessing per ottenere lo schema giusto.



9

CJam, 43 42 byte

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

Provalo online .

Ogni coordinata è mappata su un carattere, ad esempio l'angolo in alto a sinistra è (0, 0) -> "+". In particolare, calcoliamo

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

e indicizzarlo nella stringa di "#|-+ "conseguenza.


6

Retina , 106 byte

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

Prende input come unario (basato su questa meta discussione ).

Ogni riga dovrebbe andare nel proprio file e ndovrebbe essere cambiata in newline nei file. Ciò non è pratico ma è possibile eseguire il codice così com'è, come un file, con la -sbandiera, mantenendo i nmarcatori. nSe lo si desidera, è possibile modificare le "newline" nell'output per renderle leggibili. Per esempio:

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

Ulteriore golf e alcune spiegazioni verranno dopo.


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`
`

Frammento:

<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>

Funzione anonima. Inizia con una gamma completa di +--+--+--...linee e su linee appropriate, sostituisce il +per |e -per o #come appropriato.

L'espressione che decide il carattere sostitutivo "| |##| "[x%6+(i%6>2)*3]potrebbe probabilmente essere ulteriormente approfondita, ma ho scoperto che l'uso di una stringa più lunga e ridondante consente di risparmiare più caratteri di un calcolo complesso.


Buon utilizzo ES6! L'effetto del cursore nello snippet è una bella aggiunta. Potresti fornire una spiegazione e una versione non golfata?
kdragon,


3

CoffeeScript con ES6, 106 byte

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 byte

Le newline sono significative e contate come 1 byte ciascuna.

Il ritorno esplicito lo ha reso un po 'più lungo:

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}

dimostrazione

Al momento della stesura, Firefox è l'unico grande browser compatibile 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>


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+"+")


Soluzioni precedenti

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 (non inviato)

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+"+")

3

CJam, 46 byte

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

Provalo online

Beh, speravo di avere almeno una soluzione originale (normalmente non guardo altre risposte prima di lavorare da solo). Si scopre che @ Sp3000 aveva già fatto qualcosa di molto simile, solo meglio. Ma dal momento che ho già fatto il lavoro, ho pensato di pubblicarlo comunque.

Spiegazione:

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.

2

HackVM , 158 byte

Sicuramente non un vincitore, ma questa sembrava una bella sfida da fare in HVM.

Inserire la dimensione nella prima cella di memoria e utilizzare il seguente codice:

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: per funzionare, il codice deve essere esattamente in una riga.

Spiegazione:

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$

Il codice chiama 2 funzioni PLUSHDASHLINEe NORMALLINEmantiene uno stato globale per le parità (ovvero se inserire a ' 'o a'#' in una cella).

Spiegazione per 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
$

Spiegazione per 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
$

Lo apprezzerei se qualcuno desse consigli per migliorarlo ulteriormente :)


2

Python 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(*'--+'))

Non il modo più breve, ma un metodo divertente. La funzione faccetta due stringhe a,be un separatore se interlaccia i suoi argomenti come saasbbsaasbbsaas. Le righe del tabellone vengono create in questa forma con i rispettivi personaggi, quindi vengono interfogliate in questo modo per produrre il risultato.


Questo produce un output non valido per n=0. La maggior parte delle soluzioni (che saranno accettate) produce "+". Questa soluzione produce "++ (newline) ++", escludendo le 2 newline finali normali (che sono consentite).
kdragon,

@DragonGuy Il problema dice che l'input è un numero intero positivo.
xnor

Ma dovrebbe esserci un fallback per almeno 0. Non sono richiesti fallback negativi. Non ci saranno regole per numeri inferiori a 0. Questa soluzione sembra dare "++ (newline) ++" per qualcosa di meno di 1.
kdragon

@DragonGuy Quando si specificano i requisiti di input, significa che l'input è garantito per soddisfare tali requisiti e può agire arbitrariamente in caso contrario. Ho notato che hai modificato la domanda per aggiungere "n = 0 dovrebbe produrre +" dopo che questo è stato pubblicato, ma cambiare le regole dopo che le risposte sono già in è fortemente sconsigliato .
xnor

Stavo pensando a quella regola (leggi molte domande prima) prima di modificare la domanda, ma poiché non avrebbe influenzato la stragrande maggioranza delle risposte, non pensavo che sarebbe stato un problema. Domanda modificata per fornire chiarezza e renderlo facoltativo.
kdragon,

2

Rubino: 83 caratteri

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

Esecuzione di esempio:

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

2

Ruby, 87

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

Questa è una funzione anonima. Chiamalo così (tutte le possibilità da 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)}

Usa il ljustmetodo su una stringa vuota. Ruby consente di specificare una stringa di riempimento per giustificazione, quindi usiamo ljustcon una delle tre possibili stringhe di riempimento b,c,dper array a, ordinate come bccbdd.


1

Julia, 124 byte

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)

Questo crea una funzione senza nome che accetta un numero intero e stampa su stdout.

Ungolfed + spiegazione:

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

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'))

Abbastanza divertente da scrivere anche se è un po 'lungo

Funziona su Firefox

1 - Apri console

2 - Digitare quanto segue

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));

Uscita (n = 15):

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

Potresti aggiungere uno snippet come le altre soluzioni ES6? Ciò renderebbe i test più semplici.
kdragon,

Stavo per modificare il mio commento in un intervallo di 5 minuti, ma la mia connessione era difettosa. Potresti aggiungere uno snippet come le altre soluzioni ES6? Ciò renderebbe i test più semplici. Per un pro JavaScript e Noob ES6, questo non funziona in Firefox Scratchpad.
kdragon,

@DragonGuy Fatto, vedi se funziona per te.
Afonso Matos,

1
Alla fine, puoi ancora salvare tre byte sostituendoli join('\n')con join` `, dove lo spazio che ho scritto indica un nuovo carattere di linea reale.
Chiru,

1

Haskell, 99

Ciò è parzialmente ispirato alla precedente risposta di Haskell di catgocat ; Ho scritto la mia versione, poi l'ho guardata, poi ne ho scritta un'altra. Sto giocando con le stesse regole: l'input è un argomento, ma l'output è stdout. (Se potrebbe essere una funzione pura, sottrarre 7 caratteri 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

Usiamo tper prendere una regione di 3 n + 1 caratteri da una scacchiera infinita creata usandocycle , e basta. L'idea principale che ho preso dalla altra risposta è quella di mettere i modelli di cellule sia il confine e il correttore insieme nelle stringhe.

La mia prima versione (140 caratteri) utilizzava la strategia di calcolo del personaggio in ogni punto, che potrebbe essere migliore per un problema più complesso di questo.

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

Sono contento che la tua ispirazione abbia portato a una risposta così intelligente :)
Afonso Matos,

Ottengo 84 byte quando scrivo questo in un file cat <<EOF > sol1.hse conto du -b sol1.hs.
kdragon,

@DragonGuy Ho appena fatto la stessa cosa e ottengo ancora 99. è d' wcaccordo e ho controllato i caratteri non stampabili. Questa versione a 84 byte funziona ? Se è così, lo prenderò :)
Kevin Reid,

1

Haskell, 118

Questa è la mia prima risposta di golf con codice haskell ed eccola qui:

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"|##|  ""|"

Versione più leggibile:

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]

Produzione

*Main> :load test
[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> f 1
+
*Main> f 4
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
*Main> f 15
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

f 1dovrebbe produrre 1 casella vuota, f 0produce solo il segno più.
Kade,

@ Vioz- Mio male, quindi questo rende il codice ancora più breve: P
Afonso Matos,

1

C - 119 101

Utilizza ora il calcolo simile alla risposta @ Sp3000. Anche ottimizzazioni di coppia.

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));}

Penso che ?:sia un'estensione GCC ...

Vecchia risposta:

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 coordinate e calcola onestamente quale personaggio stampare per ogni coppia. L'elenco dei caratteri da stampare è memorizzato nell'array e questo da solo stampa una griglia "non colorata". Il primo elemento dell'array viene modificato per disegnare quadrati neri.

Potrei cambiarlo in modo che al posto di due coordinate indipendenti sia un valore contando in alto o (forse anche meglio) in basso, ma non posso avvolgerlo in questo momento.

Bonus: la sostituzione di 3 con qualsiasi altro numero comporta un programma che disegna una scacchiera valida con celle di dimensioni diverse.


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?"-":"|":"+"
}

È stata una vera lotta per portarlo al di sotto di 100. Contare all'indietro e usare l'operatore di gara sono stati i progressi;) Il resto è praticamente una logica semplice.


0

Pyke, 47 byte, non competitivo

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

Provalo qui!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.