3… 2… 1… Wypadnij!


47

Twoim zadaniem jest napisanie pełnego programu, który będzie odliczał od 10 przy każdym uruchomieniu.

  • Przy pierwszym uruchomieniu program powinien zostać wydrukowany 10.
  • Następnym razem powinien wyjść 9.
  • Następnym razem powinien wyjść 8, i tak dalej.
  • Zamiast drukowania 0program powinien ulec awarii. Po tym czasie nie musisz już obsługiwać uruchomionego programu.
  • Wszelkie obiekty używane do przechowywania można założyć, że są puste przed pierwszym uruchomieniem programu.

Oto przykładowa implementacja w Pythonie 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))

To jest , więc wygrywa najkrótsza odpowiedź (mierzona w bajtach).


12
Co oznacza awaria?
Conor O'Brien

2
@ ConorO'Brien Hmm ... nie zostało to omówione w meta?
Esolanging Fruit

2
@ Challenger5 Nie wiem o tym. Czy wystrzelenie błędu byłoby wystarczające?
Conor O'Brien

1
@ ConorO'Brien Tak.
Esolanging Fruit

Odpowiedzi:


18

6502 język maszynowy + Apple] [+ ROM, 12 (11? 10? 9?) Bajtów

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

Powinien zacząć od $8000. Awarie monitora systemu, gdy liczba osiągnie 0.


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

Powinien zacząć od $B1. Oszczędza to bajt, ponieważ mogę używać (dwubajtowej) wersji zerowej strony DEC, ale zastępuje krytyczną procedurę Applesoft CHRGET; musisz go załadować i wywołać z monitora, a po zakończeniu użyj CTRL+, BReturnaby ponownie zainicjować BASIC. Nie jestem pewien, czy to unieważnia, czy nie.


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

Powinien zacząć od $8000. Nie inicjuje się $9E, oszczędzając dwa bajty. Oznacza to jednak, że nie wolno dzwonić do niego z ujemnym adresem (lub, jeśli dzwonisz z monitora, musisz zadzwonić do monitora z dodatnim adresem). Jeśli tak, Applesoft za CALLrutynowe będzie przechowywać FFw $9E, powodując jej dodać 65280 do numeru podczas drukowania go. Ponownie, nie jestem pewien, czy to unieważnia rozwiązanie, czy nie.


C6 B6 F0 01 A2 0B 4C 26 ED

Powinien zacząć od $B1. Jest to kombinacja powyższych dwóch programów, oszczędzając w sumie trzy bajty; będziesz musiał zadzwonić do monitora z dodatnim adresem, załadować go i uruchomić stamtąd, a następnie użyć Ctrl+, BReturnaby ponownie zainicjować BASIC po zakończeniu .


Zauważ, że te programy modyfikują tylko program w pamięci; ponowne załadowanie programu z dysku spowoduje zresetowanie odliczania. Działa to, ponieważ Apple] [(i] [+, // e i // c) nie mają żadnego systemu ochrony pamięci; program (i jego samodzielne modyfikacje) pozostaną w pamięci nawet po wyjściu z niego, więc możesz nadal uruchamiać go z pamięci, dopóki nie nadpiszesz tej pamięci na coś innego.


Przykładowy przebieg

]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
*

Wyjaśnienie

     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

Objaśnienie wersji 10-bajtowej

     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

Warianty

Drukuje ERRi emituje sygnały dźwiękowe, gdy liczba osiągnie 0

Normalny - 15 bajtów

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

Nadpisuje CHRGET- 14 bajtów

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

Nie inicjuje się $9E- 13 bajtów

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

Nadpisuje CHRGETi nie inicjuje $9E- 12 bajtów

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

Zatrzymuje się, gdy liczba osiągnie 0

Normalny - 12 bajtów

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

Nadpisuje CHRGET- 11 bajtów

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

Nie inicjuje się $9E- 10 bajtów

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

Nadpisuje CHRGETi nie inicjuje $9E- 9 bajtów

C6 B6 F0 FE A2 0B 4C 26 ED

Nie jestem pewien, czy to rozumiem. Czy nie byłoby to tak samo, jak posiadanie funkcji w Pythonie, która dekrementuje zmienną globalną i działa tylko wtedy, gdy jest wykonywana w powłoce? Czy to jest dozwolone? Chodzi mi o to, czy zwykle nie oczekuje się, że program opuści pamięć w pewnym momencie i zostanie ponownie załadowany później?
redstarcoder,

3
@redstarcoder Nie - Apple II dosłownie nie ma systemu alokacji pamięci; możesz przechowywać wszystko w dowolnym miejscu w pamięci RAM i będzie dostępne dla dowolnego programu, dopóki nie zostanie zastąpione inną wartością.
insert_name_here

@ nazwa_zestawu_tutaj, nie jestem pewien, jak to jest dostępne w dowolnym miejscu w pamięci RAM, zmienia cokolwiek. Czy możesz niezawodnie uruchamiać inne programy i nadal uruchamiać ten program później? Może nie znam wystarczająco dobrze obowiązujących tu zasad, aby w pełni zrozumieć, więc po prostu to porzucę. Po prostu oczekuję, że pełny program będzie trwał przez ponowne uruchomienie i będę mógł działać poprawnie, jeśli inne programy są uruchamiane między jego uruchomieniami, ale nie wiem, jaka społeczność rządzi pełnym programem.
redstarcoder

1
@ redstarcoder panuje ogólna zgoda co do tego, że program jest uruchamiany na komputerze programistycznym bez wymaganego oprogramowania i nie robi nic innego w międzyczasie.
Tom Carpenter,

1
8 bajtów, jeśli zamiast tego
pobierasz

35

Perl w systemie Linux, 17 bajtów

Pomyślałem, że może być interesujące stworzenie programu, który nie utrzymuje żadnego stanu i nie modyfikuje własnego kodu źródłowego; innymi słowy, faktycznie sprawdza, jak często był uruchamiany, pytając system operacyjny. Pytanie brzmi: „Można założyć, że wszelkie urządzenia używane do przechowywania są puste przed pierwszym uruchomieniem programu.” I dlatego chcielibyśmy zacząć od całkowicie pustego systemu operacyjnego. W związku z tym lepiej wyjaśnię, jak sobie z tym poradzisz, ponieważ w przeciwnym razie testowanie programu jest trudne.

Istnieją dwa sposoby skonfigurowania działania programu. Tak czy inaczej, minimalny system operacyjny do tego celu działałby tylko z powłoką (aby umożliwić nam uruchamianie Perla z kolei) i najprostszą z możliwych powłok (aby nie robił nic wymyślnego, co sprawiłoby, że system operacyjny nie byłby pusty). /bin/dashjest dobrym wyborem tutaj, ponieważ miał być minimalną powłoką do odzyskiwania systemu. Następnie musimy uruchomić Linuksa w taki sposób, aby działał tylko dash. Możemy to zrobić, uruchamiając ponownie komputer za init=/bin/dashpomocą wiersza polecenia systemu Linux, aby nic się nie uruchamiało dash, lub (o wiele wygodniej) tworząc kontener systemu Linux za unshare -Urfp /bin/dashpomocą terminala ( unsharetak naprawdę nie tworzy pustego systemu operacyjnego, ale symulujejeden; zwłaszcza wnętrze kontenera myśli, że jest rootem, dashmyśli, że jest init, itd., tak jak by to było w przypadku rzeczywistego pustego systemu operacyjnego). Oświadczenie: Właściwie nie testowałem tego jeszcze na gołym metalu, tylko w środku unshare, ale teoretycznie powinno to działać w obie strony.

Wreszcie, kiedy już to skonfigurujemy, musimy po prostu spojrzeć na PID; ponieważ jesteśmy w systemie pustym, system inicjujący (tutaj powłoka) będzie miał PID 1, więc wykonanie Perla będzie miało PID od 2 do 12 włącznie. Nasz program wygląda więc tak:

say 12-$$||die

Oto przykładowy przebieg:

$ 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.
#

Na jakim systemie operacyjnym używasz tego? Korzystam z systemu Ubuntu Linux 14.04 i unsharenie obsługuje żadnych flag -Urfp.
isaacg,

@isaacg: Ubuntu 16.04. unsharejest całkiem nowy (jest to interfejs do funkcji systemu operacyjnego, który jest również całkiem nowy), a błędy zostały naprawione dopiero w ciągu ostatniego roku. Jeśli używasz 2-letniej wersji, nic dziwnego, że ma bardzo ograniczoną funkcjonalność.

14

Bash + sed, 41 40 38 bajtów

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

Wypróbuj online!


Link TIO ma nagłówek i stopkę, czy te nie dodają do liczby bajtów?
Pavel

2
Nie, wystarczy uruchomić program 11 razy.
Dennis

I dostać sed: invalid option -- '/'. sed (GNU sed) 4.2.2
shrx

@shrx Huh. Mam tę samą wersję sed lokalnie i na TIO, i nie pokazują tego błędu.
Dennis

9

JavaScript, 42 bajty

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

Przetestuj to za pomocą tego skrzypka - pamiętaj, aby wyczyścić pamięć lokalną, aby zresetować odliczanie.

Dzięki steenbergh, Lmis i obarakon za wiele bajtów!


y=localStorage;y.a=y.a||10;alert(y.a>0?y.a--:a)może zaoszczędzić bajt.
Oliver,

Możesz użyć sessionStoragedo testowania z łatwiejszym resetem (wystarczy użyć nowej karty), ale oczywiście +2 bajty.
Kevin Reid,

Przykro mi, właśnie zobaczyłem twoją odpowiedź, skończyłem prawie tak samo. Jeśli chcesz, możesz użyć, l=localStorage;l.l=-~l.l;alert(10-l.l||l)aby zapisać bajt, usunę mój
C5H8NNaO4

@Mego Oczywiście :) Nie widzę console.logtutaj, ale wolałbym to albo
C5H8NNaO4

