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
8
werden 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 Code-Golf , also gewinnt die kürzeste Antwort (gemessen in Bytes).
Antworten:
6502 Maschinensprache + Apple] [+ ROM, 12 (11? 10? 9?) Bytes
Sollte um beginnen
$8000
. Stürzt auf dem Systemmonitor ab, wenn die Anzahl 0 erreicht.Sollte um beginnen
$B1
. Dies spart ein Byte, da ich die (Zwei-Byte-) Zero-Page-Version von verwenden kannDEC
, aber die kritische Applesoft-Routine überschreibeCHRGET
. 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.Sollte um beginnen
$8000
. Dies wird nicht initialisiert$9E
und 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 dieCALL
speichert RoutineFF
in$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.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
Erläuterung
Erklärung der 10-Byte-Version
Varianten
Druckt
ERR
und piept, wenn die Anzahl 0 erreichtNormal - 15 Bytes
Überschreibt
CHRGET
- 14 BytesInitialisiert nicht
$9E
- 13 BytesÜberschreibt
CHRGET
und initialisiert nicht$9E
- 12 BytesFriert ein, wenn die Anzahl 0 erreicht
Normal - 12 Bytes
Überschreibt
CHRGET
- 11 BytesInitialisiert nicht
$9E
- 10 BytesÜberschreibt
CHRGET
und initialisiert nicht$9E
- 9 Bytesquelle
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/dash
ist 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äuftdash
. Dies können wir entweder tun, indem wir den Computerinit=/bin/dash
über die Linux-Befehlszeile neu starten, so dass nichts anderes gestartet wirddash
, oder (viel bequemer) indem wir einen Linux-Containerunshare -Urfp /bin/dash
in einem Terminal erstellen (erstelltunshare
eigentlich kein leeres Betriebssystem, simuliert es aber)einer; Insbesondere denkt das Innere des Containers, dass es sich um root,dash
init usw. handelt, genau wie dies bei einem leeren Betriebssystem der Fall wäre. Haftungsausschluss: Ich habe dies noch nicht auf Bare Metal getestetunshare
, 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:
Hier ist ein Probelauf:
quelle
unshare
unterstütze keine der Flags-Urfp
.unshare
ist 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.Bash + sed,
414038 BytesProbieren Sie es online!
quelle
sed: invalid option -- '/'
. sed (GNU sed) 4.2.2Javascript, 42 Bytes
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!
quelle
y=localStorage;y.a=y.a||10;alert(y.a>0?y.a--:a)
kann dir ein Byte sparen.sessionStorage
mit einem einfacheren Reset testen (verwenden Sie einfach einen neuen Tab), aber natürlich +2 Bytes.l=localStorage;l.l=-~l.l;alert(10-l.l||l)
, um ein Byte zu speichern, ich würde meine löschenconsole.log
, aber ich würde es auch vorziehena
ausgewertet wird, wenn der Wert in localstorage nicht 0 ist.C #
197160159125 Bytes34 Bytes dank Milch gespart
Und eine formatierte Version (Mit
ReadKey
hinzugefügt, damit Sie die Ausgabe anzeigen können):Es ist länger als ich dachte, also gibt es wahrscheinlich Platz zum Golfen.
quelle
File.Exists
undFile.Create
anstelle vonReadAllText
undWriteAllText
. Prüfen Sie einfach, ob ein Dateiname vorhanden ist, nicht beide mit dem Dateiinhalt. Außerdem könnennamespace System.IO
Sie den Namespace von entfernenSystem.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);}}}
Dyalog APL ,
332822/20? BytesIch 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.
Beachten Sie, dass dies auf einer inoffiziellen Eigenheit beruht,
∘←
die global zugewiesen wird .6::
bei einem Wertfehler⊢c
Rückkehr c∘←10
Welches ist global auf 10 festgelegt⋄
jetzt÷÷c
Rückgabe der zweimal invertierten (Fehler auf Null) c∘←
Welches ist global festgelegt aufc-1
einer weniger als cTryAPL online!
Mit Sicherheit gültige 28-Byte-Version:
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:
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).
quelle
Perl,
3736 BytesStürzt ab, wenn der Anfangswert -1 erreicht (was den Wert 0 ergeben hätte), während der
=~
Operator überschrieben wird.Ein Byte mit
sysopen
anstatt mit gespeichertopen
. Auf diese Weise kann ichSTDOUT
zuerst mit dem Rückgabewert als Dateimodus (1
auch bekannt alsO_WRONLY
) drucken , bevor er$~
neu zugewiesen wird.Beispielnutzung
quelle
Perl 6 ,
6058 BytesBenötigt Newline-Zeichen nach
=finish
.die
kann durch ersetzt werden1/0
.Erläuterung:
Es wird eine Liste von Zeilen abgerufen, nachdem
=finish
($=finish.lines
) diese subtrahiert10
hat. Wenn das Ergebnis nicht0
angezeigt wird, wird es gedruckt, andernfalls wird esdie
ausgegeben.Das Letzte, was es tut, ist, sich selbst im Anfügemodus zu öffnen und am Ende eine weitere Zeile hinzuzufügen.
quelle
say $*PERL.compiler.version
)Python 2, 65 Bytes
Inspiriert von L3viathans Antwort .
Kann bis zu 60 Byte reduziert werden , wenn Sie die Datei ein einzelnes Zeichen wie nennen können wählen ,
x
und ersetzen Sie dann__file__
mit'x'
. In diesem Fall ersetzen Sie75
durch70
.quelle
Jolf, 20 Bytes
Probieren Sie es hier aus! Fehler, wenn
0
gedruckt wird. Ändert den Code. Erklärung zu kommen.quelle
Applesoft BASIC, 21 Byte (tokenisiert)
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
Erläuterung
PRINT 9 + 1
tut, was Sie erwarten würden.CALL 2066
ruft die 6502-Maschinensprachenroutine am Speicherort 2066 auf, der danach liegtEND :
.END
Hä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
9
inPRINT 9 + 1
. Demontage:Nachdem der Zähler 0 erreicht hat, wird er auf "dekrementiert"
/
. Der Versuch, das Programm auszuführen, führt dann zu einem Syntaxfehler.quelle
*> <> ,
2018 BytesDies funktioniert tatsächlich unter Linux (und was auch immer Dateien mit dem Namen unterstützt,
\n
denke ich). Es wird eine Datei mit dem Namen\n
beim ersten Start erstellt und ausgegeben10
. Bei jedem nachfolgenden Durchlauf wird eine Nummer weniger ausgegeben, es sei denn,0
es stürzt stattdessen ab.Erläuterung
quelle
PHP 57 Bytes
stürzt nicht wirklich ab, sondern beendet sich (ohne herunterzuzählen), wenn es trifft
0
. Reicht dasLaufen Sie mit
-r
.quelle
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.
Ungolfed:
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.
quelle
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.)
Laufen:
quelle
Java, 343 Bytes
Mein erster Golfversuch
ungolfed
quelle
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);}}}
?
Operator verwenden, der auf der Existenz der Datei basiert, wenn Sie lesenb
:import java.io.*;class M{public static void main(String[] a) throws Exception{int b=new File("x").exists()?new java.util.Scanner(new File("x")).nextInt():10;try(PrintWriter p=new PrintWriter("x")){p.print(b/b*b-1);System.out.print(b);}}}
import java.io.*;class A{public static void main(String[]a)throws Exception{File f=new File("f");int b=f.exists()?new FileInputStream(f).read()-48:10;new PrintWriter(f).printf("%d",b/b*b-1).close();System.out.print(b);}}
SQLite,
142137Dies könnte wahrscheinlich viel geschickter gemacht werden.
141136 Zeichen für Code:Plus 1 für den Dateinamen
x
insqlite3 x '…'
.quelle
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:_;alert(l.a)
quelle
alert
oder ähnlichem nur um ein REPL-Snippet handelt.Ruby,
9487846159 BytesBitte hinterlassen Sie unten Vorschläge.
Vielen Dank an @ ConorO'Brien für die Ideen (einige schamlos von seiner Antwort abgerissen).
quelle
puts i
=>p i
new
undsize
anstelle vonopen
undlength
.Ruby, 52 + 1 = 53 Bytes
Angenommen, die Datei heißt
a
(+1 Byte).Laufen
quelle
a
(das ist nur +1).Python 2, 89 Bytes
quelle
__file__
also habe ich das in meiner Antwort benutzt.len
s
, weil ich lesen, dann suchen und dann schreiben muss. Dasprint x/x*x
würde funktionieren, verbessert aber nicht die Byteanzahl.TI-BASIC (TI-84 Plus) (15 Byte)
Ans sollte vor dem ersten Lauf gleich 0 (der Standardwert) sein.
Da dies
AnsAns/Ans
die 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.quelle
JavaScript, 41
l=localStorage;l.l=-~l.l;alert(11-l.l||I)
quelle
a
anstelle der,l
als 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.GNU Smalltalk,
7068 Bytes66 Byte Code +2 Byte für das "-S" -Flag
EDITS
Golf gespielt
Prüfung
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 .
quelle
PHP, 45 Bytes
Ehrlich gesagt nicht sicher, ob dieser zählt.
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
die
Befehl ausgeführt wird.quelle
QBIC , 70 Bytes
Öffnet die Datei
a.b
(oder erstellt sie, wenn sie beim ersten Start nicht gefunden wird) und liest Datensatz 1 eine
. Wenn dieser Datensatz nicht gefunden wird, nehmen Sie 10 an, andernfalls sub 1. Beie==0
wird ein Fehler ausgelöst. Schreiben Sie zurücke
ana.b
.Der Dateizugriff ist nicht in QBIC integriert. Dies hängt stark von dem zugrunde liegenden QBasic ab.
quelle
Batch, 72 Bytes
Muss unter Verwendung des vollständigen Dateinamens einschließlich der Erweiterung aufgerufen werden. Die letzte Zeile darf keine nachgestellte Zeile enthalten. Funktioniert, indem Sie
-1
bis zum Ende der letzten Zeile schreiben , sodass sie jedes Mal 1 weniger ergibt.goto g
fehler raus da es kein label gibt:g
.quelle
R, 52 Bytes
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, erzeugenx=10
, wenn sonstx!=0
subtrahieren1
sonst Anruf ein fehlendes Argument , das einen Fehler zurückgibt.quelle
!
und zum Umschalten der Reihenfolge der dann und anderen Argumente, und zwei weitere durch Änderungx>0
zux
. (Auchexists("x")
ist ein wenig ordentlicher als"x"%in%ls()
, obwohl gleich in derWindows Batch, 61 Bytes
quelle
JavaScript, 44 Bytes
quelle