Написать двоичный счетчик в квине

10

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

Программа (l, n) состоит из l копий s_zero и s_one, соответствующих двоичным цифрам n, дополненных слева s_zero.

Например, если s_zero = fooи s_one =, barто
программа (4, 0) = foofoofoofoo
программа (4, 1) = foofoofoobar
программа (4, 2) = foofoobarfoo
и т. Д.

Программа (l, n) должна распечатать исходный текст программы (l, (n + 1) mod (2 ^ l)). В приведенном выше примере foobarfoofooнеобходимо печатать foobarfoobarпри выполнении.

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

QuadmasterXLII
источник
Почти дубликаты для codegolf.stackexchange.com/questions/35974/… - вычисления выполняются программой quining с двумя различными блоками кода.
feersum
Может ли программа прочитать свой собственный исходный код?
Дверная ручка
2
@feersum Я не согласен. Это намного проще, в частности, вам не нужно определять разрывы строк. Кроме того, я думаю, что задача действительно имеет значение, в противном случае каждый обобщенный вызов Квина будет дублировать основной вызов Квина.
Мартин Эндер
Преимущество более простой задачи состоит в том, что она поощряет конкуренцию за создание шокирующе коротких ответов, замеченных до сих пор - я надеюсь, что эта задача будет отличаться!
QuadmasterXLII
1
Вероятно, стоит отметить, что s_zero и s_one должны быть разными. В противном случае у меня есть много решений с 2 ​​* n баллов.
рандома

Ответы:

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. ";
}_~
jimmy23013
источник
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%~}.~

Не так коротко, как в C23am-решении user23013 , но я решил, что в любом случае опубликую это, если только (незначительно) увеличить разнообразие используемых языков.

Мое решение не основано непосредственно на каком-либо из существующих решений (и, на самом деле, я не изучил их подробно, так как я до сих пор не очень хорошо читаю CJam), но все они имеют варианты одной и той же базовой структуры quine ( {".~"}.~в GolfScript, {"_~"}_~в CJam). Это на самом деле не очень удивительно, так как кажется, что это один из наиболее эффективных способов написать квин с произвольной полезной нагрузкой на этих языках.

В этом коде есть несколько частей, которые мне не очень нравятся, и я подозреваю, что это возможно и дальше, но я потратил слишком много времени на это, как есть.

Илмари Каронен
источник