Покладіть рядок у горіховий код і збийте все це


10

За допомогою однієї мови програмування напишіть 5 однорядних програм, кожна з яких виводить інший рядок першого вірша до пісні Гаррі Нілссона 1972 року " Кокосовий горіх " під час виконання окремо:

Брат купив кокос, він купив її за десять центів
його сестра ще один, вона заплатила його вапном
вона поклала вапно в кокосовий горіх, вона випила їх як вгору ,
вона поклала вапно в кокосовий горіх, вона випила їх обох
Вона поклав лайм у кокос, вона випила їх обох

( повна лірика )

Останні 3 рядки мають однакові тексти пісень, тому можуть бути і ваші останні 3 програми.

Існує 5 факторних або 120 способів, щоб ці 5 однорядкових програм можна було організувати по одній лінії на одній 5-рядковій програмі. Ви повинні оптимізувати свої однорядкові програми таким чином, щоб для якомога більшої кількості цих 120 комбінацій програма 5-рядкової програми виводила весь вірш у правильному порядку , точно так, як показано вище.

Приклад

Найпростіша відповідь мала б 5 однорядкових тверджень про друк, останні три однакові:

print('Brother bought a coconut, he bought it for a dime')
print('His sister had another one, she paid it for a lime')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')

Вихід до 5-рядкових програм буде віршем у належному порядку, доки перші два однолінійки будуть у правильних місцях. Тільки 6 із 120 можливих домовленостей досягають цього.

Оцінка балів

Подання з найбільш робочими справами з усіх 120 виграшів. Автоматичний вимикач переходить до набору програм з найменшим кумулятивним числом байтів (нові рядки не враховуються). Приклад має 309 байт.

Деталі

  • Ваші програми можуть не читати власний вихідний код. Вони також не повинні читати інші зовнішні файли або вимагати підключення до мережі.

  • Вихід до stdout або найближчої альтернативи. Ви також можете вивести файл у вибране ім'я.

  • "Однорядкові програми" - це рядки, що містять будь-які символи, окрім термінаторів рядків (вам, мабуть, просто потрібно буде турбуватися про нові рядки).

  • Складаючи одиночні вкладиші до 5-лайнерів, вам слід додати рівно 4 нових рядки, по одному між кожною сусідньою парою однолінійних. Ви можете за бажанням додати зворотний новий рядок.


"Написати 5 програм, кожен з яких виводить різний рядок ..." Це не можливо?
feersum

@feersum Рядки різні. У трьох з них просто трапляється однаковий текст.
Захоплення Кальвіна

Що робити, якщо у мене є файл Java, який містить 5 класів, кожен з mainметодом? Тоді що слід запустити під час запуску програми?
feersum

@feersum Ну що робить ваш компілятор? Я не впевнений, що робить Java, коли обидва класи в одному файлі мають обидва main.
Захоплення Кальвіна

2
Як я пам’ятаю цю, - це одна реклама кока-кола, де вони «кладуть вапно в кокс» ...
Джо Z.

Відповіді:


9

CJam, 120 дійсних перестановок, 334 299 290 байт

"She put the lime in the coconut, she drank them both up"N+
"Brother bought a coconut, he bought it for a dime"N+]$~
"She put the lime in the coconut, she drank them both up"N+
"His sister had another one, she paid it for a lime"N+]$~
"She put the lime in the coconut, she drank them both up"N+

Досить проста логіка:

  • Покладіть кожен рядок пісні в кожну з 5 програм
  • Згорніть все на стек у масив
  • Сортувати масив
  • Розгорніть масив, щоб наступна програма могла використовувати ту саму логіку
  • На кожному кроці ми маємо часткові тексти в масиві. На щастя, сортування масиву дає правильний порядок пісень.

ОНОВЛЕННЯ : Виявляється, вам не потрібен цикл обгортання-сортування-розкручування після 3-х подібних та відображених у кінці рядків пісні. Я можу пояснити, чому якщо це не так очевидно :)


8

Прелюдія , 120 перестановок, 2045 2035 байт

