"Hey Jude" von den Beatles drucken

27

Ihre Aufgabe ist es, ein Programm zu schreiben, das die folgenden vier Verse aus den Texten des Beatles-Songs "Hey Jude" druckt (© Sony / ATV Music Publishing LLC):

Hey Jude, don't make it bad\n
Take a sad song and make it better\n
Remember to let her into your heart\n
Then you can start to make it better\n
\n
Hey Jude, don't be afraid\n
You were made to go out and get her\n
The minute you let her under your skin\n
Then you begin to make it better\n
\n
Hey Jude, don't let me down\n
You have found her, now go and get her\n
Remember to let her into your heart\n
Then you can start to make it better\n
\n
Hey Jude, don't make it bad\n
Take a sad song and make it better\n
Remember to let her under your skin\n
Then you'll begin to make it\n
\n

ABER

Die einzige Eingabe, die Sie zum Erstellen dieser vier Verse verwenden dürfen, ist die folgende Liste von Token:

"Hey Jude, don't"
" make it bad"
" be afraid"
" let me down"
"Take a sad song and make it better"
"You"
" were made to go out"
" and get her"
" have found her, now go"
"Remember to"
"The minute you"
" let her"
" into your heart"
" under your skin"
"Then"
" you"
" can start"
"'ll"
" begin"
" to make it"
" better"

Beachten Sie, dass einigen Token ein Leerzeichen vorangestellt ist und dass Anführungszeichen nicht Bestandteil der Token sind. Es steht Ihnen frei, ein beliebiges Format für die Liste zu verwenden und die Reihenfolge der Token zu ändern.

Ihre generierte Ausgabe muss genau den obigen vier Versen entsprechen. Beachten Sie, dass \nfür Zeilenumbrüche ein zusätzlicher Zeilenumbruch nach jedem Vers eingefügt wird. Mit dieser Datei (MD5 4551829c84a370fc5e6eb1d5c854cbec:) können Sie Ihre Ausgabe überprüfen.

Sie können das folgende Eisenbahndiagramm verwenden, um die Struktur der Verse zu verstehen (jedes Element repräsentiert einen Token): Bildbeschreibung hier eingeben

Kürzester Code in Bytes gewinnt. Viel Spaß beim Golfen.

Arminb
quelle
47
Der Teil, der Nah nah nah nah nah nah nah nah nah nah geht, wäre leichter zu komprimieren. ^^
Arnauld
3
@ Arnauld Related : P
DJMcMayhem
10
@ Arnauld obligatorisch XKCD xkcd.com/851_make_it_better
Nathaniel
3
Es muss schwer sein, all diese Backslashes am Ende jeder Zeile zu singen.
Tamás Sengel
2
@bonh Eisenbahn-Diagramme
Arminb

Antworten:

9

Gelee , 42 Bytes

;⁷“Ṙç€ṘḋḷŒø|Ṁ2kḤ⁽⁼SƁẒVṿẎj]ð⁵ṀƒƤ)÷Ƒ¦Ẋ½Iɠ⁻’ṃ

Probieren Sie es online!

Hardcoding-Version.

Eingang:

["Hey Jude, don't", ' make it bad', 'Take a sad song and make it better', 'Remember to', ' let her', ' into your heart', 'Then', ' you', ' can start', ' to make it', ' better', ' be afraid', 'You', ' were made to go out', ' and get her', 'The minute you', ' under your skin', ' begin', ' let me down', ' have found her, now go', "'ll"]
Erik der Outgolfer
quelle
17

JavaScript (ES6), 108 Byte

a=>`01
4
9bc
efgjk

02
567
abd
efijk

03
587
9bc
efgjk

01
4
9bd
efhij

`.replace(/./g,n=>a[parseInt(n,36)])

Probieren Sie es online!


Alternative Version, 114 Bytes

Eine etwas bessere Komprimierung, die aber leider durch den größeren Dekomprimierungscode ruiniert wird.

a=>`835fc3cbbd3
84db3db4bbdb3
85cd1cc3cbbd3
835fc4bbcb3

`.replace(/./g,n=>a[n='0x'+n,i=n%8&&n%8-2+i]+[`
`[n>>3]])

Probieren Sie es online!

Arnauld
quelle
Ich wusste nicht, dass das mFlag für mehrzeilige Vorlagenliterale nicht erforderlich ist. Interessant.
Grant Miller
7

Ruby + -p, 177 136 120 118 115 109 Bytes (vollständiges Programm)

$_="abvevjlmvopqtuvvacvfghvklnvopstuvvadvfihvjlmvopqtuvvabvevjlnvoprstv".gsub(/./){|c|(eval$_)[c.ord-97]||$/}

Probieren Sie es online!

-41 Byte: Wechseln Sie von der Verwendung von Variablen zur Verwendung von Zeichen als Array-Indizes

-16 Bytes: Wechseln Sie zu einem bequemeren Eingabeformat

-1 Byte: Zwischen putsund wird kein Leerzeichen benötigt"abv...

