Jeder kennt wahrscheinlich das folgende Lied , das eine musikalische Runde ist :
Hintergrund
Weniger Leute erinnern sich vielleicht daran, mit ein paar Freunden versucht zu haben, die 4-Personen-Version davon zu singen, und scheitern. Das Versetzen der Texte eines Songs mit verschiedenen harmonischen Tonhöhen wird als "Runde" bezeichnet, und genau das wollen wir heute mit statischer Ausgabe simulieren. Hier ist ein Beispiel von jemandem, der das Stück tatsächlich aufführt (Link zu Audio / Video, wird Ton haben) .
Die Herausforderung
Diese Herausforderung besteht darin, den Text genau wie folgt auszugeben:
Row, row, row your boat, |-----------------------------------|-----------------------------------|-----------------------------------
Gently down the stream. |Row, row, row your boat, |-----------------------------------|-----------------------------------
Merrily, merrily, merrily, merrily,|Gently down the stream. |Row, row, row your boat, |-----------------------------------
Life is but a dream. |Merrily, merrily, merrily, merrily,|Gently down the stream. |Row, row, row your boat,
-----------------------------------|Life is but a dream. |Merrily, merrily, merrily, merrily,|Gently down the stream.
-----------------------------------|-----------------------------------|Life is but a dream. |Merrily, merrily, merrily, merrily,
-----------------------------------|-----------------------------------|-----------------------------------|Life is but a dream.
Regeln
- Das nachgestellte Leerzeichen ist akzeptabel, aber nicht erforderlich, dies schließt Zeilenumbrüche ein.
- Bindestriche und Balken sind Teil der erforderlichen Ausgabe, ja.
- Kommas, Punkte, Großschreibung und alle syntaktischen Elemente, die sich auf die Grammatik beziehen, sind erforderlich.
Dies ist Code-Golf , der Code mit der niedrigsten Byteanzahl ohne Verwendung von Standardlücken ist der Gewinner.
code-golf
kolmogorov-complexity
Magische Kraken-Urne
quelle
quelle
Antworten:
05AB1E ,
8077 BytesProbieren Sie es online!
In Arbeit.
quelle
ª
? Egal, Urteilsspruch, brillant.vy
kann seinʒ
, ein Byte zu speichern.V ,
139, 128 BytesEin Einzeiler! (Art von: P)
Probieren Sie es online!
Hexdump:
Bekomme ich Bonuspunkte für die Landung genau auf
2^7
?Es dauerte eine Weile, bis ich es herausgefunden hatte. Ich hoffe, ich kann tonnenweise Golf spielen wie meine Tastatur-ASCII-Kunstantwort, aber ich bin nicht sicher. Wir werden sehen. Das sind sehr ähnliche Herausforderungen (und beide machen sehr viel Spaß: D)
Ursprünglich habe ich Folgendes versucht (180):
Probieren Sie es online!
Was fügt dies ein:
und dann macht Substitution, um es zu erweitern. Aber es im ASCII-Art- Stil zu bauen ist viel kürzer (und macht mehr Spaß, TBH)
quelle
0^(2^7)
Bonuspunkte für die Landung auf2^7
haha. Interessanter erster Gedanke allerdings an die 180er Version.Batch,
292288275 BytesBearbeiten: 13 Bytes wurden gespeichert, indem der Code neu geschrieben wurde, um eine Version des Teilstringtricks zu verwenden, den ich in meiner Retina-Antwort verwendet habe. Günstigerweise kann ich eine sechsmalige Schleife ausführen und dann eine siebte Iteration des Schleifenkörpers durchführen, was bedeutet, dass das für die Ausgabe von
|
s erforderliche Zitieren nicht zu lästig wird, ich muss jedoch darauf achten, das^
s bei der Auswahl der Teilzeichenfolge zu berücksichtigen .quelle
Python 3,
252235208206205 BytesAlso gut. Hier ist eine weniger langweilige Antwort:
Alte Antwort, 252 Bytes:
Langweilige Antwort, und die andere Python-Antwort ist kürzer, aber ich dachte, ich würde versuchen, wenn dieser Ansatz kürzer ist. Python 3 trotz der Einsparungen bei Byte / String 2-3 unterscheiden sich da beide
gzip
undbase64
sind in Python 2 beschissener.quelle
PowerShell ,
224207202 BytesProbieren Sie es online! (Die Ausgabe wird umgebrochen, wenn Ihr Bildschirm nicht breit genug ist.)
Meine Güte, diese Array-Generierungssache ist hässlich, hat aber 17 Bytes gespart, also ...
Wir machen eine Schleife von
0
bis6
. Bei jeder Iteration indizieren wir in ein Array(0,1,2,3,4,4,4)
. Die Indizierung basiert auf der aktuellen Ziffer, der aktuellen Ziffer+6
, der-1
und dann der-1
. Jedes von diesen wird dann durch eine Schleife geführt, mit der wir modulieren%7
. Wenn wir uns zum Beispiel0
in der äußeren0..6
Schleife befinden0,6,5,4
, dann sind%7
dies alle0,6,5,4
. Das ist in das(0,1,2,3,4,4,4)
Array indiziert , so ist die Ausgabe0,4,4,4
. Für Input1
bekommen wir1,7,6,5
dann1,0,6,5
welche Erträge1,0,4,4
. Und so weiter. (Dinge wären so viel einfacher, wenn wir eine.clamp
Funktion hätten)Diese werden einzeln in eine Schleife gespuckt
|%{}
. Bei jeder Iteration indexieren wir die richtige Stelle im Song-Lyrics-Array und belassen diesen String in der Pipeline. Diese Zeichenfolgen werden dann-join
zusammen mit|
bearbeitet, um die Ausgabezeile zu formatieren. Diese Zeichenfolgen verbleiben in der Pipeline und die Ausgabe ist implizit.Dank Value Ink konnten einige Bytes eingespart werden.
quelle
$a
11 Leerzeichen gespeichert haben , können Sie die vierte Zeile so ändern, dass sie mit$a
plus 4 Leerzeichen endet , anstatt mit$(' '*15)
-3 Byte, ja?JavaScript (ES8),
285256240231229217214213211210 BytesSparte ein paar Bytes, indem du einen Trick aus Arnauld's Antwort borgst
Versuch es
quelle
'0444,1044,2104,3210,4321,4432,4443'.split
,.map
spart Ihnen 10 Bytes. AuchpadEnd
ist nicht Teil des ES6 oder sogar ES7.PHP, 191 Bytes
Probieren Sie es online!
Erweitert
quelle
Python 2 , 199 Bytes
Probieren Sie es online!
Vielen Dank an @mathjunkie für das Speichern von 14 Bytes
quelle
'Merrily, merrily, merrily, merrily,'
könnte('merrily, '*4).capitalize()
richtig sein? Oder ist das nicht Python?'Merrily,'+' merrily,'*3
CJam ,
128122 BytesProbieren Sie es online!
Erläuterung
quelle
SOGL , 83 Bytes
Der 1. Teil
┌׀0ρMVxDrž|⁷ΨB≈π93|↑D~Νķ‰¤t╤▼ΣΗ⁶⅔¾№⁷Ζ÷│²╥Ν9°‘
ist eine komprimierte Zeichenfolge, die ergibtDies sind die umgekehrten Zeilen (da diese Zeile für Zeile gedruckt werden), wobei der "lustige" Teil ausgeschnitten wird, um im Programm ersetzt zu werden.
Der Rest des Programms:
quelle
/// , 200 Bytes
Probieren Sie es online!
Einfach, verwendet häufige Vorkommen als Ersatz.
quelle
PHP, 179 Bytes:
ungolfed
quelle
JavaScript (ECMAScript 2017),
191187182 Byte3 Bytes dank Shaggy gespart
quelle
'Merrily,'+' merrily,'.repeat(3)
spart ein Byte.padEnd
das nicht in ES7 ist, geschweige denn in ES6.M${s='errily, '}m${s}m${s}m
stattM${s='errily,'} m${s} m${s} m
spart 2 Bytes"Merrily,"+(s=" merrily,")+s+s
.Microsoft SQL Server, 421 Byte
Überprüfen Sie es online
quelle
C (GCC),
231230 Bytes-1 byte dank ceilingcat!
Ziemlich einfach. Zuerst wird das 7-Zeilen-String-Array erstellt, Teil über ein Makro, um den "lustigen" Teil zu zerlegen, dann werden die Strichzeilen mit einem ausgefüllt
memset
. Anschließend werden die Zeilen mit dem entsprechenden Offset und den entsprechenden Trennzeichen gedruckt.Probieren Sie es online!
quelle
MATLAB, 280 Bytes
Die Indizierung von Zellen-Arrays ist ziemlich kostspielig. Dies scheint der einfachste Weg zu sein, um einige Bytes zu verwerfen (falls möglich).
quelle
Retina ,
153 bis150 BytesProbieren Sie es online!
Ich habe es mit willkürlicher Lauflängencodierung versucht,
$1$*$2
tue aber nicht, was ich will, und das Wiederholen von Zeichenfolgen hat sich als zu schwierig erwiesen. Bearbeiten: 2 Bytes durch Codierungerrily,
und 1 Byte durch Entfernen eines unnötigen gespeichert^
.quelle
Python 2, 225 Bytes
Probieren Sie es online!
quelle
Perl 5 , 215 Bytes
Probieren Sie es online!
quelle
Swift ,
416406405380372307 BytesSie können es hier ausprobieren .
Vielen Dank an @Mr. Xcoder um mir 65 Bytes zu ersparen!
quelle
f
wie folgt ersetzenvar f=String.init(repeating:count:)
print(o())
anrufen,o()
weil Sie eineprint
Anweisung darin haben, die()
am Ende der Ausgabe eine gibtT-SQL,
296 277276 BytesZeilenumbrüche am Anfang sind Teil der ursprünglichen Zeichenfolge, Zeilenumbrüche am Ende dienen nur Anzeigezwecken und werden nicht für die Bytesumme gezählt.
Vor allem durch die Antwort von Conrade SparklePony inspiriert . Andere Technik als Andrei Odegovs SQL-Antwort .
Ziemlich einfacher Multi-Ersatz, aber ein paar Dinge, die helfen, Bytes zu sparen:
Wenn ich nur
REPLACE
allesREPLACE
mit etwas kürzerem machen könnte. Hmm ....quelle
Japt
-R
,99959492908987 BytesVersuch es
quelle
Ruby, 162 Bytes
quelle
Java, 295 Bytes /
272259 Bytesmit Zeilenumbrüchen alle 4 Spalten (295b)
Probieren Sie es online
keine Newline-Version (259b):
Probieren Sie es online
quelle
Japt ,
158157 BytesProbieren Sie es online!
quelle
Stax , 63 Bytes
Führen Sie es aus und debuggen Sie es
quelle
Perl 5 , 163 Bytes
Probieren Sie es online!
quelle
Runenverzauberungen , 292 Bytes
Probieren Sie es online!
Ich mache im Allgemeinen keine Kolmogorov-Komplexität , aber das Layout war eines, mit dem ich ohne allzu große Probleme arbeiten konnte. Runic bietet keine guten Möglichkeiten, beliebige Zeichenfolgen zu komprimieren. Wir müssen also nur mit den sich wiederholenden Teilen arbeiten.
Erläuterung:
Leicht dekomprimieren:
Die ersten 5 Zeilen dienen als Funktionen zum Erstellen jedes Teils des Songs (wobei die erste Zeile die 35
-
für den Abstandhalter generiert, wobei der Dezimalwert verwendet wird#
, um 2 Bytes darüber zu sparen3X5+
). Der Rückgabebefehl befindet sich am Anfang der Zeile, um sicherzustellen, dass alle IPs, die eine Funktion eingeben, auch die IPs verlassen die Funktion auch nach der gleichen Anzahl von Zyklen verlassen, um zu vermeiden, dass IPs zusammengeführt werden (was zu fehlenden Ausgabezeilen führt), da Programme rechteckige und leere Zellen sind sind implizit.Die nächsten vier Zeilen sind für das Drucken der ersten vier Zeilen der Ausgabe verantwortlich
Die fünfte Zeile druckt dann die letzten 3 Zeilen der Ausgabe. Da alle drei Zeilen mit mindestens einem Zeilengruppen-Abstandhalter beginnen müssen, ist es nicht möglich, drei separate IPs zu verwenden (da sie Verzögerungen benötigen würden, um ein Zusammenführen zu vermeiden).
>
,y
,@
, Und eine Neue - Zeile - Kosten mehr Bytes (4) als0[...]
(3 Bytes) , wobei...
beliebige Befehle (dh. Eine andere Zeile der Ausgabe).Umgekehrt erfordert das Ersetzen
>
und@
Verwenden einer einzelnen IP mehr Bytes.Durch das Zusammenführen aller fünf Eintrittspunktzeilen in die 2. Zeile werden 5 Byte Zeilenumbruch eingespart. Wir müssen nur sicherstellen, dass der
B͍
Ranch-Return-Befehl zuerst an das Ende seiner Zeile verschoben wird, wodurch die Funktionalität der Funktion erhalten bleibt.quelle