3… 2… 1… Abbruch!


47

Ihre Aufgabe ist es, ein vollständiges Programm zu schreiben, das bei jedem Start von 10 herunterzählt.

  • Wenn Sie das Programm zum ersten Mal ausführen, sollte es gedruckt werden 10.
  • Beim nächsten Mal sollte es ausgegeben werden 9.
  • Beim nächsten Mal sollte es ausgegeben 8werden und so weiter.
  • Anstatt zu drucken 0, sollte das Programm abstürzen. Danach muss das Programm nicht mehr ausgeführt werden.
  • Es kann davon ausgegangen werden, dass alle für die Speicherung verwendeten Einrichtungen vor der ersten Ausführung des Programms leer sind.

Hier ist eine Beispielimplementierung in 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))

Das ist , also gewinnt die kürzeste Antwort (gemessen in Bytes).


12
Was bedeutet Absturz?
Conor O'Brien

2
@ ConorO'Brien Hmm ... das wurde noch nicht in Meta besprochen?
Esolanging Fruit

2
@ Challenger5 Nicht das ich wüsste. Wäre es ausreichend einen Fehler zu werfen?
Conor O'Brien

1
@ ConorO'Brien Ja.
Esolanging Fruit

Antworten:


18

6502 Maschinensprache + Apple] [+ ROM, 12 (11? 10? 9?) Bytes

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

Sollte um beginnen $8000. Stürzt auf dem Systemmonitor ab, wenn die Anzahl 0 erreicht.


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

Sollte um beginnen $B1. Dies spart ein Byte, da ich die (Zwei-Byte-) Zero-Page-Version von verwenden kann DEC, aber die kritische Applesoft-Routine überschreibe CHRGET. Sie müssen es laden und vom Monitor aus aufrufen und anschließend mit CTRL+ BReturnBASIC neu initialisieren. Ich bin mir nicht sicher, ob dies den Fehler verursacht oder nicht.


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

Sollte um beginnen $8000. Dies wird nicht initialisiert $9Eund spart zwei Bytes. Dies bedeutet jedoch, dass Sie es nicht mit einer negativen Adresse anrufen dürfen (oder, wenn Sie es vom Monitor aus anrufen, müssen Sie den Monitor mit einer positiven Adresse anrufen). Wenn Sie das tun, Apple die CALLspeichert Routine FFin $9E, es verursacht 65280 an die Nummer hinzuzufügen , wenn es gedruckt wird . Wieder nicht sicher, ob dies die Lösung ungültig macht oder nicht.


C6 B6 F0 01 A2 0B 4C 26 ED

Sollte um beginnen $B1. Dies ist eine Kombination der beiden oben genannten Programme, wodurch insgesamt drei Bytes eingespart werden. Sie müssen den Monitor mit einer positiven Adresse aufrufen, ihn laden und von dort ausführen und mit Ctrl+ BReturnBASIC neu initialisieren, wenn Sie fertig sind.


Beachten Sie, dass diese Programme nur das Programm im Speicher ändern; Durch erneutes Laden des Programms von der Festplatte wird der Countdown zurückgesetzt. Dies funktioniert, weil Apple] [(und] [+, // e und // c) überhaupt kein Speicherschutzsystem haben. Das Programm (und seine Selbstmodifikationen) bleiben auch nach dem Beenden im Speicher, sodass Sie es so lange ausführen können, bis Sie diesen Speicher mit etwas anderem überschreiben.


Probelauf

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

Erläuterung

     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

Erklärung der 10-Byte-Version

     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

Varianten

Druckt ERRund piept, wenn die Anzahl 0 erreicht

Normal - 15 Bytes

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

Überschreibt CHRGET- 14 Bytes

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

Initialisiert nicht $9E- 13 Bytes

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

Überschreibt CHRGETund initialisiert nicht $9E- 12 Bytes

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

Friert ein, wenn die Anzahl 0 erreicht

Normal - 12 Bytes

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

Überschreibt CHRGET- 11 Bytes

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

Initialisiert nicht $9E- 10 Bytes

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

Überschreibt CHRGETund initialisiert nicht $9E- 9 Bytes

C6 B6 F0 FE A2 0B 4C 26 ED

Ich bin nicht sicher, ob ich das verstehe. Wäre das nicht dasselbe wie eine Funktion in Python, die eine globale Variable dekrementiert und nur funktioniert, wenn sie in der Shell ausgeführt wird? Ist das erlaubt Was ich meine ist, wird normalerweise nicht erwartet, dass ein Programm irgendwann den Speicher verlässt, um später erneut geladen zu werden?
Redstarcoder

3
@redstarcoder Nein - der Apple II verfügt buchstäblich über kein Speicherzuweisungssystem. Sie können alles irgendwo im RAM speichern und es bleibt für jedes Programm zugänglich, bis es mit einem anderen Wert überschrieben wird.
insert_name_here

@inset_name_here, ich bin mir nicht sicher, wie es irgendwo im RAM etwas ändert, zugänglich zu sein. Können Sie andere Programme zuverlässig ausführen und dieses Programm später noch ausführen? Vielleicht kenne ich die Regeln hier nicht gut genug, um sie vollständig zu verstehen, also lasse ich sie einfach fallen. Ich erwarte nur, dass ein vollständiges Programm durch Neustarts erhalten bleibt und in der Regel einwandfrei ausgeführt werden kann, wenn andere Programme zwischen den Ausführungen ausgeführt werden, aber ich weiß nicht, wie die Community ein vollständiges Programm vorschreibt.
Redstarcoder

1
@redstarcoder Der allgemeine Konsens ist, dass das Programm auf einem Entwicklungscomputer mit nur der erforderlichen Software ausgeführt wird und in der Zwischenzeit nichts anderes tut.
Tom Carpenter

1
8 Bytes, wenn Sie stattdessen von $ 6E ausführen: C6 75 F0 03 4C 22 ED 0B
Peter Ferrie

35

Perl unter Linux, 17 Bytes

Ich dachte, es könnte interessant sein, ein Programm zu erstellen, das selbst keinen Zustand beibehält und seinen eigenen Quellcode nicht modifiziert. Mit anderen Worten, es überprüft tatsächlich, wie oft es ausgeführt wurde, indem es das Betriebssystem fragt. Die Frage lautet: "Es kann davon ausgegangen werden, dass alle für die Speicherung verwendeten Einrichtungen vor der ersten Ausführung des Programms leer sind." Daher möchten wir von einem vollständig leeren Betriebssystem ausgehen. Als solches würde ich Ihnen besser erklären, wie Sie das machen, da es sonst schwierig ist, das Programm zu testen.

Es gibt zwei Möglichkeiten, um das Programm auszuführen. In jedem Fall würde das minimale Betriebssystem für diesen Zweck nur eine Shell ausführen (damit wir Perl abwechselnd ausführen können), und die einfachste Shell (damit das Betriebssystem nichts Besonderes tut, was es zu einem Nicht-Betriebssystem macht). leer). /bin/dashist hier eine gute Wahl, da es als minimale Shell für die Systemwiederherstellung gedacht war. Dann müssen wir Linux so starten, dass es nur läuft dash. Dies können wir entweder tun, indem wir den Computer init=/bin/dashüber die Linux-Befehlszeile neu starten, so dass nichts anderes gestartet wird dash, oder (viel bequemer) indem wir einen Linux-Container unshare -Urfp /bin/dashin einem Terminal erstellen (erstellt unshareeigentlich kein leeres Betriebssystem, simuliert es aber)einer; Insbesondere denkt das Innere des Containers, dass es sich um root, dashinit usw. handelt, genau wie dies bei einem leeren Betriebssystem der Fall wäre. Haftungsausschluss: Ich habe dies noch nicht auf Bare Metal getestet unshare, sondern nur im Inneren , aber es sollte theoretisch in beide Richtungen funktionieren.

Sobald wir das eingerichtet haben, müssen wir uns nur noch die PID ansehen. Da es sich um ein leeres System handelt, hat das Init-System (hier die Shell) die PID 1, sodass die Ausführungen von Perl PIDs von 2 bis einschließlich 12 haben. Unser Programm sieht also so aus:

say 12-$$||die

Hier ist ein Probelauf:

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

Auf welchem ​​Betriebssystem läuft das? Ich arbeite unter Ubuntu Linux 14.04 und unshareunterstütze keine der Flags -Urfp.
isaacg

@isaacg: Ubuntu 16.04. unshareist ziemlich neu (es ist eine Schnittstelle zu einer OS-Funktion, die auch ziemlich neu ist) und die Bugs wurden erst im letzten Jahr wirklich ausgebügelt. Wenn Sie eine 2½ Jahre alte Version verwenden, ist es nicht verwunderlich, dass die Funktionalität sehr eingeschränkt ist.

14

Bash + sed, 41 40 38 Bytes

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

Probieren Sie es online!


Der TIO-Link hat eine Kopf- und Fußzeile, addieren sich diese nicht zur Byteanzahl?
Pavel

2
Nein, das ist nur, um das Programm 11 Mal auszuführen.
Dennis

Ich verstehe sed: invalid option -- '/'. sed (GNU sed) 4.2.2
shrx

@shrx Huh. Ich habe die gleiche Version von sed lokal und auf TIO und sie zeigen diesen Fehler nicht.
Dennis

9

Javascript, 42 Bytes

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

Probieren Sie es mit dieser Geige aus - löschen Sie unbedingt Ihren lokalen Speicher, um den Countdown zurückzusetzen.

Vielen Dank an steenbergh, Lmis und obarakon für viele Bytes!


y=localStorage;y.a=y.a||10;alert(y.a>0?y.a--:a)kann dir ein Byte sparen.
Oliver

Sie können sessionStoragemit einem einfacheren Reset testen (verwenden Sie einfach einen neuen Tab), aber natürlich +2 Bytes.
Kevin Reid

Autsch, sorry, ich habe gerade deine Antwort gesehen, am Ende habe ich fast dasselbe getan. Wenn Sie möchten, können Sie verwenden l=localStorage;l.l=-~l.l;alert(10-l.l||l), um ein Byte zu speichern, ich würde meine löschen
C5H8NNaO4

@ Mego Natürlich :) Ich sehe hier kein console.log, aber ich würde es auch vorziehen
C5H8NNaO4