9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                          (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+9409-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-5809-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-99+58992++96+99+09-9-9-3-                                             (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                 (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+993+09-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-49197+09-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-595+96+09-9-9-9-9-9-9-1-99+58992++96+95+109-9-9-9-9-9-9-1-41809-9-9-9-9-9-9-1-99+5992++991++9991++09-9-9-9-9-9-9-1-991++909-9-6-                                                           (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                                                   (9+9+9+9+9+9+9+9+9+9+6+!)

Це в кінцевому рахунку переконало мене, що Прелюдія та CJam потребують дитини. Якби не дуже обмежений набір інструкцій Prelude, це подання було б насправді дуже конкурентоспроможним, якби навіть не обіграв CJam.

Основна ідея полягає в наступному

"push line 4"               print
"push line 1"print
"push line 3"          print
"push line 2"     print
"push line 5"                    print

У прелюдії кожен рядок - це власний "голос" зі своїм стеком, і ці голоси виконуються паралельно. Тобто, у повній програмі кожен рядок просто окремо побудує рядок та надрукує його в кінці. Але через зсуви операторів друку порядок рядків зовсім не має значення для порядку виводу, оскільки виконання ліворуч-праворуч, а не зверху-вниз.

Тепер, чому рядки такі довгі? Прелюдія зберігає на своєму стеку лише номери. Крім того, воно може одночасно висувати одноцифрове число, тому великі числа повинні бути побудовані з додавання і віднімання (не існує множення ні арифметики, ні іншого). Отже, найбільша частина коду - це просто обчислення та натискання правильних кодів символів. Щоб трохи скоротити це, я компенсував їх 96. Наприкінці, щоб надрукувати, я петлю, поки стек не порожній (тобто 0зустрічається a ), додаю 96 до кожного числа і роздруковую його.

Зауважте, що рядки висуваються у зворотному напрямку, оскільки вони друкуються з останнього до першого символу.

Це передбачає , інтерпретатор Python з NUMERIC_OUTPUT = False(який , як специфікація визначає I / O).

Я використовував наступний код CJam для створення структури рядків:

"Brother bought a coconut, he bought it for a dime
"W%{i96-_0<{zLa*9/:,'-*'-+0\+}{La*9/:,_,'+*W<}?}%

Нарешті, просто для розваги, чому я вважаю, що це було б дуже коротко, якби у Прелюдії була концепція струн:

"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emid a rof ti thguob eh ,tunococ a thguob rehtorB"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emil a rof ti diap ehs ,eno rehtona dah retsis siH"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!

Тепер заяви про друк !вже в потрібному порядку, тому мені навіть не потрібно було їх компенсувати. Думаю, я певний час перейду до цього.


7

Ruby, 120 дійсних перестановок, 430 байт

$*[1]='His sister had another one, she paid it for a lime';a||=at_exit{puts($*-[p])}
$*[0]='Brother bought a coconut, he bought it for a dime';a||=at_exit{puts($*)}
$*[2]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[3]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[4]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}

Працює в будь-якому порядку або індивідуально. Кожен рядок змінює глобальний стан, після чого встановлює гачок, який потрібно виконати в кінці програми, якщо гак уже не встановлений.


У запитанні сказано "5 однолінійних програм". Чи це не означає, що кожен рядок повинен бути в окремій програмі? Не всі в одному?
bacchusbeale

1
Просто питання форматування. Кожен рядок працює як власна програма.
гістократ

6

> <> , 120 перестановок, 703 байт

<    /a"emid a rof ti thguob eh ,tunococ a thguob rehtorB"0a.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<   / a"emil a rof ti diap ehs ,eno rehtona dah retsis siH"09.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<  /  a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"08.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
< /   a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"07.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
</    a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"06.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"

Обмеження в одній лайнері було досить жорстким для двовимірної мови, тому мені довелося знайти спосіб максимально використати .інструкцію з телепорту.

Початковий <робить потік програми вліво, обертаючись і виконуючи

"o;?=0l>\\\\\\/////"15p26p37p48p59p75p76p77p78p79p7ap8ap9apaapbapcapdap

Це низка pінструкцій (put), які розміщують символи, поки рада не виглядає так:

<    /<lyrics1>0a.#.!50<blah>
<   / <lyrics2>09.#.!50<blah>
<  /  <lyrics3>08.#.!50<blah>
< /   <lyrics4>07.#.!50<blah>
</    <lyrics5>06.#.!50<blah>
 /     \
  /    \
   /   \
    /  \
     / \
       >l0=?;o

#.!50Потім перевертається назад потік програми для вправо ще раз, перш ніж стрибати на лінію 5. Нижче це:

  • Слідом за /дзеркалом у рядку 5 знаходять пісню 5, яку висувають на стек. Потім телепортуємо на рядок 6.
  • Слідом за /дзеркалом на рядку 6 знаходять пісні 4, які висуваються на стек. Потім телепортуємо на рядок 7.
  • Слідом за /дзеркалом у рядку 7 знаходять пісні 3 ...

Це відбувається до тих пір, поки ми не натиснемо тексти пісень 1, і тоді ми телепортуємося до рядка 10. Це цикл для друку всього стека, поки він не порожній.

Якщо присутній лише один рядок програми, \дзеркала виконують таку ж роботу, як і телепорти на кожній ліричній лінії.

Якщо програма зашифрована, то пояснення вище все ще застосовується, тому програма працює для всіх перестановок!

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