Напишіть двійковий лічильник у квінті


10

Напишіть два фрагменти коду, які ми будемо називати s_zero та s_one.

Програма (l, n) складається з l копій s_zero та s_one, що відповідають цифрам n у двійковій формі, з лівою кнопкою s_zero.

Наприклад, якщо s_zero = fooі s_one = barтоді
Program (4, 0) = foofoofoofoo
Програма (4, 1) = foofoofoobar
Програма (4, 2) = foofoobarfoo
і т.д.

Програма (l, n) повинна друкувати джерело програми (l, (n + 1) mod (2 ^ l)), щоб стандартно вийти. У наведеному вище прикладі foobarfoofooнеобхідно надрукувати foobarfoobarпри виконанні.

Ваш бал - це сума довжин фрагментів s_zero та s_one


Близький дублікат до codegolf.stackexchange.com/questions/35974/… - обчислення, здійснені за допомогою програми квінінгу з двома різними кодовими блоками.
feersum

Чи може програма читати власний вихідний код?
Дверна ручка

2
@feersum Я не згоден. Це набагато простіше, зокрема, вам не потрібно визначати розриви рядків. Крім того, я думаю, що завдання все-таки має значення, інакше кожен узагальнений випробування квітки був би основним завданням для квіни.
Мартін Ендер

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

1
Напевно, варто відзначити, що s_zero та s_one мають бути різними. Інакше у мене є багато рішень з 2 * n балами.
randomra

Відповіді:


6

CJam, 29 + 29 = 58 байт

Код 0:

0{"_~"]]z(3\+2b(2b2>a\+z~[}_~

1 код:

1{"_~"]]z(3\+2b(2b2>a\+z~[}_~

Пояснення

0                       " Push the current bit. ";
{"_~"                   " The basic quine structure. ";
    ]                   " Make an array of the current bit, the function and _~.
                          That is the code fragment itself. ";
    ]                   " Make an array of all code fragments in the stack. ";
    z(                  " Extract the array of the bits. ";
    3\+2b(2b2>          " Convert from base 2, decrease by one and convert back,
                          keeping the length. ";
    a\+z                " Put the bits back to the original position. ";
    ~                   " Dump the array of code fragments back into the stack. ";
    [                   " Mark the beginning position of the array of the next code fragment. ";
}_~

2
щоразу ...
Оптимізатор

3

CJam, 47 + 47 = 94 байти

Код 0:

{`"_~"+]:+T2*0+:T)\AsSerS/_,(@2Y$#+2bU@->]zs}_~

1 код:

{`"_~"+]:+T2*1+:T)\AsSerS/_,(@2Y$#+2bU@->]zs}_~

Вибачте експлікатив.

Я впевнений, що все-таки можу поголити кілька байтів там. Я додам пояснення, як тільки вирішу, що більше не можу перешкоджати гольфу.

Тестуйте це тут.



1

GolfScript, 37 + 37 = 74 байти

0{`".~"+:q;]-2%1\{1$^.@&q@}%\;-1%~}.~
1{`".~"+:q;]-2%1\{1$^.@&q@}%\;-1%~}.~

Не настільки короткий, як CJam-рішення користувача23013 , але я вважав, що все-таки опублікую це, якщо тільки (незначно) збільшити різноманітність використовуваних мов.

Моє рішення безпосередньо не ґрунтується на жодному з існуючих рішень (і, справді, я їх детально не вивчив, оскільки досі не читаю CJam дуже добре), але всі вони містять варіанти тієї ж основної структури квина ( {".~"}.~у GolfScript, {"_~"}_~CJam). Це насправді не дуже дивно, оскільки, здається, це один із найефективніших способів написати квіне з довільною корисним навантаженням на цих мовах.

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

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