1
@obarakon Yep und Boolescher Kurzschluss verhindern, dass aausgewertet wird, wenn der Wert in localstorage nicht 0 ist.
Mego

8

C # 197 160 159 125 Bytes

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 Bytes dank Milch gespart

Und eine formatierte Version (Mit ReadKeyhinzugefügt, damit Sie die Ausgabe anzeigen können):

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

Es ist länger als ich dachte, also gibt es wahrscheinlich Platz zum Golfen.


2
File.Existsund File.Createanstelle von ReadAllTextund WriteAllText. Prüfen Sie einfach, ob ein Dateiname vorhanden ist, nicht beide mit dem Dateiinhalt. Außerdem können namespace System.IOSie den Namespace von entfernen System.Console.Write. 125 Bytes:namespace System.IO{class P{static void Main(){var n=11;for(;File.Exists(""+--n););File.Create(""+n);Console.Write(n*n/n);}}}
Milch

@milch Vielen Dank! Ich kann nicht glauben, dass ich nicht daran gedacht habe, nur den Dateinamen zu verwenden! Und ich wusste nichts über diesen Namespace-Trick, großartig.
TheLethalCoder

8

Dyalog APL , 33 28 22/20? Bytes

Ich bin nicht sicher, ob dies gültig ist, da es aus einer Funktion besteht (die mit einem Dummy-Argument aufgerufen werden muss). Alle APL-Programme (rein funktional oder nicht) haben jedoch den gleichen Status, und in der Tat haben einige APL-Versionen keine herkömmlichen Programme, sondern nur Funktionen. Zum Ausgleich habe ich zwei Bytes hinzugefügt, um es zu benennen, obwohl dies für den gewünschten Effekt nicht erforderlich ist.

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

