3 ... 2 ... 1 ... Crash off!


47

Sua tarefa é escrever um programa completo que continuará a contagem decrescente de 10 toda vez que for executado.

  • A primeira vez que você executa o programa, ele deve ser impresso 10.
  • A próxima vez, deve sair 9.
  • Na próxima vez, ele deve sair 8e assim por diante.
  • Em vez de imprimir 0, o programa deve falhar. Você não precisa lidar com o programa em execução mais vezes depois disso.
  • Qualquer instalação usada para armazenamento pode ser considerada vazia antes da primeira execução do programa.

Aqui está um exemplo de implementação no 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))

Isso é , então a resposta mais curta (medida em bytes) vence.


12
O que implica a queda?
Conor O'Brien

2
@ ConorO'Brien Hmm ... isso não foi discutido na meta?
Esolanging Fruit

2
@ Challenger5 Não que eu saiba. Lançar um erro seria suficiente?
Conor O'Brien

1
@ ConorO'Brien Sim.
Esolanging Fruit

Respostas:


18

6502 idioma da máquina + Apple] [+ ROM, 12 (11? 10? 9?) Bytes

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

Deve começar às $8000. Falha no monitor do sistema quando a contagem atinge 0.


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

Deve começar às $B1. Isso economiza um byte, pois eu posso usar a versão de página zero (dois bytes) DEC, mas sobrescreve a rotina crítica da Applesoft CHRGET; você precisará carregá-lo e chamá-lo do monitor e usar CTRL+ BReturnpara reinicializar o BASIC assim que terminar. Não tenho certeza se isso invalida ou não.


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

Deve começar às $8000. Isso não inicializa $9E, economizando dois bytes. No entanto, isso significa que você não deve chamá-lo com um endereço negativo (ou, se o chamar pelo monitor, precisará chamá-lo com um endereço positivo). Se fizer isso, de Applesoft CALLrotina irá armazenar FFem $9E, causando-lo para adicionar 65280 para o número quando imprimi-lo. Novamente, não tenho certeza se isso invalida a solução ou não.


C6 B6 F0 01 A2 0B 4C 26 ED

Deve começar às $B1. Essa é uma combinação dos dois programas acima, economizando um total de três bytes; você precisará ligar para o monitor com um endereço positivo, carregá-lo e executá-lo a partir daí e usar Ctrl+ BReturnpara reinicializar o BASIC assim que terminar.


Observe que esses programas apenas modificam o programa na memória; recarregar o programa do disco redefinirá a contagem regressiva. Isso funciona porque a Apple] [(e] [+, // e e // c) não possuem sistema de proteção de memória; o programa (e suas auto-modificações) permanecerá na memória mesmo depois de sair, para que você possa continuar executando-o da memória até substituir essa memória por outra coisa.


Amostra de execução

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

Explicação

     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

Explicação da versão de 10 bytes

     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

Variantes

Imprime ERRe emite um sinal sonoro quando a contagem chega a 0

Normal - 15 bytes

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

Substituições CHRGET- 14 bytes

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

Não inicializa $9E- 13 bytes

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

Substitui CHRGETe não inicializa $9E- 12 bytes

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

Congela quando a contagem chega a 0

Normal - 12 bytes

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

Substituições CHRGET- 11 bytes

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

Não inicializa $9E- 10 bytes

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

Substitui CHRGETe não inicializa $9E- 9 bytes

C6 B6 F0 FE A2 0B 4C 26 ED

Não sei se entendi isso. Não seria o mesmo que ter uma função no Python que diminui uma variável global e só funciona se executada no shell? Isso é permitido? O que quero dizer é que normalmente não é esperado que um programa deixe a memória em algum momento para ser recarregado novamente mais tarde?
redstarcoder

3
@ redstarcoder Não - o Apple II literalmente não possui sistema de alocação de memória; você pode armazenar qualquer coisa em qualquer lugar da RAM e ele permanecerá acessível por qualquer programa até que seja substituído por outro valor.
insert_name_here 16/12/16

@inset_name_here, não tenho certeza de como o acesso a qualquer lugar na RAM altera alguma coisa. Você poderia executar outros programas de maneira confiável e ainda executar esse programa posteriormente? Talvez eu não esteja familiarizado o suficiente com as regras por aqui para entender completamente, então eu vou deixar para lá. Só espero que um programa completo persista durante as reinicializações e seja capaz de executar normalmente, se outros programas forem executados entre suas execuções, mas não sei o que a comunidade determina que seja um programa completo.
Redstarcoder

1
@redstarcoder, o consenso geral é que o programa é executado em um computador de desenvolvimento com nada além do software necessário e não fazendo mais nada nesse meio tempo.
Tom Carpenter

1
8 bytes se você executar a partir de $ 6E: C6 75 F0 03 4C 22 ED 0B
peter ferrie

35

Perl no Linux, 17 bytes

Eu pensei que poderia ser interessante criar um programa que não mantém nenhum estado em si e não modifica seu próprio código-fonte; em outras palavras, na verdade, verifica com que frequência é executada solicitando ao sistema operacional. A pergunta diz que "qualquer recurso usado para armazenamento pode estar vazio antes da primeira execução do programa" e, portanto, queremos iniciar com um sistema operacional completamente em branco. Como tal, é melhor eu explicar como você faz isso, caso contrário, é difícil testar o programa.

Na verdade, existem duas maneiras de configurar a execução do programa. De qualquer forma, o sistema operacional mínimo para esse objetivo não estaria executando nada além de um shell (para permitir executar o Perl por sua vez) e o shell mais simples possível (para que ele não faça nada sofisticado que torne o SO não- em branco). /bin/dashé uma boa escolha aqui, pois foi planejado como um shell mínimo para recuperação do sistema. Então, precisamos iniciar o Linux de forma que ele não funcione mais dash. Podemos fazer isso reinicializando o computador init=/bin/dashna linha de comando do Linux, para que ele não inicie nada além dashou (muito mais conveniente) criando um contêiner Linux usando unshare -Urfp /bin/dashum terminal ( unsharena verdade, não cria um sistema operacional em branco, mas simula1; notavelmente, o interior do contêiner pensa que é raiz, dashacha que é init etc., assim como aconteceria em um sistema operacional em branco real). Disclaimer: Na verdade, eu ainda não testei isso no bare metal, apenas por dentro unshare, mas deve funcionar nos dois sentidos em teoria.

Finalmente, uma vez que configuramos isso, simplesmente precisamos olhar para o PID; como estamos em um sistema em branco, o sistema init (aqui, o shell) terá o PID 1; portanto, as execuções do Perl terão PIDs de 2 a 12, inclusive. Portanto, nosso programa é assim:

say 12-$$||die

Aqui está uma amostra de execução:

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

Em qual SO você está executando isso? Estou no Ubuntu Linux 14.04 e unsharenão suporta nenhuma das bandeiras -Urfp.
Isaacg

@isaacg: Ubuntu 16.04. unshareé bastante novo (é uma interface para um recurso do sistema operacional que também é bastante novo) e os bugs só foram resolvidos no último ano. Se você estiver usando uma versão de 2 anos e meio, não surpreende que sua funcionalidade seja muito limitada.

14

Bash + sed, 41 40 38 bytes

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

Experimente online!


O link do TIO possui um cabeçalho e rodapé, não são adicionados à contagem de bytes?
Pavel

2
Não, essas são apenas para executar o programa 11 vezes.
Dennis

Eu entendo sed: invalid option -- '/'. sed (GNU sed) 4.2.2
shrx

@shrx Huh. Eu tenho a mesma versão do sed localmente e no TIO, e eles não mostram esse erro.
Dennis

9

Javascript, 42 bytes

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

Teste-o com este violino - certifique-se de limpar o armazenamento local para redefinir a contagem regressiva.

Obrigado a steenbergh, Lmis e obarakon por muitos bytes!


y=localStorage;y.a=y.a||10;alert(y.a>0?y.a--:a)você pode economizar um byte.
Oliver

Você pode usar sessionStoragepara testar com uma redefinição mais fácil (basta usar uma guia nova), mas é claro que +2 bytes.
Kevin Reid

Ai, desculpe, acabei de ver sua resposta, acabei fazendo quase o mesmo. Se você quiser, pode usar l=localStorage;l.l=-~l.l;alert(10-l.l||l)para salvar um byte, eu
excluiria o

@Mego Claro :) Eu não vejo um console.logaqui, mas eu preferiria isso também #
C5H8NNaO4

1
@obarakon Sim, e o curto-circuito booleano impede a aavaliação quando o valor no armazenamento local não é 0.
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);}}}

