Cetak “Hey Jude” dari The Beatles

27

Tugas Anda adalah menulis sebuah program yang mencetak empat ayat berikut diekstraksi dari lirik dari lagu 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

TAPI

Satu-satunya masukan yang Anda boleh gunakan untuk membangun empat ayat ini adalah daftar token ini:

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

Perhatikan bahwa beberapa token memiliki ruang yang didahului dan bahwa tanda kutip yang dilampirkan bukan bagian dari token. Anda bebas menggunakan format apa pun untuk daftar dan mengatur ulang urutan token.

Output yang Anda hasilkan harus sama persis dengan keempat ayat di atas. Catatan yang \ndigunakan untuk baris baru dan baris baru tambahan ditambahkan setelah setiap ayat. Anda dapat menggunakan file ini (MD5:) 4551829c84a370fc5e6eb1d5c854cbecuntuk memeriksa keluaran Anda.

Anda dapat menggunakan diagram kereta api berikut untuk memahami struktur ayat-ayat (setiap elemen mewakili token): masukkan deskripsi gambar di sini

Kode terpendek dalam byte menang. Selamat bermain golf.

arminb
sumber
47
Bagian yang berjalan Nah nah nah nah nah nah, nah nah nah, akan lebih mudah untuk dikompres. ^^
Arnauld
3
@Arnauld Terkait : P
DJMcMayhem
10
@Arnauld wajib XKCD xkcd.com/851_make_it_better
Nathaniel
3
Pasti sulit untuk menyanyikan semua backslash di akhir setiap baris.
Tamás Sengel
2
@bonh railroad-diagram
arminb

Jawaban:

9

Jelly , 42 byte

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

Cobalah online!

Versi hardcoding.

Memasukkan:

["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
sumber
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)])

Cobalah online!


Versi alternatif, 114 byte

Kompresi yang sedikit lebih baik, tetapi sayangnya hancur oleh kode dekompresi yang lebih besar.

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

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

Cobalah online!

Arnauld
sumber
Saya tidak tahu bahwa mflag tidak diperlukan untuk literal templat multi-baris. Menarik.
Grant Miller
7

Ruby + -p, 177 136 120 118 115 109 byte (program penuh)

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

Cobalah online!

-41 byte: Beralih dari menggunakan variabel ke menggunakan karakter sebagai indeks array

-16 byte: Beralih ke format input yang lebih nyaman

-1 byte: Tidak ada ruang yang dibutuhkan antara putsdan"abv...

-1 byte: Gunakan $/global alih-alih ?\nliteral

-3 byte: Gunakan gsub(/./)sebagai ganti.chars.map

-6 byte: Panggil dengan -pdan manfaatkan $_. Pavel terima kasih !

Setiap karakter dalam string ajaib mewakili indeks ke dalam array input. Saya perlu variabel zsehingga saya hanya membaca dari STDIN sekali.

Saya bisa menghemat biaya dari IO dengan menulis lambda menerima array dan mengembalikan string. Ini membutuhkan ekstra vdi akhir, karena tidak mendapatkan baris gratis dari -p.

Ruby , 162 110 108 105 byte (fungsi)

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

Cobalah online!

benj2240
sumber
Saya belum dapat menemukan cara menggunakan String#unpackuntuk menjadi lebih pendek daripada .charsdengan .ord-97, tetapi mungkin ada satu.
benj2240
1
Berikut adalah beberapa byte byte: tio.run/##VY/…
Pavel
Rapi, terima kasih! Hari ini saya belajar tentang -pdan$_
benj2240
Maafkan ketidaktahuan saya, tetapi bagaimana saya menjalankan ini dari baris perintah atau IRB?
John Topley
1
@ JohnTopley Jika Anda ingin menggunakan IRB, Anda dapat menyalin-menempelkan tiga baris ini satu per satu. Untuk menggunakan program lengkap dari baris perintah, mulai di sini
benj2240
4

Java 8, 241 233 141 140 138 byte

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

Penjelasan:

Cobalah 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`

Itu pada dasarnya mengkonversi karakter ASCII 0(48) melalui E(69) ke indeks diindeks 0 0melalui 21dengan i-48.

Kevin Cruijssen
sumber
4

Python 3, 162 147 144 142 138 127 byte

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

Cobalah secara Online

Terima kasih khusus kepada user202729 dan Pavel .

Manish Kundu
sumber
4

05AB1E , 142 68 66 65 byte

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

Cobalah online!

-74 byte berkat EriktheOutgolfer, menggunakan string terkompresi base-255.

-2 byte dengan membalikkan string yang dikompresi untuk mencegah harus menggabungkan tiga 0

-1 byte berkat EriktheOutgolfer, dengan beralih dua item dalam array input untuk menghindari 0 terkemuka, dan dengan demikian menghilangkan Reverse R perintah.

Kaldo
sumber
2

Retina 0.8.2 , 115 byte

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

Cobalah online! Mengambil input sebagai daftar string yang dibatasi baris baru.

Neil
sumber
2

Stax , 59 58 byte

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

Jalankan dan debug itu

Representasi ascii yang sesuai dari program yang sama adalah ini.

`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!`adalah literal terkompresi dengan nilai "CDBGBLNOBQRSVWBBCEBHIJBMNPBQRUVWBBCFBHKJBLNOBQRSVWBBCDBGBLNPBQRTUVBB". Karakter mewakili indeks ke dalam tabel token. Program ini menambahkan token lain untuk mewakili baris baru. Itu tidak ada dalam input, tetapi ditambahkan selama eksekusi. Sisa dari program ini bekerja seperti ini.

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
rekursif
sumber
2

Fungsi C (gcc), 139 byte

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

Cobalah online!

PrincePolka
sumber
Bagus. Bisakah Anda menjelaskan kodenya?
arminb
@arminb Tidak ada yang terlalu mewah, string panjang "AB @ E ..." berisi indeks token dan baris baru ABC ... = token [012] .. '@' = baris baru, Token atau baris baru dicetak sebagai ' Saya beralih melalui string itu.
PrincePolka
gabungkan printfinfor
l4m2
1
membalikkan pengkodean
l4m2
1
126 byte
ceilingcat
1

Merah , 133 byte

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

Cobalah online!

Tidak disatukan

t adalah blok dengan daftar 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
sumber
1

D , 166 byte

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

Cobalah online!

sinar
sumber
1

Mathematica, 102 byte

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

Fungsi murni. Mengambil daftar string sebagai input dan mengembalikan string sebagai output. Cukup enkode semua indeks token, mirip dengan jawaban lainnya.

LegionMammal978
sumber
1

Ruby , 97 byte

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

Cobalah online!

Menyimpan beberapa byte dengan pendekatan berbeda untuk sebagian besar jawaban lainnya.

Jumlah kemungkinan token di setiap baris adalah sebagai berikut

Line number   Tokens 
1             4
2             5
3             5
4             7

String sihir berisi satu karakter per baris, yang ditafsirkan sebagai bitmap yang hingga 7 token yang tersedia harus dicetak untuk masing-masing dari 16 baris lagu.

a[i%7-1+i%28/7*5] iterates melalui token setiap baris, bergeser 5 untuk setiap baris baru, dan dengan offset 1 untuk memperhitungkan fakta bahwa baris pertama hanya memiliki 4 token.

Untuk baris 1-3, hanya bit 64 hingga 4 yang digunakan - tidak menggunakan bit 2 dan 1 yang menghindari token pencetakan dari baris berikutnya. untuk baris 4, semua 7 bit dari 64 hingga 1 digunakan.

Level River St
sumber