1
@obarakon Tak, a zwarcie logiczne uniemożliwia aoszacowanie, gdy wartość w magazynie lokalnym nie wynosi 0.
Mego

8

C #, 197 160 159 125 bajtów

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

Zaoszczędzono 34 bajty dzięki mleku

I sformatowana wersja (z ReadKeydodanym, aby można było wyświetlić dane wyjściowe):

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

Jest dłuższy, niż się spodziewałem, więc prawdopodobnie jest miejsce na grę w golfa.


2
File.Existsi File.Createzamiast ReadAllTexti WriteAllText. Wystarczy sprawdzić, czy nazwa pliku istnieje, nie oba z zawartością pliku. Ponadto namespace System.IOmożesz usunąć przestrzeń nazw z System.Console.Write. 125 bajtów:namespace System.IO{class P{static void Main(){var n=11;for(;File.Exists(""+--n););File.Create(""+n);Console.Write(n*n/n);}}}
mleko

@ mleko Wielkie dzięki! Nie mogę uwierzyć, że nie myślałem tylko o użyciu nazwy pliku! I nie wiedziałem o tej sztuczce w przestrzeni nazw, niesamowite.
TheLethalCoder,

8

Dyalog APL , 33 28 22/20? bajty

Nie jestem pewien, czy jest to poprawne, ponieważ składa się z funkcji (którą należy wywołać za pomocą fikcyjnego argumentu). Jednak wszystkie programy APL (czysto funkcjonalne lub nie) mają ten sam status, a niektóre wersje APL nie mają tradycyjnych programów, a jedynie funkcje. W ramach kompensacji dodałem dwa bajty, aby go nazwać, chociaż nie jest to konieczne do uzyskania pożądanego efektu.

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

