Zeichnen Sie ein ASCII-Schachbrett

25

Zusammenfassung

Inspiriert von der jüngsten Beliebtheit von ASCII-Kunstherausforderungen, besteht der Zweck dieser Herausforderung darin, ein ASCII-Schachbrett zu zeichnen, wie eines, auf dem Schach gespielt werden kann.

Schreiben Sie ein Programm, das eine positive Ganzzahl nals Argument in stdinoder als Benutzereingabe verwendet, und geben Sie ein Schachbrett mit nx ausn Quadraten und einem Rand mit einer Dicke von 1 Zeichen aus.

Jedes Quadrat sollte 2x2 Zeichen haben. Die Quadrate sollten dem normalen abwechselnden Weiß-Schwarz-Muster (Weiß zuerst, wie in der linken oberen Ecke) eines Schachbretts folgen. Weiße Quadrate sollten aus Leerzeichen ( ) und schwarze Quadrate aus Pfund bestehen (# ) bestehen.

Der Rand sollte aus Bindestrichen ( -) mit einem Pluszeichen () bestehen.+ ) am Rand oder am senkrechten Punkt eines Quadrats bestehen.

Eingang

Positive Ganzzahl für die Anzahl der Quadrate (Abmessungen in Quadraten), die in das Schachbrett gezeichnet werden sollen, wobei jedes Quadrat 2x2 Zeichen enthält.

Beispiel Ergebnisse

n=2

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

n=3

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

n=4

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

... und so weiter.


Anmerkungen

  • Leerzeichen und neue Zeilen sind zulässig.
  • Sie können entweder ein gesamtes Programm oder eine Funktion schreiben.
  • Keine führenden Leerzeichen.
  • Ihr Programm sollte korrekte Ergebnisse für n = 15 anzeigen.
  • Stellen Sie für weniger bekannte esoterische und ähnliche Sprachen einen Link zur Sprache bereit.
  • n=0 sollte produzieren + . (Optional, aber sehr zu empfehlen und zu empfehlen.)
  • Der kürzeste Code in Bytes gewinnt, da dies Codegolf ist.
kdragon
quelle
2
Willkommen bei Programming Puzzles und Code Golf! Gute Arbeit hier, besonders für Ihre erste Herausforderung. Ich freue mich darauf, mehr von deinen Sachen zu sehen.
Alex A.
Ich vermute, "Ihr Programm sollte korrekte Ergebnisse für n = 15 anzeigen." bedeutet "bis zu n = 15"?
John Dvorak
Msgstr "Ihr Programm sollte korrekte Ergebnisse für n = 10 anzeigen." Das bedeutet, wenn Ihr Programm nicht richtig bis zu n = 15 rendern kann, sollte es nicht gepostet werden. Das heißt aber nicht, dass Sie das ausnutzen / missbrauchen und ein Programm schreiben sollten, das nur bis zu n = 15 reicht.
kdragon
Ich habe getestete funktionierende Antworten positiv bewertet, auch wenn sie nicht +für sie produziert wurden n=0.
kdragon
Entschuldigung, ich habe den Gewinner nie angenommen. Akzeptiere jetzt.
kdragon

Antworten:

16

J, 24 Bytes

Eine anonyme Funktion:

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

Verwendung:

   f =: 2 2&$&.>@(' #'{~2|+/~@i.)
   f 4
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
Lynn
quelle
1
&.>ist eine kürzer als each. Es ist zu beachten, dass es nur funktioniert, wenn auf eingestellt BoxFormist 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]

Wählt für jede Zeile eines der Muster aus

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

und druckt 3*n+1 Zeichen daraus. Das Muster wird ausgewählt, indem die ersten 6 Zeichen wiederholt werden, die mit dem String-Interleaving-Trick ausgewählt wurden. Dadurch wird auch ein Ausschnitt mit der richtigen Länge extrahiert.

Das richtige Muster wird basierend auf dem Wert des Zeilenindex imodulo 6 durch einen arithmetischen Ausdruck ausgewählt 3**i%7/2%3, der das sich wiederholende Muster [0,1,1,0,2,2] ergibt. Ich fand es unter Verwendung der Tatsache, dass x**i%7Punkt 6, dann verschiedene Werte xund unterschiedliche Nachbearbeitung versucht hat , um das richtige Muster zu erhalten.

xnor
quelle
9

Pyth, 37

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

Eher zusammen gehackt, aber kurz.

Demonstration.

isaacg
quelle
9

CJam, 43 42 Bytes

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

Probieren Sie es online aus .

Jede Koordinate wird einem Zeichen zugeordnet, z. B. die linke obere Ecke (0, 0) -> "+". Insbesondere berechnen wir

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

und indexiere den String "#|-+ "entsprechend.

Sp3000
quelle
6

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

Nimmt Eingaben als unärgernd an (basierend auf dieser Metadiskussion ).

