3 ... 2 ... 1 ... Schiantati!


47

Il tuo compito è quello di scrivere un programma completo che continuerà il conto alla rovescia da 10 ogni volta che viene eseguito.

  • La prima volta che esegui il programma, dovrebbe essere stampato 10.
  • La prossima volta, dovrebbe essere emesso 9.
  • La prossima volta, dovrebbe essere emesso 8e così via.
  • Invece di stampare 0, il programma dovrebbe bloccarsi. Successivamente non è necessario gestire il programma in esecuzione più volte.
  • Qualsiasi struttura utilizzata per l'archiviazione può essere considerata vuota prima della prima esecuzione del programma.

Ecco un'implementazione di esempio 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))

Questo è , quindi vince la risposta più breve (misurata in byte).


12
Cosa comporta lo schianto?
Conor O'Brien,

2
@ ConorO'Brien Hmm ... questo non è stato discusso in meta?
Esolanging Fruit,

2
@ Challenger5 Non che io sappia. Sarebbe sufficiente lanciare un errore?
Conor O'Brien,

1
@ ConorO'Brien Sì.
Esolanging Fruit il

Risposte:


18

6502 linguaggio macchina + Apple] [+ ROM, 12 (11? 10? 9?) Byte

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

Dovrebbe iniziare alle $8000. Si arresta in modo anomalo sul monitor di sistema quando il conteggio raggiunge 0.


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

Dovrebbe iniziare alle $B1. Ciò consente di risparmiare un byte poiché posso utilizzare la versione (a due byte) della pagina zero di DEC, ma sovrascrive la routine critica di Applesoft CHRGET; dovrai caricarlo e chiamarlo dal monitor e, al termine, utilizzare CTRL+ BReturnper reinizializzare BASIC. Non sono sicuro se questo lo invalida o meno.


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

Dovrebbe iniziare alle $8000. Questo non si inizializza $9E, salvando due byte. Tuttavia, ciò significa che non è necessario chiamarlo con un indirizzo negativo (o, se lo si chiama dal monitor, è necessario chiamare il monitor con un indirizzo positivo). Se lo fai, di Applesoft CALLroutine memorizzare FFin $9E, inducendolo a aggiungi 65280 al numero quando stamparlo. Ancora una volta, non sono sicuro se questo invalida la soluzione o meno.


C6 B6 F0 01 A2 0B 4C 26 ED

Dovrebbe iniziare alle $B1. Questa è una combinazione dei due programmi precedenti, che salva un totale di tre byte; dovrai chiamare il monitor con un indirizzo positivo, caricarlo ed eseguirlo da lì, e usare Ctrl+ BReturnper reinizializzare BASIC al termine.


Si noti che questi programmi modificano solo il programma in memoria; il nuovo caricamento del programma dal disco ripristinerà il conto alla rovescia. Questo funziona perché Apple] [(e] [+, // e e // c) non ha alcun sistema di protezione della memoria; il programma (e le sue auto-modifiche) rimarranno in memoria anche dopo la sua uscita, quindi puoi continuare a eseguirlo dalla memoria fino a quando non sovrascrivi quella memoria con qualcos'altro.


Esecuzione del campione

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

Spiegazione

     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

Spiegazione della versione a 10 byte

     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

varianti

Stampa ERRe emette un segnale acustico quando il conteggio raggiunge 0

Normale - 15 byte

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

Sovrascrive CHRGET- 14 byte

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

Non inizializza $9E- 13 byte

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

Sovrascrive CHRGETe non si inizializza $9E- 12 byte

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

Si blocca quando il conteggio raggiunge 0

Normale - 12 byte

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

Sovrascrive CHRGET- 11 byte

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

Non inizializza $9E- 10 byte

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

Sovrascrive CHRGETe non si inizializza $9E- 9 byte

C6 B6 F0 FE A2 0B 4C 26 ED

Non sono sicuro di capirlo. Non sarebbe lo stesso di avere una funzione in Python che decrementa una variabile globale e funziona solo se eseguita nella shell? È permesso? Voglio dire, non è normale che un programma lasci la memoria ad un certo punto, per essere ricaricato di nuovo in seguito?
redstarcoder

3
@redstarcoder No: l'Apple II non ha letteralmente alcun sistema di allocazione della memoria; puoi archiviare qualsiasi cosa ovunque nella RAM e rimarrà accessibile da qualsiasi programma fino a quando non viene sovrascritto con un altro valore.
insert_name_here il

@inset_name_here, non sono sicuro di come sia accessibile da qualsiasi parte della RAM cambiare qualcosa. Potresti eseguire altri programmi in modo affidabile e comunque eseguire questo programma in seguito? Forse non ho abbastanza familiarità con le regole qui intorno per capire appieno, quindi lascerò perdere. Mi aspetto solo che un programma completo persista attraverso i riavvii e che possa funzionare correttamente di solito se vengono eseguiti altri programmi tra le sue esecuzioni, ma non so quali siano le regole della community di un programma completo.
redstarcoder

1
Il consenso generale di @redstarcoder è che il programma viene eseguito su un computer di sviluppo con nient'altro che il software richiesto e non facendo nient'altro nel frattempo.
Tom Carpenter,

1
8 byte se si esegue invece da $ 6E: C6 75 F0 03 4C 22 ED 0B
peter ferrie

35

Perl su Linux, 17 byte

Ho pensato che potesse essere interessante creare un programma che non mantenga alcuno stato e non modifichi il proprio codice sorgente; in altre parole, controlla effettivamente quanto spesso è stato eseguito chiedendo al sistema operativo. La domanda dice "Qualsiasi struttura utilizzata per l'archiviazione può essere considerata vuota prima della prima esecuzione del programma", e quindi vorremmo iniziare da un sistema operativo completamente vuoto. Come tale, è meglio che ti spieghi come si fa a farlo, altrimenti testare il programma è difficile.

Esistono in realtà due modi per impostare l'esecuzione del programma. In entrambi i casi, il sistema operativo minimo allo scopo non eseguirà altro che una shell (per consentirci di eseguire Perl a sua volta), e la shell più semplice possibile in questo (in modo che non faccia nulla di fantasia che renda il sistema operativo non- vuoto). /bin/dashè una buona scelta qui, poiché era inteso come una shell minima per il ripristino del sistema. Quindi, abbiamo bisogno di avviare Linux in modo tale che non esegua altro che dash. Possiamo farlo riavviando il computer con init=/bin/dashdalla riga di comando di Linux in modo che non inizi nulla oltre dash, oppure (molto più convenientemente) creando un contenitore Linux usando unshare -Urfp /bin/dashin un terminale (in unsharerealtà non crea un sistema operativo vuoto, ma simulauno; in particolare, l'interno del contenitore pensa che sia root, dashpensa che sia init, ecc., proprio come accadrebbe su un vero sistema operativo vuoto). Disclaimer: non l'ho ancora testato su bare metal, solo all'interno unshare, ma in teoria dovrebbe funzionare in entrambi i modi.

Alla fine, una volta che abbiamo impostato questo, dobbiamo semplicemente guardare il PID; dato che siamo su un sistema vuoto, il sistema init (qui, la shell) avrà PID 1, quindi le esecuzioni di Perl avranno PID da 2 a 12 inclusi. Quindi il nostro programma è simile al seguente:

say 12-$$||die

Ecco un esempio:

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

Su quale sistema operativo stai eseguendo questo? Sono su Ubuntu Linux 14.04 e unsharenon supporta nessuna delle bandiere -Urfp.
isaacg,

@isaacg: Ubuntu 16.04. unshareè piuttosto nuovo (è un'interfaccia per una funzionalità del sistema operativo che è anche abbastanza nuova) e i bug sono stati risolti solo nell'ultimo anno o giù di lì. Se stai usando una versione di 2 anni e mezzo, non sorprende che abbia funzionalità molto limitate.

14

Bash + sed, 41 40 38 byte

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

Provalo online!


Il collegamento TIO ha un'intestazione e un piè di pagina, quelli non si aggiungono al conteggio dei byte?
Pavel,

2
No, quelli sono solo per eseguire il programma 11 volte.
Dennis,

Ho capito sed: invalid option -- '/'. sed (GNU sed) 4.2.2
shrx

@shrx Huh. Ho la stessa versione di sed localmente e su TIO e non mostrano questo errore.
Dennis,

9

Javascript, 42 byte

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

Provalo con questo violino : assicurati di cancellare la memoria locale per ripristinare il conto alla rovescia.

Grazie a Steenbergh, Lmis e Obarakon per molti byte!


y=localStorage;y.a=y.a||10;alert(y.a>0?y.a--:a)può salvarti un byte.
Oliver,

È possibile utilizzare sessionStorageper testare un ripristino più semplice (basta usare una nuova scheda) ma ovviamente +2 byte.
Kevin Reid,

Ahi, scusa, ho appena visto la tua risposta, ho finito per fare quasi lo stesso. Se si desidera, è possibile utilizzare l=localStorage;l.l=-~l.l;alert(10-l.l||l)per salvare un byte, eliminerei il mio
C5H8NNaO4

@Mego Certo :) Non vedo un console.logqui, ma preferirei che
C5H8NNaO4

1
@obarakon Yep e il corto circuito booleano impediscono adi valutare quando il valore nell'archivio locale non è 0.
Mego

8

C #, 197 160 159 125 byte

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

Risparmiato 34 byte grazie al latte

E una versione formattata (con ReadKeyaggiunta in modo da poter visualizzare l'output):

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

È più lungo di quanto pensassi, quindi probabilmente c'è spazio per il golf.


2
File.Existse File.Createinvece di ReadAllTexte WriteAllText. Basta controllare se esiste un nome file, non entrambi con il contenuto del file. Inoltre, namespace System.IOe puoi rimuovere lo spazio dei nomi da System.Console.Write. 125 byte:namespace System.IO{class P{static void Main(){var n=11;for(;File.Exists(""+--n););File.Create(""+n);Console.Write(n*n/n);}}}
latte

@milk Grazie mille! Non riesco a credere che non abbia pensato di usare il nome del file solo! E non sapevo di quel trucco dello spazio dei nomi, fantastico.
TheLethalCoder il

8

Dyalog APL , 33 28 22/20? byte

Non sono sicuro che questo sia valido, poiché consiste in una funzione (che deve essere chiamata con un argomento fittizio). Tuttavia, tutti i programmi APL (puramente funzionali o meno) hanno lo stesso stato, e in effetti alcune versioni APL non hanno programmi tradizionali, solo funzioni. In compenso, ho aggiunto due byte per nominarlo, sebbene ciò non sia necessario per l'effetto desiderato.

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

Si noti che questo si basa su una stranezza non ufficiale, che ∘←assegna a livello globale.

6:: su qualsiasi errore di valore

⊢critorno c

∘←10 che è globalmente impostato su 10

adesso

÷÷c restituisce il doppio invertito (errori su zero) c

∘← che è impostato a livello globale

c-1uno in meno di c

ProvaAPL online!


Versione sicuramente valida a 28 byte:

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

Funziona impostando c su 11 se mancante, quindi sottraendo 1 da c , invertendo due volte (il che dà errore div-by-zero se c -1 è 0), assegnando a c e producendo il nuovo valore.


Vecchia versione da 33 byte:

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










Funziona ridefinendo se stesso su ogni corsa, ma con una nuova riga finale in meno. Emette il numero due volte invertito di righe rimanenti (meno due), dando così un errore div-by-zero quando rimangono solo due righe (l'intestazione e il codice attuale).


1
Ehm ... perché ci sono così tante nuove linee?
Kritixi Lithos il

4
@KritixiLithos Il programma si ridefinisce con una riga in meno per ogni corsa.
Adám,

7

Perl, 37 36 byte

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

Si blocca quando il valore iniziale raggiunge -1 (che avrebbe stampato 0), mentre scrive sopra l' =~operatore.

Ho salvato un byte usando sysopenanziché open. Questo mi permette di stampare per STDOUTprimo, usando il valore restituito come modalità file ( 1, aka O_WRONLY), prima che $~venga riassegnato.

Esempio di utilizzo

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

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

Ha bisogno di un carattere newline dopo =finish.

diepuò essere sostituito con 1/0.

Spiegazione:

Ottiene un elenco di righe dopo =finish( $=finish.lines) sottrae tale da 10e, se il risultato non 0lo è, lo stampa, altrimenti lo dieè.

L'ultima cosa che fa è aprirsi in modalità append e aggiungere un'altra riga alla fine.


Permalink per coloro che non hanno il Perl 6.
Dennis

@Dennis Almeno quello non è così datato come quello che ha Ideone (scappa say $*PERL.compiler.version)
Brad Gilbert b2gills

1
2014.7 ... wow! 2016.11 è molto diverso dal 2016.7? Se è così, posso costruirlo dalla fonte.
Dennis,

@Dennis Il rilascio ufficiale di Perl 6 è stato il 25-12-2015. Alla fine del 2015 c'è stato un grande cambiamento chiamato The Great List Refactor (GLR), quindi far funzionare il codice anche sul 2014.7 è quasi impossibile. Gran parte di ciò che è accaduto nel 2016 è legato alle prestazioni, anche se ci sono state molte correzioni delle condizioni ai bordi. La maggior parte del codice golf qui dovrebbe funzionare su qualsiasi cosa dopo il rilascio di Rakudo del 2015.12. Quindi penso che v2016.07 vada bene.
Brad Gilbert b2gills

6

Python 2, 65 byte

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

Ispirato dalla risposta di L3viathan .

Può essere ridotto a 60 byte se puoi scegliere di nominare il file come un singolo carattere xe poi sostituirlo __file__con 'x'. In tal caso, sostituire 75con 70.


@ Flp.Tkc sì, ma non è lo stesso numero di byte?
Alex Hall,

oh, è vero: P
FlipTack

4

Jolf, 20 byte

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

Provalo qui! Errori quando 0viene stampato. Modifica il codice. Spiegazione a venire.


Non ho molta familiarità con Jolf, ma non sembra immediatamente funzionare nell'interprete online.
Esolanging Fruit il

1
@ Challenger5 La lingua di solito funziona solo su Firefox.
Conor O'Brien,

4

Applesoft BASIC, 21 byte (tokenized)

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

Sostituisci <CTRL-F>e <CTRL-H>con le loro versioni letterali. Si noti che ciò modifica solo il programma in memoria; ricaricandolo dal disco si resetterà il conto alla rovescia.


Esecuzione del campione

]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

Spiegazione

PRINT 9 + 1fa quello che ti aspetteresti. CALL 2066chiama la routine di linguaggio macchina 6502 nella posizione di memoria 2066, che è dopo END :. ENDinterrompe il programma in modo che la routine del linguaggio macchina (che, per l'interprete di Applesoft, è spazzatura) non venga eseguita.

La routine del linguaggio macchina semplicemente decrementa l' 9in PRINT 9 + 1. Smontaggio:

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

Dopo che il contatore raggiunge 0, viene "decrementato" a /; il tentativo di eseguire il programma provocherà quindi un errore di sintassi.


4

*> <> , 20 18 byte

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

Questo in realtà funziona su Linux (e qualunque cosa supporti i file di nome \nsuppongo). Crea un file denominato \nal primo avvio e output 10. Procede con l'output di un numero in meno su ogni corsa del subsquent, tranne 0dove si blocca invece.

Spiegazione

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
Conveniente che *> <> aggiunge IO
Alfie Goodacre il

4

PHP 57 byte

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

non si schianta davvero ma esce (senza conto alla rovescia) quando colpisce 0. È sufficiente?

Corri con -r.


4

C #, 156 byte

Ho golfato per un po 'la risposta di @ TheLethalCoder e sono stato in grado di salvare 3 byte riordinando le istruzioni ed eliminando int.parse (). Sono ancora margini di miglioramento, ne sono sicuro.

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-domanda: potrebbe essere hack-y prendere il lavoro di TheLethalCoder come punto di partenza per la mia risposta. Sarebbe meglio (una volta che ho il rappresentante) aggiungere questo come commento alla loro risposta? Non sto cercando di competere con loro, voglio solo mostrare il mio golf, per una reciproca edificazione.


Le persone di solito lasciano commenti sotto le altre persone rispondendo suggerendo miglioramenti, tuttavia a causa dei miei miglioramenti suggeriti dalla miniera di latte è ora molto diverso quindi il tuo va bene da solo
TheLethalCoder

Di solito vado avanti se sono miglioramenti al commento della risposta di qualcun altro, ma se è abbastanza diverso dalla loro, pubblica la tua risposta
TheLethalCoder

3

Powershell V2.0, 49 byte

(Prima di tutto codice golf, non sono riuscito a trovare le regole su come calcolare i byte. Ho usato un calcolatore String per byte online)

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

In esecuzione:

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

Benvenuti in PPCG! Le regole per calcolare i byte dipendono dalla codifica dei caratteri utilizzata dalla lingua. Powershell probabilmente usa la codifica ASCII o UTF-8, e quindi per uno script con solo codici ASCII, come nel caso qui, ogni personaggio occupa 1 byte
Luis Mendo il

Benvenuti in PPCG! Secondo l'autore della sfida, tutti gli invii devono essere un programma completo, cosa che non è - così com'è, viene essenzialmente eseguita nell'equivalente di PowerShell di un REPL.
AdmBorkBork,

Se ho scritto questo all'interno di un .ps1 e l'ho eseguito 10 volte crash-off.ps1, ad esempio, conta come un programma completo?
Kieron Davies,

@KieronDavies Sì, a condizione che se si chiude e si riapre la shell tra una volta e l'altra, si ottiene comunque lo stesso risultato. Mantenere gli elementi "in memoria" nella shell tra l'esecuzione è ciò che definisce "l'ambiente REPL" di PowerShell da un ambiente "programma completo".
AdmBorkBork,

3

Java, 343 byte

Il mio primo tentativo di golf

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

È possibile ridurlo a 300 byte importando java.io.*ed evitando di utilizzare nomi di costruttori completi e è possibile tagliare altri 8 utilizzando il fatto che "print" restringerà automaticamente i suoi argomenti: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

Puoi farlo arrivare a 237 byte non scrivendo il "10" nel file, e invece semplicemente usando l' ?operatore in base all'esistenza del file quando leggi 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

Il più ottimizzato che potrei fare: 220 byte. Ecco la 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 il

grazie per i suggerimenti :)
Viktor Mellgren,

3

SQLite, 142 137

Questo potrebbe probabilmente essere fatto in modo molto più intelligente. 141 136 caratteri per il codice:

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

Più 1 per il nome file xin sqlite3 x '…'.


1
Bello! SQLite non è mai stato usato prima in questo modo. Puoi comprimere alcuni byte sostituendo "valori (11)" con "seleziona 11" e "seleziona n dal limite t 1" con "seleziona min (n) da t"
Bence Joful

3

JavaScript, 74 byte

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
L'OP ha chiarito (nei commenti) che è necessario un programma completo.
Dennis,

1
@Dennis Il mio invio rivisto si qualifica come un programma completo?
Oliver,

Non lo so , ma non la penso così. Direi che senza una chiamata alerto simili, è solo uno snippet REPL.
Dennis,

2
Mi sembra buono. (Non posso provarlo dal mio telefono.)
Dennis

3

Rubino, 94 87 84 61 59 byte

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

Si prega di lasciare suggerimenti di seguito.

Grazie @ ConorO'Brien per le idee (alcuni spudoratamente strappati alla sua risposta).


puts i=>p i
Conor O'Brien il

Usa newe sizeinvece di opene length.
Lee W,

2

Rubino, 52 + 1 = 53 byte

Presuppone che il file sia denominato a(+1 byte).

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

In esecuzione

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

... puoi assumere nomi?
dkudriavtsev,

È possibile utilizzare $ 0 anziché a e 'echo >> # $ 0' (con i backtick) sull'ultima riga.
GB

@GB Sono ancora più byte che ipotesi a(che è solo +1).
wizzwizz4,

? a è 2 byte, $ 0 è 2 byte, ma non ha bisogno di spazi bianchi.
GB

2

Python 2, 89 byte

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

Mi è piaciuta la tua idea di apertura, __file__quindi l'ho usata nella mia risposta.
Alex Hall,

@AlexHall Ottima idea conlen
L3viathan il

@ Flp.Tkc Non salverò alcun personaggio con quello. Devo ancora usare la variabile s, perché devo leggere, quindi cercare, quindi scrivere. L' print x/x*xavrebbe funzionato, ma non migliora il numero di byte.
L3viathan,

2

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

If not(Ans
11
Ans-1
AnsAns/Ans

Ans dovrebbe essere uguale a 0 (il valore predefinito) prima della prima esecuzione.

Poiché AnsAns/Ansè l'ultima riga del programma, verrà emessa e memorizzata in Ans a meno che Ans sia 0, nel qual caso si verifica un errore di divisione per 0.


2

JavaScript, 41

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


@Mego Sì, ovviamente, non so come sia potuto accadere ... Ne ho avuto uno ainvece di lquando l'ho scritto, e l'ho cambiato senza pensarci, perché pensavo che fosse più divertente ... era troppo tardi e lei , Grazie per la segnalazione.
C5H8NNaO4,

1

GNU Smalltalk, 70, 68 byte

66 byte codice +2 byte per il flag "-S"

EDITS

  • Rimosse parentesi non necessarie, -2 byte

golfed

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)

Importante

È necessario eseguire gst come root, per poter modificare l'immagine predefinita o specificare la propria immagine con -I .


1

PHP, 45 byte

Onestamente non sono sicuro se questo conta.

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

Pubblicherei un link a un esempio, ma tutti i tester online che conosco non consentono session_start()di essere utilizzati.

Ciò continuerà il conto alla rovescia ogni volta che si aggiorna la pagina fino a 0, quando dieviene eseguito il comando.


0

QBIC , 70 byte

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|

Apre il file a.b(o lo crea quando non viene trovato alla prima esecuzione), legge il record 1 in e. Se quel record non viene trovato, supponi 10, altrimenti sub 1. At e==0, genera un errore. Riscrivi ea a.b.

L'accesso ai file non è integrato in QBIC, ciò dipende fortemente dal QBasic sottostante.


0

Lotto, 72 byte

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

Deve essere invocato usando il nome file completo inclusa l'estensione. L'ultima riga non deve avere una nuova riga finale. Funziona scrivendo -1alla fine dell'ultima riga in modo che valuti 1 in meno ogni volta. goto gerrori perché non c'è etichetta :g.


0

R, 52 byte

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

Utilizza essenzialmente ls()per elencare i nomi di tutti gli oggetti archiviati a livello globale. Se supponiamo che l'ambiente globale sia vuoto e "x"non esista già, genera x=10, altrimenti se x!=0sottrai 1altro chiama un argomento mancante che restituisce un errore.


È possibile salvare un byte rimuovendo !e cambiando l'ordine degli argomenti then e else e altri due cambiando x>0in x. (Inoltre, exists("x")è un po 'più ordinato di "x"%in%ls(), sebbene uguale nel conteggio dei byte.)
rturnbull

Ah, rileggendo i commenti nelle specifiche, sembra che sia necessario un programma completo, il che significa che non è possibile fare affidamento sulla persistenza degli oggetti tra le esecuzioni.
rturnbull,

@rturnbull Anche se non riesco a trovare dove sia esplicitamente dichiarato. Eliminerò la risposta se mi puoi indicare.
Billywob,

È menzionato qui , anche se non è stato modificato nelle specifiche.
rturnbull,

0

Batch di Windows, 61 byte

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

0

JavaScript, 44 byte

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)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.