ビートルズの「Hey Jude」を印刷


27

あなたの仕事は、ビートルズの曲「Hey Jude」(©Sony / ATV Music Publishing LLC)の歌詞から抽出した次の4つの詩を印刷するプログラムを書くことです。

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

しかし

これらの4つの節の作成に使用できる入力は、次のトークンのリストのみです。

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

一部のトークンの前にはスペースがあり、引用符を囲むことはトークンの一部ではないことに注意してください。リストには任意の形式を使用し、トークンの順序を自由に並べ替えることができます。

生成される出力は、上記の4つの節と正確に一致する必要があります。\nは改行に使用され、各節の後に余分な改行が追加されることに注意してください。あなたは使用することができ、このファイル:(MD5を4551829c84a370fc5e6eb1d5c854cbec照らし合わせて、出力を確認すること)。

次の鉄道図を使用して、詩の構造を理解できます(各要素はトークンを表します)。 ここに画像の説明を入力してください

バイト単位の最短コードが優先されます。幸せなゴルフ。


47
Nah nah nah nah nah nah、nah nah nahに行く部分は圧縮しやすいでしょう。^^
アーナウルド

3
@Arnauld 関連:P
DJMcMayhem


3
すべての行末でこれらのバックスラッシュをすべて歌うのは難しいに違いありません。
タマスセンゲル

回答:


9

ゼリー、42バイト

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

オンラインでお試しください!

ハードコーディングバージョン。

入力:

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

17

JavaScript(ES6)、108バイト

a=>`01
4
9bc
efgjk

02
567
abd
efijk

03
587
9bc
efgjk

01
4
9bd
efhij

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

オンラインでお試しください!


代替バージョン、114バイト

圧縮率はわずかに優れていますが、残念ながら大きな圧縮解除コードによって台無しになります。

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

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

オンラインでお試しください!


m複数行のテンプレートリテラルにフラグが必要ないことは知りませんでした。面白い。
グラントミラー

7

ルビー + -p177 136 120 118 115 109バイト(フルプログラム)

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

オンラインでお試しください!

-41バイト:変数の使用から配列インデックスとしての文字の使用への切り替え

-16バイト:より便利な入力形式に切り替えます

-1バイト:間に必要なスペースがありませんputsし、"abv...

-1バイト:リテラルの$/代わりにグローバルを使用?\n

-3バイト:gsub(/./)代わりに使用.chars.map

-6バイト:で呼び出し、-p利用し$_ます。パベルに感謝!

マジックストリングの各文字は、入力配列へのインデックスを表します。STDINから1回だけ読み取るように、変数が必要zです。

配列を受け入れて文字列を返すラムダを記述することにより、IOからいくらかのコストを節約できます。vから無料の改行を取得していないため、最後に追加が必要-pです。

ルビー162 110 108 105バイト(関数)

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

オンラインでお試しください!


私が使用する方法を見つけることができていないString#unpackよりも短くなるように.charsとし.ord-97ますが、1があるかもしれません。
benj2240

1
ここにいくつかのバイトがあります:tio.run
Pavel

きちんとした、ありがとう!今日、私はについて学んだ-p$_
benj2240

私の無知を許しますが、コマンドラインまたはIRBからこれをどのように実行しますか?
ジョントップリー

1
@JohnTopley IRBを使用する場合は、これら3行を 1つずつコピーして貼り付けることができます。コマンドラインから完全なプログラムを使用するには、ここ
-benj2240

4

ジャワ8、241の 233 141 140 138バイト

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

説明:

オンラインでお試しください。

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`

これは基本的なASCII文字に変換0し(48)E0 -インデックス付きのインデックスに(69)0を介して21有しますi-48



4

05AB1E142 68 66 65バイト

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

オンラインでお試しください!

-255バイトの圧縮文字列を使用したEriktheOutgolferのおかげ。

圧縮された文字列を逆にして、3つの0を連結する必要がないようにする-2バイト

EriktheOutgolferのおかげで、先頭の0を避けるために入力配列内の2つの項目を切り替え、Reverse Rコマンドを削除しました。



2

スタックス59 58 バイト

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

実行してデバッグする

同じプログラムの対応するASCII表現はこれです。

`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!`は、値がの圧縮リテラルです"CDBGBLNOBQRSVWBBCEBHIJBMNPBQRUVWBBCFBHKJBLNOBQRSVWBBCDBGBLNPBQRTUVBB"。文字は、トークンテーブルへのインデックスを表します。このプログラムは、改行を表す別のトークンを追加します。入力にはありませんが、実行中に追加されます。プログラムの残りの部分はこのように機能します。

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

2

C(gcc)関数、139バイト

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

オンラインでお試しください!


いいね コードを説明できますか?
arminb

@arminb派手なものは何もありません。長い「AB @ E ...」文字列には、トークンと改行のインデックスが含まれますABC ... = token [012] ..その文字列を繰り返し処理します。
PrincePolka

をマージprintfしますfor
l4m2

1
コーディング逆
l4m2


1

、133バイト

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

オンラインでお試しください!

非ゴルフ

t トークンのリストを持つブロックです

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


1

Mathematica、102バイト

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

純粋な機能。入力として文字列のリストを取り、出力として文字列を返します。他の回答と同様に、すべてのトークンインデックスをエンコードするだけです。


1

ルビー、97バイト

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

オンラインでお試しください!

他のほとんどの回答とは異なるアプローチで数バイトを節約しました。

各行の可能なトークンの数は次のとおりです。

Line number   Tokens 
1             4
2             5
3             5
4             7

マジックストリングには、1行に1文字が含まれています。これは、歌の16行ごとに最大7つのトークンが印刷されるビットマップとして解釈されます。

a[i%7-1+i%28/7*5] 各行のトークンを反復処理し、新しい行ごとに5ずつシフトします。最初の行には4つのトークンしかないことを考慮して、1のオフセットを付けます。

1〜3行目では、64〜4のビットのみが使用されます。2と1のビットを使用しないと、次の行からトークンが出力されなくなります。行4では、64から1までの7ビットすべてが使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.