Beachten Sie, dass dies auf einer inoffiziellen Eigenheit beruht, ∘←die global zugewiesen wird .

6:: bei einem Wertfehler

⊢cRückkehr c

∘←10 Welches ist global auf 10 festgelegt

jetzt

÷÷c Rückgabe der zweimal invertierten (Fehler auf Null) c

∘← Welches ist global festgelegt auf

c-1einer weniger als c

TryAPL online!


Mit Sicherheit gültige 28-Byte-Version:

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

Setzt c auf 11, wenn es fehlt, subtrahiert dann 1 von c , invertiert zweimal (was einen Fehler durch Null ergibt, wenn c -1 0 ist), weist c zu und gibt den neuen Wert aus.


Alte 33-Byte-Version:

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










Funktioniert, indem es sich bei jedem Durchlauf neu definiert, jedoch mit einer Zeile weniger nachgestellten Zeilenumbrüchen. Gibt die zweifach invertierte Anzahl der verbleibenden Zeilen aus (weniger als zwei), wodurch ein Fehler durch Null geteilt wird, wenn nur noch zwei Zeilen übrig sind (der Header und der tatsächliche Code).


1
Äh ... warum gibt es so viele Zeilenumbrüche?
Kritixi Lithos

4
@KritixiLithos Das Programm definiert sich mit einer Zeile weniger für jeden Lauf neu.
Adám

