Vielen Dank an @KritixiLithos, der mir bei dieser Herausforderung geholfen hat !
V ist eine Programmiersprache, die ich geschrieben habe, um vim für Code-Golf-Herausforderungen zu verwenden und zu erweitern. Das allererste Commit fand am 3. März 2016 statt, was bedeutet, dass V heute ein Jahr alt wird! Woo-hoo
Im ersten Jahr des Bestehens von V gab es 176 Commits von vier verschiedenen Mitwirkenden, 140 Antworten von 12 verschiedenen Benutzern und zu viele fehlerhafte Duplikatoperatoren, um gezählt zu werden . Es verfügt über einen Online-Dolmetscher , der großzügig von @Dennis gehostet wird und seit Dezember fast 8.000 Mal ausgeführt wurde .
Feiern wir den Geburtstag von V! Da die meisten Features in V auf String-Manipulation und Ascii-Art ausgelegt sind , scheint es nur selbstverständlich, dass sich jede Herausforderung, die V feiert, auf Ascii-Art bezieht. Ihre Herausforderung für heute besteht also darin, ein Wort als Eingabe zu nehmen und dieses Wort in die Form eines V umzuformen. Die Eingabe "Hallo" sollte beispielsweise das folgende V ergeben:
Hello olleH
Hello olleH
Hello olleH
Hello olleH
Hello olleH
HellolleH
HellleH
HeleH
HeH
H
Hier sind einige Details darüber, wie Ihr V aussehen sollte. Wenn die Eingabezeichenfolge n Zeichen lang ist, sollte das V n*2
Zeilen lang sein. Die allererste Zeile sollte bestehen aus:
<input string><(n*2) - 1 spaces><input string reversed>
In jeder neuen Zeile wird am Anfang ein Leerzeichen eingefügt, und die beiden Seiten der Zeichenfolge werden aufeinander zu bewegt, wobei sich überlappende Zeichen entfernt werden. Bis zur allerletzten Zeile, die nur das erste Zeichen der Eingabe ist. Es ist akzeptabel, in jeder Zeile Leerzeichen nachzustellen, und es ist auch zulässig, eine neue Zeile nachzustellen.
Sie können davon ausgehen, dass die Eingabe immer druckbares ASCII ohne Leerzeichen sein wird, und Sie können die Eingabe und Ausgabe in jeder angemessenen Methode vornehmen. Hier sind einige weitere Beispieleingaben:
Happy:
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
HappyppaH
HapppaH
HapaH
HaH
H
Birthday:
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
BirthdayadhtriB
BirthdadhtriB
BirthdhtriB
BirthtriB
BirtriB
BiriB
BiB
B
V!:
V! !V
V! !V
V!V
V
~:
~ ~
~
Da es sich um Code-Golf handelt , sind natürlich Standard-Lücken verboten und es ist Ihr Ziel, das kürzestmögliche Programm zu schreiben, um diese Aufgabe zu erfüllen. Viel Spaß beim Golfen!
Was auch immer es wert ist, ich habe ein Faible für VIM-Antworten, also imaginäre Bonuspunkte für die Verwendung von VIM oder V, obwohl jede Sprache akzeptabel ist. :)
Antworten:
MATL ,
2114 BytesMATL wünscht V alles Gute zum Geburtstag!
Probieren Sie es online!
Erläuterung
Betrachten Sie die Eingabe
der Länge
n=5
. Der Code berechnet die 2D-Faltung dieser Zeichenfolge mit der Identitätsmatrix der Größe2*n
.Das Ergebnis der Faltung, konvertiert in char und mit char 0 als Leerzeichen, ist
Dann werden die Spalten
[1, 2, ..., 2*n-1, 2*n, 2*n-1, ..., 2, 1]
aus dieser Zeichenmatrix ausgewählt, um das gewünschte Ergebnis zu erzielen:Kommentierter Code
quelle
V ,
24, 23, 20 BytesProbieren Sie es online!
Viel kürzer jetzt, da V einen "Rückwärts" -Operator hat .
Nicht so beeindruckend im Vergleich zu den anderen Golfsprachen, die geantwortet haben, aber es musste getan werden. Hexdump:
Erläuterung:
Zu diesem Zeitpunkt sieht der Puffer folgendermaßen aus:
Nein, wir bauen das Dreieck rekursiv ab.
Hier kann ich eines meiner Lieblingsmerkmale von V demonstrieren. Viele Befehle erfordern ein Argument. Beispielsweise wird der
>
Befehl abhängig vom Argument eine variable Anzahl von Zeilen einrücken:Die meisten Befehle müssen jedoch mit einem Standardargument (normalerweise der aktuellen Zeile) enden, wenn es sich am Ende des Programms befindet und nicht angegeben ist. Was V beispielsweise für unsere rekursive Schleife tatsächlich ausführt, ist:
Das zweite
ò
ist implizit ausgefüllt. Das Coole ist, dass implizit beendete Befehle mehrere Ebenen tief anwenden. Obwohl wir nur geschrieben haben>
, wird V implizit_
für das Argument angeben und die aktuelle Zeile einrücken.quelle
Brainfuck , 152 Bytes
Dies ist eine so bedeutsame Gelegenheit, dass ich mich entschlossen habe, den alten BF-Interpreter zu knacken und es zu versuchen.
Mit Kommentaren
Probieren Sie es online!
quelle
> <> 221 Bytes
Ich verbrachte Art und Weise zu viel Zeit zu diesem Thema . Alles Gute zum Geburtstag V!
Sie können es online ausprobieren , aber es macht viel mehr Spaß, diesen Interpreter zu bekommen und ihn unter Verwendung der
--play
Flagge auszuführenDaraus ergibt sich die Animation unten.
Beispiel
(es dauert etwas weniger als zwei Minuten)
Erläuterung
Da der interessante Teil dieser Antwort darin besteht, sie in
V
Form zu bringen, finden Sie hier eine Erklärung, die dieser entspricht. Wir verwenden die folgende zeilennummerierte Version als Referenz.Manchmal werden Pfeile (→ ↓ ←) verwendet, um die Richtung anzugeben, in der ein Snippet erreicht wird.
Initialisierung
In der ersten Zeile wird 2n auf [0,1] verschoben, n auf dem Stapel belassen und ein Leerzeichen angehängt. Als nächstes gehen wir nach oben und biegen in die zweite Zeile rechts ein, wo wir anfangen, nach links zu gehen. Es gibt eine Schleife zum Anhängen von n + 1 Leerzeichen. Das funktioniert wie folgt.
Nachdem dies abgeschlossen ist, springt es nach unten zu Zeile 3. Dort werden die beiden obersten Stapelelemente (0 und ein Leerzeichen) entfernt (
~~
) und wir springen zuX
Position [10,1] (a1.
), wobei wir uns nach rechts bewegen. Wir stoßen an der/
, biegen in Zeile 7 ab und starten die Hauptprogrammschleife.Hauptschleife ( 2n mal)
Dies ist die Schleifenbedingung. Zunächst wird der Stapel zum Drucken umgekehrt. Dann erhalten wir den Zähler von [1,0] (
01g
) und speichern eine dekrementierte Version (:1-01p
). Indem wir uns abkoppeln und anstoßen, stoßen wir auf die Bedingung zum Beenden des Programms. Wenn wir nicht abbrechen, springen wir in die erste Druckschleife.Erste Druckschleife (linke Hälfte)
Wir beginnen mit der Länge oben auf dem Stapel und führen den folgenden Code aus, solange das oberste Element nicht 0 ist.
Dadurch wird der Stapel gedruckt, ohne ihn zu verwerfen. Wenn die Schleife endet, springen wir in Zeile 5 nach rechts und bereiten uns auf die nächste Druckschleife vor.
Vorbereitung der rechten Hälfte
Dies war eines der am schwierigsten zu montierenden Teile. Unten ist eine Version ohne Umbruch, um anzuzeigen, was passiert.
Wir verschieben dann die Länge des zu druckenden Textes und starten die zweite Druckschleife (mit einem anfänglichen Duplikat, das nicht Teil der Schleife ist).
Zweite Druckschleife (rechte Hälfte)
Der Code, der ausgeführt wird, ist völlig derselbe wie in der ersten Druckschleife, wobei der Code
o}
etwas weiter platziert wird, weil es verfügbare Stellen gibt. Am Ende müssen wir noch ein paar Dinge erledigen, bevor wir die Hauptschleifeninvariante erneut überprüfen können. Nachdem die~
Zeile 9 ausgeführt wurde, werden wir vertikal herumlaufen und am folgenden Codeteil enden.Zuerst
ao
wird eine neue Zeile gedruckt. Dann hüpfen wir auf und kommen nach der Initialisierung genau an der gleichen Stelle an, nämlich beim Springen zumX
.quelle
Brain-Flak , 486 + 1 = 489 Bytes
Alles Gute zum Geburtstag V von Brain-Flak!
Auch ein Dankeschön an 0 ', der einen Teil des in dieser Antwort verwendeten Codes zur Verfügung gestellt hat
+1 aufgrund des
-c
Flags, das für ASCII in und out benötigt wirdProbieren Sie es online!
Dies ist ohne Zweifel das Schwierigste, was ich jemals in Brain-Flak gemacht habe.
Brain-Flak ist bekanntermaßen für das Duplizieren und Umkehren von Saiten schrecklich, und diese Herausforderung besteht nur aus dem Duplizieren und Umkehren von Saiten.
Ich habe es geschafft, dieses fast funktionierende Snippet in weniger als einer Stunde harter Arbeit zu bekommen, aber das Hinzufügen in den letzten paar Stellen hat sich als eine der schwierigsten Dinge herausgestellt, die ich jemals in Brain-Flak getan habe.
Erläuterung
Die Grundidee ist, dass wir zuerst die Spitze des V erstellen und bei jeder Iteration zwei Zeichen aus der Mitte entfernen und dem Anfang ein Leerzeichen hinzufügen.
In der Praxis wird dies ziemlich schwierig.
Es gibt vorhandene Algorithmen zum Kopieren und Umkehren, daher habe ich einen davon verwendet, um eine umgekehrte Kopie des Codes im Offstack zu erstellen. Sobald ich das getan habe, setze ich
2n-1
Leerzeichen auf den ursprünglichen Stapel und lege den Stapel wieder auf den Stapel, um ein Sandwich zu erstellen.Jetzt haben wir unsere oberste Reihe. Jetzt wollen wir zwei Zeichen vom Anfang entfernen und ein Leerzeichen nach vorne einfügen. Dies ist der schwierigste Teil. Der Grund dafür ist, dass wir im Wesentlichen zwei Werte speichern müssen, einen für die Tiefe des aktuellen Snippets und einen für die Tiefe in der Mitte des V, in der die Löschung erfolgen muss.
Das ist schwer.
Aufgrund all der Duplizierungen und Umkehrungen, die auf beiden Stapeln stattfinden, sind sie die ganze Zeit in vollem Einsatz. Es gibt wirklich keinen Ort auf diesen Stapeln, an dem man etwas unterbringen könnte. Selbst mit der gesamten dritten Stapel-Magie der Welt können Sie nicht die Art von Zugriff erhalten, die Sie zur Lösung dieses Problems benötigen.
Wie beheben wir das? Kurz gesagt, wir tun es nicht wirklich. Wir ignorieren die Leerzeichen fürs Erste und korrigieren sie später. Wir werden dem Code Nullen hinzufügen, um zu markieren, wohin die Leerzeichen gehen sollen, aber ansonsten werden wir eigentlich nichts tun.
Also machen wir bei jeder Iteration eine Kopie der letzten Iteration und legen sie in den Offstack. Wir verwenden die Tiefe, die wir gespeichert haben, um diese in zwei Hälften zu teilen, sodass wir die linke Hälfte des V auf dem rechten Stapel und die rechte Hälfte des V auf dem linken Stapel haben. Wir entfernen zwei Elemente und fügen sie wieder zusammen. Wir fügen eine neue Zeile für eine gute Messung hinzu und starten die nächste Iteration. Jedes Mal, wenn die Tiefe zur Mitte des V um eins abnimmt und es auf Null trifft, stoppen wir die Schleife.
Jetzt haben wir den Großteil des V aufgebaut. Es fehlen uns jedoch die richtigen Räume und unser V ist derzeit ein bisschen (gelesen: vollständig) auf dem Kopf.
Also drehen wir es um. Um es auf den anderen Stapel zu drehen, müssen wir jedes Element einzeln verschieben. Während wir Elemente bewegen, prüfen wir, ob Nullen vorhanden sind. Wenn wir einem begegnen, müssen wir die Räume dorthin zurückversetzen, wo sie hingehören. Wir setzen die Null und fügen eine Menge Leerzeichen hinzu. Woher wissen wir, wie viele? Wir behalten den Überblick; Das Umdrehen eines Stapels im Gegensatz zum Duplizieren oder Umkehren eines Stapels ist eine sehr unintensive Aufgabe, sodass wir tatsächlich über den Speicher verfügen, um einen zusätzlichen Zähler zu speichern und darauf zuzugreifen, um zu verfolgen, wie viele Speicherplätze hinzugefügt werden müssen. Jedes Mal, wenn wir Leerzeichen hinzufügen, verringern wir den Zähler um eins. Der Zähler sollte in der letzten Zeile (am oberen Rand des V) auf Null stehen und somit können wir drucken.
Zuletzt bereinigen wir ein paar Dinge und beenden das Programm für die implizite Ausgabe.
quelle
-r
Flag hinzufügen ?-r
Flag hinzufüge, muss ich es tatsächlich ein weiteres Mal umkehren. Es wird spät, wo ich bin, aber ich denke, ich werde versuchen, dies morgen deutlich zu reduzieren. Wenn ich das Platzproblem beheben kann, werde ich definitiv die-r
Flagge verwenden.Jelly ,
1512 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Python 3 , 65 Bytes
Probieren Sie es online!
Python 2 , 65 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6),
1081069894 Bytequelle
n*2
vonn*4
(einschließlich der Zeilenumbrüche am Ende jeder Zeile). Ich berechne dann das Zeichen, das in jeder Zelle erscheinen soll.f=
und entfernens=>
.f=
ist nur ein Teil des Snippets, nicht die Antwort. Als solches ist es nicht in der Byteanzahl enthalten.Netzhaut ,
5147 BytesAlles Gute zum Geburtstag von einer anderen Sprache, die Saiten verarbeitet!
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online!
Erläuterung
Hiermit werden
n
Leerzeichen (wobein
die Zeichenfolgenlänge ist) angehängt , indem das Ende der Zeichenfolge abgeglichen, die Länge der Zeichenfolge mit abgerufen$.`
und ein Leerzeichen so oft mit wiederholt wird$*
.Wir duplizieren die gesamte Zeichenkette (durch einen Zeilenumbruch getrennt), indem wir das Ende der Zeichenkette erneut abgleichen und die Zeichenkette selbst mit einfügen
$`
.Dies kehrt die zweite Zeile um, indem von rechts nach links (
r
) abgeglichen wird und dann jeweils ein Zeichen abgeglichen wird (.
), wobei jedoch sichergestellt wird, dass alle Zeichen benachbart sind (\G
). Auf diese Weise kommen die Streichhölzer nicht über den Zeilenvorschub hinaus. Dies wird dann in einer Sortierstufe verwendet. Wenn Sie den$
Sortiermodus ( ) verwenden, aber jede Übereinstimmung durch eine leere Zeichenfolge ersetzen, erfolgt keine eigentliche Sortierung. Aufgrund der^
Option werden die Übereinstimmungen am Ende umgekehrt, wodurch die gesamte zweite Zeile umgekehrt wird.Diese Stufe ist für die Ausgabe vorgesehen und wirkt sich auch auf den Rest des Programms aus.
{
Wickelt die verbleibenden Stufen in eine Schleife, die wiederholt wird, bis diese Stufen die Zeichenfolge nicht mehr ändern (was passiert, weil die letzte Stufe nicht mehr übereinstimmt). Die;
Ausgabe wird am Ende des Programms deaktiviert. Das*
verwandelt diese Stufe in einen Probelauf, was bedeutet, dass die Stufe verarbeitet und das Ergebnis gedruckt wird, aber danach wird die vorherige Zeichenfolge wiederhergestellt.Die Bühne selbst entfernt einfach einen Zeilenumbruch und das vorhergehende Zeichen. Das gibt uns eine Zeile der gewünschten Ausgabe (beginnend mit der ersten Zeile).
Schließlich verwandelt diese Stufe jede Zeile in die nächste. Hierzu wird ein Leerzeichen vor dem ersten Nicht-Leerzeichen eingefügt, wobei das letzte Zeichen in der ersten Zeile sowie das erste Zeichen in der zweiten Zeile entfernt werden. Dieser Vorgang wird beendet, sobald in der ersten Zeile nur noch ein Leerzeichen vorhanden ist, das der letzten Zeile der Ausgabe entspricht.
quelle
s///
Zeichen, die sich summieren, längerer Zeichenfolgenumkehr und anderer Operationen, denen die Feinheiten von Retina fehlen. Gut zu lesen. +105AB1E , 12 Bytes
Probieren Sie es online!
Erläuterung
Oder für die gleiche Anzahl von Bytes aus der anderen Richtung.
Erläuterung
quelle
Japt,
22201614 + 2 BytesJapt wünscht noch viele erfolgreiche Golfjahre!
Benötigt die
-R
Flagge. Online testen!Erläuterung
Dies nutzt die
ç
undî
Funktionen, die ich vor ein paar Tagen hinzugefügt habe:Dennis 'Technik ist ein Byte länger:
quelle
GNU sed ,
110100 + 1 (r Flag) = 101 BytesEdit: 9 Bytes kürzer dank Riley
Sed wünscht V als weitere Saitenmanipulationssprache alles Gute!
Probieren Sie es online!
Erläuterung: Angenommen, die Eingabe ist der letzte Testfall ('V!'). Der Klarheit halber werde ich den Musterraum bei jedem Schritt anzeigen und Leerzeichen durch 'S' ersetzen.
quelle
Python, 110 Bytes
Probieren Sie es online!
Ich bin mir sicher, dass dies nicht optimal ist, aber es ist zumindest ziemlich pythonisch:
quelle
Jolf, 31 Bytes
Jolf wünscht V alles Gute zum Geburtstag!
Probieren Sie es hier aus!
␅
sollte 0x05 sein.Erläuterung
quelle
Kohle , 29 Bytes
Alles Gute zum Geburtstag V, von Ihrem Kollegen, der sich enttäuschend lange nach dieser herausfordernden ASCII-Kunstsprache sehnt!
Probieren Sie es online!
Erläuterung
Unsere Strategie: Drucken Sie die linke Hälfte des V von unten nach links oben; dann reflektiere es.
(Wenn nur Charcoal das Aufschneiden von Strings gehabt hätte ... leider scheint das noch nicht implementiert worden zu sein.)
quelle
CycleChop
der Fall, mit dem der Kopf des Strings extrahiert werden kann, wodurch 4 Bytes gespart werden. Es gibt jedoch einen besseren Ansatz, der 9 Bytes einspart. Weitere Einsparungen, von denen ich denke, dass sie zu der Zeit auch funktionierten:Reflect
Standardmäßig spiegeln sie ein weiteres Byte wider, und eine der Variablen ist für die erste Eingabe vordefiniert, wodurch zwei Bytes gespart werden.Pip ,
32-25BytesNimmt die Eingabezeichenfolge als Befehlszeilenargument. Probieren Sie es online!
Erläuterung
quelle
R mit Stringipaket, 225 Bytes
Wenn Sie R im interaktiven Code ausführen, geben Sie nach dem Einfügen meiner Antwort einfach etwas ein. Sie müssen das stringi R-Paket installieren (ich hoffe, es verstößt nicht gegen die Regeln).
Erläuterung:
Die Grundidee besteht darin, Leerzeichen an der linken Seite einzufügen und diese dann auf die richtige Länge zu schneiden. Fügen Sie es anschließend mit der umgekehrten Version als rechte Seite ein. Hier ist eine längere, für Menschen lesbare Version der Funktion:
quelle
Ruby,
928985 BytesMein Verfahren bestand darin, das erste Zeichen aus der rechten Hälfte jeder Zeile zu entfernen, nachdem die erste Hälfte umgekehrt wurde. So was:
Ich bin es nicht gewohnt, Golf zu spielen, also lass es mich wissen, wenn ich etwas tun kann, um es kürzer zu machen.
quelle
Batch,
186185 BytesDie Zeilen 1 und 6 haben ein Leerzeichen am Ende. Bearbeiten: 1 Byte dank @ ConorO'Brien gespeichert.
quelle
@set
und entfernen Sie ihn@echo off
, und fügen Sie ihn@
nach Bedarf ein.set
mir 8 s genug Bytes erspart hätten, damit es sich lohnt.Haskell , 76 Bytes
v
ist die Hauptfunktion, einString
Argument zu nehmen und einString
Ergebnis zu geben.Probieren Sie es online!
Anmerkungen:
i
ist das ursprüngliche Argument / die ursprüngliche Eingabe.s
wird anfangsi
mitlength i
Leerzeichen angehängt.v i
ruft aufr s
und verbindet dann die Ergebniszeilen.r
gibt eine Liste vonString
Zeilen zurück.t
ists
mit dem letzten Zeichen abgehackt.r t
erzeugt die Zeilen mit Ausnahme der ersten, abzüglich des Anfangsabstands in jeder Zeile.quelle
v
. : Dunlines.r.((++)<*>(' '<$))
.Gelee , 13 Bytes
Probieren Sie es online!
Wie?
quelle
Ruby,
8583 Bytesbearbeiten: überschüssiges Leerzeichen entfernt
Ich fand es tatsächlich ziemlich schwierig, dieses Spiel in Ruby zu spielen. Nach dem Hinzufügen von Whitespace wird es zu einem ziemlich lesbaren Codeausschnitt erweitert:
quelle
s=ARGV[0];(s+=' '*s.size).size.times{|i|puts s+s[i..-2].reverse;s=' '+s[0..-2]}
MATLAB (R2016b),
223183 BytesZum ersten Mal Code Golf. Trinkgelder sind willkommen!
Programmausgabe:
Bearbeiten:
40 Bytes gespart dank Luis Mendo.
quelle
's'
ausinput
. Ich verstehe auch nicht, warum Sie verwendenevalc(disp(...))
, aber ich denke, Sie können nur aufcell2mat
diese Weise verwendenflip
ist kürzer alsend:-1:1
, siehe hierPHP,
959285807877 BytesAnmerkung: Verwendet die IBM-850-Codierung
Laufen Sie wie folgt:
Erläuterung
Optimierungen
str_pad
standardmäßig Leerzeichen, was wir brauchen)substr
~"0"
Fall nicht berücksichtigt werden muss (ASCII 207), da angenommen werden kann, dass alle Eingaben druckbar sind (Thx @Titus).quelle
echo$s,strrev($s=" $s"^$s^$s),~§;
spart 5 Bytes.~$s[$i++]
ist ausreichend (Eingabe ist druckbar ASCII, und so ist$s
)JavaScript (ES6),
169157 Bytes(-10 Bytes dank Conor O'Brien)
Eine rekursive Lösung. Ich bin neu in JavaScript, also sei bitte vorsichtig! Alle Golftipps werden sehr geschätzt. :)
Und natürlich alles Gute zum Geburtstag
V
!Testschnipsel
Code-Snippet anzeigen
quelle
s.split("")
kann geändert werden , um[...s]
, unda.join("")
kann wordena.join
durch ein Paar von Backticks gefolgt. Sie können weitere 3 Bytes speichern, indem Sie[r='repeat']
und[r]
durch einfaches 'Wiederholen' ersetzen , dasselbe mitslice
.CJam , 26 Bytes
Alles Gute zum Geburtstag von deinem alten Kumpel CJam!
Probieren Sie es online!
Erläuterung
quelle
PowerShell,
126 Bytes124 BytesRufen Sie es mit einem einzelnen Parameter auf, z
.\V.ps1 Hello
.Bearbeiten: 2 Bytes mit Tipp von AdmBorkBork gespeichert
quelle
$l=($s="$args")|% Le*;
Pyke , 14 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6), 94 Byte
Testfälle
Code-Snippet anzeigen
quelle
J, 44 Bytes
quelle
|."0 1
bis|."{
(2 Bytes gespeichert)