-1 Byte: Verwenden Sie $/global anstelle von ?\nLiteral

-3 Bytes: Verwenden Sie gsub(/./)anstelle von.chars.map

-6 Bytes: Mit aufrufen -pund nutzen $_. Vielen Dank Pavel !

Jedes Zeichen in der magischen Zeichenfolge repräsentiert einen Index im Eingabearray. Ich brauche die Variable, zdamit ich nur einmal aus STDIN lesen kann.

Ich könnte einige Kosten von IO sparen, indem ich ein Lambda schreibe, das ein Array akzeptiert und eine Zeichenfolge zurückgibt. Dies erfordert vam Ende ein Extra , da es keinen kostenlosen Zeilenumbruch gibt -p.

Ruby , 162 110 108 105 Bytes (Funktion)

->z{"abvevjlmvopqtuvvacvfghvklnvopstuvvadvfihvjlmvopqtuvvabvevjlnvoprstvv".gsub(/./){|c|z[c.ord-97]||$/}}

Probieren Sie es online!

benj2240
quelle
Ich habe keinen Weg gefunden, String#unpackum kürzer als .charsmit zu sein .ord-97, aber es könnte einen geben.
benj2240
1
Hier sind ein paar Bytes übrig
Pavel
Schön, danke! Heute habe ich von -pund erfahren$_
benj2240
Vergib mir meine Unwissenheit, aber wie würde ich das von der Kommandozeile oder dem IRB ausführen?
John Topley
1
@JohnTopley Wenn Sie IRB verwenden möchten, können Sie diese drei Zeilen einzeln kopieren und einfügen . Um das vollständige Programm über die Befehlszeile zu verwenden, starten Sie hier
benj2240
4

Java 8, 241 233 141 140 138 Bytes

a->{a.add("\n");"01E4E9;<E>?@CDEE02E567E:;=E>?@CDEE03E587E91<E>?@CDEE01E4E91=E>?ABCEE".chars().forEach(i->System.out.print(a.get(i-48)));}

Erläuterung:

Probieren Sie es online aus.

a->{                  // Method with ArrayList<String> parameter and no return-type
 a.add("\n");         //  Add a new-line as last item (index 21) to the input-List
 "01E4E9;<E>?@CDEE02E567E:;=E>?@CDEE03E587E91<E>?@CDEE01E4E91=E>?ABCEE".chars().forEach(i->
                      //  Loop over the bytes of this String above
   System.out.print(  //   Print:
     a.get(i-48)));}  //    The String in the list at index `i-48`

Er wandelt im wesentlichen die ASCII - Zeichen 0(48) bis E(69) auf den 0-indiziert Indizes 0durch 21mit dem i-48.

Kevin Cruijssen
quelle
4

Python 3, 162 147 144 142 138 127 Bytes

lambda k,x=b'ABVCVDEFVGHIJKVVALVMNOVPEWQVGHRJKVASVVMTOV':"".join([(k+['\n',' '])[i-65]for i in x+x[5:16]+x[:4]+b'VDEWQVGHURJ'])

Probieren Sie es online

Besonderer Dank geht an user202729 und Pavel .

Manish Kundu
quelle
4

05AB1E , 142 68 66 65 Bytes

`¶)•7/è¸ĀuVI{è:÷MDS.₁bö¼d@ÉÃƶõî›Λðë’OŒβι"žHƒö>“ÃaÈǝõöÓ∍¿þœθÀ•2ôèJ

Probieren Sie es online!

-74 Bytes dank EriktheOutgolfer mit einer Base-255-komprimierten Zeichenfolge.

-2 Bytes durch Umkehren der komprimierten Zeichenfolge, um zu vermeiden, dass drei Nullen verkettet werden müssen

-1 Byte dank EriktheOutgolfer, indem zwei Elemente im Eingabearray umgeschaltet werden, um die führenden Nullen zu vermeiden, und damit der Befehl R umkehren entfernt wird.

Kaldo
quelle
2

Retina 0.8.2 , 115 Bytes

^
12F5F:<=F?@ADEFF13F678F;<>F?@CDEFF14F698F:<=F?@ADEFF12F5F:<>F?@BCDF¶
{`1(?=.*¶(.*))
$1
^(.*)¶.*
$1
}T`1-E`0-D
F
¶

Probieren Sie es online! Übernimmt die Eingabe als durch Zeilenumbrüche getrennte Liste von Zeichenfolgen.

Neil
quelle
2

Stax , 59 58 Bytes

îòÖ╥╬╬╞:,y╓ønä⌠╦╒ï╦≤x◘‼ε╩ⁿ◙ΓZ►e«qpôr╡"╣Ü≥┤╢┴;╡ÑkAú0:=;m╠╠x

Führen Sie es aus und debuggen Sie es

Dies ist die entsprechende ASCII-Darstellung desselben Programms.

`ORIpY$T&z{m6Y=>mR)_ .VQ)eN70e[:0yO8j$^RN[ Bp{IN/$|"3^;G#^&lv!`FAx+@]p