7

Perl, 37 36 Bytes

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

Stürzt ab, wenn der Anfangswert -1 erreicht (was den Wert 0 ergeben hätte), während der =~Operator überschrieben wird.

Ein Byte mit sysopenanstatt mit gespeichert open. Auf diese Weise kann ich STDOUTzuerst mit dem Rückgabewert als Dateimodus ( 1auch bekannt als O_WRONLY) drucken , bevor er $~neu zugewiesen wird.

Beispielnutzung

$ 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 Bytes

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

Benötigt Newline-Zeichen nach =finish.

diekann durch ersetzt werden 1/0.

Erläuterung:

Es wird eine Liste von Zeilen abgerufen, nachdem =finish( $=finish.lines) diese subtrahiert 10hat. Wenn das Ergebnis nicht 0angezeigt wird, wird es gedruckt, andernfalls wird es dieausgegeben.

Das Letzte, was es tut, ist, sich selbst im Anfügemodus zu öffnen und am Ende eine weitere Zeile hinzuzufügen.


Permalink für diejenigen, die Perl 6 nicht haben.
Dennis

@Dennis Zumindest ist das nicht so veraltet wie das, was Ideone hat (run say $*PERL.compiler.version)
Brad Gilbert b2gills

1
2014.7 ... wow! Unterscheidet sich 2016.11 stark von 2016.7? Wenn ja, kann ich es aus dem Quellcode erstellen.
Dennis

@Dennis Die offizielle Veröffentlichung von Perl 6 war der 25.12.2015. Ende 2015 gab es eine große Änderung mit dem Namen The Great List Refactor (GLR), sodass es fast unmöglich ist, Code auch für 2014.7 zum Laufen zu bringen. Das meiste, was im Jahr 2016 passiert ist, hängt von der Leistung ab, obwohl es viele Fehlerbehebungen in Bezug auf Randbedingungen gegeben hat. Der meiste Code für den Golfsport sollte nach der Veröffentlichung von Rakudo am 12.12.2015 für alles funktionieren. Ich denke also, dass v2016.07 in Ordnung ist.
Brad Gilbert b2gills

6

Python 2, 65 Bytes

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

Inspiriert von L3viathans Antwort .

