Ваша задача - написать полную программу, которая будет продолжать отсчитывать от 10 при каждом запуске.
- При первом запуске программы ее следует распечатать
10
. - В следующий раз он должен вывести
9
. - В следующий раз он должен вывести
8
, и так далее. - Вместо печати
0
программа должна аварийно завершить работу. Вам больше не нужно обрабатывать программу, запущенную после этого. - Любые средства, используемые для хранения, могут считаться пустыми до первого выполнения программы.
Вот пример реализации в Python 3:
try:f=open("a","r+");v=int(f.read())
except:f=open("a","w");v=10
1/v
print(v)
f.seek(0)
f.write(str(v-1))
Это код-гольф , поэтому выигрывает самый короткий ответ (измеряемый в байтах).
Ответы:
6502 машинного языка + Apple] [+ ROM, 12 (11? 10? 9?) Байтов
Должен начинаться с
$8000
. Вылетает на системный монитор, когда счет достигает 0.Должен начинаться с
$B1
. Это экономит байт, так как я могу использовать (двухбайтовую) версию с нулевой страницейDEC
, но перезаписывает критическую процедуру ApplesoftCHRGET
; вам нужно будет загрузить его и вызвать с монитора, а также использовать CTRL+ BReturnдля повторной инициализации BASIC, как только вы закончите. Не уверен, если это делает его недействительным или нет.Должен начинаться с
$8000
. Это не инициализирует$9E
, сохраняя два байта. Однако это означает, что вы не должны вызывать его с отрицательным адресом (или, если вы вызываете его с монитора, вы должны вызывать монитор с положительным адресом). Если вы это сделаете, Applesoft вCALL
рутина будет хранитьFF
в$9E
, заставляя его , чтобы добавить 65280 на номер при печати. Опять же, не уверен, если это делает решение недействительным или нет.Должен начинаться с
$B1
. Это комбинация двух вышеупомянутых программ, сохраняющая в общей сложности три байта; вам придется вызывать монитор с положительным адресом, загружать его и запускать оттуда, и использовать Ctrl+ BReturnдля повторной инициализации BASIC, как только вы закончите.Обратите внимание, что эти программы только изменяют программу в памяти; Повторная загрузка программы с диска приведет к сбросу обратного отсчета. Это работает, потому что Apple] [(и] [+, // e и // c) не имеют никакой системы защиты памяти; программа (и ее самодиакции) останутся в памяти даже после ее выхода, поэтому вы можете продолжать запускать ее из памяти, пока не перезапишите эту память чем-то другим.
Пробный прогон
объяснение
Объяснение 10-байтовой версии
Варианты
Печатает
ERR
и подает звуковой сигнал, когда счетчик достигает 0Нормальный - 15 байт
Перезаписывает
CHRGET
- 14 байтовНе инициализируется
$9E
- 13 байтПерезаписывает
CHRGET
и не инициализирует$9E
- 12 байтЗависает при достижении 0
Нормальный - 12 байт
Перезаписывает
CHRGET
- 11 байтНе инициализируется
$9E
- 10 байтПерезаписывает
CHRGET
и не инициализирует$9E
- 9 байтисточник
Perl на Linux, 17 байт
Я подумал, что может быть интересно создать программу, которая не поддерживает само состояние и не изменяет свой собственный исходный код; другими словами, он на самом деле проверяет, как часто он запускается, спрашивая ОС. В вопросе говорится: «Любые средства, используемые для хранения, можно считать пустыми до первого выполнения программы», и поэтому мы хотели бы начать с полностью пустой ОС. Поэтому я лучше объясню, как вы это делаете, поскольку в противном случае тестирование программы затруднительно.
На самом деле есть два способа настройки для запуска программы. В любом случае, минимальная ОС для этой цели будет запускать только оболочку (чтобы мы могли запускать Perl по очереди) и самую простую оболочку (при этом она не делает ничего особенного, что делает ОС не пустой).
/bin/dash
Это хороший выбор, так как он был задуман как минимальная оболочка для восстановления системы. Затем нам нужно запустить Linux таким образом, чтобы он работал толькоdash
. Мы можем сделать это, перезагрузив компьютер сinit=/bin/dash
помощью командной строки Linux, чтобы он ничего не запустилdash
, или (гораздо удобнее) создать контейнер Linux, использующийunshare -Urfp /bin/dash
в терминале (наunshare
самом деле не создающий пустую ОС, но он симулируетодин; в частности, внутренняя часть контейнера думает, что он root,dash
думает , что он init и т. д., как это происходит в реальной пустой ОС). Отказ от ответственности: я еще не проверял это на голом металле, только внутриunshare
, но теоретически это должно работать в обоих направлениях.Наконец, как только мы это настроим, нам просто нужно взглянуть на PID; поскольку мы находимся в пустой системе, система инициализации (здесь, оболочка) будет иметь PID 1, поэтому при выполнении Perl PID будут иметь значения от 2 до 12 включительно. Итак, наша программа выглядит так:
Вот пример прогона:
источник
unshare
не поддерживаю ни один из флагов-Urfp
.unshare
довольно новый (это интерфейс к функции ОС, который также довольно новый), и ошибки действительно были устранены только за последний год или около того. Если вы используете версию 2,5 года, неудивительно, что она очень ограничена в функциональности.Баш + седь,
414038 байтПопробуйте онлайн!
источник
sed: invalid option -- '/'
. sed (GNU sed) 4.2.2Javascript, 42 байта
Проверьте это с помощью этой скрипки - обязательно очистите локальное хранилище, чтобы сбросить обратный отсчет.
Спасибо steenbergh, Lmis и obarakon за большое количество байтов!
источник
y=localStorage;y.a=y.a||10;alert(y.a>0?y.a--:a)
может сэкономить вам байт.sessionStorage
тестирование с более простым сбросом (просто используйте новую вкладку), но, конечно, +2 байта.l=localStorage;l.l=-~l.l;alert(10-l.l||l)
для сохранения байта, я бы удалил мойconsole.log
здесь, но я предпочел бы это такжеa
оценить, когда значение в localalstorage не равно 0.C #,
197160159125 байтСохранено 34 байта благодаря молоку
И отформатированная версия (с
ReadKey
добавленным, чтобы вы могли просмотреть вывод):Это дольше, чем я думал, так что, вероятно, есть место для игры в гольф.
источник
File.Exists
аFile.Create
вместоReadAllText
иWriteAllText
. Просто проверьте, существует ли имя файла, но не с содержимым файла. Кроме того,namespace System.IO
и вы можете удалить пространство имен изSystem.Console.Write
. 125 байт:namespace System.IO{class P{static void Main(){var n=11;for(;File.Exists(""+--n););File.Create(""+n);Console.Write(n*n/n);}}}
Дьялог АПЛ ,
332822/20? байтовЯ не уверен, является ли это допустимым, так как он состоит из функции (которая должна вызываться с фиктивным аргументом). Однако все программы APL (чисто функциональные или нет) имеют одинаковый статус, и, действительно, некоторые версии APL не имеют традиционных программ, только функции. В качестве компенсации я добавил два байта, чтобы назвать его, хотя это не является необходимым для желаемого эффекта.
Обратите внимание, что это зависит от неофициальной причуды, которая
∘←
присваивается глобально.6::
при любой ошибке⊢c
возврат с∘←10
который глобально установлен на 10⋄
в настоящее время÷÷c
вернуть дважды перевернутые (ошибки на ноль) c∘←
который глобально установлен наc-1
один меньше чем сПопробуй APL онлайн!
Конечно, действительная 28-байтовая версия:
Работает, устанавливая c в 11, если отсутствует, затем вычитая 1 из c , инвертируя дважды (что дает ошибку деления на ноль, если c -1 равно 0), присваивая c и выводя новое значение.
Старая 33-байтовая версия:
Работает, переопределяя себя при каждом запуске, но с одним последним переводом строки. Выводит дважды инвертированное число оставшихся строк (меньше двух), что дает ошибку деления на ноль, когда остаются только две строки (заголовок и фактический код).
источник
Perl,
3736 байтСбои, когда начальное значение достигает -1 (что напечатало бы 0), когда оно записывает через
=~
оператор.Сохранено использование байта,
sysopen
а неopen
. Это позволяет мнеSTDOUT
сначала печатать , используя возвращаемое значение в качестве режима файла (или1
, иначеO_WRONLY
), до$~
переназначения.Образец использования
источник
Perl 6 ,
6058 байтТребуется символ новой строки после
=finish
.die
можно заменить на1/0
.Объяснение:
Он получает список строк после того, как
=finish
($=finish.lines
) вычитает это из10
, и если результат не является,0
он печатает его, в противном случае этоdie
s.Последнее, что он делает, это открывает себя в режиме добавления и добавляет в конец еще одну строку.
источник
say $*PERL.compiler.version
)Python 2, 65 байт
Вдохновлен ответом L3viathan .
Может быть уменьшено до 60 байт, если вы можете назвать файл одним символом,
x
а затем заменить__file__
на'x'
. В этом случае замените75
на70
.источник
Джольф, 20 байт
Попробуй это здесь! Ошибки при
0
печати. Изменяет код. Объяснение впереди.источник
Applesoft BASIC, 21 байт (токенизированный)
Замените
<CTRL-F>
и<CTRL-H>
их буквальными версиями. Обратите внимание, что это только изменяет программу в памяти; Повторная загрузка с диска приведет к сбросу обратного отсчета.Пробный прогон
объяснение
PRINT 9 + 1
делает то, что вы ожидаете.CALL 2066
вызывает подпрограмму машинного языка 6502 в ячейке памяти 2066, что послеEND :
.END
останавливает программу так, что подпрограмма машинного языка (которая, по мнению интерпретатора Applesoft, является мусором) не выполняется.Программа машинного языка просто уменьшает значение
9
inPRINT 9 + 1
. Разборка:После того, как счетчик достигает 0, он «уменьшается» до
/
; попытка запустить программу приведет к синтаксической ошибке.источник
*> <> ,
2018 байтЭто на самом деле работает в Linux (и все, что поддерживает файлы с именем
\n
я думаю). Он создает файл с именем\n
при первом запуске и выводит10
. Он продолжает выводить на одно меньшее число при каждом последующем запуске, кроме случаев,0
когда вместо этого происходит сбой.объяснение
источник
PHP 57 байт
на самом деле не сбой, а выход (без обратного отсчета), когда он попадает
0
. Этого достаточно?Беги с
-r
.источник
C #, 156 байт
Я немного поиграл ответом @ TheLethalCoder и смог сэкономить 3 байта, переупорядочив операторы и исключив int.parse (). Я уверен, что все еще есть возможности для улучшения.
Ungolfed:
Мета-вопрос: Может быть, взломать работу TheLethalCoder за отправную точку моего ответа. Было бы лучше (если у меня есть представитель) добавить это в качестве комментария к их ответу? Я не пытаюсь конкурировать с ними, я просто хочу показать свой гольф для взаимного назидания.
источник
Powershell V2.0, 49 байт
(Первый в истории код гольфа, не мог найти правила о том, как рассчитать байты. Я использовал онлайн калькулятор String to bytes)
Бег:
источник
Java, 343 байта
Моя первая попытка игры в гольф
ungolfed
источник
java.io.*
и избегая использования полных имен конструкторов, и вы можете сократить еще 8, используя тот факт, что «print» автоматически приведёт в соответствие свои аргументы:import java.io.*;class M{public static void main(String[] a) throws Exception{if(!new File("x").exists()) try(PrintWriter p=new PrintWriter("x")){p.print(10);}int b=new java.util.Scanner(new File("x")).nextInt();try(PrintWriter p=new PrintWriter("x")){p.print(b/b*b-1);System.out.print(b);}}}
?
оператор, основанный на существовании файла, когда вы читаетеb
:import java.io.*;class M{public static void main(String[] a) throws Exception{int b=new File("x").exists()?new java.util.Scanner(new File("x")).nextInt():10;try(PrintWriter p=new PrintWriter("x")){p.print(b/b*b-1);System.out.print(b);}}}
import java.io.*;class A{public static void main(String[]a)throws Exception{File f=new File("f");int b=f.exists()?new FileInputStream(f).read()-48:10;new PrintWriter(f).printf("%d",b/b*b-1).close();System.out.print(b);}}
SQLite,
142137Это, вероятно, можно сделать гораздо умнее.
141136 символов для кода:Плюс 1 для имени файла
x
вsqlite3 x '…'
.источник
JavaScript, 74 байта
x=typeof x!=typeof 1?10:x!=1?x-=1:_
l=localStorage;l.a=typeof l.a!=typeof""?10:l.a!=1?l.a=--l.a:_;alert(l.a)
источник
alert
или чего-то подобного, это просто фрагмент REPL.Рубин,
9487846159 байтПожалуйста, оставьте предложения ниже.
Спасибо @ ConorO'Brien за идеи (некоторые бесстыдно сорваны с его ответа).
источник
puts i
=>p i
new
иsize
вместоopen
иlength
.Рубин, 52 + 1 = 53 байта
Предполагается, что файл назван
a
(+1 байт).Бег
источник
a
(что только +1).Python 2, 89 байт
источник
__file__
поэтому я воспользовался этим в своем ответе.len
s
, потому что мне нужно прочитать, затем искать, затем писать. Этоprint x/x*x
сработает, но не улучшит количество байтов.TI-BASIC (TI-84 Plus) (15 байт)
Значение Ans должно равняться 0 (значение по умолчанию) перед первым запуском.
Поскольку
AnsAns/Ans
это последняя строка программы, она будет выведена и сохранена в Ans, если Ans не равно 0, и в этом случае возникает ошибка деления на 0.источник
JavaScript, 41
l=localStorage;l.l=-~l.l;alert(11-l.l||I)
источник
a
вместо того,l
когда я написал это, и изменил его, не задумываясь, потому что я думал, что это выглядит веселее ... было слишком поздно и , Спасибо что подметил это.GNU Smalltalk,
7068 байтКод 66 байтов +2 байта для флага "-S"
редактирует
Golfed
Контрольная работа
Важный
Вы должны запустить gst от имени пользователя root, чтобы он мог изменить изображение по умолчанию или указать свой собственный образ с помощью -I .
источник
PHP, 45 байт
Честно говоря, не уверен, что это считается.
Я бы опубликовал ссылку на пример, но все известные мне онлайн-тестеры не позволяют
session_start()
использовать его.Это будет вести обратный отсчет каждый раз, когда вы обновляете страницу, до 0, когда
die
команда запускается.источник
QBIC , 70 байт
Открывает файл
a.b
(или создает его, если он не найден при первом запуске), считывает запись 1 вe
. Если эта запись не найдена, предположим 10, иначе подпункт 1. Ate==0
, вызвать ошибку. Запись обратноe
вa.b
.Доступ к файлам не встроен в QBIC, это сильно зависит от базового QBasic.
источник
Пакетная, 72 байта
Должен быть вызван с использованием полного имени файла, включая расширение. В последней строке не должно быть завершающей строки. Работает, записывая
-1
в конец последней строки, так что она каждый раз оценивается на 1 меньше.goto g
ошибки, потому что нет метки:g
.источник
R, 52 байта
По существу использует
ls()
для перечисления имен всех глобально сохраненных объектов. Если мы предполагаем, что глобальная среда пуста и ее"x"
еще не существует, сгенерируйтеx=10
, иначе, еслиx!=0
вычесть1
другое, вызовите отсутствующий аргумент, который возвращает ошибку.источник
!
и переключив порядок аргументов then и else, и еще два, изменивx>0
наx
. (Кроме того,exists("x")
это немного аккуратнее, чем"x"%in%ls()
, хотя и равное количество байтов.)Пакет Windows, 61 байт
источник
JavaScript, 44 байта
источник