Economizou 34 bytes graças ao leite

E uma versão formatada (com ReadKeyadicionado para que você possa ver a saída):

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

É mais longo do que eu pensava, então provavelmente há espaço para jogar golfe.


2
File.Existse em File.Createvez de ReadAllTexte WriteAllText. Basta verificar se existe um nome de arquivo, não ambos com o conteúdo do arquivo. Além disso, namespace System.IOe você pode remover o espaço para nome de 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);}}}
milk

@ leite Muito obrigado! Não posso acreditar que eu nem pensei em usar o nome do arquivo! E eu não sabia sobre esse truque de namespace, incrível.
TheLethalCoder

8

Dyalog APL , 33 28 22/20? bytes

Não tenho certeza se isso é válido, pois consiste em uma função (que deve ser chamada com um argumento fictício). No entanto, todos os programas APL (puramente funcionais ou não) têm o mesmo status e, de fato, algumas versões do APL não possuem programas tradicionais, apenas funções. Em compensação, adicionei dois bytes para nomeá-lo, embora isso não seja necessário para o efeito desejado.

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

Observe que isso depende de uma peculiaridade não oficial, ∘←atribuída globalmente.

6:: sobre qualquer erro de valor

⊢cretornar c

∘←10 globalmente definido como 10

agora

÷÷c retorna o c invertido duas vezes (erros em zero) c

