พิมพ์“ Hey Jude” จาก The Beatles


27

งานของคุณคือการเขียนโปรแกรมที่พิมพ์สี่ข้อต่อไปนี้สกัดจากเนื้อเพลงจากเพลง "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

แต่

อินพุตเดียวที่คุณได้รับอนุญาตให้ใช้เพื่อสร้างสี่ข้อเหล่านี้คือรายการของโทเค็น:

"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
ส่วนที่ไปNah nah nah nah nah nah nah nah nahจะง่ายกว่าที่จะบีบอัด ^^
Arnauld


10
@Arnauld บังคับ XKCD xkcd.com/851_make_it_better
นาธาเนียล

3
มันจะยากที่จะร้องเพลงแบ็กสแลชเหล่านั้นในตอนท้ายของทุกบรรทัด
Tamás Sengel

คำตอบ:


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ไม่จำเป็นต้องตั้งค่าสถานะสำหรับตัวอักษรเทมเพลตหลายบรรทัด น่าสนใจ
Grant Miller

7

Ruby + -p, 177 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 เพียงครั้งเดียว

ฉันสามารถประหยัดค่าใช้จ่ายจาก IO โดยการเขียนแลมบ์ดาให้ยอมรับอาร์เรย์และส่งคืนสตริง นี้ต้องเสริมในตอนท้ายเพราะมันไม่ได้รับการขึ้นบรรทัดใหม่ฟรีจากv-p

Ruby , 162 110 108 105 ไบต์ (ฟังก์ชั่น)

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

ลองออนไลน์!


ผมยังไม่ได้รับสามารถที่จะหาวิธีที่จะใช้String#unpackจะสั้นกว่า.charsด้วย.ord-97แต่อาจจะเป็นหนึ่ง
benj2240

1
ที่นี่ไม่กี่ไบต์ออก: tio.run/##VY/...
พาเวล

เรียบร้อยขอบคุณ! วันนี้ฉันเรียนรู้เกี่ยวกับ-pและ$_
benj2240

ยกโทษให้ความไม่รู้ของฉัน แต่ฉันจะเรียกใช้จากบรรทัดคำสั่งหรือ IRB ได้อย่างไร
John Topley

1
@JohnTopley หากคุณต้องการที่จะใช้คณะกรรมการคุณสามารถคัดลอกวางทั้งสามสายหนึ่งโดยหนึ่ง ในการใช้โปรแกรมเต็มรูปแบบจากบรรทัดคำสั่งเริ่มต้นที่นี่
benj2240

4

Java 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

05AB1E , 142 68 66 65 ไบต์

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

ลองออนไลน์!

-74 ไบต์ขอบคุณ EriktheOutgolfer โดยใช้สตริงบีบอัดฐาน 255

-2 ไบต์โดยการย้อนกลับสตริงที่บีบอัดเพื่อป้องกันไม่ให้เชื่อมต่อกันสาม 0

-1 ไบต์ต้องขอบคุณ EriktheOutgolfer โดยการสลับสองรายการในอาร์เรย์อินพุตเพื่อหลีกเลี่ยงการนำหน้า 0 และทำให้การลบคำสั่งReverse R



2

Stax , 59 58 bytes

îòÖ╥╬╬╞:,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

รวมเข้าด้วยกันprintfในfor
l4m2

1
ย้อนกลับการเข้ารหัส
l4m2


1

สีแดง 133 ไบต์

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

ลองออนไลน์!

Ungolfed

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

Ruby , 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

สตริงเวทย์มีอักขระหนึ่งตัวต่อบรรทัดซึ่งตีความเป็นบิตแมปซึ่งมีโทเค็นที่พร้อมใช้งานสูงสุด 7 รายการที่จะพิมพ์สำหรับแต่ละ 16 บรรทัดของเพลง

a[i%7-1+i%28/7*5] วนซ้ำโทเค็นของแต่ละบรรทัดเลื่อนเป็น 5 สำหรับแต่ละบรรทัดใหม่และมีออฟเซ็ต 1 ถึงบัญชีสำหรับข้อเท็จจริงที่ว่าบรรทัดแรกมีเพียง 4 โทเค็น

สำหรับบรรทัด 1-3 จะใช้บิต 64 ถึง 4 เท่านั้นไม่ใช่การใช้บิต 2 และ 1 เพื่อหลีกเลี่ยงการพิมพ์โทเค็นจากบรรทัดถัดไป สำหรับบรรทัดที่ 4 จะใช้บิตทั้งหมด 7 บิตจาก 64 ถึง 1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.