Das ist Calvin . Ich versuche nur, 20 Wiederholungen zu erhalten, damit dieser Benutzer im PPCG Minecraft Server-Chatroom chatten kann .
Schreiben Sie ein Programm oder eine Funktion, die eine positive Ganzzahl enthält.
Wenn die Ganzzahl gerade ist (2, 4, 6, ...), geben Sie diese genaue ASCII-Zeichenfolge aus oder geben Sie sie zurück:
__ __ __ __ ___
/\ /\ | |\ | | / | | /\ | |
/ \/ \ | | \ | |-- | |--\ /__\ |-- |
/ \ | | \| |__ \__ | \ / \ | |
Wenn die Ganzzahl ungerade ist (1, 3, 5, ...), drucken Sie diese genaue ASCII-Zeichenfolge oder geben Sie sie zurück:
__ __
\ / | | /| | / | / \ __ / | |
\ /\ / | | / | |-- | |--/ \ / |-- |
\/ \/ | |/ | |__ \__ |__| \/ |__ _|_
Sie können davon ausgehen, dass die Eingabe immer eine positive Ganzzahl ist.
In beiden Ausgabefällen kann optional eine beliebige Anzahl von nachgestellten Leerzeichen bis zum rechten Rand des "T" in jeder Zeile und / oder eine einzelne nachgestellte neue Zeile vorhanden sein. Beachten Sie, dass zwischen jedem Buchstaben zwei Spalten mit Leerzeichen stehen.
Der kürzeste Code in Bytes gewinnt.
quelle
Antworten:
JavaScript (ES6),
343336289267265260 BytesNur zum Spaß ... :) (Danke an Xufox für das Abschneiden von 46 Bytes und die Ermutigung, mir selbst 37 Bytes abzuschneiden.)
Genannt als
a(4)
oder ähnlich. Probieren Sie es hier aus:Code-Snippet anzeigen
Ich habe das Leerzeichen in Ziffernfolgen von
2
bis zusammengefasst8
(z. B.887
= 23 Leerzeichen). Jede Ziffer wird dann durch die entsprechende Anzahl von Leerzeichen ersetzt.0
repräsentiert| |
und1
repräsentiert__
. Alles in allem ist dieses Programm 170 Bytes kürzer als die beiden Strings zusammen (203 + 227 = 430), also bin ich glücklich. :)Edit: Irgendwie ist es genau so lang wie der einzige andere Eintrag an dieser Stelle .... o_o
Edit 2: Gespeicherte etwas Platz , indem
n%2<1?
ann%2?
und die Saiten tauschen. Nutzte auch die Tatsache, dass die Anfänge der beiden Zeichenfolgen gleich sind, um weitere 5 Bytes zu reduzieren.Edit 3:
|2|
schien eine Menge zu zeigen, so dass jedes Vorkommen vereinfachtx
wurde und 7 Bytes gespart wurden. Die Vorschläge von Xufox haben weitere 40 Byte abgeschnitten.Edit 4: Der Vorschlag von Xufox, durch
\n
tatsächliche Zeilenumbrüche zu ersetzen , hat sich ausgezahlt und 6 Bytes von der Gesamtsumme entfernt. Durch das Ändern vonx
zu0
und__
zu1
(böses Lachen hier einfügen) und anschließendes Kombinieren aller Elemente (Regex-Plural hier einfügen), wie er es in seinem Eintrag getan hat, wurden zusätzliche 16 Byte gespart.Bearbeiten 5: Da ich mich für die Verwendung der ES6-Standards entschieden habe, habe ich eine benutzerdefinierte Vorlagenzeichenfolge-Interpolation verwendet, um 2 letzte Bytes zu entfernen.
quelle
.replace(/\d/g,d=>' '.repeat(d))
?\n
ein Byte pro Zeilenumbruch zu sparen?Matlab,
343341Die eingegebene Nummer wird von stdin bereitgestellt.
Probelauf:
quelle
CJam,
158149145138 BytesOben wird die Caret-Notation verwendet, da der Code nicht druckbare Zeichen enthält.
Probieren Sie es online im CJam-Interpreter aus .
Wenn der Permalink in Ihrem Browser nicht funktioniert, können Sie den Code aus dieser Paste kopieren .
Beispiellauf
Idee
Anstatt den MINECRAFT-String (gepolstert, um eine konstante Zeilenlänge zu erreichen) direkt zu codieren, werden wir eine "gezippte" Version davon codieren, bei der Zeilen und Spalten transponiert wurden.
Nach dem Zippen und Entfernen der Zeilenvorschübe muss dieser String (nennen wir ihn R ) codiert werden:
Da es viele Läufe von Leerzeichen gibt, ersetzen wir jedes Vorkommen eines Leerzeichentripels durch einen Zeilenvorschub.
Dies lässt uns sieben verschiedene Zeichen (
\n -/\_|
) übrig, daher weisen wir jedem von ihnen eine Zahl von 0 bis 6 zu und betrachten die resultierenden Array-Ziffern einer Zahl zur Basis 7, die wir dann als Byte-Zeichenfolge kodieren.Die Dekodierung erfolgt in umgekehrter Reihenfolge.
Die gespiegelte Zeichenfolge kann aus der ursprünglichen Zeichenfolge erstellt werden.
Wenn wir die Reihenfolge der vier Zeilen umkehren und die Solidusen tauschen, erhalten wir Folgendes:
Irgendwie ähnlich, aber wir müssen die Reihen eindeutig drehen, um die untere Reihe nach oben zu bringen:
Das wäre es, wenn es nicht diese nervigen Unterstriche gäbe.
Wenn wir die ursprüngliche Zeichenfolge von oben nach unten lesen und Zeilenvorschübe ignorieren (um R zu erhalten ) und jeden Unterstrich gefolgt von einem Leerzeichen durch ein Leerzeichen gefolgt von einem Unterstrich ersetzen, bevor wir die Zeilen verschieben, ist dies das Ergebnis:
Viel besser! Alles, was Sie tun müssen, ist, das erste Leerzeichen der ersten Zeile zu löschen (alle Unterstriche in der ersten Zeile um ein Zeichen nach links verschieben), die falsch platzierten Unterstriche in E und C um eine Zeile nach oben zu verschieben und den Unterstrich über T zu verwerfen .
Code
quelle
Pyth - 182 Bytes
Verwendet den Basiscodierungsansatz. Da die Indizierung in Pyth modular aufgebaut ist, muss ich nicht einmal etwas für die gerade Ungerade tun, sondern muss es nur in die richtige Reihenfolge bringen und verwenden
@Q
. Als Bonus funktioniert dies auch bei negativen Zahlen.Ich hatte versucht, nur die erste zu codieren, dann die Schrägstriche umzudrehen und zu vertauschen, aber die erste und letzte Zeile waren zu hart.
Ich könnte 6 Bytes einsparen, indem ich tatsächlich null Bytes in den Code stecke, aber das ist zu viel Mühe.
Probieren Sie es hier online aus .
Es sieht online wirklich schlecht aus, weil das Ausgabefeld zu klein ist und umbrochen wird. Ich empfehle, mit der Dev-Konsole zu fummeln und die
col-md-5
auf a zu änderncol-md-7
.quelle
JavaScript (ES6),
312,285,281,272,270,263,262260Informationen zu früheren Änderungen finden Sie im Bearbeitungsverlauf .
Edit 5: Bei der Konvertierung habe ich die mit
-
(jetzt 0) und Whitespace (jetzt 1) verknüpfte Nummer gewechselt . Im resultierenden Block wurden die Nummern 1, 2 und 3 nicht mehr so oft verwendet. Dadurch konnte ich ein Array mit den fehlenden Zahlen verwenden.Edit 6: Das Array-Literal wurde verbessert. Ich habe versucht , diese vorher, aber verwendet
777
und77
als Zeichenketten anstelle von Zahlen und bemerkte erst jetzt , dass ich das verpasst hatte.Bearbeiten 7: Der "Golfed Code" ist eine Funktion, wie in der Frage angegeben, und es besteht keine Notwendigkeit
f=
, diese Spezifikation zu erfüllen. So wird es entfernt und zwei Bytes gespart.In Firefox 39 lauffähig:
Es basiert auf dem Zahlensystem der Basis 6 und jedes ASCII-Zeichen steht für eine Zahl:
Dann habe ich die Zahlendarstellung jeder ASCII-Zeichenfolge kombiniert. Beispiel: Wenn die erste ASCII-Zeichenfolge
/
an einer Position ein und die andere\
an derselben Position ein enthält , wird diese Position zur32
Basis 6 (20
in Dezimalform). Wenn Sie dies in Basis 36 konvertieren (um eine Basis-36-Zahl für jeweils zwei zu erhalten) Basis-6-Zahlen zu erhalten), erhalten Siek
.All dies wurde im Voraus durchgeführt und die Funktion macht diesen Vorgang im Wesentlichen rückgängig.
Nun haben die beiden JavaScript-Antworten jeweils eine andere Antwort, die die gleiche Byteanzahl hat ...PS: Als Hinweis für mich und als Verweis auf andere ist dies der Code, den ich verwendet habe:
quelle
~NaN == -1
?![…][x]+77
,77
keine Zeichenfolge mehr sein müssen), aber die zusätzliche Umkehr in der golfed Code es hat sich nicht gelohnt ...isNaN
mit1+
und~~(i/6)
mit ersetzeni/6|0
.f=
am Anfang nicht hast , aber ich tue es. Ich habe auch gelesen, dass es akzeptiert wird, es zu entfernen, also mache ich es selbst, und jetzt habe ich 260 Bytes. ;)CJam, 136 Bytes
Oben wird die Caret-Notation verwendet, da der Code nicht druckbare Zeichen enthält.
Der Zeilenumbruch dient ausschließlich der "Lesbarkeit". Probieren Sie es online im CJam-Interpreter aus .
Wenn der Permalink in Ihrem Browser nicht funktioniert, können Sie den Code aus dieser Paste kopieren .
Beispiellauf
Idee
Dieser Ansatz hat einige Ähnlichkeiten mit dem in meiner anderen Antwort , ist jedoch viel einfacher und (ziemlich enttäuschend) etwas kürzer.
Wir suchen nach einer Möglichkeit, die folgende Zeichenfolge zu codieren:
Nach dem Auffüllen jeder Zeile (um eine konstante Zeilenlänge zu erreichen), dem Zippen (Vertauschen von Zeilen und Spalten) und dem Entfernen der Zeilenvorschübe muss diese Zeichenfolge codiert werden:
Wir werden jedes Teilzeichen ersetzen
" |||"
mit einem 0 , jede Teilkette" "
mit einem 1 und den Zeichen des"/-_\| "
mit 2 zu 7 , eine Anordnung von Basis 8 Stellen bilden, die als ein Byte - String codiert werden kann.Die Dekodierung erfolgt in umgekehrter Reihenfolge.
Code
quelle
Schläger,
443434386 BytesNur zum Spaß.
Hinweis: Möglicherweise benötigen Sie die
#lang racket
Leitung, um in DrRacket ausgeführt werden zu können.quelle
05AB1E ,
179177176 BytesProbieren Sie es online aus.
Erläuterung:
ist die komprimierte Zahl :
Probieren Sie es online aus.
7в
konvertiert es in Base-7 als Liste, so dass wir die Liste der Ziffern erhalten:Probieren Sie es online aus.
è
Indiziert jede Ziffer in der Zeichenfolge"\n-/\_|"
undJ
fügt dann die gesamte Liste zusammen. Dadurch erhalten wir Folgendes:Probieren Sie es online aus.
2ä
Teilt die Zeichenfolge in zwei Teile.Iè
Nehmen Sie die Eingabe und indizieren Sie sie (mit automatischem Wrap-Around), um einen der beiden Teile zu erhalten, der dann implizit ausgegeben wird.Ein großes Dankeschön an @MagicOctopusUrns ASCII-Kompressor , mit dem die komprimierte Zahl und das Base-7-Transliteral generiert wurden. Probieren Sie es online aus. (Nach dem der transkribieren wurde durch Umkehren der Zeichenfolge und Nummer auf dem Stapel golfed, indem
в
stattB
es eine Liste von Ziffern zu machen, und der Index in den String mitè
.quelle
C 251 Bytes
Dies ist eine Funktion
k
, die einen Parameter empfängt und die Nachricht an ausgibtstdout
.Eine lesbarere Version:
Zunächst wird eine leere Nachricht vorbereitet (mit Leerzeichen gefüllt). Für jedes Zeichen (zB
|
oder-
) gibt es eine Liste mit Positionen, an denen dieses Zeichen platziert werden kann.Wenn für jede Position die umgekehrte Version gedruckt werden soll, wird die Position umgekehrt. Das heißt, seine vertikale Koordinate
y
wird durch4-y
oder ersetzt3-y
(abhängig davon, ob das Zeichen ein Unterstrich ist). Auch die Richtungen der Schrägstriche werden gekippt - dies erfolgt durch einXOR
mit115
.Diese Kontrollstruktur wird auch zum Platzieren der Zeilenumbruchzeichen verwendet. Es scheint effizienter zu sein, der Liste 4 weitere Koordinaten hinzuzufügen, als eine explizite Schleife zu schreiben.
Es gibt ein paar kleinere Probleme mit diesem System. Zunächst sieht der letzte Buchstabe T in der gedrehten Fassung etwas anders aus:
Um es korrekt auszugeben, muss der Code das platzieren
|
Zeichen nach den_
Zeichen platzieren.Um sicherzustellen, dass die Steuerzeichenfolge nur ASCII-Zeichen enthält, habe ich sie außerdem codiert:
37
hinzugefügt, um sie in den ASCII-Bereich 32 ... 127 zu verschieben. Ich könnte eine kleinere Zahl hinzufügen,37
vermeidet aber Zeichen wie"
und\
, die in String-Literalen maskiert werden müssen.-
Zeichen an Position 137. Um dies zu berücksichtigen, habe ich an einer-
anderen Stelle (79) ein künstliches Zeichen hinzugefügt , das später überschrieben wird - das Zeichen|
erscheint auch an Position 79.Eine andere lustige Sache war, dass ich
puts
die Zeichenfolge nicht ausgeben konnte - dies würde eine zusätzliche nachgestellte Newline erzeugen. Also habe ich benutztprintf
stattdessen verwendet.Außerdem kommt die Zahl
57
im Golf-Code viermal vor - der scheinbar langatmige Ausdruck(w%2?4-i/6-p/57:p/57)*57+p%57
ermöglicht es, die Variable zu entferneny
, wodurch der Code kürzer wird.quelle
Perl,
292259246 BytesEs macht sich die Tatsache zunutze, dass die beiden Zeichenfolgen größtenteils ähnlich sind (z. B. der gesamte IE und C) und die Zeichenfolge aus Zeichen besteht, die je nach angezeigter Version unterschiedlich angezeigt werden. zB m bedeutet "ein Schrägstrich vorwärts für die rechts aufwärts gerichtete Zeichenfolge, ein umgekehrter Schrägstrich in der umgedrehten Zeichenfolge". Es wird eine Transliterationsersetzung durchgeführt, um das richtige Zeichen anzuzeigen. Leerzeichen werden auch mit Zeichenfolgensubstitutionen in Lauflänge codiert.
mehrzeilig:
Idee:
Da die Ausgabe nur 22 eindeutige Spalten enthält, sollte es möglich sein, sie als 22 * 4 = 88 Zeichen mit einem Bereich von 0-17 (alle möglichen "Doppelbedeutungszeichen") zusammen mit einer 56-Zeichen-Suche zu speichern Tabelle mit einem Eintrag im Bereich von 0-21 pro Spalte. Theoretisch könnte dies mit <100 Bytes codiert werden, es ist jedoch schwierig, dies zu einem Nettogewinn zu machen, da der Code komplizierter zu decodieren ist.
quelle
CJAM, 206
Die beiden ASCII-Bilder sind Base-216-codiert, ein Byte = 3 Zeichen.
Teste es hier
quelle
Powershell,
275253248 BytesTestskript:
Ausgabe:
Hauptideen
Die Komprimierungsmethode ist die erweiterte Methode von CJam von Dennis ♦:
Das Skript zur Komprimierung:
Die Zeichenfolge vor der Komprimierung lautet:
quelle
SAS, 442 Byte
Nicht golfen:
Tests:
Könnte möglicherweise ein bisschen Code einsparen, indem sie in Eingabeblöcke eingefügt werden, aber das fügt die Einschränkung hinzu, dass das Makro nur einmal pro Datenschritt sein kann, was meiner Meinung nach den Geist des Schreibens als Makro verletzt. (Und ich vermute, das Hinzufügen einer Eingabeaufforderung, um Eingaben in den Datenschritt zu erhalten, fügt mehr Zeichen hinzu).
quelle
Bash, 247 Bytes
Zeichenfolgen werden verkettet und gziped.
quelle
PHP, 225 Bytes
Hässliche Brute-Force-Lösung.
Ich habe dann base64 komprimiert und die anzuzeigenden verketteten Zeichenfolgen codiert. Der Code dekodiert, dekomprimiert und teilt ihn in Stücke von 224 Zeichen. Die erste Zeichenfolge besteht aus 224 Zeichen ohne abschließende Zeile, die zweite aus 201 Zeichen (auch ohne nachfolgende Zeile). Die Parität des Befehlszeilenarguments (
$argv[1]%2
) wird als Index in dem von generierten Array verwendetstr_split()
.quelle
Haskell, 138 Bytes
Das ist ein bisschen hacken. Ich forciere den SHA256-Hash der Concatination der beiden Minecraft-Texte und teile sie dann auf und wähle den passenden Text basierend auf Parameter x aus. Dies ist natürlich sehr unpraktisch und kann nicht in Echtzeit berechnet werden. Soweit ich weiß, kann es sogar zu Kollisionen kommen.
Da Haskell die ASCII-Darstellung dieses Hash in einer Zeichenfolge nicht haben kann, lese ich sie aus einer Datei mit dem Namen "a" und habe daher meiner Punktzahl 32 Bytes hinzugefügt.
Erklärung:
Erstellt eine Liste mit jeder Kombination der Buchstaben "/ \ | _-" aus 425 Buchstaben (die Länge beider Minecraft-Texte zusammen).
Wählen Sie den ersten, der zum Hash passt
Der erste Text ist 225 Buchstaben lang, der andere genau 200.
quelle
Javascript (ES6),
403296 Bytes(Aus meiner vorherigen Antwort ) Eine neue Methode ausprobieren:
Beachten Sie, dass es einige nicht druckbare Zeichen gibt. diese wurden ersetzt durch zb
\x83
.Die Codierung selbst ist ca. 40 Byte kürzer als die andere, der Decodierungsprozess ist jedoch aufwändiger. Ich habe das Base-216-System verwendet, mit dem andere den Text verschlüsselt haben. Als Referenz ist hier der Code, den ich verwendet habe:
Dabei wird im Grunde genommen der ASCII-Text (vorkonvertiert auf Basis 6) verdreifacht und in Basis 216 geändert. Anschließend werden 53 hinzugefügt, um die meisten nicht druckbaren Zeichen zu entfernen.
Vorschläge willkommen!
Hier ist der ursprüngliche 403-Byte-Code:
Mit einer
for
Schleife, einerwhile
Schleife, vier Variablen, die nur einmal verwendet wurden, und einer Menge langer Algorithmen für einfache Dinge. Junge, habe ich mich verbessert ...quelle
y=[' ','/','|','\\','_','-'],
und statty[x]
schreiben' /|\\_-'[x]
. =)Python, 312 Bytes
Funktion druckt die Ausgabe mit einem Int
quelle
C 321 Bytes
Codierte die Wiederholung und den Zeichenindex in eine Zeichenfolge.
quelle
Python 3, 486
533612quelle
PHP , 263 Bytes
Probieren Sie es online!
quelle
Ruby, 290 Bytes
Wahrscheinlich ein schwacher und verbesserungsfähiger Eintrag. Grundsätzlich eine sehr einfache (handgefertigte) Komprimierung, bei der Kleinbuchstaben bedeuten, dass viele Leerzeichen (tatsächlich ord (ch) - 'A' Leerzeichen) und Großbuchstaben nur einige gebräuchliche Begriffe sind, die einige Bytes einsparen.
quelle
SOGL V0.12 ,
7271 BytesProbieren Sie es hier aus!
Die vertikale Spiegelung von SOGL hat dafür perfekt funktioniert.
quelle
Canvas , 70 Byte
Probieren Sie es hier aus!
quelle