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))

Це , тому найкоротша відповідь (вимірюється в байтах) виграє.


12
Що тягне за собою збій?
Conor O'Brien

2
@ ConorO'Brien Хм ... це не обговорювалося в мета?
Esolanging Fruit

2
@ Challenger5 Не те, що я знаю. Чи буде достатньо помилки кидання?
Conor O'Brien

1
@ ConorO'Brien Так.
Esolanging Fruit

Відповіді:


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

Я не впевнений, що я це розумію. Хіба це не буде те ж саме, що мати функцію в Python, яка декрементує глобальну змінну і працює лише, якщо виконується в оболонці? Це дозволено? Що я маю на увазі, чи не очікується, що програма в якийсь момент залишить пам’ять, а потім знову буде перезавантажена?
redstarcoder

3
@redstarcoder Ні - Apple II практично не має системи розподілу пам'яті; ви можете зберігати що завгодно в оперативній пам’яті, і воно залишатиметься доступним будь-якій програмі, поки не буде перезаписано інше значення.
insert_name_here

@inset_name_here, я не впевнений, наскільки це доступність будь-де в оперативній пам'яті щось змінює. Чи можете ви надійно запустити інші програми і все ж пізніше запустити цю програму? Можливо, я недостатньо знайомий з правилами навколо, щоб повністю зрозуміти, тому просто відкину його. Я просто очікую, що повна програма буде зберігатися через перезавантаження та матиме змогу нормально запускатись, якщо між її виконанням виконуються інші програми, але я не знаю, яким правилом є спільна програма.
redstarcoder

1
@redstarcoder загальна думка полягає в тому, що програма запускається на розроблювальному комп'ютері, окрім необхідного програмного забезпечення та не виконуючи нічого іншого середнього часу.
Том Карпентер

1
8 байт, якщо замість цього ви працюєте з $ 6E: C6 75 F0 03 4C 22 ED 0B
peter ferrie

35

Perl на Linux, 17 байт

Я подумав, що може бути цікавим створити програму, яка не підтримує жодного стану сама та не змінює власний вихідний код; Іншими словами, він фактично перевіряє, наскільки часто це запускається, запитуючи ОС. У запитанні сказано: "Будь-які засоби, що використовуються для зберігання, можуть вважатись порожніми до першого виконання програми.", І тому ми хотіли б почати з абсолютно порожньої ОС. Тому я краще поясню, як ви це робите, оскільки в іншому випадку перевірити програму складно.

Насправді існує два способи налаштування для запуску програми. Так чи інакше, мінімальна ОС для цієї мети не матиме нічого, крім оболонки (щоб ми могли запускати Perl по черзі) і найпростішої можливої ​​оболонки в цьому (щоб вона не робила нічого фантазійного, що робить ОС не- порожній). /bin/dashтут є хорошим вибором, оскільки він задуманий як мінімальна оболонка для відновлення системи. Тоді нам потрібно запустити Linux таким чином, щоб він не працював нічого dash. Ми можемо це зробити, перезавантаживши комп’ютер init=/bin/dashза допомогою командного рядка Linux, щоб він нічого не запускав dash, або (набагато зручніше) створив контейнер Linux за unshare -Urfp /bin/dashдопомогою терміналу ( unshareнасправді не створюється порожня ОС, але він імітуєодин; зокрема, внутрішня частина контейнера думає, що це корінь, dashдумає , що це init тощо, як це було б у фактичній порожній ОС). Відмова: Я ще фактично не перевіряв це на чистому металі, тільки всередині unshare, але теоретично він повинен працювати обома способами.

Нарешті, як тільки ми встановили цю програму, ми просто повинні подивитися на PID; оскільки ми знаходимося в порожній системі, система init (тут, оболонка) матиме 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

@isaacg: Ubuntu 16.04. unshareдосить нова (це інтерфейс до функції ОС, яка також є досить новою), і помилки дійсно випрасовувались протягом останнього року. Якщо ви використовуєте 2-річну версію, не дивно, що вона дуже обмежена у функціональності.

14

Bash + sed, 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 Huh. У мене однакова версія sed локально і на TIO, і вони не показують цієї помилки.
Денніс

9

Javascript, 42 байти

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

Перевірте це за допомогою цієї скрипки - не забудьте очистити місцеве сховище, щоб скинути відлік часу.

Завдяки Стінбергу, Лмісу та Обаракону за багато байтів!


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оцінювати, коли значення в локальному зберіганні не дорівнює 0.
Mego

8

C #, 197 160 159 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);
        }
    }
}

Це довше, ніж я думав, це буде так, ймовірно, є місце для гольфу.


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повернути c

∘←10 який у глобальному масштабі встановлений на 10

зараз

