Добрый вечер, агенты по гольфу,
Ваша миссия от имени известного гиганта индустрии развлечений Eviltronic Arts. В рамках своего гнусного плана порабощения и развлечений в мире они должны продать как можно больше копий SimStation V. Это означает, что программное обеспечение должно загадочным образом перестать работать, после его запуска несколько раз.
Ваша цель - написать программу, которая будет подсчитывать, сколько раз она была запущена. Программа не должна делать ничего другого, кроме как записать целое число в стандартный вывод. При первом запуске он должен вернуть «1». Следующая «2» и так далее. Программа должна быть в состоянии, по крайней мере, достигнуть числа «14», но нет обязательного верхнего предела.
Однако ваша программа не должна писать никаких новых файлов. Доступ к самому себе, или реестру, или даже интернету абсолютно нормален. Но некоторые наши пользователи с подозрением относятся к новым файлам и просто перезаписывают их! Нерв! Победив ограничения на программное обеспечение, которое они законно приобрели!
Программа не может предполагать стабильный интерпретатор или оболочку - программа все равно должна работать, если весь компьютер интерпретатора или оболочки перезапускается между выполнением.
Поскольку он должен быть как можно более детектируемым, победит самый короткий исходный код.
Удачи, агенты. Индустрия развлечений рассчитывает на вас.
Ответы:
bash script,
39,37,2118Коротко и сладко, моя первая подача в коде гольф :)
источник
echo
наid
: D;
новой строки и удалите завершающий символ новой строки. Это даже будет выглядеть намного лучше :-)Python,
40,39, 38 символовТакже нет такого верхнего предела времени выполнения:
Как видите, размер программы постепенно увеличивается, но в исходной задаче такого ограничения не было. Я считаю, что размер представленной программы - это все, что имеет значение
источник
a+
,a
должно работать нормально.PHP 48 байт
Простой самоизменяющийся подход. После прогона 99 раз он эффектно рухнет.
⋮
источник
bash script, 37
источник
Рубин:
3121 символов(Это переписывание Abhijit «s решения Python . Если вы как базовая идея, upvote своего ответа, как я.)
Образец прогона:
источник
<<
вы можете сохранить некоторые символы: `open ($ 0* ш, 17
Использование веб-сервиса, другой подход, чем другие существующие решения до сих пор. Лимит: память о моей машине.
JavaScript, 40
Едва ли считается программой, но в любом случае она довольно длинная. Не работает в Firefox в локальном файле. Лимит: 2 ^ 31.
источник
alert(localStorage.a=~~localStorage.a+1)
41, и технически говоря, программа javascript была бы без тегов сценария, которых было бы только 33alert((l=localStorage).a=~~l.a+1)
a=localStorage;alert(a.b=~~a.b+1)
хотя ваш выглядит лучше: DPHP 31
37символовСамостоятельная модификация. Это считается в одинарном. Будьте осторожны, чтобы ваш текстовый редактор не пытался быть полезным и вставлял символ новой строки после 1. Он будет работать (правильно) только в PHP <5.3.2, потому что он полагается на php для закрытия дескрипторов открытых файлов при завершении работы. Или это допустимо для утечки файловых дескрипторов?
Оригинальная версия (36 символов), все версии PHP:
источник
Питон, 50
Он использует тот же подход, что и в ответе primo, и аналогичным образом дает сбой при 100-м прогоне.
источник
J (58)
Вам нужно запустить это как скрипт, он не будет работать из командной строки J, очевидно.
В J токенайзер, который использует интерпретатор, доступен как
;:
функция, поэтому, если онx
содержит код J, он;:x
содержит токены J, то есть:Так:
echo m=.1
: установитеm
в 1 и запишите это на экранk=.1{ARGV
: сохранить второй элемент вARGV
(имя скрипта) вk
.1!:2[k
: записать в файл следующую строкуk
:;:1!:1[k
: чтениеk
, текущий скрипт и токенизация(<":m+1)(<3)}
: заменить третий токен строковым представлениемm + 1
;:^:_1
: запустить токенизатор в обратном порядке, создав строкуexit
: выйти из интерпретатора (он не делает это сам по себе, даже если вы запускаете скрипт)источник
PHP,
3433 символаСпасибо Тиму за обновление! Мое старое решение:
Проблема заключается в том, что
$_SESSION[A]
это""
- пустая строка - в первой итерации, ноsession_start()
возвращает 1, вы можете добавить его и убить двух или трех мух в одном кадре!Решение с правильным синтаксисом (35 символов):
источник
Haskell - 36 байт
Просто добавляет
+1
в конец исходный файл, который предполагается именоватьa.hs
..hs
Расширение является обязательным и в GHC и GHCI.источник
TI-Basic, 9 символов
источник
Партия - 41
Учитывая пример использования, я, вероятно, не предположил бы, что этот метод является жизнеспособным - он переименовывает файл .bat, содержащий скрипт -
Сохраните это в файл с именем
0.bat
- и вызовите с помощью0.bat 2>nul
.2>nul
перенаправляет stderr на nul, что необходимо, потому что этот скрипт переименует файл, содержащий скрипт, как только он это сделает, cmd, очевидно, больше не сможет видеть скрипт (до того, как он достигнет EOF) и вернет ошибкуThe batch file cannot be found.
Каждый последующий вызов сценария, конечно, должен быть
1.bat 2>nul ... 2.bat 2>nul ... 3.bat 2>nul ... etc ...
источник
скрипт mIRC, 28/22 байта
Если поместить на вкладку «псевдонимы», «псевдоним» может быть опущен и составляет 22 байта.
источник
Python,
4948 символовЯ понял, что это будет только 48 символов на Windows из-за
\r\n
. В противном случае это должно быть 49.Дешевый грабеж метода от @grc
источник
C 190 символов. Работает только на Win NT
источник
C #, 142 символа
источник
Tcl, 63 или 73 байта
С некоторым веб-сервисом это 73:
Модификация сама по себе составляет 63:
источник
C # -
201239234 символаРаботает первые 255 раз, затем обнуляется до 0. При первом выполнении ничего не выдается.
Сохранить как Main.cs, скомпилировать с
Протестировано с gmcs 2.10.8.1 и Mono runtime 2.10.8.1-5ubuntu2
источник
Powershell, 47 байт
предполагает, что сценарий назван
a.ps1
Скрипт перезапишет себя, заменив
0
первую строку на1
,2
,3
и так далее.также можно сохранить еще 8 байтов, заменив оба экземпляра
a.ps1
с1
и сохранения сценария в виде файла с именем1
, хотя это немного далеко для меня.Замените вторую строку этим, если файл не сохранен как «a.ps1».
0
на первой строке инициализировать счетLinebreak обеспечивает самый простой способ разбить файл на две части
он берет файл «a.ps1» и считывает его как массив строк, затем мы перебираем его с
[0..1]
и устанавливаем его в переменные,$n
которые преобразуются как[int]
и$t
соответственно, так что0
первая строка становится$n
и код на второй строке становится$t
При этом использовалась
,1,2
запись массива для создания массива из двух элементов, один из которых является числом, хранящимся в$n
предварительно увеличенном виде и выводимое на стандартный вывод с использованием неявных скобок, второе - вторая строка текста из файла, а затем также выводится это в файл с именем «a.ps1»поскольку и вход, и выход являются массивами строк, требуется минимальное форматирование, и интерпретатор принимает почти все.
источник
Zsh (без coreutils), 32 байта
(Обратите внимание на завершающий перевод строки) Использует длину скрипта. На каждом вызове, последняя линия , показанная выше будет добавлять
:
(идентичныйtrue
) и перевод строки в сценарий, отсюда/2
.Попробуйте онлайн!
источник
Rust / cargo-script, 283 байта
Один лайнер:
Сохранить как
w
и запустить сcargo-script
:Не повторяйте слишком быстро, иначе он застрянет .
Частично негольфированный:
Сломается после 99999;
источник
GNU sed, 13 + 1 (флаг n) = 14 байт
Выполнить: sed -nf ss
Предполагается, что имя файла источника называется
s
. После кода необходим завершающий символ новой строки, который был подсчитан в общем количестве байтов. Объяснение:источник