Zauważ, że polega to na nieoficjalnym dziwactwie, które ∘←przypisuje się globalnie.

6:: przy każdym błędzie wartości

⊢czwrot c

∘←10 który jest globalnie ustawiony na 10

teraz

÷÷c zwraca dwukrotnie odwrócony (błędy na zero) c

∘← który jest globalnie ustawiony na

c-1jeden mniej niż ok

Wypróbuj APL online!


Z pewnością ważna wersja 28-bajtowa:

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

Działa poprzez ustawienie c na 11, jeśli brakuje, a następnie odjęcie 1 od c , dwukrotne odwrócenie (co daje błąd div-by-zero, jeśli c -1 wynosi 0), przypisanie do c i wyprowadzenie nowej wartości.


Stara 33-bajtowa wersja:

fa
÷ pokrywają się ≢2 ↓ r⊣⎕FX¯1 ↓ r ← ⎕NR'f '










Działa poprzez redefinicję się przy każdym uruchomieniu, ale z jedną nową końcową linią mniej. Zwraca dwukrotnie odwróconą liczbę pozostałych linii (mniej dwóch), co daje błąd div-by-zero, gdy pozostały tylko dwie linie (nagłówek i rzeczywisty kod).


1
Eee ... dlaczego jest tyle nowych linii?
Kritixi Lithos