Jede Zeile sollte in eine eigene Datei gehen und nin den Dateien in eine neue Zeile geändert werden. Dies ist unpraktisch, aber Sie können den Code so wie er ist als eine Datei mit dem -sFlag ausführen , wobei die nMarkierungen erhalten bleiben. Sie können die nZeilenumbrüche in der Ausgabe zur besseren Lesbarkeit ändern . Z.B:

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

Weiteres Golfen und Erklärungen folgen später.

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

Snippet:

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

Anonyme Funktion. Beginnt mit einem vollständigen Array von +--+--+--...Zeilen und ersetzt in den entsprechenden Zeilen das +für |und -für oder #nach Bedarf.

Der Ausdruck, der das Ersetzungszeichen bestimmt "| |##| "[x%6+(i%6>2)*3], könnte wahrscheinlich weiter verwendet werden, aber ich habe festgestellt, dass die Verwendung einer längeren, redundanten Zeichenfolge mehr Zeichen als eine komplexe Berechnung spart.

Apsillers
quelle
Gute ES6-Nutzung! Der Effekt des Schiebereglers im Snippet ist eine nette Ergänzung. Könnten Sie eine Erklärung und eine ungolfed Version geben?
kdragon
3

CoffeeScript mit 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 Byte

Zeilenumbrüche sind signifikant und werden jeweils als 1 Byte gezählt.

Die explizite Rückgabe hat es etwas länger gemacht:

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}

Demo

Zur Zeit ist Firefox der einzige große Browser, der mit ES6 kompatibel ist.

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


Bisherige Lösungen

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 (nicht übermittelt)

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+"+")
Monopol
quelle
3

CJam, 46 Bytes

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

Probieren Sie es online aus

Nun, ich hatte gehofft, dass ich wenigstens eine originelle Lösung haben würde (normalerweise schaue ich mir keine anderen Antworten an, bevor ich alleine arbeite). Stellt sich heraus, dass @ Sp3000 schon etwas sehr ähnliches gemacht hatte, nur besser. Aber da ich die Arbeit bereits gemacht habe, dachte ich, ich würde sie trotzdem posten.

Erläuterung:

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

HackVM , 158 Bytes

Auf jeden Fall kein Gewinner, aber dies schien eine schöne Herausforderung in HVM zu sein.

Platzieren Sie die Größe in der ersten Speicherzelle und verwenden Sie den folgenden Code:

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$

Hinweis: Der Code muss genau in einer Zeile stehen, damit er funktioniert.

Erläuterung:

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$

Der Code ruft 2 Funktionen auf PLUSHDASHLINEund NORMALLINEbehält einen globalen Status für Paritäten bei (dh ob ein ' 'oder ein '#'in eine Zelle gesetzt werden soll).

Erklärung für 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
$

Erklärung für 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
$

Würde mich freuen, wenn jemand Tipps zur weiteren Verbesserung gibt :)

Jay Bosamiya
quelle
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(*'--+'))

Nicht der kürzeste Weg, aber eine amüsante Methode. Die Funktion fnimmt zwei Zeichenfolgen a,bund ein Trennzeichen auf sund verschachtelt ihre Argumente wie saasbbsaasbbsaas. Die Zeilen der Tafel werden in dieser Form mit ihren jeweiligen Zeichen erstellt und dann auf diese Weise verschachtelt, um das Ergebnis zu erhalten.

xnor
quelle
Dies erzeugt eine ungültige Ausgabe für n=0. Die Mehrheit der Lösungen (die akzeptiert werden) ergibt "+". Diese Lösung erzeugt "++ (newline) ++" mit Ausnahme der normalen zwei nachgestellten Zeilen (was erlaubt ist).
kdragon
@DragonGuy Das Problem besagt, dass die Eingabe eine positive Ganzzahl ist.
xnor
Es sollte jedoch einen Fallback für mindestens 0 geben. Negative Fallbacks sind nicht erforderlich. Es wird keine Regel für Zahlen unter 0 geben. Diese Lösung scheint "++ (newline) ++" für weniger als 1 zu geben.
kdragon
@DragonGuy Wenn Sie die Eingabeanforderungen angeben, bedeutet dies, dass die Eingabe diese Anforderungen garantiert erfüllt und willkürlich reagieren kann, wenn dies nicht der Fall ist. Ich stelle fest, dass Sie die Frage bearbeitet haben, um "n = 0 sollte + ergeben" hinzuzufügen, nachdem dies veröffentlicht wurde. Es wird jedoch dringend davon abgeraten, die Regeln zu ändern, nachdem bereits Antworten eingegangen sind .
Xnor
Ich habe über diese Regel nachgedacht (ich habe viele Fragen zuvor gelesen), bevor ich die Frage bearbeitete, aber da sie die weitaus meisten Antworten nicht beeinflussen würde, hätte ich nicht gedacht, dass es ein Problem sein würde. Frage bearbeitet, um Klarheit zu schaffen und dies optional zu machen.
kdragon
2

Ruby: 83 Zeichen

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

Probelauf:

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
Mann bei der Arbeit
quelle
2

Rubin, 87

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

