3 ... 2 ... 1 ... Сбой!

47

Ваша задача - написать полную программу, которая будет продолжать отсчитывать от 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))

Это , поэтому выигрывает самый короткий ответ (измеряемый в байтах).

Esolanging Fruit
источник
12
Что влечет за собой сбой?
Конор О'Брайен
2
@ ConorO'Брайен Хмм ... это не обсуждалось в мета?
Esolanging Fruit
2
@ Challenger5 Не то, что я знаю. Будет ли выбрасывать ошибку?
Конор О'Брайен
1
@ ConorO'Brien Да.
Esolanging Fruit
Относящиеся .
FryAmTheEggman

Ответы:

18

6502 машинного языка + Apple] [+ ROM, 12 (11? 10? 9?) Байтов

CE 06 80 F0 01 A2 0B A9 00 4C 24 ED

Должен начинаться с $8000. Вылетает на системный монитор, когда счет достигает 0.


C6 B6 F0 01 A2 0B A9 00 4C 24 ED

Должен начинаться с $B1. Это экономит байт, так как я могу использовать (двухбайтовую) версию с нулевой страницей DEC, но перезаписывает критическую процедуру Applesoft CHRGET; вам нужно будет загрузить его и вызвать с монитора, а также использовать CTRL+ BReturnдля повторной инициализации BASIC, как только вы закончите. Не уверен, если это делает его недействительным или нет.


CE 06 80 F0 01 A2 0B 4C 26 ED

Должен начинаться с $8000. Это не инициализирует $9E, сохраняя два байта. Однако это означает, что вы не должны вызывать его с отрицательным адресом (или, если вы вызываете его с монитора, вы должны вызывать монитор с положительным адресом). Если вы это сделаете, Applesoft в CALLрутина будет хранить FFв $9E, заставляя его , чтобы добавить 65280 на номер при печати. Опять же, не уверен, если это делает решение недействительным или нет.


C6 B6 F0 01 A2 0B 4C 26 ED

Должен начинаться с $B1. Это комбинация двух вышеупомянутых программ, сохраняющая в общей сложности три байта; вам придется вызывать монитор с положительным адресом, загружать его и запускать оттуда, и использовать Ctrl+ BReturnдля повторной инициализации BASIC, как только вы закончите.


Обратите внимание, что эти программы только изменяют программу в памяти; Повторная загрузка программы с диска приведет к сбросу обратного отсчета. Это работает, потому что Apple] [(и] [+, // e и // c) не имеют никакой системы защиты памяти; программа (и ее самодиакции) останутся в памяти даже после ее выхода, поэтому вы можете продолжать запускать ее из памяти, пока не перезапишите эту память чем-то другим.


Пробный прогон

]BLOAD COUNT THEN BRK
]CALL 32768
10
]CALL 32768
9
]CALL 32768
8
]CALL 32768
7
]CALL 32768
6
]CALL 32768
5
]CALL 32768
4
]CALL 32768
3
]CALL 32768
2
]CALL 32768
1
]CALL 32768

8008-    A=80 X=9D Y=00 P=36 S=EE
*

объяснение

     DEC NUM+1  ; Decrement the LDX instruction's operand
     BEQ NUM+1  ; If it is now zero, branch to it; 00 is the opcode for the BRK instruction, which causes the program to crash to the monitor
NUM  LDX #$0B   ; Load the X register with 0x0A; the operand has already been decremented once
     LDA #$00   ; Load the accumulator with 0
     JMP $ED24  ; Jump to $ED24, an Applesoft ROM routine which prints A (high byte),X (low byte) in decimal

Объяснение 10-байтовой версии

     DEC NUM+1  ; Decrement the LDX instruction's operand
     BEQ NUM+1  ; If it is now zero, branch to it; 00 is the opcode for the BRK instruction, which causes the program to crash to the monitor
NUM  LDX #$0B   ; Load the X register with 0x0A; the operand has already been decremented once
     JMP $ED26  ; Jump to $ED26, which is two bytes into the Applesoft routine at $ED24. The two skipped bytes would store the accumulator in $9E

Варианты

Печатает ERRи подает звуковой сигнал, когда счетчик достигает 0

Нормальный - 15 байт