∘← globalmente definido como

c-1um a menos que c

TryAPL online!


Certamente versão de 28 bytes válida:

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

Funciona definindo c como 11 se estiver ausente, subtraindo 1 de c , invertendo duas vezes (o que gera erro div-por-zero se c -1 for 0), atribuindo a c e gerando o novo valor.


Versão antiga de 33 bytes:

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










Funciona redefinindo-se a cada execução, mas com menos uma nova linha à direita. Emite o número duas vezes invertido de linhas restantes (menos duas), resultando em um erro div-por-zero quando restam apenas duas linhas (o cabeçalho e o código real).


1
Er ... por que existem tantas novas linhas?
Kritixi Lithos

4
@KritixiLithos O ​​programa se redefine com uma linha a menos para cada execução.
Adám

7

Perl, 37 36 bytes

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

Trava quando o valor inicial atinge -1 (o que teria impresso 0), conforme ele escreve sobre o =~operador.

Salva um byte usando em sysopenvez de open. Isso me permite imprimir STDOUTprimeiro, usando o valor de retorno como o modo de arquivo ( 1, aka O_WRONLY), antes de $~ser reatribuído.

Uso da amostra

$ 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
 

Precisa de um caractere de nova linha depois =finish.

diepode ser substituído por 1/0.

Explicação:

Ele obtém uma lista de linhas depois de =finish( $=finish.lines) subtrai isso de 10e, se o resultado não for, 0ele será impresso, caso contrário, será die.

A última coisa que faz é abrir-se no modo de acréscimo e adicionar outra linha ao final.


Permalink para aqueles que não têm Perl 6. #
Dennis

@ Dennis pelo menos, que não é tão longe para fora da data como o Ideone tem (run say $*PERL.compiler.version)
Brad Gilbert b2gills

1
2014.7 ... uau! 2016.11 é muito diferente de 2016.7? Nesse caso, eu posso construí-lo a partir da fonte.
Dennis

@Dennis O lançamento oficial do Perl 6 foi 25/12/2015. Houve uma grande mudança no final de 2015 chamada The Great List Refactor (GLR), portanto, é quase impossível obter código para trabalhar também em 2014.7. A maior parte do que está acontecendo em 2016 está relacionada ao desempenho, embora tenha havido muitas correções nas condições de borda. A maioria do código de golfe aqui deve funcionar em qualquer coisa após o lançamento de Rakudo em 2015.12. Então, acho que a v2016.07 está bem.
Brad Gilbert b2gills

6

Python 2, 65 bytes

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

Inspirado pela resposta de L3viathan .

Pode ser reduzido para 60 bytes se você optar por nomear o arquivo com um único caractere xe substituí-lo __file__por 'x'. Nesse caso, substitua 75por 70.


@ Flp.Tkc sim, mas não é o mesmo número de bytes?
Alex Hall

ah, isso é verdade: P
FlipTack

4

Jolf, 20 bytes

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

Experimente aqui! Erros quando 0é impresso. Modifica o código. Explicação para vir.


Não estou muito familiarizado com Jolf, mas ele não parece funcionar imediatamente no intérprete online.
Esolanging Fruit

1
@ Challenger5 O idioma geralmente só funciona no Firefox.
Conor O'Brien

4

Applesoft BASIC, 21 bytes (tokenizado)

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

