Die schöne Musterlade
Guten Morgen PPCG!
Als ich neulich versuchte, jemandem bei Stack Overflow zu helfen, gab mir ein Teil seines Problems eine Idee für diese Herausforderung.
Überprüfen Sie zunächst die folgende Form:
Dabei sind alle schwarzen Zahlen der Index der Punkte in der Form und alle dunkelblauen Zahlen der Index der Verknüpfungen zwischen den Punkten.
Wenn Sie nun eine Hexadezimalzahl für 0x00000 bis 0xFFFFF angeben, müssen Sie in der Konsole eine Form zeichnen, bei der nur Zeichen und "■" verwendet werden (die Verwendung des Zeichens "o" ist ebenfalls in Ordnung).
Hier sind einige Beispiele, in denen eine hexadezimale Zahl eingegeben und eine Form ausgegeben wird:
0xE0C25 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■
0xC1043 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■
■
■
■
■
■
■
■ ■ ■ ■ ■ ■ ■ ■ ■
0xE4F27 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
0xF1957 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
0xD0C67 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
0x95E30 :
■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■
0x95622 :
■ ■ ■ ■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■
■
■
■ ■ ■ ■ ■
0xC5463 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
0xE5975 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
0xB5E75 :
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
0xF4C75 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
0xF5D75 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
Hier einige Erklärungen zur Funktionsweise:
0xFFFFF(16) = 1111 1111 1111 1111 1111(2)
Sie haben hier 20 Bits, jedes Bit gibt an, ob eine Verknüpfung besteht oder nicht.
Der Index des höchstwertigen Bits (MSB) ist 0 (Bildreferenz) oder das niedrigwertigste Bit (LSB) ist 19 (wieder Bildreferenz).
So funktioniert es für die erste als Beispiel angegebene Form:
0xE0C25(16) = 1110 0000 1100 0010 0101(2)
Das heißt, Sie haben die folgenden vorhandenen Links: 0,1,2,8,9,14,17,19.
Wenn Sie die Linien auf dem Referenzbild mit diesen Zahlen markieren, erhalten Sie diese Form:
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■
Hier ist eine einfache und unkomplizierte Python-Implementierung, wenn Sie weitere Hilfe benötigen:
patterns = [
0xE0C25, 0xC1043, 0xE4F27, 0xF1957,
0xD0C67, 0x95E30, 0x95622, 0xC5463,
0xE5975, 0xB5E75, 0xF4C75, 0xF5D75
]
def printIfTrue(condition, text = "■ "):
if condition:
print(text, end="")
else:
print(" "*len(text), end="")
def orOnList(cube, indexes):
return (sum([cube[i] for i in indexes]) > 0)
def printPattern(pattern):
cube = [True if n == "1" else False for n in str(bin(pattern))[2::]]
for y in range(9):
if y == 0: printIfTrue(orOnList(cube, [0, 2, 3]))
if y == 4: printIfTrue(orOnList(cube, [2, 4, 9, 11, 12]))
if y == 8: printIfTrue(orOnList(cube, [11, 13, 18]))
if y in [0, 4, 8]:
printIfTrue(cube[int((y / 4) + (y * 2))], "■ ■ ■ ")
if y == 0: printIfTrue(orOnList(cube, [0, 1, 4, 5, 6]))
if y == 4: printIfTrue(orOnList(cube, [3, 5, 7, 9, 10, 13, 14, 15]))
if y == 8: printIfTrue(orOnList(cube, [12, 14, 16, 18, 19]))
printIfTrue(cube[int((y / 4) + (y * 2)) + 1], "■ ■ ■ ")
elif y in [1, 5]:
for i in range(7):
if i in [2, 5]:
print(" ", end=" ")
printIfTrue(cube[y * 2 + (1 - (y % 5)) + i])
elif y in [2, 6]:
for i in range(5):
if i in [1, 2, 3, 4]:
print(" ", end=" ")
if i in [1, 3]:
if i == 1 and y == 2:
printIfTrue(orOnList(cube, [3, 4]))
elif i == 3 and y == 2:
printIfTrue(orOnList(cube, [6, 7]))
if i == 1 and y == 6:
printIfTrue(orOnList(cube, [12, 13]))
elif i == 3 and y == 6:
printIfTrue(orOnList(cube, [15, 16]))
else:
printIfTrue(cube[(y * 2 - (1 if y == 6 else 2)) + i + int(i / 4 * 2)])
elif y in [3, 7]:
for i in range(7):
if i in [2, 5]:
print(" ", end="")
ri, swap = (y * 2 - 2) + (1 - (y % 5)) + i, [[3, 6, 12, 15], [4, 7, 13, 16]]
if ri in swap[0]: ri = swap[1][swap[0].index(ri)]
elif ri in swap[1]: ri = swap[0][swap[1].index(ri)]
printIfTrue(cube[ri])
if y == 0: printIfTrue(orOnList(cube, [1, 7, 8]))
if y == 4: printIfTrue(orOnList(cube, [6, 8, 10, 16, 17]))
if y == 8: printIfTrue(orOnList(cube, [15, 17, 19]))
print()
for pattern in patterns:
printPattern(pattern)
Natürlich ist es nicht perfekt und es ist ziemlich lang für das, was es tun sollte, und genau das ist der Grund, warum du hier bist!
Das Programm lächerlich kurz zu machen :)
Das ist Code-Golf, also gewinnt die kürzeste Antwort!
quelle
Antworten:
JavaScript (ES6),
202188187 ByteWie es funktioniert
Wir arbeiten in einem Raster
g
von 9 Zeilen mit 10 Zeichen. Das Raster wird anfänglich mit Leerzeichen gefüllt, wobei jedes 10. Zeichen einen Zeilenvorschub enthält.Jedes Segment wird durch eine Startposition und eine Richtung definiert.
Anweisungen sind wie folgt codiert:
Jedes Segment ist als Ganzzahl codiert:
Beispielsweise beginnt das Segment Nr. 3 an Position 55 und verwendet die 3. Richtung. Daher ist es codiert als
(55 << 2) | 3 == 223
.Unten ist die resultierende Liste von ganzen Zahlen von Segment # 19 bis Segment # 0:
Sobald die Delta-Codierung bei 356 beginnt, wird sie:
Welches ist schließlich codiert als:
quelle
Python 3, 289 Bytes
Nichts Schlaues, nur Hardcoding.
quelle
"trq|t...a|eca".split("|")
werden"tqr t...a eca".split()
?.split()
zerstört||
.Ruby, 116 Bytes
Dies beruht auf ein paar Mustern, die ich beobachtet habe. Erstens wiederholt sich das Muster alle 9 Zeilen. Zweitens, wenn die Startpunkte der horizontalen Linien richtig gewählt sind, wechseln die x-Richtungen kontinuierlich durch rechts, links und gerade.
Ungolfed im Testprogramm
Ich glaube, es gibt eine 112-Byte-Lösung mit einer 20-Zeichen-Zeichenfolge und etwas Dekodierung, um die Parameter der 20 Zeilen zu definieren. Ich werde es später versuchen, wenn ich Zeit habe.
quelle
PHP,
142150149 Bytesdruckt die Form so weit wie nötig; dh wenn der untere Teil leer ist, wird er abgeschnitten.
Laufen Sie mit
php -nr '<code>' <input>
. Keine Eingabe voranstellenTesten Sie es online
Fügen Sie 11 Bytes für kein Schneiden hinzu: Fügen Sie
,$r[80]=" "
danach ein$r=""
.Kodierung erklärt
Jede Linie kann mit einem Startpunkt und einer von vier Richtungen beschrieben werden.
In einem 9x9-Raster reicht die Startposition von
0,0
bis8,4
; oder kombiniert von0
bis8*9+4=76
. Zum Glück sind alle Startpunkte[0,4,8,36,40,44,72,76]
durch 4 teilbar; So kann der Richtungscode[0..3]
in die Bits 0 und 1 eingeklemmt werden -> es ist überhaupt keine Verschiebung erforderlich.Für eine einfache Berechnung der Cursorbewegung
0
wird für Ost (nur Richtung ohne vertikale Bewegung) und[1,2,3]
für Südwest, Süd, Südost, wobei der Versatz9
(für vertikale Bewegung) plus[-1,0,1]
->[8,9,10]
-> istdelta=code?code+7:1
.Die Richtung für die erste und letzte Zeile ist nach Osten, was zu Codes zwischen 0 und 76 führt
[0+0,4+0,0+2,0+3,4+1,4+2,4+3,8+1,8+2,...,44+1,44+2,72+0,76+0]
. und bitweises x oder 96 für jeden Wert führt zu druckbaren und unproblematischen ASCII-Codes[96,100,98,99,101,102,103,105,106,68, 72,70,71,73,74,75,77,78,40,44]
->`dbcefgijDHFGIJKMN(,
. Der Code verwendet das LSB für Bit 0, während Zeile 0 dem MSB entspricht, sodass die Zeichenfolge umgekehrt werden muss. Finito.Nervenzusammenbruch
etwas Golf erklärt
^96
sich dies nicht auf die unteren beiden Bits auswirkt, kann es beim Extrahieren der Richtung ignoriert werden. Es ist also nicht erforderlich, den Wert in einer Variablen zu speichern, wodurch 5 Bytes auf dem Cursor-Init gespeichert werden.~3
statt124
spart ein Byte und ermöglicht das nächste Golfen:$k=3
innerhalb der$p
Zuweisung spart zwei Bytesund schadet der Vorbedingung nicht (da der obere Wert noch eine Ziffer hat).
chunk_split
ist der kürzeste Weg, um die Zeilenumbrüche einzufügen.Ich möchte nicht einmal wissen, wie viel mehr alles andere dauern würde.
7+($c&3?:-6)
ist ein Byte kürzer als$c&3?$c%4+7:1
.hexdec()
(8 Byte), um die Eingabebeschränkung zu erfüllen.quelle
JavaScript,
184183178168167 BytesWar ursprünglich 206 Bytes, aber die Antwort von @ Arnauld hat mich dazu inspiriert, eine eindimensionale Array-Lösung zu untersuchen. Bearbeiten: 1 Byte dank @ edc65 gespeichert. Gespeichert
515 Bytes dank @Arnauld. Ein weiteres Byte durch Ändern der Zeichenauswahl gespeichert.quelle
[0,1,2,3,4]
ist kürzer[67,65,52,36,51,50,34,49,48,35,33,20,4,19,18,2,17,16,3,1]
und sparen[0,2,4,6,8].map(i=>a[(e&102)*4+(e&17||15)*i]='o')
[..."ecVFUTDSREC6&54$32%#"]
und verwenden[0,2,4,6,8].map(i=>a[(e&102)*4+(e&17||15)*i]='o',e=e.charCodeAt()-34)
, um weitere 10 Bytes zu speichern.~
von-34
abzuspielen (leider falle ich an "\" vorbei, weshalb ich keine 2 Bytes spare).Stapel, 491 Bytes
Hinweis: Die letzte Zeile endet mit einem Leerzeichen. Das Versetzen einer
if
Bedingung mit einer Variablen in einefor
Schleife geht über den Stapel hinaus, sodass eine eigene Unterroutine erforderlich ist. Da es nichts sichtbares macht, falle ich hinein, um auszusteigen. Die~
unquotes die Saiten in der äußeren Schleife so dass die innere Schleife eine Schleife über die Zahlen. Die Zahlen sind einfach die Bitmasken für alle Stellen, an deneno
s gezeichnet werden soll.quelle
C
267262260256 ZeichenDas Zählen entgeht als 1 Zeichen
k ist ein Verweis auf die Felder, in die ein 'o' eingefügt werden soll.
Probieren Sie es online!
quelle
Befunge, 468 Bytes
Probieren Sie es online!
In der ersten Zeile wird eine Zeichenfolge aus stdin gelesen und als Hexadezimalzahl ausgewertet. Der Rest des Codes ist im Wesentlichen nur eine Doppelschleife über den x / y-Koordinaten des Gitters, wobei eine massive Boolesche Berechnung festlegt, ob
o
für jede Position eine ausgegeben werden soll.Grundsätzlich gibt es für jeden der 20 Gitterpunkte eine eigene Bedingung (die ersten vier):
Und wenn wir alle 20 berechnet haben, ODER das Los zusammen, und wenn das Ergebnis wahr ist, geben wir ein aus
o
, sonst geben wir ein Leerzeichen aus.Befunge hat keine Möglichkeit, Bits zu manipulieren. Um also die Bits aus der Eingabe zu extrahieren, werden wir nur wiederholt evaluieren
n%2
und dannn/=2
die 20 Bedingungsberechnungen durchlaufen.quelle