pb , 240 Bytes
<[8]^w[Y!14]{w[X!24]{>[8]b[124]^b[124]v}vw[X!-8]{b[45]<}vv}>[12]^[12]b[49]>[12]w[T!8]{<[4]b[T+50]^<w[X%8!6]{b[65+T*3+X%8%3]>}>[10]vw[B!124]{<[24]vvv}t[T+1]}<[4]b[42]>[8]b[48]>[8]b[35]^[4]>w[B!0]{b[B+2]<}b[87]w[X!2]{<[5]w[B!0]{b[B+1]<}}b[80]
(Dieses Programm fordert zur Eingabe in der aktuellen Version von pbi auf, da es auf Y = -1 geht und die B
Variable versucht, sich selbst zu aktualisieren. Selbst wenn Sie eine Eingabe eingeben, wird nichts kaputt gehen. Es ist ärgerlich, aber besser als die alte Version das forderte zur Eingabe auf, egal was.)
pb ist eine Sprache, in der das Terminal als 2D-Zeichenfläche behandelt wird. Um auszugeben, müssen Sie den "Pinsel" (einen Punkt, der durch die aktuellen Werte der X- und Y-Variablen dargestellt wird) an die Stelle bewegen, an der das Zeichen abgelegt werden soll, und ihn dort platzieren. Es ist umständlich für Dinge wie das Ausdrucken eines Wortes, aber für Kunst ist es oft bequem.
Dieses Programm zeichnet nicht genau das, was die Frage angibt. (Warte, stimme mich noch nicht ab! Lass es mich erklären!)
Das Zeichnen von Kisten mit Schleifen ist ziemlich einfach, aber es gibt einen Haken. Wenn Sie die folgende Form wiederholen:
--------
|
|
Sie erhalten zwar Kisten, aber die rechte und die untere sind offen. Sie können die zusätzlichen Seiten manuell zeichnen, dies kostet jedoch Bytes. Um dies zu umgehen, zeichnet mein Programm dies tatsächlich mit den offenen Kanten links und oben:
| | | |
| | | |
--------------------------------
| | ABC | DEF |
| 1 | 2 | 3 |
--------------------------------
| GHI | JKL | MNO |
| 4 | 5 | 6 |
--------------------------------
| PQRS | TUV | WXYZ |
| 7 | 8 | 9 |
--------------------------------
| | | |
| * | 0 | # |
--------------------------------
Aber Einschienenbahn! Das steht nicht in der Spezifikation! Sie können nicht einfach etwas anderes zeichnen, weil es einfacher ist und Sie Lust dazu haben! Auch wenn ich Ihre Aufmerksamkeit habe, sind Sie sehr klug und süß.
Shh, shh, es ist okay. Mit pb können Sie auf einen Punkt auf der Leinwand mit einem oder mehreren negativen Werten in den Koordinaten "schreiben". Der Wert wird gespeichert, während das Programm ausgeführt wird, aber nur Punkte, an denen X und Y beide> = 0 sind, werden tatsächlich auf den Bildschirm geschrieben. Dieses Programm positioniert den Pinsel so, dass Bereiche, die in diesem Bild getönt sind, ein negatives X oder Y haben:
Obwohl zusätzliche Linien "gezeichnet" werden, werden sie nie gedruckt.
Nach dem Durchlaufen und Erstellen des Rasters füllt dieses Programm die oberen neun Felder aus. Die erste ist fest codiert, eine 1 wird geschrieben und das Programm geht weiter. Die anderen acht werden programmgesteuert generiert. Wenn Sie den Code zum Wechseln zum nächsten Feld ignorieren, feststellen, wann die Zeile leer ist usw. (vorausgesetzt, der Pinsel beginnt immer in der unteren Zeile des Felds und in der mittleren Spalte), wird dies acht Mal ausgeführt:
b[T+50]
^<w[X%8!6]{b[65+T*3+X%8%3]>}
t[T+1]
Selbst wenn Sie wissen, dass dies b
der Befehl zum Schreiben eines Zeichens ist, ^v<>
bewegen Sie den Pinsel und führen Sie w[a!b]{}
den Code in geschweiften Klammern aus, bis a != b
dies schwer zu befolgen ist. Als erstes ist zu beachten, dass Sie in pb keine Variablen definieren können. In jedem Programm gibt es sechs, und Sie müssen lernen, mit ihnen zu leben. Zweitens T
ist dies die einzige Variable, die Sie tatsächlich so verwenden können, wie Sie es von Variablen gewohnt sind. einen Wert zuweisen und später lesen. Jede andere Variable kann entweder nicht festgelegt werden und sagt nur etwas über den Punkt auf der Leinwand aus, auf dem Sie sich befinden, oder sie kann nur indirekt und mit Nebenwirkungen festgelegt werden ( ^v<>
ändern X
und Y
, wodurch sich auch die Pinselposition ändert.c
Sätze P
zu(P+1)%8
, wodurch auch die Ausgabefarbe geändert wird). Es ist einfach unmöglich, einen Zähler dafür zu führen, welche Zahl geschrieben werden muss und welche Buchstaben. Stattdessen verfolgt dieser Code nur die Nummer und ermittelt die darauf basierenden Buchstaben. Hier ist wie:
b[T+50] # We start printing at box 2 with T==0, 0+50=='2'
^< # Go up and to the left of the number
w[X%8!6]{ # Take the X coordinate mod 8 so it's like we're in
# the leftmost box. Until hitting the sixth cell:
b[ # Write this character:
65 # 'A'
+ T * 3 # Number of current box - 2 (letters start at
# 2) * 3 (3 letters per box)
+ X % 8 % 3 # X % 8 makes every box behave like it's on the
# left, % 3 puts 0 at the point where the first
# letter goes, then 1, then 2. This is how each
# letter is made different in a box.
]
> # Move to the right
}
t[T+1] # Box is done, increase counter
Dies ist nicht perfekt, da nur 3 Buchstaben in die Felder 7 und 9 eingegeben werden. Nach dem Füllen der unteren Zeile (einfache Hardcodierung) wird jeder Buchstabe in Feld 9 um 2 erhöht und das W manuell platziert. In ähnlicher Weise wird jeder Buchstabe in den Feldern 7 und 8 um 1 erhöht und das P wird manuell platziert.
Ungolfed:
<[8]^ # Go to (-8, -1)
w[Y!14]{ # While the brush is not on Y=14:
w[X!24]{ # While the brush is not on X=24:
>[8] # Go right 8
b[124]^b[124]v # Draw a pipe at the current location and above it
}
vw[X!-8]{b[45]<} # Go down and draw hyphens all the way until X=-8
vv # Go down by 2 to start drawing next row
}
>[12]^[12]b[49] # Write a 1 in the first box
>[12] # Go to the bottom pipe on the right of box 2
w[T!8]{ # While T is not 8:
<[4] # Go to center cell of the box
b[T+50] # Write the number that belongs there
^<w[X%8!6]{b[65+T*3+X%8%3]>} # Write the letters
>[10]v # Go to the next box
w[B!124]{ # If the next box isn't there:
<[24]vvv # Go down a row
}
t[T+1] # Increase counter
}
<[4]b[42]>[8]b[48]>[8]b[35] # Put the asterisk, 0 and hash in their boxes
^[4]>w[B!0]{b[B+2]<} # Increase all letters in the 9th box by 2
b[87] # Put a W in the 9th box
w[X!2]{<[5]w[B!0]{b[B+1]<}} # Increase all letters in the 7th/8th box by 1
b[80] # Put a P in the 7th box