Ich hoffe, dieses Bild kommt Ihnen bekannt vor.
Es ist einer von Pacmans Geistern in seinem "verletzlichen" Zustand , nachdem Pacman eine Kraftpille gegessen hat.
Die Herausforderung
Stellen Sie sich unseren Geist in einem kleinen Rahmen mit ASCII-Kunst vor. Bei normaler Skalierung (dazu später mehr) sollte jedes Quadrat im obigen Bild einem Zeichen entsprechen, und der Rahmen sollte links und rechts vom Geist einen Abstand von einem Zeichen nach oben und unten sowie einen Abstand von zwei Zeichen aufweisen :
####################
# #
# #### #
# ######## #
# ########## #
# ############ #
# ############ #
# ### ## ### #
# #### ## #### #
# ############## #
# ############## #
# ## ## ## ## #
# # ## ## ## # #
# ############## #
# ## ### ### ## #
# # ## ## # #
# #
####################
Aber das sieht nicht sehr hübsch aus. #
ist möglicherweise nicht die beste Wahl für die aktiven Pixel. Außerdem sind die Zeichenzellen nicht quadratisch, wodurch unser Freund geisterhafter aussieht, als er es bereits ist.
Um mehr Flexibilität zu erhalten, ändert sich das Bild entsprechend drei Eingabeparametern:
- Zeichen, das für aktive Pixel verwendet werden soll;
- Horizontaler Skalierungsfaktor;
- Vertikaler Skalierungsfaktor.
Zum Beispiel mit %
, 4
, 2
wäre die ouput desto besser aussehendes Bild
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% %%%%
%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%%
%%%% %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Regeln
Alle eingebauten erlaubt.
Eingaben werden in jedem vernünftigen Format und in jeder Reihenfolge vorgenommen. Bei der obigen ersten Eingabe (Zeichen für aktive Pixel) handelt es sich garantiert um ein druckbares ASCII-Zeichen (Codes 32 bis 126).
Leerzeichen nach jeder Zeile oder Zeilenumbrüche nach der letzten Zeile sind zulässig.
Code Golf, gewinnt die wenigsten Bytes.
quelle
Antworten:
CJam,
535149 BytesBeachten Sie, dass drei der Zeichen nicht druckbar sind. Probieren Sie es online!
Hintergrund
Die rechte Hälfte der nicht skalierten Ausgabe ist identisch mit der linken, daher ist es ausreichend, eine davon zu codieren. Wenn wir Leerzeichen durch Nullen und Nicht-Leerzeichen durch Einsen ersetzen, erhalten wir
Dabei kann jede Zeile als Binärzahl interpretiert werden. Dies ergibt
Die einfachste Methode zum Codieren dieser Informationen besteht darin, jede Ganzzahl an diesem Codepunkt durch das Unicode-Zeichen zu ersetzen. Für die Codierung mit UTF-8 sind jedoch zwei Byte erforderlich.
Durch XOR-Verknüpfung der Ganzzahlen mit 544 halten wir alle bis auf zwei Ganzzahlen unter 128 und vermeiden Nullbytes.
Das Ergebnis ist
als ganze Zahlen oder
als entkommene Zeichenfolge.
Wie es funktioniert
quelle
Perl,
1131051041009796+2 für hinzugefügt
-ap
Vorschläge von dev-null speichern 9 Bytes Fehler behoben, der von Dennis bemerkt wurde
Führen Sie mit
echo "2 4 %" | perl -ap pacman.pl
pacman.pl
:mit der Ausnahme, dass die Zeichenfolge
"\xff\x00\x03\x0f\x1f\x3f\x3f\x39\x79\x7f\x7f\x66\x59\x7f\x6e\x46\x00\xff"
in binärer Form mit einfachen Anführungszeichen geschrieben werden sollteLeerzeichen als Ersatzzeichen wird zur leeren Zeichenkette und führt zu kurzen Zeilen. Aber es wird sowieso alles leer aussehen
quelle
Dyalog APL, 64 Bytes
Dies nimmt den Skalierungsfaktor als linkes Argument und das Zeichen als rechtes Argument, dh:
Erläuterung:
⍉(7/2)⊤⎕AV⍳'Äâ\⊥⊥∘)⍞⍞┬#⍞`⍒'
: Die linke Hälfte des Geistes, ohne Rand. (Es ist symmetrisch.) Für jedes Zeichen ist ein hohes Bit festgelegt, um zu verhindern, dass nicht druckbare Zeichen ausgewählt⎕AV
werden. Es werden jedoch nur die ersten 7 Bytes verwendet.0,⍪⍨0⍪0,0,
: Fügen Sie links, oben und unten einen Rand aus Leerzeichen hinzu1⍪⍨1⍪1,
: Fügen Sie den Rahmen links, oben und unten hinzu,∘⌽⍨
: mit seinem vertikalen Spiegel verbinden1+
: addiere 1, da Arrays standardmäßig 1-indiziert sind' '⍵[
...]
: Verwenden Sie diese Matrix als Index für die Zeichenfolge' '⍵
, sodass jede 0 einer Leerstelle und jede 1 einer Leerstelle zugeordnet wird⍵
.⍺,⊂
: Schließe die Matrix ein und verbinde sie mit den Skalierungsfaktoren/
: rechte Falte mit folgender Funktion:/∘⍉
: transponieren und horizontal skalierenquelle
MATL , 71 Bytes
Probieren Sie es online!
Erläuterung
Das Bild ist horizontal symmetrisch, sodass nur die linke Hälfte codiert werden muss. Jede 10-Pixel-Zeile ist als Zahl zwischen 0 und 1023 binär codiert. Aktive Pixel sind eher als 0 als als 1 codiert, sodass die erste Zeile eher als 0 als 1023 nummeriert ist.
Da sich aufeinanderfolgende Zeilen nur um wenige Pixel unterscheiden, werden die Zahlen weiter differenziell codiert. Jede Zeile wird also als kumulative Summe aller Zahlen bis zu dieser Zeile dekodiert, gefolgt von der Konvertierung in Binär.
Die benötigten Nummern sind dann
0 wird in MATL mit der
O
Funktion eingeführt, die ein Trennzeichen mit benachbarten Zahlen vermeidet. Außerdem bedeuten negative Vorzeichen keine zusätzlichen Bytes, da sie als Trennzeichen dienen.Sobald das Array erstellt wurde, wird es kumuliert summiert, binär decodiert und horizontal gespiegelt. Das resultierende 2D-Array wird verwendet, um eine Zeichenfolge mit zwei Zeichen zu indizieren, um das Ergebnis zu erzeugen. Diese Zeichenfolge hat die Form
'% '
, wobei'%'
es sich um ein Eingabezeichen handelt.Wie von @Conor bemerkt, funktioniert der Code auch mit zwei Zeichen als Eingabe. In diesem Fall hat die letzte indizierte Zeichenfolge die Form
'%_ '
, in der die Eingabe eine Zeichenfolge mit zwei Zeichen ist'%_'
. Das Leerzeichen wird einfach ignoriert, da das Indizierungsarray nur die ersten beiden Zeichen anspricht.quelle
C (gcc) ,
199 bis197 Bytes-2 Bytes dank @JonathanFrech
Probieren Sie es online!
188 Bytes (nicht druckbar)
Mit freundlicher Genehmigung von @JonathanFrech.
Probieren Sie es online!
Nichts Spektakuläres. Wie andere bemerkt haben, ist der Geist sehr symmetrisch. Das Bild selbst ist 20 Einheiten breit, aber mit Ausnahme der oberen und unteren Zeilen sind die drei am weitesten rechts stehenden Spalten identisch. Dies ermöglicht es uns, die Hälfte des Bildes als Zeichen zu speichern, anstatt ganze Zahlen zu verwenden:
Die resultierende Zeichenfolge wurde umgekehrt, um bei einer absteigenden for-Schleife einige Bytes herauszuholen (was auch ein ärgerliches Problem mit hexadezimalen Escapezeichen behebt). Andere Loops können dank Symmetrie problemlos umgedreht werden.
Jedes Zeichen wird nach links verschoben und mit einem Rand versehen (mit besonderer Sorgfalt in der ersten und letzten Zeile). Dann geht es nur noch darum, den String richtig skaliert auszugeben.
All die for-Schleifen geben mir das Gefühl, dass es einen besseren Weg gibt.
quelle
\xff
nicht durchÿ
( TIO ) ersetzt werden kann?Im Ernst, 116 Bytes
Diese Zeilenumbruch ist wichtig. Hexdump:
Dieselbe Strategie wie Dennis ' CJam-Antwort , aber die Werte sind hexadezimal codiert und nicht mit 544 XOR-verknüpft, und die Manipulation von Zeichenfolgen ist in Seriously viel schwieriger.
Probieren Sie es online!
quelle
BBC BASIC,
239236232214 BytesDas Aufrufen
PROCM(1,1,35)
erzeugt den Geist, der aus # Symbolen besteht. Die Argumente für PROCM sind: horizontale Skala, vertikale Skala, ASCII-Zeichenwert.Dieses Programm funktioniert sowohl für Brandy Basic als auch für BASIC 2 auf einem Originalmodell B.
quelle
Batch,
740722720 BytesBearbeiten:
18 bis20 Byte durch Entfernen unnötiger Leerzeichen gespeichert .quelle
Stax , 45 Bytes
Führen Sie es aus und debuggen Sie es
Erläuterung:
quelle
JavaScript (ES6), 167 Byte
Basierend auf der Antwort von @ Dennis. Ich schätze, Sie könnten ein anderes Byte abschneiden, indem Sie stattdessen einen wörtlichen FF verwenden
\f
, aber ich bezweifle, dass ich hier einen einfügen kann. Wenn Sie dies ausprobieren, möchten Sie möglicherweise auch\u01CA
anstelle desNJ
Zeichens verwenden.Das Voranstellen eines Leerzeichens vor dem Zeichenargument kostet leider ganze 6 Bytes.
quelle
Python 2,
838828618 BytesDurch die Verwendung eines Strings anstelle eines Arrays wurden 210 Bytes eingespart. Dank Dennis für diesen Vorschlag weiß ich, dass ich noch bessere Ergebnisse erzielen kann, aber im Moment ist dies eine gute Verbesserung.
Dies ist das Beste, was ich tun kann, ich bin nicht sehr gut mit Grafiken in der Kommandozeile.Ich nahm den kleinen Geist als Basis.
Ich benutze standardmäßig den ASCII 219, da mit diesem Char der Geist ziemlich genial aussieht !!!
Golf gespielt
Probieren Sie es auf repl.it
Ungolfed
Prüfung
quelle
Python 2, 244 Bytes
quelle
Python 2, 169 Bytes
Probieren Sie es online!
Erläuterung:
Wie in Dennis 'Antwort repräsentiert jedes Zeichen in dieser Zeichenkette die binäre Darstellung einer Zeile der linken Hälfte des "Bildes", XOR 544.
Führen Sie für jedes Zeichen in der Zeichenfolge die folgenden Schritte aus:
Transformiere das Zeichen in seine Ganzzahldarstellung und führe dann ein binäres XOR mit 544 durch. Dann transformiere diese Ganzzahl in eine Zeichenkette seiner Binärdarstellung, wie '0xb1111111111'.
Führen Sie für jedes Zeichen im Stich beginnend bei Position 2 (wobei die 0b am Anfang übersprungen wird) die folgenden Schritte aus:
Wenn das Zeichen == "1" ist, ersetzen Sie es durch das angegebene Zeichen, andernfalls durch ein Leerzeichen. Dann kopiere dieses Zeichen x mal. (x = 0 führt zu einer leeren Zeichenfolge.)
Verketten Sie alle Zeichenfolgen zu einer langen Zeichenfolge, die durch eine leere Zeichenfolge "" getrennt ist.
Machen Sie eine Zeichenkette aus b + der Umkehrung von b, erstellen Sie dann ein Array mit y Instanzen dieser Zeichenkette (y = 0 erzeugt eine leere Liste []) und fügen Sie diese Liste an die Liste z an.
Zum Schluss drucken Sie, um jede der produzierten Zeichenfolgen durch Zeilenumbrüche getrennt zu prüfen.
quelle