Теперь мы все знаем, что большинство языков имеют очень простые способы «самоизменения» кода. Тем не менее, что если бы вы на самом деле изменили код и отредактировали его части ... на диске?
Ваша цель - создать код, который печатает число, а затем редактирует свой собственный файл, чтобы заменить число следующим в последовательности Фибоначчи, например:
$ ./program
1
$ ./program
1
$ ./program
2
$ ./program
3
$ ./program
5
[etc...]
правила
- Вы не можете хранить число «вне» кода. Без комментариев, без указания сценария на выход, без EOF и т. Д.
- Если ваш код работает с любым именем файла, вычтите 2 из вашего байта и напишите
$BYTESNOW ($ORIGINALBYTES - 2)
в своем заголовке. (Предполагается, что имена файлов находятся в пределах любого алфавитно-цифрового пути к файлу.) - Ваш код должен записать вывод в файл сам по себе, без какой-либо внешней помощи по трубопроводам.
- Ваш код может начинаться с единицы или с нуля. Это не важно
perl6 program
), или она должна включать строку shebang, чтобы ее можно было назвать как./program
?program
, и можем ли мы предположить, что оно находится в текущем рабочем каталоге?"a"
вместоarg[0]
. Это не стоит того.Ответы:
Bash,
5247 (49-2) байтовправок:
Golfed
Тестовое задание
источник
-?
из регулярного выражения. И так как вы там, вы также можете удалить первую группу захвата :)Python 2,
118111 байтов (113 - 2)Он работает с любым допустимым именем файла. Здесь не так много объяснений, сам код очень многословен.
Спасибо FlipTack за напоминание,
close()
не является обязательным.источник
f=open(...)
вместоwith
заявления?Пакет, 81 байт
Примечание: завершающий перевод новой строки является значительным. Требуется, чтобы скрипт вызывался с использованием его полного имени, включая расширение. Выход начинается с 0.
Так как пакетный режим не может реально отредактировать файл, я просто добавляю дополнительные строки в конец файла, чтобы в итоге он узнал, какой будет следующий номер для печати.
>>%0
Размещение экономит байты , потому что я не могу предшествую его с цифрой.источник
C, 142 байта (144 - 2)
Это довольно просто. Сначала он читает, а затем сохраняет два символа в позиции 0x1A в заголовке. Возможно, я мог бы глубже найти более безопасное место для сохранения данных, но он работает для меня на моей машине под управлением OSX, скомпилированной с GCC 4.2ish, и я сомневаюсь, что она очень портативна. Кроме того, поскольку он основан на символах, он переполняется после 13-й итерации.
Это дает вывод:
источник
Node.js,
152137 байт (139 - 2)Для ясности разделены символами новой строки, а не частью количества байтов.
Объяснение:
Использование:
источник
Python 3,6,
9691 (93-2) байтжесткое кодирование имени файла позволит сэкономить 5 байт (88 байт):
Сохранено несколько байтов благодаря @Artyer
источник
a,b=0,1
f=open('f','r+');next(f);f.write(f'a,b={b,a+b}\n{next(f)}{f.seek(0)}');print(b)#
утилиты bash + Unix, 43 байта (45-2)
При первом запуске он использует dc для вычисления 1-го числа Фибоначчи по формуле Бине. Каждый вызов sed изменяет программу, изменяя строку, переданную в dc; это изменение говорит dc добавить дополнительную 1 к показателю степени в формуле, что заставляет его вычислять следующее число в последовательности Фибоначчи каждый раз.
Тестовое задание
Чтобы проиллюстрировать, как это работает, на данный момент, после печати 55, программа была изменена следующим образом:
так что запустить его снова дает
и теперь программа читает:
источник
SmileBASIC 3, 99 байт (101 -2)
-2 байтовый бонус, потому что он работает с любым именем файла.
Этот действительно работает, и он каким-то образом оказался того же размера, что и мой сломанный!
источник
PRGEDIT
команды для замены первой строки (и добавите разрыв строки послеA=0B=1
). И вам также не нуженA=0
первый раз.R 145 байтов (147-2)
(Имеет завершающий перевод строки). Он работает с любым допустимым именем файла.
источник
Perl 6 ,
6762 байта (64 - 2)источник
Сложенный, неконкурентный, 65 (67 - 2) байтов
Некоторые проблемы, касающиеся файлового ввода-вывода, были исправлены в самой последней серии коммитов. Таким образом, неконкурентоспособен.
Вот ссылка на GitHub.
Пример исполнения
(Я пропустил фактический путь для ясности.)
объяснение
Как это работает, беря пару чисел , чтобы начать последовательность (
2:>
в данном случае является целым числом диапазон[0, 2)
, который является(0 1)
), а затем выполняет преобразование Фибоначчи на них, например , так:При каждом запуске это преобразование выполняется в верхней части стека. Затем стек помещается в стек, дублируется и получается его первый член (
stack:0#
). Этот элемент затем выводится и является желаемым числом Фибоначчи.repr
затем берет представление стека и добавляет новую строку. Затем программа помещается в стек и разбивается на новые строки. Затем мы берем последний член (последнюю строку) и добавляем это к вышеупомянутой строке. Наконец, мы нажимаемd0
(сам файл; думаюd
знак ollar0
==$0
.) И пишем в него.источник
Рубин, 68 байт (70-2)
источник
Clojure,
209204195 байтов-5 байт, переключаясь на анализ чисел как длинных вместо целых, и удаляя пару пропущенных пробелов.
-9 байт, удалив пробел между вторым числом и
(let...)
(самое дорогое место за всю историю!).См. Комментарии к pregolfed-коду для описания.
Протестировано снова, и больше не выдает непревзойденных ошибок в скобках. Он работает до 7540113804746346429, после чего он генерирует исключение целочисленного переполнения.
Также обратите внимание, что предполагается, что исходный код находится по адресу «./src/s.clj».
источник