4
@KritixiLithos Program przedefiniowuje się o jedną linię mniej dla każdego uruchomienia.
Adám

7

Perl, 37 36 bajtów

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

Występuje awaria, gdy wartość początkowa osiągnie -1 (co spowodowałoby wydrukowanie 0), gdy zapisuje się nad =~operatorem.

Zapisano bajt za pomocą sysopenzamiast open. To pozwala mi STDOUTnajpierw wydrukować , używając wartości zwracanej jako trybu pliku ( 1aka O_WRONLY), zanim $~zostanie ponownie przypisany.

Przykładowe użycie

$ 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 bajtów

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

Potrzebuje znaku nowej linii po =finish.

diemożna zastąpić 1/0.

Wyjaśnienie:

Później dostaje listę linii =finish ( $=finish.lines) odejmuje to 10, a jeśli wynik nie 0jest, drukuje go, w przeciwnym razie diejest.

Ostatnią rzeczą, którą robi, jest otwarcie się w trybie dołączania i dodanie kolejnej linii na końcu.


Link bezpośredni dla tych, którzy nie mają Perla 6.
Dennis

@Dennis Przynajmniej ten nie jest tak nieaktualny, jak to, co Ideone (uruchomił say $*PERL.compiler.version)
Brad Gilbert b2gills

1
2014.7 ... wow! Czy 2016.11 bardzo różni się od 2016.7? Jeśli tak, mogę zbudować go ze źródła.
Dennis

@Dennis Oficjalna wersja Perla 6 to 25.12.2015. Pod koniec 2015 r. Nastąpiła duża zmiana o nazwie The Great List Refactor (GLR), więc uzyskanie kodu do pracy również w 2014.7 jest prawie niemożliwe. Większość tego, co dzieje się w 2016 r., Jest związana z wydajnością, choć wprowadzono wiele poprawek warunków brzegowych. Większość kodu do gry w golfa powinna działać na czymkolwiek po wydaniu Rakudo 2015.12. Więc myślę, że v2016.07 jest w porządku.
Brad Gilbert b2gills,

6

Python 2, 65 bajtów

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

Zainspirowany odpowiedzią L3viathan .

Można zmniejszyć do 60 bajtów, jeśli możesz nazwać plik pojedynczym znakiem, xa następnie zastąpić __file__go 'x'. W takim przypadku należy wymienić 75z 70.


@ Flp.Tkc tak, ale czy to nie ta sama liczba bajtów?
Alex Hall

