Zeichnen Sie diese Ascii Kaffeetasse:
O O O __________ / \ __ | J | \ | A | | | V | | | A | __ / \ __________ /
Brownie Punkte für Kaffee-Skript oder Java :)
Kürzester Code in Bytes, Funktion oder Programm, nachfolgender Zeilenumbruch oder Leerraum ist akzeptabel.
Antworten:
SOGL , 48 Bytes
Erläuterung:
SOGL verfügt über eine integrierte String-Komprimierung und unter anderem über eine Zeichenwörterbuch-Komprimierung. Noch besser ist, dass es einen Boxstring-Komprimierungstyp gibt, bei dem die einzigen verfügbaren Zeichen "/ \ | _- \ n" sind. Das gesamte Programm ist also eine Zeichenfolge, die in "'" eingeschlossen ist (das "ist implizit).
Die Zeichenfolge, die ich dem Kompressor gegeben habe, ist (geflüchtet):
quelle
JavaScript (ES6),
110104 Byte4 Bytes gespart dank edc65
Wie es funktioniert
Die Komprimierung der ursprünglichen ASCII-Grafik wird erreicht, indem alle Folgen von 2 bis 10 aufeinanderfolgenden Leerzeichen und die beiden Folgen von 10 aufeinanderfolgenden Unterstrichen durch eine einzelne Ziffer ersetzt werden:
N
aufeinanderfolgender Leerzeichen wird mit der Ziffer codiertN-1
.9
. Codiert .Wir verwenden
N-1
eher als,N
damit wir nie mehr als eine Ziffer verwenden müssen. Daher die Notwendigkeit++n
bei der Dekodierung.Der Ausdruck
n>>3
(bitweise Verschiebung nach rechts) entspricht 0 fürn = 1
bisn = 7
und 1 fürn = 8
(nicht verwendet) undn = 9
. Gibt daher' _'[n>>3]
einen Unterstrich für9
und ein Leerzeichen für alle anderen gefundenen Werte an.Der einzige Sonderfall ist die Folge von 10 aufeinanderfolgenden Leerzeichen direkt über "JAVA". Die Kodierung mit einem
9
würde zu einem Konflikt mit den Unterstrichen führen. Also müssen wir es in zwei Sequenzen von 5 Räumen aufteilen, die als codiert sind44
.quelle
f=
). Sie können auf diese Weise 4 Bytes speichern:n>>3
anstelle von+!(n&7)
,9
anstelle von_8
(zweimal) und44
anstelle von9
f=
in diesem gezählt habe ... Danke für die gespeicherten Bytes!' '
). Aber ich weiß nicht genau, wie es das macht. Was macht die Bitverschiebung? Warum erhöhen wir n?Jelly ,
6764 Bytes-2 Bytes dank Dennis (1. Redundante entfernen
”
und 2. Transponieren und Run-Length-Decodieren ersetzenZŒṙ
, mit Reduzierung durch Elementwiederholungx/
.)Probieren Sie es online!
Wie?
“...“...’
ist eine Liste von zwei Base-250-komprimierten Zahlen:D
Konvertiert in eine Dezimalzahl, um zwei Ziffernlisten zu erhalten:x/
Reduziert durch Elementwiederholung, um eine Liste von Ziffern zu erhalten (Wiederholung der Zahl aus der ersten Liste um den entsprechenden Wert der anderen):ị
weist an, in die Liste des rechten Eintrags zu indexieren, und zwar einseitig und modular (0 Indexe für den Eintrag ganz rechts). Die Liste auf der rechten Seite¶_/\|JAVo
ist einfach das Zeichen, das in der erforderlichen Reihenfolge verwendet wird, in der der Pilger¶
den gleichen Codepunkt wie ein Zeilenvorschub hat. Der Abschlusspartner von“
ist nicht erforderlich, da dies das Ende des Programms ist:Jelly führt einen impliziten Ausdruck dieser Liste durch, die, da sie Zeichen enthält, wie eine Zeichenfolge gedruckt wird:
quelle
”
ist implizit und kann durch ersetztZŒṙ
werdenx/
. Auch wenn es keine Bytes enthält,¶
wird der Code durch Verwenden von anstelle einer wörtlichen Newline redabler.CoffeeScript ES6,
214180 BytesCoffeeScript, 135 Bytes mit Hardcodierung
quelle
Python 2,
174172171167 BytesKeine Hardcodierung.
Keine Base-64-Codierung.
Kein Regex.
Einsparung von 2 Bytes durch Externalisierung
'_'*10
und Ausnutzung der Python-Konvertierung vonTrue -> 1
undFalse -> 0
.1 Byte gespart, indem unnötige Leerzeichen entfernt wurden.
4 Bytes gespart dank @TuukkaX!
quelle
] for
und zu habenin [
.[2,7,4]
und[3,4,5,6]
bis2,4,7
und verkürzen3,4,5,6
.PowerShell ,
136,124123105 ByteProbieren Sie es online!
Vielen Dank an @briantist für die Suche nach dem kürzeren
-replace
Methode gefunden hat, von der ich wusste, dass sie irgendwo vorhanden ist.Dies nimmt die Zeichenfolge mit Zahlen anstelle der erforderlichen Anzahl von Leerzeichen. Anschließend werden
-replace
die Ziffern mit einem Skriptausdruck umgerechnet$(" "*$1)
. So wird beispielsweise die erste Zeile der Zeichenfolge$(" "*2)o
, die zweite Zeile$(" "*7)o
usw. sein. Aufgrund der dreifachen Anführungszeichen bleibt dies als Zeichenfolge in der Pipeline. Wir werfen das aufiex
(kurz fürInvoke-Expression
und ähnlich wieeval
), was die Skriptausdrücke verarbeitet und den resultierenden mehrzeiligen String in der Pipeline belässt. Die Ausgabe ist implizit.quelle
($_,' '*$_)[+$_-in48..57]
- egal was ich ändere, es scheint für mich zu scheitern.space
mito
und barfs multiplizieren .GNU sed ,
113112 BytesGrundlegende Codierung, speichert 3 Leerzeichen als
S
,\n
als@
und 5 Unterstreichungen alsU
. Ich werde weiterhin versuchen, Kombinationen zu finden, um etwas kürzeres zu finden.Probieren Sie es online!
Die einfache Lösung zum direkten Drucken der Zeichenfolge ist unten angegeben. Es hat 136 Bytes, was zu einer Komprimierung von 18% unter Verwendung des obigen Kodierungsschemas führt.
Probieren Sie es online!
quelle
ss
alsS
spart 1 Byte.S
3 Speicherplätzen gefunden, neins
. Ich denke, ich bearbeite dieses stattdessen, da es die gleiche Anzahl von Transformationen enthält.MATL,
8786838278 BytesDiese Lösung zerlegt den Kaffee in zwei Teile: die "Blasen" und die Tasse. Um die Blasen zu erzeugen, erstellen wir eine dünne Matrix mit 111 an drei Stellen und wandeln sie in ein Zeichenarray um
Für die Becherkomponente setzen wir auf String-Komprimierung
Beide Komponenten werden auf die Ausgabe gedruckt, und zwischen den Komponenten wird automatisch eine neue Zeile eingefügt
Probieren Sie es bei MATL Online aus
quelle
Python 2 ,
128127 Bytes-1 Byte dank Rod (Multiplikation des Tupels verwenden
('_'*10,)
, um eine Deklaration zu vermeiden).Probieren Sie es online!
Hinweis: dieser doppelte Backslash wird vor dem Zeilenvorschub benötigt.
Alles zwischen
'''
und'''
ist eine einzelne Zeichenfolge, die beiden%s
sind Formatierer, die durch den Inhalt des nachfolgenden%(...)
Tupels ersetzt werden, das wiederum zwei Kopien'_'*10
der Tupel-Multiplikation enthält(...)*2
. Der'_'*10
führt eine String-Multiplikation durch, um zu ergeben'__________'
.Der Code durchläuft die Zeichen,
c
, dieser ganze Reihe mitfor c in '''...
und erstellt eine neue Zeichenfolge durch Verbinden (join(...)
)entweder die Anzahl der Räume , die durch identifiziert
c
,int(c)
wennc
eine Zifferoder
c
selbst- wird eine Ziffer identifiziert wird durch
'0'<c<':'
über zu speichernc.isdigit()
.quelle
u,u
mit('_'*10,)*2
und die Drop -u
DeklarationJava 8,
294289248 BytesGolf gespielt:
Im Geiste der Kolmogorov-Komplexität wird der auszugebende String dadurch nicht hartcodiert . Stattdessen wird die Tatsache ausgenutzt, dass es in vielen Fällen mehrere Leerzeichen gibt, denen ein druckbares Zeichen folgt. Es codiert die Anzahl der Leerzeichen, die einem Zeichen im höherwertigen Byte des Zeichens vorangehen, und das tatsächliche ASCII-Zeichen im niederwertigen Byte.
Ungolfed:
quelle
\u0641
.F
. Es sollte möglich sein, beides dort unterzubringen.0x
half, das Präfix zu verlieren .if
ist beispielsweise überflüssig) und etwa 1/6 der Größe zu entfernen.Befunge,
158105101 BytesProbieren Sie es online!
Die Zeichen in der Zeichenfolge werden zuerst als Indizes in eine Nachschlagetabelle der zehn möglichen Werte codiert. Die Indizes werden dann zu Paaren gruppiert, wobei jedes Paar zu einer einzigen Zahl (i1 + i2 * 10) im Bereich von 0 bis 99 kombiniert wird. Durch sorgfältige Auswahl der Reihenfolge der Nachschlagetabelle können wir sicherstellen, dass diese Werte immer gültig sind ASCII-Zeichen, die in einem String-Literal dargestellt werden können.
Dies ist eine Aufschlüsselung des Codes selbst:
Wir beginnen mit der Initialisierung des letzten Elements der Nachschlagetabelle mit einem Zeilenumbruchzeichen (ASCII 10).
Wir verwenden dann ein Zeichenfolgenliteral, um den codierten Inhalt auf den Stapel zu verschieben.
Schließlich durchlaufen wir die Werte des Stapels und dekodieren und geben jeweils zwei Zeichen aus.
Die letzte Zeile enthält die Nachschlagetabelle: Das 9. Element ist ein implizites Leerzeichen, und die 10. (neue Zeile) wird manuell festgelegt, wie bereits erläutert.
quelle
Retina , 71 Bytes
Anders als meine andere Antwort wurde diese von Hand geschrieben.
(Am Ende befindet sich ein Leerzeichen)
Probieren Sie es online!
Das Prinzip hat immer noch eine "komprimierte" Schnur, aus der die Tasse Kaffee durch Substitutionen rekonstruiert werden kann. Es stellte sich heraus, dass es sich nur lohnt, verschiedene Substitutionen zu versuchen:
=
wird zu__________
(10 Unterstriche)quelle
Common Lisp,
125123122120114 BytesIch habe 6 Bytes gespart, indem ich die Idee hatte, nur Eingaben in eine Zeichenkette anstelle von
~&
s zu schreiben.Verbesserungsvorschläge erwünscht.
quelle
Python3, 206 Bytes
quelle
s=' '
Variable und verwenden Sie sie.'o\n'
hat die gleiche Länge wie'o'+n
.print(*(' o',7*' '+'o',4*' '+'o',' '+10*'_','/'+10*' '+'\__','|'+3*' '+'J'+6*' '+'| \\','|'+4*' '+'A'+5*' '+'| |','|'+5*' '+'V'+4*' '+'| |','|'+6*' '+'A'+3*' '+'|__/','\\'+10*'_'+'/'),sep='\n')
oderfor x in(' o',7*' '+'o',4*' '+'o',' '+10*'_','/'+10*' '+'\__','|'+3*' '+'J'+6*' '+'| \\','|'+4*' '+'A'+5*' '+'| |','|'+5*' '+'V'+4*' '+'| |','|'+6*' '+'A'+3*' '+'|__/','\\'+10*'_'+'/'):print(x)
, beide sind 197. Noch länger ist als ein 136 Festcode .Pyth, 80 Bytes
Online-Dolmetscher hier verfügbar.
Einfache Lauflängendekodierung.
quelle
C - 179
Lösung mit umfangreicher Verwendung von Formatstrings:
Hier ist eine besser lesbare Version:
quelle
void g(){puts(" o\n o\n o\n __________\n/ \\__\n| J | \\\n| A | |\n| V | |\n| A |__/\n\__________/\n");}
Retina , 99 Bytes
Diese Lösung wurde mithilfe dieses Skripts automatisch generiert .
(in vielen Zeilen sind nachgestellte Leerzeichen)
Dies funktioniert, indem Zahlen 1, 2, 3, 4 anstelle einiger Zeichenfolgen verwendet werden, die in der Zielzeichenfolge wiederholt werden, und diese dann zurückgesetzt werden.
Ich weiß, dass man mehr Golf spielen könnte, wenn man diesen Code ändert oder die Herangehensweise komplett ändert, aber da die Kolmogorov-Meta-Golf-Herausforderung ein ziemlich enttäuschendes Ergebnis hatte, wollte ich versuchen, mein Skript für eine echte Herausforderung zu verwenden.
Probieren Sie es online!
quelle
3
und dann die Substitution bewegen , den er vor der 3. Sie können auch ändern2\n
zu2\n3
und diese Substitution zu bewegen, bevor der 3. Versuchen Sie es online!1\n__________
zu1\n_____
und jeder dann ändern1
im Haupt Substitution11
Online ausprobieren!Python 3.6
(nicht konkurrierend)Hier ist mein Versuch der Huffman-Codierung. Es ist definitiv weiter golffähig, wenn jemand die Idee aufgreifen möchte.
Das Literal könnte noch weiter komprimiert werden, indem es in base64 oder ein anderes konvertiert wird, und der Huffman-Baum könnte optimiert werden, um noch ein kürzeres Bitarray zu erhalten.
quelle
GameMaker-Sprache, 138 Byte
quelle
C 141 Bytes
Verwendung
Einfache Lösung, 148 Bytes:
quelle
PHP, 116 Bytes
Das sieht Arnauld sehr ähnlich - und tut so ziemlich dasselbe. Laufen Sie mit
-r
.quelle
zsh, 86 Bytes
Erklärung: Diese Zeichenfolge ist die gzip-komprimierte Java Cup ASCII Art. Ich benutze
printf
, weil mitecho
,zcat
eine Warnung ausgegeben wird undecho -e
ein Zeichen länger ist. Es funktioniert nicht mitbash
odersh
, weil sie denken, es ist eine Binärdatei. Da Sie diese Ausgabe nicht effektiv aus dem Browser einfügen können, finden Sie hier eine verwendbare Datei.quelle
Java 9 / JShell, 299 Byte
Ungolfed:
Verwendung in JShell:
Codiert jedes Zeichen als zehn Bits, bestehend aus der Anzahl der Leerzeichen vor dem Zeichen in den oberen drei Bits, gefolgt vom Codepunkt in den unteren sieben Bits.
(Da es nur drei Bits für die Zählung gibt, kann es nicht mehr als sieben aufeinanderfolgende Leerzeichen darstellen, und es gibt zehn Leerzeichen an einem Punkt in der Zeichenfolge. Diese werden als Anzahl von sechs codiert, gefolgt von einem Leerzeichen und dann einem Anzahl von drei, gefolgt vom nächsten Zeichen.)
Leider verliert es an dieser trivialen 140-Byte-Java-Lösung:
quelle
05AB1E , 85 Bytes
Probieren Sie es online!
quelle