CE 06 80 F0 07 A2 0B A9 00 4C 24 ED 4C 2D FF

Перезаписывает CHRGET- 14 байтов

C6 B6 F0 07 A2 0B A9 00 4C 24 ED 4C 2D FF

Не инициализируется $9E- 13 байт

CE 06 80 F0 05 A2 0B 4C 26 ED 4C 2D FF

Перезаписывает CHRGETи не инициализирует $9E- 12 байт

C6 B6 F0 05 A2 0B 4C 26 ED 4C 2D FF

Зависает при достижении 0

Нормальный - 12 байт

CE 06 80 F0 FE A2 0B A9 00 4C 24 ED

Перезаписывает CHRGET- 11 байт

C6 B6 F0 FE A2 0B A9 00 4C 24 ED

Не инициализируется $9E- 10 байт

CE 06 80 F0 FE A2 0B 4C 26 ED

Перезаписывает CHRGETи не инициализирует $9E- 9 байт

C6 B6 F0 FE A2 0B 4C 26 ED
insert_name_here
источник
Я не уверен, что понимаю это .. Разве это не то же самое, что иметь функцию в Python, которая уменьшает глобальную переменную и работает, только если выполняется в оболочке? Это разрешено? Я имею в виду, разве не ожидается, что программа в какой-то момент выйдет из памяти и будет перезагружена позже?
Redstarcoder
3
@redstarcoder Нет - у Apple II буквально нет системы выделения памяти; Вы можете хранить все что угодно в ОЗУ, и оно останется доступным для любой программы, пока не будет перезаписано другим значением.
insert_name_here
@inset_name_here, я не уверен, как это доступно где-нибудь в RAM, что-то меняет. Можете ли вы запустить другие программы надежно и по-прежнему запускать эту программу позже? Может быть, я недостаточно знаком с правилами здесь, чтобы полностью понять, поэтому я просто оставлю это. Я просто ожидаю, что полная программа сохранится после перезагрузки и сможет нормально работать, если другие программы запускаются между ее запусками, но я не знаю, каким сообществом правила для полной программы.
Redstarcoder
1
@redstarcoder, по общему мнению, программа запускается на компьютере разработчика, на котором нет ничего, кроме необходимого программного обеспечения, и в то же время ничего не делает.
Том Карпентер
1
8 байт, если вместо этого вы используете $ 6E: C6 75 F0 03 4C 22 ED 0B
Питер Ферри
35

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 включительно. Итак, наша программа выглядит так:

say 12-$$||die

Вот пример прогона:

$ unshare -Urfp /bin/dash
# perl -E 'say 12-$$||die'
10
# perl -E 'say 12-$$||die'
9
# perl -E 'say 12-$$||die'
8
# perl -E 'say 12-$$||die'
7
# perl -E 'say 12-$$||die'
6
# perl -E 'say 12-$$||die'
5
# perl -E 'say 12-$$||die'
4
# perl -E 'say 12-$$||die'
3
# perl -E 'say 12-$$||die'
2
# perl -E 'say 12-$$||die'
1
# perl -E 'say 12-$$||die'
Died at -e line 1.
#

источник
На какой ОС это работает? Я на Ubuntu Linux 14.04 и unshareне поддерживаю ни один из флагов -Urfp.
Исаак
@isaacg: Ubuntu 16.04. unshareдовольно новый (это интерфейс к функции ОС, который также довольно новый), и ошибки действительно были устранены только за последний год или около того. Если вы используете версию 2,5 года, неудивительно, что она очень ограничена в функциональности.
14

Баш + седь, 41 40 38 байт

echo $[n=10/1]
sed -i s/$n/$[n-1]/g $0

Попробуйте онлайн!

Деннис
источник
Ссылка TIO имеет верхний и нижний колонтитулы, разве они не добавляют к количеству байтов?
Павел
2
Нет, это просто запустить программу 11 раз.
Деннис
Я получаю sed: invalid option -- '/'. sed (GNU sed) 4.2.2
shrx
@shrx Да. У меня есть та же версия sed локально и на TIO, и они не показывают эту ошибку.
Деннис
9

Javascript, 42 байта

y=localStorage;y.a=y.a||10;alert(y.a--||a)