Substitua <CTRL-F>e <CTRL-H>por suas versões literais. Observe que isso apenas modifica o programa na memória; recarregá-lo a partir do disco redefinirá a contagem regressiva.


Amostra de execução

]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

Explicação

PRINT 9 + 1faz o que você esperaria. CALL 2066chama a rotina do idioma da máquina 6502 no local da memória 2066, que é posterior END :. ENDinterrompe o programa para que a rotina de linguagem de máquina (que, para o intérprete da Applesoft, seja lixo) não seja executada.

A rotina de linguagem de máquina simplesmente diminui o 9no PRINT 9 + 1. Desmontagem:

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

Depois que o contador atinge 0, ele é "decrementado" para /; tentar executar o programa causará um erro de sintaxe.


4

*> <> , 20 18 bytes

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

Isso realmente funciona no Linux (e qualquer que seja o suporte a arquivos chamados, \neu acho). Ele cria um arquivo nomeado \nna primeira execução e saídas 10. Ele procede à saída de um número a menos em cada execução subseqüente, exceto 0onde ocorre o travamento.

Explicação

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 que *> <> adiciona IO
Alfie Goodacre

4

PHP 57 bytes

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

realmente não trava, mas sai (sem contagem regressiva) quando bate 0. Isso é suficiente?

Corra com -r.


4

C #, 156 bytes

Joguei a resposta do @ TheLethalCoder um pouco e pude salvar 3 bytes reordenando as instruções e eliminando o int.parse (). Ainda há espaço para melhorias, tenho certeza.

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-pergunta: Pode ser complicado tomar o trabalho de TheLethalCoder como ponto de partida para minha resposta. Seria melhor (depois que eu tiver o representante) adicionar isso como um comentário na resposta deles? Não estou tentando competir com eles, só quero mostrar meu golfe, para edificação mútua.


As pessoas costumam deixar um comentário debaixo das outras pessoas responder melhorias sugerindo, no entanto por causa das melhorias no meu sugerido por leite meu é agora muito diferente, então o seu é bem por conta própria
TheLethalCoder

Eu costumo ir por se eles são melhorias comentário resposta de outra pessoa, mas se é o suficiente diferente para o deles, em seguida, postar a sua própria resposta
TheLethalCoder

3

Powershell V2.0, 49 bytes

(O primeiro código de golfe, não foi possível encontrar as regras sobre como calcular bytes. Eu usei uma calculadora de String para bytes online)

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

Corrida:

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

Bem-vindo ao PPCG! As regras para calcular bytes dependem da codificação de caracteres usada pelo idioma. Powershell provavelmente usa ASCII ou UTF-8, e assim para um script com apenas códigos ASCII, como é o caso aqui, cada personagem ocupa 1 byte
Luis Mendo

Bem-vindo ao PPCG! De acordo com o autor do desafio, todos os envios devem ser um programa completo, o que não é - como é, está essencialmente sendo executado no equivalente do PowerShell a um REPL.
AdmBorkBork

Se eu escrevi isso dentro de um .ps1 e executei 10 vezes crash-off.ps1, por exemplo, isso conta como um programa completo?
Kieron Davies

@KieronDavies Sim, desde que, se você fechasse e reabrisse o shell entre cada vez, ainda assim obtivesse o mesmo resultado. Manter os itens "na memória" no shell entre a execução é o que define o "ambiente REPL" do PowerShell a partir de um ambiente de "programa completo".
AdmBorkBork

3

Java, 343 bytes

Minha primeira tentativa de golfe

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

destroçado

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

Você pode reduzi-lo a 300 bytes importando java.io.*e evitando o uso de nomes de construtores totalmente qualificados, e pode cortar outros 8 usando o fato de que "print" irá automaticamente especificar seus argumentos: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

Você pode reduzi-lo a 237 bytes, não escrevendo o "10" no arquivo e apenas usando o ?operador com base na existência do arquivo ao ler 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

O mais otimizado que consegui: 220 bytes. Aqui está a fera: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

thx para as sugestões :) #
227 Viktor Mellgren

3

SQLite, 142 137

Provavelmente isso poderia ser feito de maneira muito mais inteligente. 141 136 caracteres para o código:

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

Mais 1 para o nome do arquivo xem sqlite3 x '…'.


1
Agradável! Não vi o SQLite usado assim antes. Você pode comprimir alguns bytes substituindo "values ​​(11)" por "select 11" e "select n from t limit 1" por "select min (n) from t")
Bence Joful

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
O PO esclareceu (nos comentários) que é necessário um programa completo.
Dennis