Dies ist eine anonyme Funktion. Nenne es so (alle Möglichkeiten von 0 bis 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)}

Die ljustMethode wird für eine leere Zeichenfolge verwendet. Ruby ermöglicht die Angabe einer Auffüllzeichenfolge zur Rechtfertigung. Daher verwenden wir ljusteine der drei möglichen Auffüllzeichenfolgen b,c,dpro Array a, sortiert nach bccbdd.

Level River St
quelle
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)

Dadurch wird eine unbenannte Funktion erstellt, die eine Ganzzahl akzeptiert und nach stdout druckt.

Ungolfed + Erklärung:

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

Ziemlich lustig zu schreiben, obwohl es ein bisschen lang ist

Funktioniert mit Firefox

1 - Konsole öffnen

2 - Geben Sie Folgendes ein

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

Ausgabe (n = 15):

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Afonso Matos
quelle
Könnten Sie ein Snippet wie die anderen ES6-Lösungen hinzufügen? Dies würde das Testen erleichtern.
kdragon
Ich wollte meinen Kommentar im 5-Minuten-Bereich bearbeiten, aber meine Verbindung war fehlerhaft. Könnten Sie ein Snippet wie die anderen ES6-Lösungen hinzufügen? Dies würde das Testen erleichtern. Für einen JavaScript-Pro und ES6-Neuling funktioniert dies im Firefox-Scratchpad nicht.
kdragon
@DragonGuy Fertig, sehen Sie, ob es bei Ihnen funktioniert.
Afonso Matos
1
Ganz am Ende, können Sie noch sparen drei Bytes durch Substitution join('\n')mitjoin` ` , wo der Raum , den ich schrieb bezeichnet eine tatsächliche Zeilenendmarke.
Chiru
1

Haskell, 99

Dies ist teilweise inspiriert von der vorherigen Haskell-Antwort von catgocat ; Ich habe meine eigene Version geschrieben, sie dann angeschaut und eine andere geschrieben. Ich spiele nach den gleichen Regeln - die Eingabe ist ein Argument, aber die Ausgabe ist stdout. (Wenn es sich um eine reine Funktion handeln könnte, subtrahieren Sie 7 Zeichen 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

Wir verwenden t, um einen Bereich von 3 n + 1 Zeichen von einem unendlichen Schachbrett zu nehmen, das mit gebaut wurde cycle, und das war's. Die Hauptidee, die ich aus der anderen Antwort gezogen habe, besteht darin, die Muster sowohl der Rand- als auch der Kontrollzelle zusammenzufügen in Strings.

Meine erste Version (140 Zeichen) verwendete die Strategie, das Zeichen an jedem Punkt zu berechnen, was für ein komplexeres Problem möglicherweise besser ist als dieses.

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
quelle
Ich bin froh, dass deine Inspiration zu solch einer klugen Antwort geführt hat :)
Afonso Matos
Ich bekomme 84 Bytes, wenn ich dies in eine Datei mit schreibe cat <<EOF > sol1.hsund mit zähle du -b sol1.hs.
kdragon
@DragonGuy Ich habe gerade das Gleiche gemacht und bekomme immer noch 99. wc stimmt zu, und ich habe nach nicht druckbaren Zeichen gesucht. Enthält diese 84-Bit - Version laufen ? Wenn ja, nehme ich es :)
Kevin Reid
1

Haskell, 118

Dies ist meine erste Antwort auf einen Haskell-Code und hier ist sie:

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

Mehr lesbare Version:

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]

Ausgabe

*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
quelle
f 1Sollte 1 leeres Kästchen erscheinen, erscheint f 0nur das Pluszeichen.
Kade
@ Vioz- Mein Schlechtes, das macht den Code noch kürzer: P
Afonso Matos
1

C - 119 101

Verwendet nun die Berechnung ähnlich wie bei @ Sp3000 Antwort. Auch Paaroptimierungen.

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

ich denke, dass ?: ist eine GCC-Erweiterung ...

Alte Antwort:

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

Es behält 2 Koordinaten bei und berechnet ehrlich, welches Zeichen für jedes Paar gedruckt werden soll. Die Liste der zu druckenden Zeichen wird in einem Array gespeichert, und dies allein druckt ein "ungefärbtes" Gitter. Das erste Element des Arrays wird geändert, um schwarze Quadrate zu zeichnen.

Ich könnte dies so ändern, dass anstelle von zwei unabhängigen Koordinaten ein Wert hoch- oder (vielleicht sogar besser) runtergezählt wird, aber ich kann mich jetzt nicht darum kümmern.

Bonus - Ersetzen Sie 3 durch eine andere Zahl, erhalten Sie ein Programm, das ein gültiges Schachbrett mit einer anderen Zellengröße zeichnet.

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

Es war ein ziemlicher Kampf, es unter 100 zu bringen. Rückwärts zu zählen und den Match-Operator zu verwenden, waren die Durchbrüche;) Der Rest ist eine ziemlich einfache Logik.

Cabbie407
quelle