Kann bis zu 60 Byte reduziert werden , wenn Sie die Datei ein einzelnes Zeichen wie nennen können wählen , xund ersetzen Sie dann __file__mit 'x'. In diesem Fall ersetzen Sie 75durch 70.


@ Flp.Tkc ja, aber ist das nicht die gleiche Anzahl von Bytes?
Alex Hall

oh, das stimmt: P
FlipTack


4

Applesoft BASIC, 21 Byte (tokenisiert)

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

Ersetzen Sie <CTRL-F>und <CTRL-H>mit ihren wörtlichen Versionen. Beachten Sie, dass dies nur das Programm im Speicher ändert. Durch erneutes Laden von der Festplatte wird der Countdown zurückgesetzt.


Probelauf

]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

Erläuterung

PRINT 9 + 1tut, was Sie erwarten würden. CALL 2066ruft die 6502-Maschinensprachenroutine am Speicherort 2066 auf, der danach liegt END :. ENDHält das Programm an, sodass die maschinensprachliche Routine (für den Applesoft-Interpreter Müll) nicht ausgeführt wird.

Die Maschinensprache Routine dekrementiert einfach die 9in PRINT 9 + 1. Demontage:

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

Nachdem der Zähler 0 erreicht hat, wird er auf "dekrementiert" /. Der Versuch, das Programm auszuführen, führt dann zu einem Syntaxfehler.


4

*> <> , 20 18 Bytes

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

Dies funktioniert tatsächlich unter Linux (und was auch immer Dateien mit dem Namen unterstützt, \ndenke ich). Es wird eine Datei mit dem Namen \nbeim ersten Start erstellt und ausgegeben 10. Bei jedem nachfolgenden Durchlauf wird eine Nummer weniger ausgegeben, es sei denn, 0es stürzt stattdessen ab.

Erläuterung

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
Praktisch, dass *> <> IO hinzufügt
Alfie Goodacre

4

PHP 57 Bytes

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

stürzt nicht wirklich ab, sondern beendet sich (ohne herunterzuzählen), wenn es trifft 0. Reicht das

Laufen Sie mit -r.


4

C #, 156 Bytes

Ich spielte eine Weile mit der Antwort von @ TheLethalCoder und konnte 3 Bytes einsparen, indem ich die Anweisungen neu anordnete und die int.parse () eliminierte. Ich bin mir sicher, dass es noch Verbesserungspotenzial gibt.

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

Meta-Frage: Es mag schwierig sein, die Arbeit von TheLethalCoder als Ausgangspunkt für meine Antwort zu nehmen. Wäre es besser (wenn ich den Repräsentanten habe), dies als Kommentar zu ihrer Antwort hinzuzufügen? Ich versuche nicht, mit ihnen zu konkurrieren, ich möchte nur mein Golf zur gegenseitigen Erbauung vorführen.


Normalerweise hinterlassen die Leute Kommentare unter den Antworten der anderen Personen, die Verbesserungen vorschlagen. Aufgrund der Verbesserungen, die von der
Milchmine

Normalerweise gehe ich vorbei, wenn sie Verbesserungen am Antwortkommentar einer anderen Person sind, aber wenn es anders ist als das ihre, dann
poste

3

Powershell V2.0, 49 Bytes

(Zum ersten Mal Code Golf, konnte die Regeln für die Berechnung von Bytes nicht finden. Ich habe online einen String-to-Bytes-Rechner verwendet.)

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

Laufen:

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

Willkommen bei PPCG! Die Regeln zur Berechnung von Bytes hängen von der von der Sprache verwendeten Zeichenkodierung ab. Powershell verwendet wahrscheinlich ASCII- oder UTF-8-Codierung. Für ein Skript mit nur ASCII-Codes, wie hier, belegt jedes Zeichen 1 Byte
Luis Mendo

Willkommen bei PPCG! Gemäß dem Herausforderungsschreiber müssen alle Einreichungen ein vollständiges Programm sein. Dies ist jedoch nicht der Fall, da es im Wesentlichen in PowerShells Entsprechung zu einer REPL ausgeführt wird.
AdmBorkBork