`ORIpY$T&z{m6Y=>mR)_ .VQ)eN70e[:0yO8j$^RN[ Bp{IN/$|"3^;G#^&lv!`ist ein komprimiertes Literal mit einem Wert von "CDBGBLNOBQRSVWBBCEBHIJBMNPBQRUVWBBCFBHKJBLNOBQRSVWBBCDBGBLNPBQRTUVBB". Die Zeichen stehen für Indizes in der Tokentabelle. Dieses Programm fügt ein weiteres Token hinzu, um eine neue Zeile darzustellen. Es ist nicht in der Eingabe, sondern wird während der Ausführung hinzugefügt. Der Rest des Programms funktioniert so.

F           for each character, execute the rest of the program
 A          integer literal 10, character code of newline
  x+        append 10 to the input array
    @       get element at index, using wrap-around
                the list is size 22, and B is 66, so B gets the first token
     ]      wrap the result in a singleton array.
                this effectively turns 10 into "\n"
      p     print without newline
rekursiv
quelle
2

C (gcc) -Funktion, 139 Bytes

i,m;f(char**s){for(i=0;i<68;)m="AB@E@JLM@OPQTU@@AC@FGH@KLN@OPSTU@@AD@FIH@JLM@OPQTU@@AB@E@JLN@OPRST@@"[i++],printf(m^64?"%s":"\n",s[m-65]);}

Probieren Sie es online!

PrincePolka
quelle
Nett. Können Sie den Code erklären?
Arminb
@arminb Nichts Besonderes, der lange String "AB @ E ..." enthält die Indizes der Token und Zeilenumbrüche. ABC ... = Token [012] .. '@' = Zeilenumbruch, Ein Token oder Zeilenumbruch wird gedruckt als ' Ich iteriere durch diese Zeichenfolge.
PrincePolka
verschmelze die printfinfor
l4m2 20.04.18
1
Codierung umkehren
l4m2
1
126 Bytes
Ceilingcat
1

Rot , 133 Bytes

foreach c{abzezjlmzopqtuzzaczfghzklnzopstuzzadzfihzjlmzopqtuzzabzezjlnzoprstzz}[prin either c =#"z"["^/"][t/(to-integer c -#"a"+ 1)]]

Probieren Sie es online!

Ungolfed

t ist ein Block mit der Liste der Token

s:{abzezjlmzopqtuzzaczfghzklnzopstuzzadzfihzjlmzopqtuzzabzezjlnzoprstzz}
foreach c s[                           ; for each character in s
    prin either c = #"z"               ; if it's a 'z' 
        ["^/"]                         ; print CR
        [t/(to-integer c - #"a" + 1)]  ; otherwise find which token to print
]                                      ; by mapping its offset to the alphabet
Galen Ivanov
quelle
1

D , 166 Bytes

import std.algorithm,std.range;T f(T)(T[]s){return"abvevjlmvopqtuvvacvfghvklnvopstuvvadvfihvjlmvopqtuvvabvevjlnvoprstvv".map!((int a){return(s~["\n"])[a-97];}).join;}

Probieren Sie es online!

Strahl
quelle
1

Mathematica, 102 Bytes

""<>Append[#,"
"][[36^^ajikrj7lg8pya7wgtt43pvrilsik1dea1uht6mx3go33m4mjj02hb4wi9w3~IntegerDigits~23]]&

Funktion pur. Nimmt eine Liste von Zeichenfolgen als Eingabe und gibt eine Zeichenfolge als Ausgabe zurück. Codiert einfach alle Token-Indizes, ähnlich wie bei anderen Antworten.

LegionMammal978
quelle
1

Ruby , 97 Bytes

->a{112.times{|i|$><<a[i%7-1+i%28/7*5]*("0@Xg(44k$,Xg0@Tz"[i/7].ord>>~i%7&1)+$/*(i%7/6+i%28/27)}}

Probieren Sie es online!

Einige Bytes mit einem anderen Ansatz für die meisten anderen Antworten gespeichert.

Die Anzahl der möglichen Token in jeder Zeile ist wie folgt

Line number   Tokens 
1             4
2             5
3             5
4             7

Die magische Zeichenkette enthält ein Zeichen pro Zeile, was als Bitmap interpretiert wird, von der für jede der 16 Zeilen des Songs bis zu 7 verfügbare Token gedruckt werden sollen.

a[i%7-1+i%28/7*5] Durchläuft die Token jeder Zeile, wird für jede neue Zeile um 5 verschoben und mit einem Versatz von 1, um die Tatsache zu berücksichtigen, dass die erste Zeile nur 4 Token enthält.

Für die Zeilen 1-3 werden nur die Bits von 64 bis 4 verwendet. Wenn Sie nicht die Bits von 2 und 1 verwenden, werden keine Token aus der nächsten Zeile gedruckt. Für Leitung 4 werden alle 7 Bits von 64 bis 1 verwendet.

Level River St
quelle