Imprimer "Hey Jude" des Beatles

27

Votre tâche consiste à écrire un programme qui imprime à la suite de quatre versets extraits des paroles de la chanson des Beatles "Hey Jude" (© 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

MAIS

La seule entrée que vous êtes autorisé à utiliser pour construire ces quatre versets est cette liste de jetons:

"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"

Notez que certains jetons ont un espace précédé et que les guillemets qui les entourent ne font pas partie des jetons. Vous êtes libre d'utiliser n'importe quel format pour la liste et de réorganiser l'ordre des jetons.

Votre sortie générée doit correspondre exactement aux quatre versets ci-dessus. Notez qu'il \nest utilisé pour les retours à la ligne et un retour à la ligne supplémentaire est ajouté après chaque verset. Vous pouvez utiliser ce fichier (MD5:) 4551829c84a370fc5e6eb1d5c854cbecpour comparer votre sortie.

Vous pouvez utiliser le diagramme de chemin de fer suivant pour comprendre la structure des versets (chaque élément représente un jeton): entrez la description de l'image ici

Le code le plus court en octets gagne. Bon golf.

arminb
la source
47
La partie qui va Nah nah nah nah nah nah, nah nah nah, aurait plus facile à comprimer. ^^
Arnauld
3
@Arnauld Related : P
DJMcMayhem
10
@Arnauld obligatoire XKCD xkcd.com/851_make_it_better
Nathaniel
3
Il doit être difficile de chanter toutes ces barres obliques inverses à la fin de chaque ligne.
Tamás Sengel
2
@bonh railroad-diagrams
arminb

Réponses:

9

Gelée , 42 octets

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

Essayez-le en ligne!

Version codée en dur.

Contribution:

["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 le Outgolfer
la source
17

JavaScript (ES6), 108 octets

a=>`01
4
9bc
efgjk

02
567
abd
efijk

03
587
9bc
efgjk

01
4
9bd
efhij

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

Essayez-le en ligne!


Version alternative, 114 octets

Une compression légèrement meilleure, mais malheureusement ruinée par le code de décompression plus important.

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

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

Essayez-le en ligne!

Arnauld
la source
Je ne savais pas que l' mindicateur n'est pas requis pour les littéraux de modèle multiligne. Intéressant.
Grant Miller
7

Ruby + -p, 177 136 120 118 115 115 109 octets (programme complet)

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

Essayez-le en ligne!

-41 octets: passer de l'utilisation de variables à l'utilisation de caractères comme index de tableau

-16 octets: passez à un format d'entrée plus pratique

-1 octet: aucun espace nécessaire entre putset"abv...

-1 octet: utilisez $/global au lieu de ?\nlittéral

-3 octets: utiliser gsub(/./)au lieu de.chars.map

-6 octets: appelez avec -pet utilisez $_. Merci Pavel !

Chaque caractère de la chaîne magique représente un index dans le tableau d'entrée. J'ai besoin de la variable zpour ne lire qu'une fois dans STDIN.

Je pourrais économiser des coûts d'IO en écrivant un lambda acceptant un tableau et en renvoyant une chaîne. Cela nécessite un supplément và la fin, car il ne reçoit pas de nouvelle ligne gratuite -p.

Ruby , 162 110 108 105 octets (fonction)

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

Essayez-le en ligne!

benj2240
la source
Je n'ai pas pu trouver un moyen d'utiliser String#unpackpour être plus court .charsqu'avec .ord-97, mais il pourrait y en avoir un.
benj2240
1
Voici quelques octets de moins: tio.run/##VY/…
Pavel
Bien, merci! Aujourd'hui, j'ai appris -pet$_
benj2240
Pardonnez mon ignorance, mais comment pourrais-je l'exécuter à partir de la ligne de commande ou de l'IRB?
John Topley
1
@JohnTopley Si vous souhaitez utiliser IRB, vous pouvez copier-coller ces trois lignes une par une. Pour utiliser le programme complet à partir de la ligne de commande, commencez ici
benj2240
4

Java 8, 241 233 141 140 138 octets

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

Explication:

Essayez-le en ligne.

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`

Il convertit essentiellement les caractères ASCII 0(48) à E(69) en index indexés 0par 21le biais de i-48.

Kevin Cruijssen
la source
4

Python 3, 162 147 144 142 138 138 127 octets

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

Essayez-le en ligne

Un merci spécial à user202729 et Pavel .

Manish Kundu
la source
4

05AB1E , 142 68 66 65 octets

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

Essayez-le en ligne!

-74 octets grâce à EriktheOutgolfer, utilisant une chaîne compressée en base 255.

-2 octets en inversant la chaîne compressée pour éviter d'avoir à concaténer trois 0

-1 octet grâce à EriktheOutgolfer, en commutant deux éléments dans le tableau d'entrée afin d'éviter les 0 de tête, et donc de supprimer la commande Reverse R

Kaldo
la source
2

Retina 0.8.2 , 115 octets

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

Essayez-le en ligne! Prend l'entrée comme une liste de chaînes délimitées par des sauts de ligne.

Neil
la source
2

Stax , 59 58 octets

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

Exécuter et déboguer

La représentation ascii correspondante du même programme est la suivante.

`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!`est un littéral compressé avec une valeur de "CDBGBLNOBQRSVWBBCEBHIJBMNPBQRUVWBBCFBHKJBLNOBQRSVWBBCDBGBLNPBQRTUVBB". Les caractères représentent des index dans la table des jetons. Ce programme ajoute un autre jeton pour représenter une nouvelle ligne. Ce n'est pas dans l'entrée, mais ajouté pendant l'exécution. Le reste du programme fonctionne comme ceci.

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
récursif
la source
2

Fonction C (gcc), 139 octets

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]);}