Проверьте это с помощью этой скрипки - обязательно очистите локальное хранилище, чтобы сбросить обратный отсчет.

Спасибо 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)для сохранения байта, я бы удалил мой
C5H8NNaO4
@Mego Конечно :) Я не вижу console.logздесь, но я предпочел бы это также
C5H8NNaO4
1
@obarakon Да, и булево короткое замыкание не позволяет aоценить, когда значение в localalstorage не равно 0.
Мего
8

C #, 197 160 159 125 байт

namespace System.IO{class P{static void Main(){int n=11;for(;File.Exists(""+--n););File.Create(""+n);Console.Wr‌​ite(n*n/n);}}}

Сохранено 34 байта благодаря молоку

И отформатированная версия (с ReadKeyдобавленным, чтобы вы могли просмотреть вывод):

namespace System.IO
{
    class P
    {
        static void Main()
        {
            int n=11;
            for(;File.Exists(""+--n););
            File.Create(""+n);
            Console.Wr‌​ite(n*n/n);
        }
    }
}

Это дольше, чем я думал, так что, вероятно, есть место для игры в гольф.

TheLethalCoder
источник
2
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);}}}
молоко
@milk Спасибо большое! Не могу поверить, что я не думал об использовании только имени файла! И я не знал об этом трюке с пространством имен, потрясающе.
TheLethalCoder
8

Дьялог АПЛ , 33 28 22/20? байтов

Я не уверен, является ли это допустимым, так как он состоит из функции (которая должна вызываться с фиктивным аргументом). Однако все программы APL (чисто функциональные или нет) имеют одинаковый статус, и, действительно, некоторые версии APL не имеют традиционных программ, только функции. В качестве компенсации я добавил два байта, чтобы назвать его, хотя это не является необходимым для желаемого эффекта.

f←{6::⊢c∘←10⋄÷÷c∘←c-1}

Обратите внимание, что это зависит от неофициальной причуды, которая ∘←присваивается глобально.

6:: при любой ошибке

⊢cвозврат с

∘←10 который глобально установлен на 10

в настоящее время

÷÷c вернуть дважды перевернутые (ошибки на ноль) c

∘← который глобально установлен на

c-1один меньше чем с

Попробуй APL онлайн!


Конечно, действительная 28-байтовая версия:

f
'c←11'/⍨0=⎕NC'c'
c←÷÷c-1

Работает, устанавливая c в 11, если отсутствует, затем вычитая 1 из c , инвертируя дважды (что дает ошибку деления на ноль, если c -1 равно 0), присваивая c и выводя новое значение.


Старая 33-байтовая версия:

е
÷÷ ≢2 ↓ ↓ r⊣⎕FX¯1 г ← ⎕NR'f»










Работает, переопределяя себя при каждом запуске, но с одним последним переводом строки. Выводит дважды инвертированное число оставшихся строк (меньше двух), что дает ошибку деления на ноль, когда остаются только две строки (заголовок и фактический код).

Адам
источник
1
Э-э ... почему так много новых строк?
Критиси Литос
4
@KritixiLithos Программа переопределяет себя с одной строкой меньше для каждого запуска.
Адам
7

Perl, 37 36 байт

9=~//;print$'-sysopen$~,$0,print$'+1

Сбои, когда начальное значение достигает -1 (что напечатало бы 0), когда оно записывает через =~оператор.

Сохранено использование байта, sysopenа не open. Это позволяет мне STDOUTсначала печатать , используя возвращаемое значение в качестве режима файла (или 1, иначе O_WRONLY), до $~переназначения.

Образец использования

$ perl crash-off.pl
10
$ perl crash-off.pl
9
$ perl crash-off.pl
8

...

$ perl crash-off.pl
2
$ perl crash-off.pl
1
$ perl crash-off.pl
syntax error at crash-off.pl line 1, near "1~"
Execution of crash-off.pl aborted due to compilation errors.
Примо
источник
6

Perl 6 ,  60  58 байт

put 10-$=finish.lines||die;
$*PROGRAM.open(:a).put;
=finish
 
open($*PROGRAM,a=>put 10-$=finish.lines||die).put
=finish
 