1
@Dennis Meu envio revisado se qualifica como um programa completo?
Oliver

Não sei , mas acho que não. Eu diria que, sem uma ligação alertou similar, é apenas um trecho do REPL.
Dennis

2
Parece bom para mim. (Não é possível testá-lo do meu telefone.)
Dennis

3

Ruby, 94 87 84 61 59 bytes

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

Por favor, deixe sugestões abaixo.

Obrigado @ ConorO'Brien pelas idéias (algumas vergonhosamente arrancadas de sua resposta).


puts i=>p i
Conor O'Brien

Use newe em sizevez de opene length.
Lee W

2

Ruby, 52 + 1 = 53 bytes

Supõe que o arquivo seja nomeado a(+1 byte).

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

Corrida

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

... você pode assumir nomes?
Dkudriavtsev

Você pode usar $ 0 em vez de a e 'eco >> # $ 0' (com reticulares) na última linha.
GB

Ainda há mais bytes do que se supõe a(que é apenas +1).
wizzwizz4

? a é 2 bytes, $ 0 é 2 bytes, mas não precisa de espaços em branco.
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`))

Gostei da sua ideia de abertura, __file__então usei isso na minha resposta.
Alex Hall

@AlexHall Great idea withlen
L3viathan

@ Flp.Tkc Não vou salvar nenhum caractere com isso. Ainda preciso usar a variável s, porque preciso ler, depois procurar e depois escrever. O print x/x*xfuncionaria, mas não melhora a contagem de bytes.
L3viathan

2

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

If not(Ans
11
Ans-1
AnsAns/Ans

A resposta deve ser igual a 0 (o valor padrão) antes da primeira execução.

Como AnsAns/Ansé a última linha do programa, ele será gerado e armazenado em Ans, a menos que Ans seja 0; nesse caso, ocorrerá um erro de divisão por 0.


2

JavaScript, 41

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


@Mego Sim, obviamente, eu não sei como isso poderia acontecer ... Eu tinha um em avez de lquando o escrevi e o mudei sem pensar, porque achei que parecia mais divertido ... já foi tarde demais , Obrigado por apontar isso.
C5H8NNaO4

1

GNU Smalltalk, 70, 68 bytes

Código de 66 bytes +2 bytes para o sinalizador "-S"

EDITAR% S

  • Removidos parênteses desnecessários, -2 bytes

Golfe

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

Teste

>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

Você deve executar o gst como root, para poder modificar a imagem padrão ou especificar sua própria imagem com -I .


1

PHP, 45 bytes

Honestamente não tenho certeza se este conta.

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

Eu postaria um link para um exemplo, mas todos os testadores on-line que conheço não permitem o session_start()uso.

Isso continuará a contagem regressiva sempre que você atualizar a página até 0, quando o diecomando for executado.


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|

Abre o arquivo a.b(ou cria quando não encontrado na primeira execução), lê o registro 1 no e. Se esse registro não for encontrado, assuma 10, ou seja, sub 1. Em e==0, gere um erro. Escreva de volta epara a.b.

O acesso a arquivos não está embutido no QBIC, isso depende muito do QBasic subjacente.


0

Lote, 72 bytes

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

Precisa ser chamado usando o nome completo do arquivo, incluindo a extensão. A última linha não deve ter uma nova linha à direita. Funciona escrevendo -1no final da última linha, para avaliar 1 a menos a cada vez. goto gerros porque não há etiqueta :g.


0

R, 52 bytes

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

Utiliza essencialmente ls()para listar os nomes de todos os objetos armazenados globalmente. Se assumirmos que o ambiente global está vazio e "x"ainda não existe, gere x=10; caso contrário, se x!=0subtrair 1, chamará um argumento ausente que retornará um erro.


Você pode salvar um byte removendo !e alternando a ordem dos argumentos then e else e outros dois alterando x>0para x. (Além disso, exists("x")é um pouco mais limpa do que "x"%in%ls(), embora igual na contagem de bytes.)
rturnbull

Ah, relendo os comentários na especificação, parece que é necessário um programa completo, o que significa que você não pode confiar na persistência do objeto entre as execuções.
Rdb #

@rturnbull Embora eu não consiga encontrar onde isso é explicitamente declarado. Excluirei a resposta se você puder me indicar.
Billywob

É mencionado aqui , embora não tenha sido editado na especificação.
R16 #

0

Lote do Windows, 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)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.