Печать «Эй, Джуд» из 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для проверки вашего вывода.

Вы можете использовать следующую схему железной дороги, чтобы понять структуру стихов (каждый элемент представляет токен): введите описание изображения здесь

Самый короткий код в байтах побеждает. Удачного игры в гольф.

arminb
источник
47
Та часть, которая звучит как нах, нах, нах, нах, нах, нах, нах, нах, будет легче сжать. ^^
Арно
3
@Arnauld Связанные : P
DJMcMayhem
10
@Arnauld обязательный XKCD xkcd.com/851_make_it_better
Натаниэль
3
Должно быть трудно петь все эти обратные слеши в конце каждой строки.
Тамас Сенгель
2
@bonh Railroad -Diagrams
Армин

Ответы:

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"]
Эрик Outgolfer
источник
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]])

Попробуйте онлайн!

Arnauld
источник
Я не знал, что 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 только один раз.

Я мог бы сэкономить некоторую стоимость от ввода-вывода, написав лямбду, принимающую массив и возвращающую строку. Это требует дополнительного vв конце, потому что он не получает бесплатный перевод строки -p.

Рубин , 162 110 108 105 байт (функция)

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

Попробуйте онлайн!

benj2240
источник
Я не смог найти способ использовать, 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

Python 3, 162 147 144 142 138 127 байт

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

Попробуйте онлайн

Отдельное спасибо пользователю 202729 и Павлу .

Маниш Кунду
источник
4

05AB1E , 142 68 66 65 байт

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

Попробуйте онлайн!

-74 байта благодаря EriktheOutgolfer, используя сжатую строку base-255.

-2 байта путем обращения сжатой строки, чтобы избежать объединения трех нулей

-1 байт благодаря EriktheOutgolfer, путем переключения двух элементов в массиве ввода, чтобы избежать ведущих 0, и , таким образом , удаляя обратный R команду.

Kaldo
источник
2

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

Попробуйте онлайн!

PrincePolka
источник
Ницца. Можете ли вы объяснить код?
Арминб
@arminb Ничего особенного, длинная строка «AB @ E ...» содержит индексы токенов и новых строк ABC ... = token [012] .. '@' = новая строка, токен или новая строка печатается как ' Я перебираю эту строку.
PrincePolka
объединить printfвfor
l4m2
1
поменять
1
126 байт
floorcat
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]]&

Чистая функция. Принимает список строк в качестве входных данных и возвращает строку в качестве выходных данных. Просто кодирует все индексы токенов, аналогично другим ответам.

LegionMammal978
источник
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.

Уровень реки St
источник