Требуется символ новой строки после =finish.

dieможно заменить на 1/0.

Объяснение:

Он получает список строк после того, как =finish( $=finish.lines) вычитает это из 10, и если результат не является, 0он печатает его, в противном случае это dies.

Последнее, что он делает, это открывает себя в режиме добавления и добавляет в конец еще одну строку.

Брэд Гилберт b2gills
источник
Постоянная ссылка для тех, у кого нет Perl 6.
Деннис
@Dennis По крайней мере, это не так уж и устарело, как то, что есть у Ideone (бег say $*PERL.compiler.version)
Брэд Гилберт b2gills
1
2014.7 ... вау! 2016.11 сильно отличается от 2016.7? Если это так, я могу построить его из источника.
Деннис
@Dennis Официальный релиз Perl 6 был 2015-12-25. В конце 2015 года произошли большие изменения под названием The Great List Refactor (GLR), поэтому заставить работать код на 2014.7 практически невозможно. Большая часть того, что происходило в 2016 году, связана с производительностью, хотя было множество исправлений крайних условий. Большая часть кода для игры в гольф должна работать на чем угодно после выпуска Rakudo 2015.12. Так что я думаю v2016.07 в порядке.
Брэд Гилберт b2gills
6

Python 2, 65 байт

f=open(__file__,"r+")
x=75-len(f.read())
x/x
print x
f.write('#')

Вдохновлен ответом L3viathan .

Может быть уменьшено до 60 байт, если вы можете назвать файл одним символом, xа затем заменить __file__на 'x'. В этом случае замените 75на 70.

Алекс Холл
источник
@ Flp.Tkc да, но это не то же самое количество байтов?
Алекс Холл
о, это правда: P
FlipTack
4

Джольф, 20 байт

γ-@▲lqΈ?␡γ?γaγ0₯I₯C1

Попробуй это здесь! Ошибки при 0печати. Изменяет код. Объяснение впереди.

Конор О'Брайен
источник
Я не очень знаком с Джольфом, но он не сразу работает в онлайн-переводчике.
Esolanging Fruit
1
@ Challenger5 Язык обычно работает только в Firefox.
Конор О'Брайен
4

Applesoft BASIC, 21 байт (токенизированный)

