Wydrukuj „Hej Jude” z The Beatles

27

Twoim zadaniem jest napisanie programu, który wydrukuje cztery wiersze wyodrębnione z tekstu piosenki The 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

ALE

Jedynym wejściem, którego możesz użyć do skonstruowania tych czterech wersetów, jest lista tokenów:

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

Zauważ, że niektóre tokeny mają spacje poprzedzone i że cytaty nie są ich częścią. Możesz użyć dowolnego formatu listy i zmienić kolejność tokenów.

Wygenerowany wynik musi dokładnie odpowiadać powyższym czterem wersetom. Zauważ, że \njest używany do nowych wierszy, a po każdym wersecie jest dodawana nowa linia . Możesz użyć tego pliku (MD5:), 4551829c84a370fc5e6eb1d5c854cbecaby sprawdzić dane wyjściowe.

Możesz użyć następującego schematu kolei, aby zrozumieć strukturę wierszy (każdy element reprezentuje token): wprowadź opis zdjęcia tutaj

Najkrótszy kod w bajtach wygrywa. Wesołego golfa.

arminb
źródło
47
Część, która idzie Nah nah nah nah nah nah nah nah nah nah, byłaby łatwiejsza do skompresowania. ^^
Arnauld
3
@Arnauld Powiązane : P
DJMcMayhem
10
@Arnauld obowiązkowe XKCD xkcd.com/851_make_it_better
Nathaniel
3
Musi być trudno śpiewać te wszystkie ukośniki na końcu każdej linii.
Tamás Sengel,
2
@bonh railroad-diagrams
arminb

Odpowiedzi:

9

Galaretka , 42 bajty

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

Wypróbuj online!

Wersja na stałe.

Wkład:

["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 the Outgolfer
źródło
17

JavaScript (ES6), 108 bajtów

a=>`01
4
9bc
efgjk

02
567
abd
efijk

03
587
9bc
efgjk

01
4
9bd
efhij

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

Wypróbuj online!


Wersja alternatywna, 114 bajtów

Nieco lepsza kompresja, ale niestety zrujnowana większym kodem dekompresyjnym.

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

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

Wypróbuj online!

Arnauld
źródło
Nie wiedziałem, że mflaga nie jest wymagana w przypadku literałów szablonów zawierających wiele wierszy. Ciekawy.
Grant Miller
7

Ruby + -p, 177 136 120 118 115 115 bajtów (pełny program)

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

Wypróbuj online!

-41 bajtów: Przełącz z używania zmiennych na używanie znaków jako indeksów tablic

-16 bajtów: Przełącz na wygodniejszy format wejściowy

-1 bajt: nie potrzeba miejsca między putsi"abv...

-1 bajt: użyj $/globalnego zamiast ?\nliteralnego

-3 bajty: użyj gsub(/./)zamiast.chars.map

-6 bajtów: Dzwoń -pi używaj $_. Dzięki, Pavel !

Każdy znak w magicznym ciągu reprezentuje indeks w tablicy wejściowej. Potrzebuję zmiennej, zaby odczytać ze STDIN tylko raz.

Mógłbym zaoszczędzić trochę na IO, pisząc lambda akceptując tablicę i zwracając ciąg znaków. Wymaga to vna końcu dodatkowego , ponieważ nie otrzymuje darmowej nowej linii -p.

Ruby , 162 110 108 105 bajtów (funkcja)

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

Wypróbuj online!

benj2240
źródło
Nie byłem w stanie znaleźć sposobu String#unpackna bycie krótszym niż .charsz .ord-97, ale może być jeden.
benj2240
1
Oto kilka bajtów: tio.run/##VY/…
Pavel
Świetnie, dziękuję! Dzisiaj dowiedziałem się -pi$_
benj2240
Wybacz moją ignorancję, ale jak miałbym to uruchomić z wiersza poleceń lub IRB?
John Topley,
1
@JohnTopley Jeśli chcesz korzystać z IRB, możesz skopiować i wkleić te trzy linie jeden po drugim. Aby użyć pełnego programu z wiersza poleceń, zacznij tutaj
benj2240,
4

Java 8, 241 233 141 140 138 bajtów

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

Wyjaśnienie:

Wypróbuj online.

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`

Zasadniczo konwertuje znaki ASCII 0(48) do E(69) na indeksy 0 indeksowane 0za 21pomocą i-48.

Kevin Cruijssen
źródło
4

Python 3, 162 147 144 142 138 127 127 bajtów

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

Wypróbuj online

Specjalne podziękowania dla user202729 i Pavel .

Manish Kundu
źródło
4

05AB1E , 142 68 66 65 bajtów

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

Wypróbuj online!

-74 bajty dzięki EriktheOutgolfer, przy użyciu skompresowanego ciągu base-255.

-2 bajty poprzez odwrócenie skompresowanego łańcucha, aby uniknąć konieczności połączenia trzech zer

-1 bajt dzięki EriktheOutgolfer przełączając dwie pozycje w tablicy wejściowego w celu uniknięcia cyfrę 0, a tym samym zmniejsza odwrotnej R polecenie.

Kaldo
źródło
2

Retina 0.8.2 , 115 bajtów

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

Wypróbuj online! Pobiera dane wejściowe jako listę ciągów rozdzielanych znakiem nowej linii.

Neil
źródło
2

Stax , 59 58 bajtów

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

Uruchom i debuguj

Odpowiada to reprezentacji ascii tego samego programu.

`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!`jest skompresowanym literałem o wartości "CDBGBLNOBQRSVWBBCEBHIJBMNPBQRUVWBBCFBHKJBLNOBQRSVWBBCDBGBLNPBQRTUVBB". Znaki reprezentują indeksy w tabeli tokenów. Ten program dodaje kolejny token do reprezentowania nowej linii. Nie ma go na wejściu, ale jest dodawany podczas wykonywania. Reszta programu działa w ten sposób.

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
rekurencyjny
źródło
2

Funkcja C (gcc), 139 bajtów

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

Wypróbuj online!

PrincePolka
źródło
Miły. Czy potrafisz wyjaśnić kod?
arminb
@arminb Nic nadzwyczajnego, długi ciąg „AB @ E ...” zawiera indeksy tokenów i nowych linii ABC ... = token [012] .. „@” = nowa linia, token lub nowa linia są drukowane jako „ iteruje ten ciąg.
PrincePolka
połącz printfwfor
l4m2
1
odwróć kodowanie
l4m2 20.04.2018
1
126 bajtów
pułap pułapu
1

Czerwony , 133 bajty

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

Wypróbuj online!

Nie golfił

t jest blokiem z listą tokenów

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 Iwanow
źródło
1

D , 166 bajtów

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

Wypróbuj online!

Promień
źródło
1

Mathematica, 102 bajty

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

Czysta funkcja. Pobiera listę ciągów jako dane wejściowe i zwraca ciąg jako dane wyjściowe. Po prostu koduje wszystkie indeksy tokenów, podobnie jak inne odpowiedzi.

LegionMammal978
źródło
1

Ruby , 97 bajtów

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

Wypróbuj online!

Zapisano kilka bajtów z innym podejściem do większości innych odpowiedzi.

Liczba możliwych tokenów w każdej linii jest następująca

Line number   Tokens 
1             4
2             5
3             5
4             7

Magiczny ciąg zawiera po jednym znaku w wierszu, co jest interpretowane jako mapa bitowa, z której można wydrukować do 7 dostępnych tokenów dla każdego z 16 wierszy utworu.

a[i%7-1+i%28/7*5] przechodzi przez tokeny każdej linii, przesuwając o 5 dla każdej nowej linii, z przesunięciem o 1, aby uwzględnić fakt, że pierwsza linia ma tylko 4 tokeny.

W przypadku linii 1-3 używane są tylko bity od 64 do 4 - nieużywanie bitów 2 i 1 pozwala uniknąć drukowania tokenów z następnej linii. dla linii 4 używane są wszystkie 7 bitów od 64 do 1.

Level River St
źródło