Wenn ich dies in eine .ps1-Datei geschrieben und diese zum Beispiel 10-mal ausgeführt habe, gilt das dann als vollständiges Programm?
Kieron Davies

@KieronDavies Ja, vorausgesetzt, Sie haben immer noch das gleiche Ergebnis erzielt, wenn Sie die Shell zwischenzeitlich geschlossen und erneut geöffnet haben. Das Speichern von Elementen in der Shell zwischen der Ausführung definiert die "REPL-Umgebung" von PowerShell in einer "Vollprogramm" -Umgebung.
AdmBorkBork

3

Java, 343 Bytes

Mein erster Golfversuch

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

Sie können es auf 300 Bytes java.io.*reduzieren, indem Sie vollständig qualifizierte Konstruktornamen importieren und vermeiden, und Sie können weitere 8 durch die Tatsache kürzen, dass "print" seine Argumente automatisch striktiert: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

Sie können es auf 237 Bytes reduzieren, indem Sie die "10" nicht in die Datei schreiben und stattdessen nur den ?Operator verwenden, der auf der Existenz der Datei basiert, wenn Sie lesen 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

Am optimiertesten könnte ich machen: 220 Bytes. Hier ist das Biest: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

Danke für die Vorschläge :)
Viktor Mellgren

3

SQLite, 142 137

Dies könnte wahrscheinlich viel geschickter gemacht werden. 141 136 Zeichen für Code:

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 für den Dateinamen xin sqlite3 x '…'.


1
Nett! Ich habe noch nie gesehen, dass SQLite so verwendet wurde. Sie können einige Bytes auspressen, indem Sie "Werte (11)" durch "Auswahl 11" und "Auswahl n von t Grenze 1" durch "Auswahl min (n) von t"
ersetzen

3

JavaScript, 74 Bytes

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
Das OP hat (in den Kommentaren) klargestellt, dass ein vollständiges Programm erforderlich ist.
Dennis

1
@Dennis Qualifiziert sich meine überarbeitete Einreichung als vollständiges Programm?
Oliver

Ich weiß nicht wissen , aber ich glaube nicht. Ich würde sagen, dass es sich ohne einen Anruf bei alertoder ähnlichem nur um ein REPL-Snippet handelt.
Dennis

2
Sieht gut für mich aus. (Kann es nicht von meinem Handy testen.)
Dennis

3

Ruby, 94 87 84 61 59 Bytes

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

Bitte hinterlassen Sie unten Vorschläge.

Vielen Dank an @ ConorO'Brien für die Ideen (einige schamlos von seiner Antwort abgerissen).


puts i=>p i
Conor O'Brien

Verwenden Sie newund sizeanstelle von openund length.
Lee W

2

Ruby, 52 + 1 = 53 Bytes

Angenommen, die Datei heißt a(+1 Byte).

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

Laufen

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

... können Sie Namen annehmen?
Dkudriavtsev

Sie können $ 0 anstelle von a und 'echo >> # $ 0' (mit Backticks) in der letzten Zeile verwenden.
GB

@GB Es sind immer noch mehr Bytes als angenommen a(das ist nur +1).
wizzwizz4

? a ist 2 Bytes, $ 0 ist 2 Bytes, benötigt aber keine Leerzeichen.
GB

2

Python 2, 89 Bytes

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

Ich mochte deine Idee, etwas zu eröffnen, __file__also habe ich das in meiner Antwort benutzt.
Alex Hall

@ AlexHall Tolle Idee mitlen
L3viathan

@ Flp.Tkc Ich werde damit keine Zeichen speichern. Ich muss die Variable immer noch verwenden s, weil ich lesen, dann suchen und dann schreiben muss. Das print x/x*xwürde funktionieren, verbessert aber nicht die Byteanzahl.
L3viathan

2