Essayez-le en ligne!

PrincePolka
la source
Agréable. Pouvez-vous expliquer le code?
arminb
@arminb Rien d'extraordinaire, la longue chaîne "AB @ E ..." contient les indices des jetons et des retours à la ligne ABC ... = token [012] .. '@' = newline, Un token ou un retour à la ligne est imprimé comme ' j'itère à travers cette chaîne.
PrincePolka
fusionner le printfinfor
l4m2
1
inverser le codage
l4m2
1
126 octets
plafondcat
1

Rouge , 133 octets

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

Essayez-le en ligne!

Non golfé

t est un bloc avec la liste des jetons

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
la source
1

D , 166 octets

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

Essayez-le en ligne!

Rayon
la source
1

Mathematica, 102 octets

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

Fonction pure. Prend une liste de chaînes en entrée et renvoie une chaîne en sortie. Encode simplement tous les indices de jeton, de la même manière que les autres réponses.

LegionMammal978
la source
1

Rubis , 97 octets

->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)}}

Essayez-le en ligne!

Enregistré quelques octets avec une approche différente de la plupart des autres réponses.

Le nombre de jetons possibles dans chaque ligne est le suivant

Line number   Tokens 
1             4
2             5
3             5
4             7

La chaîne magique contient un caractère par ligne, ce qui est interprété comme une image bitmap parmi laquelle jusqu'à 7 jetons disponibles doivent être imprimés pour chacune des 16 lignes du morceau.

a[i%7-1+i%28/7*5] itère à travers les jetons de chaque ligne, se décalant de 5 pour chaque nouvelle ligne, et avec un décalage de 1 pour tenir compte du fait que la première ligne n'a que 4 jetons.

Pour les lignes 1 à 3, seuls les bits de 64 à 4 sont utilisés - ne pas utiliser les bits de 2 et 1 évite d'imprimer les jetons de la ligne suivante. pour la ligne 4, tous les 7 bits de 64 à 1 sont utilisés.

Level River St
la source