Роздрукуйте "Ей Джуд" від "Бітлз"


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, було б легше стиснути. ^^
Арнольд

3
@Arnauld Пов'язане : P
DJMcMayhem

10
@Arnauld обов'язковий XKCD xkcd.com/851_make_it_better
Натаніел

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

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?
Джон Топлі

1
@JohnTopley Якщо ви хочете використовувати IRB, ви можете скопіювати ці три рядки один за одним. Щоб використовувати повну програму з командного рядка, починайте тут
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через 21з i-48.



4

05AB1E , 142 68 66 65 байт

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

Спробуйте в Інтернеті!

-74 байти завдяки EriktheOutgolfer, використовуючи стислий рядок base-255.

-2 байта, перевернувши стислий рядок, щоб уникнути необхідності об'єднання трьох 0-х

-1 байт завдяки EriktheOutgolfer, шляхом перемикання двох елементів в масиві введення, щоб уникнути провідних 0, і , таким чином , видаляючи зворотний 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 ... = токен [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

Математика, 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

Чарівний рядок містить один символ на рядок, який інтерпретується як растровий малюнок, з якого до 7 доступних жетонів слід надрукувати для кожного з 16 рядків пісні.

a[i%7-1+i%28/7*5] повторюється через лексеми кожного рядка, зміщуючи на 5 для кожного нового рядка і зі зміщенням на 1, щоб врахувати той факт, що перший рядок має лише 4 лексеми.

Для рядків 1-3 використовуються лише біти від 64 до 4 - не використовуючи біти 2 та 1, можна уникнути друку жетонів з наступного рядка. для рядка 4 використовуються всі 7 біт від 64 до 1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.