Im Jahr 2014 Demoscener Jakub 'Ilmenit' Debski veröffentlichte eine 250-Byte (1) Verfahren Grafiken Demo für den Atari XL genannt Mona . Es zeichnet das folgende Bild (2) :
Ihre Aufgabe ist es, mit der Sprache Ihrer Wahl genau das gleiche Bild zu erzeugen.
(1) Aufschlüsselung: 136 Datenbytes + 114 Code-Bytes.
(2) Das Originalbild ist 128x96. Die obige Version wurde auf 256x192 vergrößert. Einige Pixel unterscheiden sich vom Original, dies ist jedoch die erwartete Ausgabe mit dem in dieser Challenge beschriebenen Pseudocode.
Wie?
Das ist Code-Golf . Obwohl Sie berechtigt sind, eine Methode zu verwenden, werden die besten Ergebnisse höchstwahrscheinlich mit dem unten beschriebenen Originalalgorithmus erzielt.
NB : Dieser Absatz ist keine Spezifikation, sondern eine allgemeine Beschreibung. Einzelheiten zum Algorithmus finden Sie im Pseudocode und in der Referenzimplementierung.
Das Bild besteht aus 64 pseudozufälligen Pinselstrichen ( siehe dieses Video ) und durchläuft die folgenden Farben (im hexadezimalen RRGGBB-Format):
COLOR = [ 0xFFE289, 0xE99E45, 0xA55A00, 0x000000 ]
Der Hintergrund wird zunächst mit der 4. Farbe (schwarz) gefüllt. Jeder Strich ist kürzer als der vorherige.
Der Pseudozufallsgenerator verwendet ein Linear-Feedback-Schieberegister (LFSR) für eine 32-Bit-Ganzzahl, die ursprünglich auf 0x7EC80000
XOR gesetzt und mit XOR verknüpft wurde 0x04C11DB7
.
Jeder Strich wird mit einem 16-Bit-Wert initialisiert, der die niedrigsten Bytes des Seeds überschreibt:
BRUSH = [
0x030A, 0x37BE, 0x2F9B, 0x072B, 0x0E3C, 0xF59B, 0x8A91, 0x1B0B,
0x0EBD, 0x9378, 0xB83E, 0xB05A, 0x70B5, 0x0280, 0xD0B1, 0x9CD2,
0x2093, 0x209C, 0x3D11, 0x26D6, 0xDF19, 0x97F5, 0x90A3, 0xA347,
0x8AF7, 0x0859, 0x29AD, 0xA32C, 0x7DFC, 0x0D7D, 0xD57A, 0x3051,
0xD431, 0x542B, 0xB242, 0xB114, 0x8A96, 0x2914, 0xB0F1, 0x532C,
0x0413, 0x0A09, 0x3EBB, 0xE916, 0x1877, 0xB8E2, 0xAC72, 0x80C7,
0x5240, 0x8D3C, 0x3EAF, 0xAD63, 0x1E14, 0xB23D, 0x238F, 0xC07B,
0xAF9D, 0x312E, 0x96CE, 0x25A7, 0x9E37, 0x2C44, 0x2BB9, 0x2139
];
Diese Werte werden auch verwendet, um die neue Position verwendet (bx, by) der Bürste zu Beginn des Hubes: bx wird durch das niedrigstwertige Byte gegeben und durch durch das höchstwertige Byte angegeben.
Die Richtung des Strichs wird durch die Bits # 1 und # 7 des Startwerts angegeben. (Siehe die SWITCH-Anweisung im Pseudocode.)
Pseudocode
Unten ist der Algorithmus in Pseudo-Code, 0-indizierte Arrays unter der Annahme, wo AND
, OR
und XOR
mittlere Bit - Operationen.
seed = 0x7EC80000
dir = 0x00
FOR part = 0 TO 63
word = BRUSH[part]
seed = (seed AND 0xFFFF0000) OR word
bx = word AND 0xFF
by = (word >> 8) AND 0xFF
FOR len = 0 TO (64 - part) * 32 - 1
carry = seed AND 0x80000000
seed = (seed << 1) AND 0xFFFFFFFF
IF carry
seed = seed XOR 0x04C11DB7
dir = seed AND 0xFF
ENDIF
SWITCH dir AND 0x82
CASE 0x00:
by = (by + 1) AND 0x7F
ENDCASE
CASE 0x02:
bx = (bx + 1) AND 0x7F
ENDCASE
CASE 0x80:
by = (by - 1) AND 0x7F
ENDCASE
CASE 0x82:
bx = (bx - 1) AND 0x7F
ENDCASE
ENDSWITCH
drawPixel(bx, by, COLOR[part AND 3])
ENDFOR
ENDFOR
Referenzimplementierung
Unten finden Sie eine Referenzimplementierung in JavaScript, die nicht für Golfer geeignet ist.
Sie können hier auch eine animierte Version sehen .
Klarstellung und Regeln
- Die Ausgabe muss auf 128x96 beschnitten werden, obwohl der Algorithmus außerhalb dieses Bereichs zeichnet.
- Wenn Ihre Sprache / Plattform die oben beschriebenen genauen Farben nicht ausgeben kann, müssen Sie Farben verwenden, die so nah wie möglich sind.
- Wenn Sie sich für eine alternative Methode entscheiden, müssen Sie dennoch genau dieselbe Ausgabe generieren.
- Nur für den Fall: Das Senden des ursprünglichen 6502-Assemblercodes oder einer leicht bearbeiteten Version ist nicht zulässig.
- Können Sie 250 Bytes schlagen? Viel Spaß beim Zeichnen!
Antworten:
x86-Opcode,
227224223 BytesBild:
quelle
0122 6681F7B71DC104 xor edi, 00001DB7
Fehler gefunden in W32Dasm8086 Assembly - NASM (MBR) -
248245 Bytequelle
xor dx,dx
und ändernmov bp,0xa000; mov es,bp
zupush 0xa000; pop es
.PUSH imm
Excel VBA 32-Bit,
1011720 BytesRevision 49; Δ Score = 291 Bytes
Golf gespielt
Volle
Sub
Routine, die keine Eingaben macht und die Mona Lisa an dasActiveSheet
Objekt in der Reichweite ausgibt[A1:DX96]
.Es gab eine Menge schwarzer Magie beteiligt Golf spielen diese bis zu seinem aktuellen Zustand, - der Note, einige der Tricks beteiligt sind prep Pixel - Kunst , Bitfarben Verschiebung implizite Typumwandlung , und
Bytes als ein Komprimierenbase64
KompressionString
.Hinweis: Diese Lösung wurde auf 32-Bit-Versionen von Excel VBA beschränkt, ebenso
^
wie dasLongLong
Typliteral in 64-Bit-VersionenHinweis, The Second: Die Zeichenfolge in Zeile 3 ist kein Kommentar, da
”
nicht gleichbedeutend mit"
Ausgabe
Gif zeigt die Ausgabe an,
ActiveSheet
wannM
im VBE- Direktfenster aufgerufen wird. Beachten Sie, dass diesesfiggif aufgrund von Dateigrößenbeschränkungen weniger Frames als tatsächlich produziert hat.Ungolfed
Ungolfed volle
sub
Routine, die keine Eingabe nimmt und die Mona Lisa unter Verwendung der oben beschriebenen Methode auf demActiveSheet
Objekt erzeugtquelle
HTML + CSS + JavaScript (ES6), 499 Byte
678...478475473465459455451447449 BytesEs ist nicht annähernd 250 Bytes, aber ich werde mich definitiv mit weniger als 500 Bytes zufrieden geben! Ein großes Dankeschön an @Arnauld und @Firefly, die mir geholfen haben, dieses Monster abzuspielen.
Ersetzen Sie für einen größeren Maßstab das CSS durch Folgendes:
Kommentierte Geschichte!
Ich hatte eine Menge Spaß beim Golfen mit Arnauld's Referenzcode, und davon können Sie hier einiges bekommen. Genießen!
Code-Snippet anzeigen
quelle
Befunge,
11311052 BytesEs gibt eine Reihe von Problemen, die das Problem in Befunge zu einer Herausforderung machen:
Befunge verfügt nur über 2000 Byte Arbeitsspeicher (und das schließt den Quellcode ein), sodass wir nicht das gesamte Bild in den Arbeitsspeicher rendern können, bevor wir es ausgeben. Die Art und Weise, wie ich das umgehe, besteht darin, den Algorithmus 96-mal zu wiederholen, einmal für jede Zeile. In jedem Lauf werden nur die Pixel gespeichert, die für die aktuelle Zeile benötigt werden und am Ende des Laufs ausgegeben werden. Dies ermöglicht es uns, mit einem Pixelpuffer von nur 128 Bytes auszukommen.
Befunge hat keinerlei Operationen. Viele der
AND
Operationen können einfach mit einem Modulo-Operator emuliert werden (z. B.a AND 0x7F
durch ersetzt werdena % 0x80
). DiesXOR
erfordert jedoch einige recht komplizierte Bit-Manipulationen, die wir jeweils mit einem Byte durchführen müssen, indem wir einen Satz benutzerdefinierter Formeln verwenden, die fest codiert sind, um die vier benötigten Bytes zu verarbeiten. Zur Berechnung verwendena XOR 0xC1
wir beispielsweise die Formel:a + 0xC1 - (a/64%4*64 + a%2)*2
Obwohl Befunge per se keine Einschränkung darstellt, ist die Schnittstelle von TIO nicht in der Lage, erweiterte ASCII-Zeichen in der Quelle zu verarbeiten, was der einfachste Weg gewesen wäre, die Pinsel- und Farbtabellen zu speichern. Ich arbeite daran, indem ich diese Tabellen als eine Liste von Zahlen auf dem Stapel generiere und dann eine kleine Initialisierungsschleife habe, die die Werte vom Stapel in den Speicher kopiert. Ein beträchtlicher Teil meiner Zeit verbrachte ich mit dem Golfen an diesem Tisch, der die ersten fünfeinhalb Codezeilen einnimmt.
Leider ist es trotz aller Bemühungen, den Code mit TIO kompatibel zu machen, und meiner Wahl eines Dateiformats, das aus TIO ( PPM ) extrahiert werden kann, einfach zu langsam, um es innerhalb des Zeitlimits von 60 Sekunden fertig zu stellen (wahrscheinlich 96-maliges Ausführen des Algorithmus) hilft nicht). Da das Bild jedoch zeilenweise generiert wird, sollten Sie immer noch genug von der Ausgabe erhalten, um fast die Hälfte des Bildes wiederherzustellen.
Probieren Sie es online!
Wenn Sie keinen lokalen PPM-Datei-Viewer haben, können Sie mit einem der vielen Online-Konverter problemlos in ein anderes Format konvertieren. Ein Beispiel ist Convertio .
quelle
Python 3,
544536523519518 BytesDies ist eine weitere abgespeckte Version von CCB60s Python-Übersetzung der Referenzimplementierung. Ich habe ursprünglich eine große Hex-Zahl verwendet, um den Pinsel des Algorithmus darzustellen, aber später wurde mir klar, dass meine unbegründete Annahme, dass eine Unicode-Zeichenfolgendarstellung in Python nicht funktionieren würde, falsch war.
Ursprünglich dachte ich, meine Byteanzahl sei erheblich niedriger, aber wie nur in ASCII angegeben , habe ich nicht daran gedacht, die Unicode-Zeichen als mehr als ein Byte zu zählen.
Ausgabe (128 x 96)
Identisch mit dem CCB60-Ausgang.
quelle
Java 7,
681677675626612610 BytesGibt das folgende Bild in der Auflösung 128x96 aus:
Ich weiß, es ist nicht einmal in der Nähe von 250 Bytes, aber hey, es ist Java
-2 Bytes dank Zacharý
quelle
#Language, <s>Old Scores</s> Score Bytes
und 2 Sie Ihren Code ein bisschen lesbarer machen können, indem Sie<!-- language-all: lang-java -->
vorher eine Sprachflagge des Formulars hinzufügen Ihr Code-Block0x04C11DB7
=>0x4C11DB7
und0x7f
=>127
. Sei nicht verrückt, wenn es nicht gebraucht wird.C #,
960850 BytesEine einfache Kopie des Pseudo-Codes mit etwas Golf. Es gibt immer noch eine Menge, die man spielen kann, aber ich wollte meine Antwort posten, um den Ball ins Rollen zu bringen.
Voll / Formatierte Version:
quelle
var m = new Bitmap(128,96)
AE IU WAUGH WYPython 2.7;
880876 Bytes insgesamt (einschließlich Daten)-4 Bytes auf 876 dank ZacharyT. (Mein Python-Interpreter mochte seinen Vorschlag nicht, die Leerzeichen zwischen den 80ern und sonst zu streichen.)
Taylor Scotts Vorschlag, den Pinsel in Base 10 einzufügen, ist ausgezeichnet, aber notjagan (in einem Kommentar) hat seinen Vorschlag unter Verwendung des erweiterten Integer-Formats von Python in Hex weiterentwickelt. Die Antwort von notjagan ist in Python 3 und ist eine solche Verbesserung von dem, was ich getan habe, dass er Anerkennung verdient. Ich hoffe, er wird es als separate Antwort posten.
Ausgabe in ein Tkinter-Fenster. Ohne Skalierung ist das Bild sehr klein, aber durch die Skalierung wird die Anzahl um etwa ein Dutzend Bytes erhöht.
Hier ist nicht viel los, außer der Übersetzung in Python und ein bisschen grundlegendem Golfen. Manchmal sind bitweise Manipulationen kürzer, manchmal ganzzahlige Berechnungen. Ich konnte keinen Weg finden, mehr Logik in Listen oder Arrays zu packen. Der grundlegende Algorithmus ist bereits ziemlich dicht.
quelle
<!-- language-all: lang-py -->
80
und demelse
. Und0x00
ist dasselbe wie0
, richtig?import
und entfernen*
.Tcl / Tk, 805
808815816819826839840843Immer noch der Verlierer, aberich musste es tun! Vielleicht kann ich später mehr Golf spielen!Nicht der Verlierer jetzt!
Tcl / Tk, 1370
Sehr ungolfed Transliteration des Pseudo-Codes bevor der Golfspree begann! Die
update
Linie ermöglicht es, die Zeichnung fortlaufend zu sehen!quelle
Python 3 + matplotlib, 541
Das Bild wird als PNG-Datei "i" gespeichert. Um das Bild anzuzeigen, können Sie den imsave durch einen imshow und einen show für 545 Bytes ersetzen.
quelle
SmileBASIC,
454447444 BytesDie Zeichenfolge von "x" enthielt einige ungültige Unicode-Zeichen, daher kann ich sie hier nicht posten. Hier sind die Zeichencodes in Dezimalzahl (nur das BRUSH-Array in umgekehrter Reihenfolge):
8505, 11193, 11332, 40503, 9639, 38606, 12590, 44957, 49275, 9103, 45629, 7700, 44387, 16047, 36156, 21056, 32967, 44146, 47330, 6263, 59670, 16059, 2569, 1043, 21292, 45297, 10516, 35478, 45332, 45634, 21547, 54321, 12369, 54650, 3453, 32252, 41772, 10669, 2137, 35575, 41799, 37027, 38901, 57113, 9942, 15633, 8348, 8339, 40146, 53425, 640, 28853, 45146, 47166, 37752, 3773, 6923, 35473, 62875, 3644, 1835, 12187, 14270, 778
quelle
"xx...xx"
Zeichenfolge zu posten ?: R4, 764 Bytes
die quelle für run in : r4 github
Ich benutze einen Trick, um den Zug ohne Bedingungen zu machen, transformiere Bit 8 in Vorzeichen und verschiebe mit Bit 2. Version mit Stapelnamen:
quelle
Yabasic,
790779 BytesEine grundlegende Antwort, bei der keine Ein- und Ausgaben in ein neues Grafikfenster übernommen werden.
Ausgabe
Das Folgende wird um den Faktor 8 skaliert
quelle