och, to prawda: P
FlipTack

4

Jolf, 20 bajtów

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

Wypróbuj tutaj! Błędy podczas 0drukowania. Modyfikuje kod Wyjaśnienie, które nastąpi.


Nie znam się zbyt dobrze na Jolfie, ale wydaje się, że nie działa on od razu w tłumaczu online.
Esolanging Fruit

1
@ Challenger5 Język zwykle działa tylko na Firefox.
Conor O'Brien

4

Applesoft BASIC, 21 bajtów (tokenizowany)

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

Zamień <CTRL-F>i<CTRL-H> ich dosłowne wersje. Zauważ, że modyfikuje to tylko program w pamięci; ponowne załadowanie go z dysku spowoduje zresetowanie odliczania.


Przykładowy przebieg

]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

Wyjaśnienie

PRINT 9 + 1robi to, czego można oczekiwać. CALL 2066wywołuje procedurę języka maszynowego 6502 w lokalizacji pamięci 2066, która jest późniejEND : . ENDzatrzymuje program, tak aby procedura języka maszynowego (która dla interpretera Applesoft jest śmieciem) nie jest wykonywana.

Procedura w języku maszynowym po prostu zmniejsza wartość 9w PRINT 9 + 1. Demontaż:

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

Gdy licznik osiągnie 0, jest „zmniejszany” do /; próba uruchomienia programu spowoduje błąd składniowy.


4

*> <> , 20 18 bajtów

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

To faktycznie działa na Linuksie (i \nchyba cokolwiek obsługuje pliki o nazwie ). Tworzy plik o nazwie \nprzy pierwszym uruchomieniu i wyjściach 10. Kontynuuje generowanie o jedną liczbę mniejszą przy każdym kolejnym uruchomieniu, z wyjątkiem miejsca, w 0którym zamiast tego ulega awarii.

Wyjaśnienie

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
Wygodne, że *> <> dodaje IO
Alfie Goodacre

4

PHP 57 bajtów

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

tak naprawdę nie ulega awarii, ale kończy działanie (bez odliczania), gdy uderza 0. Czy to wystarczy?

Uruchom z -r.


4

C #, 156 bajtów

Grałem przez chwilę w grę @ TheLethalCoder i byłem w stanie zaoszczędzić 3 bajty, zmieniając kolejność instrukcji i eliminując int.parse (). Jestem pewien, że wciąż jest miejsce na ulepszenia.

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

Nie golfowany:

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

Meta-pytanie: Może być hack-y potraktować pracę TheLethalCoder jako punkt wyjścia do mojej odpowiedzi. Czy byłoby lepiej (gdy mam przedstawiciela) dodać to jako komentarz do ich odpowiedzi? Nie próbuję z nimi konkurować, chcę po prostu pokazać swoje umiejętności gry w golfa, wzajemne budowanie.


Ludzie zwykle pozostawiają komentarze pod innymi osobami, które sugerują ulepszenia, jednak ze względu na ulepszenia w mojej kopalni sugerowane przez kopalnię mleka jest teraz znacznie inne, więc twoje jest w porządku samo w sobie
TheLethalCoder

Zwykle przechodzę, jeśli są to ulepszenia w komentarzach innych osób, ale jeśli są wystarczająco różne od ich, to opublikuj własną odpowiedź
TheLethalCoder

3

PowerShell V2.0, 49 bajtów

(Pierwszy w historii kod golfowy, nie mogłem znaleźć zasad obliczania bajtów. Użyłem kalkulatora Łańcuch bajtów online)

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

Bieganie:

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

Witamy w PPCG! Zasady obliczania bajtów zależą od kodowania znaków używanego przez język. Powershell prawdopodobnie używa kodowania ASCII lub UTF-8, a więc w przypadku skryptu zawierającego tylko kody ASCII, tak jak w tym przypadku, każda postać zajmuje 1 bajt
Luis Mendo