0  PRINT 9 + 1: CALL 2066: END : OR <CTRL-F><CTRL-H>`

Замените <CTRL-F>и <CTRL-H>их буквальными версиями. Обратите внимание, что это только изменяет программу в памяти; Повторная загрузка с диска приведет к сбросу обратного отсчета.


Пробный прогон

]RUN
10

]RUN
9

]RUN
8

]RUN
7

]RUN
6

]RUN
5

]RUN
4

]RUN
3

]RUN
2

]RUN
1

]RUN

?SYNTAX ERROR IN 0

объяснение

PRINT 9 + 1делает то, что вы ожидаете. CALL 2066вызывает подпрограмму машинного языка 6502 в ячейке памяти 2066, что после END :. ENDостанавливает программу так, что подпрограмма машинного языка (которая, по мнению интерпретатора Applesoft, является мусором) не выполняется.

Программа машинного языка просто уменьшает значение 9in PRINT 9 + 1. Разборка:

0812-   CE 06 08    DEC $0806
0815-   60          RTS

После того, как счетчик достигает 0, он «уменьшается» до /; попытка запустить программу приведет к синтаксической ошибке.

insert_name_here
источник
4

*> <> , 20 18 байт

a1Fi:0(?b1-:?:1Fn;

Это на самом деле работает в Linux (и все, что поддерживает файлы с именем \nя думаю). Он создает файл с именем \nпри первом запуске и выводит 10. Он продолжает выводить на одно меньшее число при каждом последующем запуске, кроме случаев, 0когда вместо этого происходит сбой.

объяснение

a1F                   open file named "\n"
   i:                 recieve input and duplicate it (-1 if empty)
     0(?b             if the file is empty, push 11 to the stack
         1-           subtract one
           :          duplicate the number
            ?:        if the number isn't 0, duplicate it again
              1F      save the number to the file
                n     output the number (crash if non-existant)
                 ;    exit
redstarcoder
источник
2
Удобно, что *> <> добавляет IO
Alfie Goodacre
4

PHP 57 байт

echo$n=($f=file(f))?$f[0]:10?:die;fputs(fopen(f,w),--$n);

на самом деле не сбой, а выход (без обратного отсчета), когда он попадает 0. Этого достаточно?

Беги с -r.

Titus
источник
4

C #, 156 байт

Я немного поиграл ответом @ TheLethalCoder и смог сэкономить 3 байта, переупорядочив операторы и исключив int.parse (). Я уверен, что все еще есть возможности для улучшения.

using System.IO;class P{static void Main(){int n;try{n=File.ReadAllText("f")[0]-48;}catch{n=10;}System.Console.Write(n/n*n);File.WriteAllText("f",""+--n);}}

Ungolfed:

using System.IO;
class P
{
    static void Main()
    {
        int n;
        try
        {
            n = File.ReadAllText("f")[0] - 48;
        }
        catch {
            n = 10;
        }
        System.Console.Write(n / n * n);
        File.WriteAllText("f", "" + --n);
    }
}

Мета-вопрос: Может быть, взломать работу TheLethalCoder за отправную точку моего ответа. Было бы лучше (если у меня есть представитель) добавить это в качестве комментария к их ответу? Я не пытаюсь конкурировать с ними, я просто хочу показать свой гольф для взаимного назидания.

Бенс Джофул
источник
Люди обычно оставляют комментарии под ответами других людей, предлагая улучшения, однако из-за улучшений, предложенных моим, предлагаемый молочным рудником, теперь сильно отличается, так что у вас все хорошо
TheLethalCoder
Я обычно обращаюсь, если они улучшают чей-либо комментарий к ответу, но если он достаточно отличается от их комментариев, тогда
публикуйте
3

Powershell V2.0, 49 байт

(Первый в истории код гольфа, не мог найти правила о том, как рассчитать байты. Я использовал онлайн калькулятор String to bytes)

if(!$n){$n=10;$n}else{$n-=1;if($n-eq0){throw};$n}

Бег:

PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
10

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
9

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
8

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
7

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
6

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
5

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
4

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
3

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
2

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
1

____________________________________________________________________________________________________________________________________________________________________
PS C:\Users\***> if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw};$n;}
ScriptHalted
At line:1 char:49
+ if(!$n){$n = 10;$n}else{$n=$n-1;if($n-eq0){throw <<<< };$n;}
    + CategoryInfo          : OperationStopped: (:) [], RuntimeException
    + FullyQualifiedErrorId : ScriptHalted
Кирон Дэвис
источник
Добро пожаловать в PPCG! Правила для вычисления байтов зависят от кодировки символов, используемой языком. Powershell, вероятно, использует кодировку ASCII или UTF-8, и поэтому для сценария, содержащего только коды ASCII, как и здесь, каждый символ занимает 1 байт
Luis Mendo
Добро пожаловать в PPCG! Согласно автору запросов, все представления должны быть законченной программой, которой это не является - как, по сути, она запускается в PowerShell-эквиваленте REPL.
AdmBorkBork
Если я написал это внутри .ps1 и выполнил, например, 10 раз crash-off.ps1, это будет считаться полной программой?
Кирон Дэвис
@KieronDavies Да, при условии, что если вы закрываете и снова открываете оболочку каждый раз, вы все равно получаете тот же результат. Хранение элементов «в памяти» в оболочке между выполнением - это то, что определяет «среду REPL» PowerShell из среды «полной программы».
AdmBorkBork
3

Java, 343 байта

Моя первая попытка игры в гольф

import java.io.PrintWriter;class M{public static void main(String[] a) throws Exception{if(!new java.io.File("x").exists()) try(PrintWriter p=new java.io.PrintWriter("x")){p.write("10");}int b=new java.util.Scanner(new java.io.File("x")).nextInt();try(PrintWriter p=new java.io.PrintWriter("x")){p.print(b/b*b-1+"");System.out.print(b+"");}}}

ungolfed

import java.io.PrintWriter;

class M {
    public static void main(String[] a) throws Exception {
        if (!new java.io.File("x").exists()) {
            try (PrintWriter p = new java.io.PrintWriter("x")) {
                p.write("10");
            }
        }
        int b = new java.util.Scanner(new java.io.File("x")).nextInt();
        try (PrintWriter p = new java.io.PrintWriter("x")) {
            p.print(b / b * b - 1 + "");
            System.out.print(b + "");
        }
    }
}
Виктор Меллгрен
источник
Вы можете уменьшить его до 300 байт, импортировав 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);}}}
Glen
Вы можете уменьшить его до 237 байт, не записывая в файл «10», а просто используя ?оператор, основанный на существовании файла, когда вы читаете 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);}}}
Глен
Максимально оптимизированный я мог сделать: 220 байт. Вот зверь: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);}}
Оливье Грегуар
спасибо за предложения :)
Виктор Меллгрен
3

SQLite, 142 137

Это, вероятно, можно сделать гораздо умнее. 141 136 символов для кода:

create table if not exists t(n not null);insert into t select 11;update t set n=case n when 1 then null else n-1 end;select min(n)from t

Плюс 1 для имени файла xв sqlite3 x '…'.

Джон Перди
источник
1
Приятно! Никогда не видел, чтобы SQLite использовался подобным образом. Вы можете сжать несколько байтов, заменив «values ​​(11)» на «select 11», а «select n from t limit 1» на «select min (n) from t»)
Бенс Джофул
3

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:_;aler‌​t(l.a)

Оливер
источник
5
ОП пояснил (в комментариях), что требуется полная программа.
Деннис
1
@ Денис Мое пересмотренное представление квалифицируется как полная программа?
Оливер
Я не знаю , но я так не думаю. Я бы сказал, что без звонка alertили чего-то подобного, это просто фрагмент REPL.
Деннис
2
Выглядит хорошо для меня. (Не могу проверить это с моего телефона.)
Деннис
3

Рубин, 94 87 84 61 59 байт

j=File.open(?a,"a+");1/(i=j.readlines.size-14);p -i;j.puts

Пожалуйста, оставьте предложения ниже.

Спасибо @ ConorO'Brien за идеи (некоторые бесстыдно сорваны с его ответа).

dkudriavtsev
источник
puts i=>p i
Конор О'Брайен
Используйте newи sizeвместо openи length.
Ли Ш
2

Рубин, 52 + 1 = 53 байта

Предполагается, что файл назван a(+1 байт).

q=File.read ?a
0/h=62-q.size
p h
File.write ?a,q+?1#

Бег

C:\Users\Conor O'Brien\Documents\Programming
λ type a
q=File.read ?a
0/h=62-q.size
p h
File.write ?a,q+?1#
C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
10

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
9

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
8

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
7

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
6

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
5

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
4

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
3

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
2

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
1

C:\Users\Conor O'Brien\Documents\Programming
λ ruby a
a:2:in `/': divided by 0 (ZeroDivisionError)
        from a:2:in `<main>'
Конор О'Брайен
источник
... вы можете принять имена?
дкудрявцев
Вы можете использовать $ 0 вместо a и 'echo >> # $ 0' (с обратными галочками) в последней строке.
GB
@GB Это все еще больше байтов, чем предполагается a(что только +1).
wizzwizz4
? a - 2 байта, $ 0 - 2 байта, но ему не нужны пробелы.
ГБ
2

Python 2, 89 байт

x=10
x/x
print x
f=open(__file__,"r+")
s=f.read()
f.seek(0)
f.write(s.replace(`x`,`x-1`))
L3viathan
источник
Мне понравилась ваша идея открытия, __file__поэтому я воспользовался этим в своем ответе.
Алекс Холл
@AlexHall Отличная идея сlen
L3viathan
@ Flp.Tkc Я не буду сохранять символы с этим. Мне все еще нужно использовать переменную s, потому что мне нужно прочитать, затем искать, затем писать. Это print x/x*xсработает, но не улучшит количество байтов.
L3viathan
2

TI-BASIC (TI-84 Plus) (15 байт)

If not(Ans
11
Ans-1
AnsAns/Ans

Значение Ans должно равняться 0 (значение по умолчанию) перед первым запуском.

Поскольку AnsAns/Ansэто последняя строка программы, она будет выведена и сохранена в Ans, если Ans не равно 0, и в этом случае возникает ошибка деления на 0.

tratchy
источник
2

JavaScript, 41

l=localStorage;l.l=-~l.l;alert(11-l.l||I)

C5H8NNaO4
источник
@Mego Да, очевидно, я не знаю, как это могло произойти ... У меня было aвместо того, lкогда я написал это, и изменил его, не задумываясь, потому что я думал, что это выглядит веселее ... было слишком поздно и , Спасибо что подметил это.
C5H8NNaO4
1

GNU Smalltalk, 7068 байт

Код 66 байтов +2 байта для флага "-S"

редактирует

  • Убраны лишние скобки, -2 байта

Golfed

X=Y ifTrue:[Smalltalk at:#X put:10]ifFalse:[X:=X-1].(X*X/X)printNl

Контрольная работа

>seq 11|xargs -L1 sudo gst -S fail.st 2>/dev/null
10
9
8
7
6
5
4
3
2
1
Object: 0 error: The program attempted to divide a number by zero
ZeroDivide(Exception)>>signal (ExcHandling.st:254)
SmallInteger(Number)>>zeroDivide (SysExcept.st:1426)
SmallInteger>>/ (SmallInt.st:277)
UndefinedObject>>executeStatements (fail.st:1)

Важный

Вы должны запустить gst от имени пользователя root, чтобы он мог изменить изображение по умолчанию или указать свой собственный образ с помощью -I .

дирижабль
источник
1

PHP, 45 байт

Честно говоря, не уверен, что это считается.

<?session_start();echo10-$_SESSION[0]++?:die;

Я бы опубликовал ссылку на пример, но все известные мне онлайн-тестеры не позволяют session_start()использовать его.

Это будет вести обратный отсчет каждый раз, когда вы обновляете страницу, до 0, когда dieкоманда запускается.

Xanderhall
источник
0

QBIC , 70 байт

open"r",1,"a.b" $get#1,1,e|~e=0|e=z\e=e-1]?e~e=0|$error 1|]$put#1,1,e|

Открывает файл a.b(или создает его, если он не найден при первом запуске), считывает запись 1 в e. Если эта запись не найдена, предположим 10, иначе подпункт 1. At e==0, вызвать ошибку. Запись обратно eв a.b.

Доступ к файлам не встроен в QBIC, это сильно зависит от базового QBasic.

steenbergh
источник
0

Пакетная, 72 байта

@call:l
@if %n%==0 goto g
@echo %n%
@cmd/cset/a-1>>%0
:l
@set/an=10

Должен быть вызван с использованием полного имени файла, включая расширение. В последней строке не должно быть завершающей строки. Работает, записывая -1в конец последней строки, так что она каждый раз оценивается на 1 меньше. goto gошибки, потому что нет метки :g.

Нил
источник
0

R, 52 байта

`if`(!"x"%in%ls(),cat(x<-10),`if`(x>0,cat(x<-x-1),))

По существу использует ls()для перечисления имен всех глобально сохраненных объектов. Если мы предполагаем, что глобальная среда пуста и ее "x"еще не существует, сгенерируйте x=10, иначе, если x!=0вычесть 1другое, вызовите отсутствующий аргумент, который возвращает ошибку.

Billywob
источник
Вы можете сохранить байт, удалив !и переключив порядок аргументов then и else, и еще два, изменив x>0на x. (Кроме того, exists("x")это немного аккуратнее, чем "x"%in%ls(), хотя и равное количество байтов.)
rturnbull
Ах, перечитывая комментарии в спецификации, похоже, что требуется полная программа, что означает, что вы не можете полагаться на постоянство объектов между запусками.
rturnbull
@rturnbull Хотя я не могу найти, где это прямо указано. Я удалю ответ, если вы можете указать мне на него.
Billywob
Это упомянуто здесь , хотя это не было отредактировано в спецификации.
rturnbull
0

Пакет Windows, 61 байт

@if %n%.==. set n=10
@if %n%==0 goto.
@set /a n-=1&@echo %n%
Питер Ферри
источник
0

JavaScript, 44 байта

function* f(n=11){for(;--n;yield n);throw''}

p=f()
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)
console.log(p.next().value)

guest271314
источник