打印披头士乐队的“ Hey Jude”


27

您的任务是编写一个程序,该程序打印从披头士乐队的歌曲“ 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

您可以用来构造这四节经文的唯一输入是此标记列表:

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

请注意,某些标记的前面有一个空格,并且引号不是标记的一部分。您可以自由使用任何格式的列表并重新排列令牌的顺序。

您生成的输出必须与上述四节完全匹配。请注意,\n它用于换行符,并且在每节经文之后添加一个额外的换行符。您可以使用此文件(MD5:)4551829c84a370fc5e6eb1d5c854cbec来检查您的输出。

您可以使用以下铁路图来理解经文的结构(每个元素代表一个记号): 在此处输入图片说明

以字节为单位的最短代码获胜。快乐打高尔夫球。


47
就是那张在部分全息全息全息全息全息全息,全息全息全息,将有更容易压缩。^^
Arnauld

3
@Arnauld 相关:P
DJMcMayhem

10
@Arnauld强制性XKCD xkcd.com/851_make_it_better
Nathaniel

3
在每一行的末尾都很难唱出所有这些反斜杠。
塔玛斯·森格尔

Answers:


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并使用$_感谢帕维尔

魔术字符串中的每个字符代表输入数组的索引。我需要变量,z以便我只能从STDIN读取一次。

通过编写一个接受数组并返回一个字符串的lambda,我可以节省一些IO成本。最后需要额外的费用v,因为它没有从免费获得换行符-p

红宝石162个 110 108 105字节(功能)

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

在线尝试!


我还没有找到一种比使用String#unpackshort短的.chars使用方法.ord-97,但是可能会有一种。
benj2240 '18

1
这里有几个字节要关闭:tio.run/##VY/…
Pavel

整洁,谢谢!今天笔者了解到-p$_
benj2240

原谅我的无知,但是我将如何从命令行或IRB上运行它呢?
约翰·托普利

1
@JohnTopley如果要使用IRB,可以将这三行内容一一复制粘贴。要从命令行使用完整程序,请从此处开始
benj2240,18年

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)E(69)到0索引的索引0通过21i-48



4

05AB1E142 68 66 65字节

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

在线尝试!

-74字节(感谢EriktheOutgolfer)使用了以255为基数的压缩字符串。

通过反转压缩字符串来减少-2字节,以防止必须连接三个0

通过切换输入数组中的两个项以避免前导0,从而感谢EriktheOutgolfer -1字节,从而删除了Reverse R命令。



2

Stax59 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 ... =令牌[012] ..'@'=换行符,令牌或换行符打印为'我遍历那个字符串。
PrincePolka'3

合并printffor
l4m2

1
反向编码
l4m2 '18


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

D,166字节

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

在线尝试!


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

魔术字符串每行包含一个字符,这被解释为一个位图,该位图将为歌曲的16行中的每行打印最多7个可用标记。

a[i%7-1+i%28/7*5] 遍历每行的令牌,每行增加5个偏移量,偏移量为1以说明第一行只有4个令牌的事实。

对于1-3行,仅使用64到4的位-不使用2和1的位可以避免从下一行打印令牌。对于第4行,将使用从64到1的所有7位。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.