Witamy w PPCG! Według twórcy wyzwania wszystkie zgłoszenia muszą być kompletnym programem, co nie jest - ponieważ jest w zasadzie uruchamiane w odpowiedniku REPL programu PowerShell.
AdmBorkBork,

Jeśli napisałem to w pliku .ps1 i wykonałem 10-krotny crash-off.ps1, czy to się liczy jako pełny program?
Kieron Davies,

@KieronDavies Tak, pod warunkiem, że jeśli zamkniesz i ponownie otworzysz powłokę za każdym razem, nadal otrzymasz ten sam wynik. Przechowywanie elementów „w pamięci” w powłoce między wykonywaniem definiuje „środowisko REPL” programu PowerShell ze środowiska „pełnego programu”.
AdmBorkBork,

3

Java, 343 bajty

Moja pierwsza próba golfa

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

bez golfa

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

Możesz sprowadzić go do 300 bajtów, importując java.io.*i unikając używania w pełni kwalifikowanych nazw konstruktorów, a możesz wyciąć kolejne 8, korzystając z faktu, że „print” automatycznie zaostrzy swoje argumenty: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

Możesz sprowadzić go do 237 bajtów, nie zapisując „10” do pliku, a zamiast tego po prostu używając ?operatora opartego na istnieniu pliku, gdy czytasz 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

Najbardziej zoptymalizowany, jaki mogłem zrobić: 220 bajtów. Oto bestia: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);}}
Olivier Grégoire,

dziękuję za sugestie :)
Viktor Mellgren,

3

SQLite, 142 137

Można to prawdopodobnie zrobić znacznie sprytniej. 141 136 znaków dla kodu:

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

Plus 1 za nazwę pliku xw sqlite3 x '…'.


1
Miły! Nie widziałem wcześniej, żeby SQLite był tak używany. Możesz wycisnąć kilka bajtów, zastępując „wartości (11)”
słowami

3

JavaScript, 74 bajty

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
PO wyjaśnił (w komentarzach), że wymagany jest pełny program.
Dennis

1
@Dennis Czy moje poprawione zgłoszenie kwalifikuje się jako pełny program?
Oliver,

Nie wiem , ale nie sądzę. Powiedziałbym, że bez wywołania alertlub podobnego, to tylko fragment REPL.
Dennis

2
Dla mnie wygląda dobrze. (Nie mogę przetestować z mojego telefonu.)
Dennis

3

Ruby, 94 87 84 61 59 bajtów

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

Proszę zostawić sugestie poniżej.

Dzięki @ ConorO'Brien za pomysły (niektórzy bezwstydnie oderwali się od jego odpowiedzi).


puts i=>p i
Conor O'Brien

Użyj newi sizezamiast openi length.
Lee W

2

Rubinowy, 52 + 1 = 53 bajty

Zakłada, że ​​plik ma nazwę a(+1 bajt).

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

Bieganie

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

... możesz przyjmować nazwiska?
dkudriavtsev

Możesz użyć 0 $ zamiast a i 'echo >> # $ 0' (z backticks) w ostatnim wierszu.
GB

@GB To wciąż więcej bajtów niż zakładanie a(co jest tylko +1).
wizzwizz4

? a ma 2 bajty, 0 $ to 2 bajty, ale nie wymaga białych znaków.
GB

2

Python 2, 89 bajtów

x=10
x/x
print x
f=open(__file__,"r+")
s=f.read()
f.seek(0)
f.write(s.replace(`x`,`x-1`))

Podobał mi się twój pomysł otwarcia, __file__więc skorzystałem z tego w mojej odpowiedzi.
Alex Hall

@AlexHall Świetny pomysł zlen
L3viathan

@ Flp.Tkc Nie zapisam przy tym żadnych znaków. Nadal muszę używać zmiennej s, ponieważ muszę czytać, a następnie szukać, a następnie pisać. To print x/x*xdziałałoby, ale nie poprawia liczby bajtów.
L3viathan

