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
8
e 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 é código-golfe , então a resposta mais curta (medida em bytes) vence.
Respostas:
6502 idioma da máquina + Apple] [+ ROM, 12 (11? 10? 9?) Bytes
Deve começar às
$8000
. Falha no monitor do sistema quando a contagem atinge 0.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 ApplesoftCHRGET
; 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.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 ApplesoftCALL
rotina irá armazenarFF
em$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.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
Explicação
Explicação da versão de 10 bytes
Variantes
Imprime
ERR
e emite um sinal sonoro quando a contagem chega a 0Normal - 15 bytes
Substituições
CHRGET
- 14 bytesNão inicializa
$9E
- 13 bytesSubstitui
CHRGET
e não inicializa$9E
- 12 bytesCongela quando a contagem chega a 0
Normal - 12 bytes
Substituições
CHRGET
- 11 bytesNão inicializa
$9E
- 10 bytesSubstitui
CHRGET
e não inicializa$9E
- 9 bytesfonte
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 maisdash
. Podemos fazer isso reinicializando o computadorinit=/bin/dash
na linha de comando do Linux, para que ele não inicie nada alémdash
ou (muito mais conveniente) criando um contêiner Linux usandounshare -Urfp /bin/dash
um terminal (unshare
na verdade, não cria um sistema operacional em branco, mas simula1; notavelmente, o interior do contêiner pensa que é raiz,dash
acha 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 dentrounshare
, 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:
Aqui está uma amostra de execução:
fonte
unshare
não suporta nenhuma das bandeiras-Urfp
.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.Bash + sed,
414038 bytesExperimente online!
fonte
sed: invalid option -- '/'
. sed (GNU sed) 4.2.2Javascript, 42 bytes
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!
fonte
y=localStorage;y.a=y.a||10;alert(y.a>0?y.a--:a)
você pode economizar um byte.sessionStorage
para testar com uma redefinição mais fácil (basta usar uma guia nova), mas é claro que +2 bytes.l=localStorage;l.l=-~l.l;alert(10-l.l||l)
para salvar um byte, euconsole.log
aqui, mas eu preferiria isso também #a
avaliação quando o valor no armazenamento local não é 0.C #,
197160159125 bytesEconomizou 34 bytes graças ao leite
E uma versão formatada (com
ReadKey
adicionado para que você possa ver a saída):É mais longo do que eu pensava, então provavelmente há espaço para jogar golfe.
fonte
File.Exists
e emFile.Create
vez deReadAllText
eWriteAllText
. Basta verificar se existe um nome de arquivo, não ambos com o conteúdo do arquivo. Além disso,namespace System.IO
e você pode remover o espaço para nome deSystem.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? bytesNã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.
Observe que isso depende de uma peculiaridade não oficial,
∘←
atribuída globalmente.6::
sobre qualquer erro de valor⊢c
retornar c∘←10
globalmente definido como 10⋄
agora÷÷c
retorna o c invertido duas vezes (erros em zero) c∘←
globalmente definido comoc-1
um a menos que cTryAPL online!
Certamente versão de 28 bytes válida:
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:
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).
fonte
Perl,
3736 bytesTrava quando o valor inicial atinge -1 (o que teria impresso 0), conforme ele escreve sobre o
=~
operador.Salva um byte usando em
sysopen
vez deopen
. Isso me permite imprimirSTDOUT
primeiro, usando o valor de retorno como o modo de arquivo (1
, akaO_WRONLY
), antes de$~
ser reatribuído.Uso da amostra
fonte
Perl 6 ,
6058 bytesPrecisa de um caractere de nova linha depois
=finish
.die
pode ser substituído por1/0
.Explicação:
Ele obtém uma lista de linhas depois de
=finish
($=finish.lines
) subtrai isso de10
e, se o resultado não for,0
ele 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.
fonte
say $*PERL.compiler.version
)Python 2, 65 bytes
Inspirado pela resposta de L3viathan .
Pode ser reduzido para 60 bytes se você optar por nomear o arquivo com um único caractere
x
e substituí-lo__file__
por'x'
. Nesse caso, substitua75
por70
.fonte
Jolf, 20 bytes
Experimente aqui! Erros quando
0
é impresso. Modifica o código. Explicação para vir.fonte
Applesoft BASIC, 21 bytes (tokenizado)
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
Explicação
PRINT 9 + 1
faz o que você esperaria.CALL 2066
chama a rotina do idioma da máquina 6502 no local da memória 2066, que é posteriorEND :
.END
interrompe 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
9
noPRINT 9 + 1
. Desmontagem:Depois que o contador atinge 0, ele é "decrementado" para
/
; tentar executar o programa causará um erro de sintaxe.fonte
*> <> ,
2018 bytesIsso realmente funciona no Linux (e qualquer que seja o suporte a arquivos chamados,
\n
eu acho). Ele cria um arquivo nomeado\n
na primeira execução e saídas10
. Ele procede à saída de um número a menos em cada execução subseqüente, exceto0
onde ocorre o travamento.Explicação
fonte
PHP 57 bytes
realmente não trava, mas sai (sem contagem regressiva) quando bate
0
. Isso é suficiente?Corra com
-r
.fonte
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.
Ungolfed:
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.
fonte
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)
Corrida:
fonte
Java, 343 bytes
Minha primeira tentativa de golfe
destroçado
fonte
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);}}}
?
operador com base na existência do arquivo ao lerb
: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,
142137Provavelmente isso poderia ser feito de maneira muito mais inteligente.
141136 caracteres para o código:Mais 1 para o nome do arquivo
x
emsqlite3 x '…'
.fonte
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)
fonte
alert
ou similar, é apenas um trecho do REPL.Ruby,
9487846159 bytesPor favor, deixe sugestões abaixo.
Obrigado @ ConorO'Brien pelas idéias (algumas vergonhosamente arrancadas de sua resposta).
fonte
puts i
=>p i
new
e emsize
vez deopen
elength
.Ruby, 52 + 1 = 53 bytes
Supõe que o arquivo seja nomeado
a
(+1 byte).Corrida
fonte
a
(que é apenas +1).Python 2, 89 bytes
fonte
__file__
então usei isso na minha resposta.len
s
, porque preciso ler, depois procurar e depois escrever. Oprint x/x*x
funcionaria, mas não melhora a contagem de bytes.TI-BASIC (TI-84 Plus) (15 bytes)
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.fonte
JavaScript, 41
l=localStorage;l.l=-~l.l;alert(11-l.l||I)
fonte
a
vez del
quando o escrevi e o mudei sem pensar, porque achei que parecia mais divertido ... já foi tarde demais , Obrigado por apontar isso.GNU Smalltalk,
70, 68 bytesCódigo de 66 bytes +2 bytes para o sinalizador "-S"
EDITAR% S
Golfe
Teste
Importante
Você deve executar o gst como root, para poder modificar a imagem padrão ou especificar sua própria imagem com -I .
fonte
PHP, 45 bytes
Honestamente não tenho certeza se este conta.
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
die
comando for executado.fonte
QBIC , 70 bytes
Abre o arquivo
a.b
(ou cria quando não encontrado na primeira execução), lê o registro 1 noe
. Se esse registro não for encontrado, assuma 10, ou seja, sub 1. Eme==0
, gere um erro. Escreva de voltae
paraa.b
.O acesso a arquivos não está embutido no QBIC, isso depende muito do QBasic subjacente.
fonte
Lote, 72 bytes
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
-1
no final da última linha, para avaliar 1 a menos a cada vez.goto g
erros porque não há etiqueta:g
.fonte
R, 52 bytes
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, gerex=10
; caso contrário, sex!=0
subtrair1
, chamará um argumento ausente que retornará um erro.fonte
!
e alternando a ordem dos argumentos then e else e outros dois alterandox>0
parax
. (Além disso,exists("x")
é um pouco mais limpa do que"x"%in%ls()
, embora igual na contagem de bytes.)Lote do Windows, 61 bytes
fonte
JavaScript, 44 bytes
fonte