÷÷c повернути двічі перевернуті (помилки на нуль) c

∘← на який встановлено глобально

c-1на один менше c

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


Звичайно дійсна версія 28 байт:

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

Працює, встановивши c до 11, якщо він відсутній, а потім віднімає 1 від c , перевертаючи двічі (що дає помилку поділки за нулем, якщо c -1 дорівнює 0), призначаючи c і виводить нове значення.


Стара 33-байтна версія:

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










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


1
Е-е ... чому так багато нових рядків?
Kritixi Lithos

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.

Останнє, що він робить - це відкрити себе в режимі додавання та додати ще один рядок до кінця.


Постійне посилання на тих, хто не має Perl 6.
Dennis

@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('#')

Натхненний відповіддю Л3віафана .

Може бути зменшений до 60 байт , якщо ви можете вибрати ім'я файлу по одному символу , як xі замінити __file__з 'x'. У такому випадку замініть 75на 70.


@ Flp.Tkc так, але хіба це не однакова кількість байтів?
Алекс Холл

о, це правда: P
FlipTack

4

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

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

Спробуйте тут! Помилки під час 0друку. Змінює код. Пояснення про майбутнє.


Я не дуже знайомий з Джольфом, але це не відразу здається, що він працює в Інтернеті.
Esolanging Fruit

1
@ Challenger5 Мова зазвичай працює лише у firefox.
Conor O'Brien

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 є сміттям) не виконувалася.

Рутинний машин мову просто віднімає 9ін PRINT 9 + 1. Розбирання:

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

Після того, як лічильник досягне 0, він "зменшується" до /; спроба запуску програми призведе до синтаксичної помилки.


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

2
Зручно тим, що *> <> додає IO
Alfie Goodacre

4

PHP 57 байт

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

насправді не виходить з ладу, але виходить (не відраховуючи), коли він потрапляє 0. Це достатньо?

Бігайте з -r.


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);}}

Безголівки:

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 байт
Луїс Мендо

Ласкаво просимо до PPCG! На думку автора виклику, всі подання повинні бути повноцінною програмою, а це не так - як це, по суті, вона виконується в еквіваленті PowerShell в якості REPL.
AdmBorkBork

Якщо я написав це всередині .ps1 і виконав, наприклад, 10 разів аварійне завершення роботи .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+"");}}}

неозорий

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);}}}
Glen

Найбільш оптимізований я міг зробити: 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);}}
Олів'є Грегоар

thx для пропозицій :)
Віктор Мелгрен

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. Ви можете видавити кілька байтів, замінивши "значення (11)" на "вибрати 11", а "вибрати n від t межа 1" на "вибрати min (n) від t"
Bence Joful

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
@Dennis Чи моє переглянуте подання кваліфікується як повна програма?
Олівер

Я не знаю , але не думаю. Я б сказав, що без дзвінка до 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 за ідеї (деякі безсоромно вирвалися з його відповіді).


puts i=>p i
Conor O'Brien

Використовуйте newі sizeзамість openі length.
Лі W

2

Ruby, 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>'

... ви можете вважати імена?
dkudriavtsev

Ви можете використовувати $ 0 замість a "echo >> # $ 0" (із зворотними посиланнями) в останньому рядку.
ГБ

@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`))

Мені сподобалась ваша ідея відкриття, __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 помилка.


2

JavaScript, 41

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


@ Mego Так, очевидно, я не знаю, як це могло статися ... Я aзамість того, lколи я написав це, і змінив це, не думаючи, тому що я думав, що це виглядає веселіше ... вже пізно і herby , дякую, що вказали на це.
C5H8NNaO4

1

GNU Smalltalk, 70, 68 байт

66 байт коду +2 байти для прапора "-S"

РЕДАКТИ

  • Видалено непотрібні дужки, -2 байти

Гольф

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команда буде запущена.


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. При e==0, зробіть помилку. Назад eдо a.b.

Доступ до файлів не вбудований у QBIC, він значною мірою спирається на базовий QBasic.


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виклик відсутнього аргументу, який повертає помилку.


Ви можете зберегти байт, видаливши !та перемикаючи порядок тодішніх та інших аргументів, та ще двох, змінивши x>0на x. (Крім того, exists("x")трохи акуратніше "x"%in%ls(), хоча і рівне за кількістю байтів.)
rturnbull

Ага, перечитавши коментарі в специфікації, схоже, що потрібна повна програма, а це означає, що ви не можете розраховувати на стійкість об'єкта між прогонами.
rturnbull

@rturnbull Хоча я не можу знайти, де це прямо вказано. Я видалю відповідь, якщо ви можете на мене вказати.
Billywob

Він згадується тут , хоча він не був відредагований у специфікації.
rturnbull


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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.