TI-BASIC (TI-84 Plus) (15 Byte)

If not(Ans
11
Ans-1
AnsAns/Ans

Ans sollte vor dem ersten Lauf gleich 0 (der Standardwert) sein.

Da dies AnsAns/Ansdie letzte Zeile des Programms ist, wird sie ausgegeben und in Ans gespeichert, sofern Ans nicht 0 ist. In diesem Fall tritt ein Fehler beim Teilen durch 0 auf.


2

JavaScript, 41

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


@Mego Ja offensichtlich, ich weiß nicht, wie das passieren könnte ... Ich hatte eine aanstelle der, lals ich sie schrieb, und änderte sie ohne nachzudenken, weil ich dachte, es macht mehr Spaß ... es war zu spät und herby Danke, dass Sie darauf hingewiesen haben.
C5H8NNaO4

1

GNU Smalltalk, 7068 Bytes

66 Byte Code +2 Byte für das "-S" -Flag

EDITS

  • Entfernte unnötige Klammern, -2 Bytes

Golf gespielt

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

Prüfung

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

Wichtig

Sie müssen gst als root ausführen , damit das Standard-Image geändert werden kann, oder Sie müssen mit -I Ihr eigenes Image angeben .


1

PHP, 45 Bytes

Ehrlich gesagt nicht sicher, ob dieser zählt.

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

Ich würde einen Link zu einem Beispiel posten, aber alle mir bekannten Online-Tester dürfen nicht session_start()verwendet werden.

Dies zählt jedes Mal herunter, wenn Sie die Seite aktualisieren, bis 0, wenn der dieBefehl ausgeführt wird.


0

QBIC , 70 Bytes

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|

Öffnet die Datei a.b(oder erstellt sie, wenn sie beim ersten Start nicht gefunden wird) und liest Datensatz 1 ein e. Wenn dieser Datensatz nicht gefunden wird, nehmen Sie 10 an, andernfalls sub 1. Bei e==0wird ein Fehler ausgelöst. Schreiben Sie zurück ean a.b.

Der Dateizugriff ist nicht in QBIC integriert. Dies hängt stark von dem zugrunde liegenden QBasic ab.


0

Batch, 72 Bytes

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

Muss unter Verwendung des vollständigen Dateinamens einschließlich der Erweiterung aufgerufen werden. Die letzte Zeile darf keine nachgestellte Zeile enthalten. Funktioniert, indem Sie -1bis zum Ende der letzten Zeile schreiben , sodass sie jedes Mal 1 weniger ergibt. goto gfehler raus da es kein label gibt :g.


0

R, 52 Bytes

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

Wird im Wesentlichen verwendet, ls()um die Namen aller global gespeicherten Objekte aufzulisten. Wenn wir davon ausgehen , dass die globale Umwelt leer ist und "x"nicht bereits vorhanden ist, erzeugen x=10, wenn sonst x!=0subtrahieren 1sonst Anruf ein fehlendes Argument , das einen Fehler zurückgibt.


Sie können das durch Entfernen eines Byte speichern !und zum Umschalten der Reihenfolge der dann und anderen Argumente, und zwei weitere durch Änderung x>0zu x. (Auch exists("x")ist ein wenig ordentlicher als "x"%in%ls(), obwohl gleich in der
Byteanzahl

Ah, wenn Sie die Kommentare in der Spezifikation noch einmal lesen, wird anscheinend ein vollständiges Programm benötigt, was bedeutet, dass Sie sich nicht auf die Objektpersistenz zwischen den Durchläufen verlassen können.
Rturnbull

@rturnbull Obwohl ich nicht finden kann, wo dies ausdrücklich angegeben ist. Ich werde die Antwort löschen, wenn Sie mich darauf hinweisen können.
Billywob

Es wird hier erwähnt , obwohl es nicht in der Spezifikation bearbeitet wurde.
Turnbull

0

Windows Batch, 61 Bytes

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

0

JavaScript, 44 Bytes

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)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.