Напишите прямоугольный блок текста, который при размещении в ковре Серпинского , используя блоки одинакового размера для пустых порций, создает программу, которая выводит номер итерации ковра.
Например, если ваш текстовый блок
TXT
BLK
затем запустить программу
TXTTXTTXT
BLKBLKBLK
TXT TXT
BLK BLK
TXTTXTTXT
BLKBLKBLK
должен выводить, 1
потому что форма программы представляет первую итерацию ковра Серпинского.
Точно так же работает
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXT TXT TXT TXT
BLK BLK BLK BLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
должен вывести 2, потому что это форма второй итерации Серпинского ковра.
Запуск текстового блока как есть
TXT
BLK
должен выводить, 0
потому что это можно считать нулевой итерацией.
Это должно работать для всех дальнейших итераций. (По крайней мере, теоретически, если на компьютере есть память и все.)
подробности
- Программы не могут читать или получать доступ к информации об их исходном коде. Относитесь к этому как к строгой проблеме Куайна.
- Вывод идет в стандартный вывод или подобную альтернативу. Выведите только число и дополнительный завершающий перевод строки. Там нет ввода.
- Текстовый блок может содержать любые символы, которые не считаются символами конца строки . Текстовый блок может содержать пробелы.
- «Пустое пространство» в ковре должно состоять исключительно из символов пробела .
- При желании вы можете предположить, что все программы имеют завершающий перевод строки.
Вы можете использовать этот фрагмент стека, чтобы сгенерировать ковер для данного текстового блока на любой итерации:
<style>#o,#i{font-family:monospace;}</style><script>function c(e){e=e.split("\n");for(var n=new Array(3*e.length),t=0;t<n.length;t++){var l=t%e.length;n[t]=e[l]+(t>=e.length&&t<2*e.length?e[l].replace(/./g," "):e[l])+e[l]}return n.join("\n")}function f(){for(i=document.getElementById("i").value,n=parseInt(document.getElementById("n").value);n>0;)i=c(i),n--;document.getElementById("o").value=i}</script><textarea id='i'placeholder='code block...'rows='8'cols='32'></textarea><br>Iterations <input id='n'type='text' value='1'><br><br><button type='button'onclick='f()'>Generate</button><br><br><textarea id='o'placeholder='output...'rows='8'cols='32'style='background-color:#eee'readonly></textarea>
счет
Представление, начальный текстовый блок которого наименьший по площади (ширина умножается на высоту), является победителем. TXT\nBLK
Пример 3 на 2 на балл 6. ( в основном короткие выигрыши коды, поэтому кодовое поле для тега.)
Tiebreaker переходит к представлению, которое использует наименьшее количество отдельных символов в своем текстовом блоке. Если все еще связаны, ответ опубликовал первые победы.
источник
Perl, 30 (15 × 2)
Прежде всего, я собираюсь утверждать, что 10 итераций - разумный предел, а не 2 32 . После 10 итераций программа, состоящая из N байтов, будет расширена до ( N × 3 20 ) байтов (плюс разрывы строк), что превышает 3 гигабайта даже для N = 1. 32-битная архитектура была бы полностью неспособна обрабатывать 11 итераций. (И, очевидно, во Вселенной не хватает частиц для 2 32 итераций).
Итак, вот мое решение:
Это работает путем увеличения переменной
$n
в первой строке и вычисления ее логарифма на каждом шаге. Вторая строка печатает целую часть этого логарифма и выходит.Простой логарифм с основанием e (2.718 ..) достаточно близок, чтобы дать правильные результаты для первых 10 итераций.
источник
Golfscript, 9 * 2 = 18
(Обратите внимание, что в первой строке есть пробелы, чтобы сделать ее прямоугольной)
Я не мог найти функцию журнала для Golfscript, поэтому
base
пришлось сделать.Golfscript начинается с пустой строки, поэтому
0+
просто увеличивает длину строки на 1 (по приведению). К тому времени, когда первая строка закончится, в стеке будет строка длины3^n
, которую мы возьмем за основу журнала 3, прежде чем будем суперкомментировать.n
затем автоматически печатается.источник
,
во второй строке. Первая строка0or)
:; вторая линия3base,(}
. Другая очевидная цель -(
вторая строка. Это сложнее, но также можно удалить, заменив первую строку1+~abs(
на прямоугольник 7 * 2.С, 12х8 = 96
Вдохновленный @ciamej, я уменьшил его. Он использует это деление на 3 трюка, плюс понимание того, что ковер эффективно преобразует if в цикл while.
Код был протестирован на gcc / Ubuntu для итераций до 3.
Предыдущее решение: C, 11x12
Не победитель размера, но эй, это C.
Он находит log2 числа блоков путем сдвига битов, затем использует некоторые магические числа и усечение int для оценки log3. Математика должна работать до 26 итераций (42-битное число).
источник
CJam, 9 байт
Идея использования
]
исходит от Оптимизатора, но он использует совершенно другой метод для подсчета.Попробуйте онлайн
Как это устроено:
Два других 9-байтовых решения
источник
Python 2, 15 * 3 = 45
Еще одна реализация идеи «счесть первый ряд-потом-журнал-три-и-выйти». Вероятно, еще можно играть в гольф чуть больше.
источник
до н.э., 2 * 16 + 1 = 33
Дополнительные +1 в счете, потому что
-l
требуется опция bc:источник
Golfscript, 7 * 2 = 14
Это вдохновляет Sp3000 в ответ , и , в частности , стремлением оптимизировать длинную вторую линию.
3base,
настолько короток, насколько логарифм с базой 3 попадет в GS, и супер-комментарий}
явно оптимален.Для первой строки требуется отобразить пустую строку
''
из исходного stdin в 0, а затем отобразить каждое неотрицательное целое число в его преемнике. Таким образом, мы заканчиваем первую строку3^n - 1
в стеке и3base,
не требуем никакого уменьшения.источник
С, 13х8
источник
Perl, 76
Я знаю, что публиковать это, вероятно, не имеет особого смысла, так как это уже полностью побеждено, но в любом случае вот мое текущее решение.
источник
> <> (Рыба), 12 * 3 = 36
Более простое> <> решение:
Сначала мы запускаем верхний ряд верхних блоков.
'v'00p
ставитv
на самую первую позицию всей программы, направляя указатель программы вниз, когда он возвращается к началу после достижения конца строки. Перед этим каждый блок помещает в него 0 и длину стека + 1. (стек будет0 2 0 4 0 6 ...
)В первой половине второй и третьей мы подсчитываем, сколько раз мы можем разделить верхний элемент стека, прежде чем получим 2 (мы сохраняем это во втором-верхнем элементе).
В конце мы выводим второй в верхний элемент стека.
источник
Луа, 3 * 17 = 51
Та же стратегия, что и у большинства людей:
источник
PHP, 22 × 2 = 44
27 × 2 = 54Просто еще один пример - count-log3-out. Не очень маленький, но мой первый гольф;)
источник