2

TI-BASIC (TI-84 Plus) (15 bajtów)

If not(Ans
11
Ans-1
AnsAns/Ans

Ans powinna wynosić 0 (wartość domyślna) przed pierwszym uruchomieniem.

Ponieważ AnsAns/Ansjest to ostatni wiersz programu, zostanie on wyprowadzony i zapisany w Ans, chyba że Ans wynosi 0, w którym to przypadku występuje błąd dzielenia przez 0.


2

JavaScript, 41

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


@Mego Tak, oczywiście, nie wiem, jak to się mogło stać ... Miałem azamiast tego, lkiedy to napisałem, i zmieniłem to bez zastanowienia, ponieważ myślałem, że wygląda to bardziej zabawnie ... było za późno i herby , dzięki za zwrócenie na to uwagi.
C5H8NNaO4

1

GNU Smalltalk, 70, 68 bajtów

66 bajtów kod +2 bajty dla flagi „-S”

EDYCJE

  • Usunięto niepotrzebne nawiasy, -2 bajty

Grał w golfa

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

Test

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

Ważny

Musisz uruchomić gst jako root, aby mógł zmodyfikować domyślny obraz lub określić własny obraz za pomocą -I .


1

PHP, 45 bajtów

Szczerze mówiąc, nie jestem pewien, czy to się liczy.

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

Zamieszczę link do przykładu, ale wszyscy testerzy online, których znam, nie pozwalają session_start()na użycie.

Będzie to odliczało za każdym razem, gdy odświeżysz stronę, aż do 0, kiedy diepolecenie zostanie uruchomione.


0

QBIC , 70 bajtów

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|

Otwiera plik a.b(lub tworzy go, gdy nie zostanie znaleziony przy pierwszym uruchomieniu), wczytuje rekord 1 do e. Jeśli ten rekord nie zostanie znaleziony, załóż 10, w przeciwnym razie pod 1. W e==0, zgłoś błąd. Napisz edo a.b.

Dostęp do plików nie jest wbudowany w QBIC, zależy to w dużej mierze od bazowej QBasic.


0

Partia, 72 bajty

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

Należy wywołać przy użyciu pełnej nazwy pliku, w tym rozszerzenia. Ostatnia linia nie może mieć końcowego nowego wiersza. Działa, pisząc -1do końca ostatniego wiersza, dzięki czemu za każdym razem ocenia się o 1 mniej. goto gbłędy, ponieważ nie ma etykiety :g.


0

R, 52 bajty

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

Zasadniczo używa ls()do wyświetlania nazw wszystkich globalnie przechowywanych obiektów. Jeśli założymy, że środowisko globalne jest puste i jeszcze "x"nie istnieje, wygeneruj x=10, w przeciwnym razie, jeśli x!=0odejmij 1, wywołaj brakujący argument, który zwróci błąd.


Możesz zapisać bajt, usuwając !i zmieniając kolejność argumentów ów i else, a kolejne dwa, zmieniając x>0na x. (Ponadto exists("x")jest nieco starsze niż "x"%in%ls(), choć równa pod względem liczby bajtów.)
rturnbull

Ach, ponownie czytając komentarze w specyfikacji, wygląda na to, że wymagany jest pełny program, co oznacza, że ​​nie można polegać na trwałości obiektu między uruchomieniami.
rturnbull

@rturnbull Chociaż nie mogę znaleźć, gdzie jest to wyraźnie określone. Usunę odpowiedź, jeśli możesz mnie wskazać.
Billywob,

Jest tu wspomniane , chociaż nie zostało edytowane w specyfikacji.
rturnbull

0

Pakiet Windows, 61 bajtów

@if %n%.==. set n=10
@if %n%==0 goto.
@set /a n-=1&@echo %n%

0

JavaScript, 44 bajty

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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.