Поместите строку в код, который вам нужен, и встряхните

10

Используя один язык программирования, напишите 5 однострочных программ, каждая из которых выводит отдельную строку первого стиха песни Гарри Нильссона « Кокос » 1972 года при индивидуальном запуске:

Брат купил кокос, он купил его за десять центов. У
его сестры был еще один, она заплатила за лайм.
Она положила лайм в кокос, она выпила их обоих.
Она положила лайм в кокос, она выпила их обоих.
Она положить лайм в кокос, она выпила их обоих

( полная лирика )

Последние 3 строки имеют одинаковую лирику, так что ваши последние 3 программы также могут быть.

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

пример

Самый простой ответ будет состоять из 5 однострочных операторов печати, последние 3 идентичных:

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 байтов.

подробности

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

  • Вывод на стандартный вывод или ближайшую альтернативу. Вы также можете вывести в файл с именем по вашему выбору.

  • «Однострочные программы» - это строки, которые содержат любые символы, кроме разделителей строк (вам, вероятно, просто нужно беспокоиться о новых строках).

  • При составлении однострочников в 5 строчек вы должны добавить ровно 4 новых строки, по одной между каждой соседней парой однострочников. При желании вы можете добавить завершающий перевод строки.

Кальвин Хобби
источник
«Напишите 5 программ, каждая из которых выводит отдельную строку ...» разве это невозможно?
feersum
@feersum Линии разные. У трех из них просто один и тот же текст.
Увлечения Кэлвина
Что если у меня есть файл Java, содержащий 5 классов, каждый из которых имеет mainметод? Тогда что должно быть запущено при запуске программы?
feersum
@feersum Ну, что делает твой компилятор? Я не уверен, что делает Java, когда несколько классов в одном файле имеют оба main.
Увлечения Кэлвина
2
Насколько я помню, это один рекламный ролик Coca-Cola, где они «кладут лайм в колу» ...
Джо З.

Ответы:

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 программ
  • Обернуть все в стек в массиве
  • Сортировать массив
  • Разверните массив, чтобы следующая программа могла использовать ту же логику
  • На каждом этапе у нас есть частичная лирика в массиве. К счастью, сортировка массива дает правильный порядок лирики.

ОБНОВЛЕНИЕ : Оказывается, вам не нужен цикл wrap-sort-unwrap после 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

В Prelude каждая строка - это свой собственный «голос» со своим стеком, и эти голоса исполняются параллельно. То есть в полной программе каждая строка будет просто индивидуально создавать строку и при печати ее в конце. Но из-за смещений операторов print порядок строк не имеет значения для порядка вывода, так как выполнение выполняется слева направо, а не сверху вниз.

Теперь, почему линии такие длинные? Prelude хранит только числа в своем стеке. Кроме того, он может выдвигать только однозначное число за раз, поэтому большие числа должны быть построены из сложения и вычитания (нет ни умножения, ни другой арифметики). Таким образом, большая часть кода просто вычисляет и нажимает правильные коды символов. Чтобы немного сократить это, я компенсировал их 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<}?}%

И наконец, просто для забавы, почему я думаю, что это было бы очень кратко, если бы в Prelude было понятие строк:

"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

Рубин, 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])}

Работает в любом порядке или индивидуально. Каждая строка изменяет глобальное состояние, а затем устанавливает ловушку для выполнения в конце программы, если ловушка уже не была установлена.

histocrat
источник
На вопрос написано «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(пут) инструкций, которые помещают символы, пока доска не будет выглядеть следующим образом:

<    /<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. Это цикл для печати всего стека, пока он не станет пустым.

Если присутствует только одна строка программы, то \зеркала выполняют ту же работу, что и телепорты в каждой лирической строке.

Если программа зашифрована, то приведенное выше объяснение все еще применимо, поэтому программа работает для всех перестановок!

Sp3000
источник