Inspirado por este padrão para IO .
A tarefa
Escreva um programa que, dado um número inteiro de entrada x
entre 0 e 255, trava com o código de saída x
.
Restrições
- Você não pode chamar nada que seja destinado diretamente à saída do código de saída (
System.exit(x)
, retornando demain
etc.). Em vez disso, seu programa deve causar um erro ou falha que fará com que, com uma probabilidade de 1, o programa saia com o número inteiro de entrada.- Nesse caso, as palavras "erro" e "falha" significam que o programa causou alguma exceção fatal não intencional, em que um método, operação ou outro foi usado incorretamente que causou uma falha irreversível.
- Você não pode causar o erro diretamente, lançando-o diretamente. Você deve causá-lo usando um método, função ou outro objeto cuja finalidade atenda a uma função diferente (por exemplo, tentar executar uma gravação de arquivo em um diretório somente leitura).
- Você deve ter pelo menos dois códigos de saída contabilizados em seu programa.
- O término do processo com o uso de sinais é proibido. (O raciocínio pode ser encontrado nesta discussão )
Pontuação
A pontuação do seu programa é determinada pelo número de códigos de saída suportados, nos quais a concisão do código é desempatador. O maior número de códigos de saída suportados vence!
code-challenge
restricted-source
Addison Crump
fonte
fonte
throw new Exception()
estilo), isso é ilegal. Se é o subproduto do uso indevido de uma função existente, tudo bem.one zero zero
aceitável aceitar entrada como dígitos em inglês escritos por extenso (por exemplo, para 100)? Eu tenho uma ideia para esse desafio, mas o idioma tem algumas idéias bastante incomuns sobre E / S, e esse é o formato de entrada mais natural.Respostas:
Shell Unix (+ ncurses + utilitários BSD),
36., 26 bytes, 256 códigos de saídaGolfe
Uma vez que o código de saída do tput ultrapassa 255, ele simplesmente transborda, então 253 (erros na entrada) resultará no código de saída de 1 etc., produzindo assim o status de saída desejado para todo o intervalo de entradas.
Nota : se o tput falhará, ao definir / obter um recurso específico, depende do tipo de terminal, usei:
xterm with 256 colors
jot é um utilitário BSD , que imprime dados seqüenciais ou aleatórios e (AFAIK) também está disponível imediatamente nos sistemas OSX.
Se o seu sistema não tiver
jot
disponível, você poderá usar uma versão ligeiramente mais longa (29 bytes):Experimente Online! (a versão de 29 bytes)
fonte
Bash 4.2 + extras, 24 códigos de saída
Obrigado a @ KenY-N por 3 códigos de saída. Obrigado a @ el.pescado por 1 código de saída.
Verificação
Todos os testes foram realizados no openSUSE 13.2.
fonte
http_proxy=fafa curl http://example.org
INTERCAL (C-INTERCAL), 15 códigos, 313 + 2 = 315 bytes
Experimente online!
Todo espaço em branco aqui é irrelevante. (O programa original continha guias, mas eu as converti em espaços para que se alinhassem corretamente no SE; é convencional usar uma largura de guia 8 para INTERCAL. Testei uma versão do programa com todas as guias, espaços , e novas linhas excluídas, e funciona bem.)
Compile com
-abm
(penalidade de 2 bytes, porque-b
é necessário para o compilador ser determinístico).Como de costume para INTERCAL, isso requer entrada numérica no formato, por exemplo,
ONE TWO THREE
para123
.Explicação
Quando um programa C-INTERCAL erra, o status de saída é o código de erro módulo 256. Como resultado, podemos ter como objetivo escrever um programa capaz de produzir o maior número possível de erros de tempo de execução. Este programa omite apenas dois erros de tempo de execução que não indicam problemas internos do compilador: ICL200I, porque sua reprodução requer o uso de bibliotecas externas que são compatíveis apenas com um programa de thread único (e os programas multithread têm mais erros disponíveis); e ICL533I, porque 533 tem o mesmo valor de módulo 256 que 277 e o programa é capaz de produzir ICL277I.
O programa sempre começa da mesma maneira. Primeiro, inserimos (
WRITE IN
) um valor para a variável.1
. Então, usamos umaCREATE
declaração computada para criar nova sintaxe (aqui,A
); mas, como é calculado, a definição da sintaxe varia com base no valor de.1
. Finalmente, na maioria dos casos, executamos nossa novaA
instrução, que foi definida para produzir um erro; a tabela de definições possíveis que temos contém uma definição para cada possível erro de tempo de execução (além das exceções listadas acima).Primeiro, existem duas exceções a esse esquema geral.
(0)
não é um número de linha válido; portanto, se o usuário inserirZERO
, passamos da segunda linha (numerada(8)
) para a quarta linha por meio de umaCOME FROM
instrução computada . Isso então cai em um erro de sintaxeDO X
, que produz um erroICL000I
. (No INTERCAL, os erros de sintaxe ocorrem no tempo de execução, devido à tendência de os comandos serem desabilitados, a sintaxe ser redefinida sob você, etc.). ACOME FROM
instrução também tem um efeito colateral, mesmo que nada realCOME FROM
aconteça, criando uma sobrecarga de operando de.1
para#1
sempre que uma linha com um número de linha for executada; isso é usado posteriormente ao produzir a saída 21. (Efeitos colaterais globais aleatórios são bastante idiomáticos em INTERCAL.)A outra exceção é com entrada
ONE TWO NINE
. Como não há número de linha(129)
no programa, obtemos um erro para um número de linha ausenteICL129I
. Portanto, não precisei escrever nenhum código para cobrir esse caso.Aqui estão os outros erros e o que os causa:
NEXT
estouro de pilha (DO (123) NEXT
). ANEXT
instrução precisa de outros modificadores (FORGET
ouRESUME
) para determinar retroativamente que tipo de instrução de controle era. Não ter o erro ICL123I dessas causas, uma vez que existem 80 instruções `NEXT não resolvidas.DO STASH .2
em umCOME FROM
loop). Os stashes são limitados apenas pela memória disponível, mas isso acabará eventualmente, causando o erro ICL222I.DO ,1 <- #0
significa e causa o erro ICL240I.,1
não foi alocado (,
é usado para variáveis do tipo matriz em INTERCAL), portanto, a indexação causa o erro ICL241I.#256 $ #0
) a uma variável de 16 bits.2
. Não se encaixa, causando o erro ICL275I.#2
a.1
. Isso pode parecer uma atribuição bastante simples, mas sobrecarregamos.1
para significar#1
mais cedo, e tentar alterar o valor de 1 sem-v
opção na linha de comandos causa o erro ICL277I.GO BACK
), que não existe neste momento no programa (não executamos nenhum comando para manipular a pilha do ponto de escolha, portanto ela ainda está vazia). Isso causa o erro ICL404I.RETRIEVE .2
partir de um stash inexistente (porque não escondemos nada nesse ramo do programa), causando o erro ICL436I.WRITE IN
) para sempre em umCOME FROM
loop. Eventualmente, acabaremos lendo EOF passado, causando o erro ICL562I.DO RESUME #0
, que não tem sentido e está especificamente documentada como causando um erro (ICL621I).DO RESUME #9
. Ainda não executamos tantasNEXT
instruções e, portanto, obtemos o erro ICL120I. (Curiosamente, esse erro específico é definido na documentação INTERCAL como sair do programa normalmente e depois causar o erro, em vez de sair do programa com um erro. Porém, não acredito que esses dois casos sejam notavelmente diferentes.)Verificação
Alguns dos erros envolvem a execução intencional da memória do programa, por isso sugiro definir limites de memória bastante pequenos. Aqui está o comando shell que eu usei para testar o programa (com novas linhas adicionadas para facilitar a leitura; exclua-as se você executá-lo):
E aqui está a saída (com os números de linha e as mensagens "POR FAVOR CORRETA SOURCE" excluídas para economizar espaço), que adicionei parcialmente para demonstrar o funcionamento do programa, mas principalmente para mostrar as mensagens de erro tolas da INTERCAL:
fonte
Perl, 108 bytes, 256 códigos de saída
Este programa (ab) usa o módulo Test :: More . Ele tenta abrir o arquivo chamado
""
n vezes em que n é fornecido como argumento da linha de comando. Ele falha sempre e cada chamada é tratada como um teste. Teste :: Mais número de retorno de testes com falha como código de saída.plan tests => $ARGV[0]%255
é necessário para obter o código de saída 255.fonte
perl -MTest::More -e'plan tests,$%%255if$%=<>;ok 0for 1..$%'
51 bytes (38 bytes + 13 bytes para-MTest::More<space>
). Recebe entrada em stdin.C90 (gcc), 256 códigos de saída,
282718 bytesEu não tenho certeza se isso é inteligente ou cheaty, mas eu não acho que isso viola as regras como escrito: tecnicamente não usa
exit
,return
ou qualquer erro mecanismo jogando, mas simplesmente depende de um comportamento indefinido eo fato de que gcc faz algo bastante conveniente no que diz respeito a esse desafio.Experimente online!
Como funciona
Isso simplesmente usa
getchar
para ler um byte do STDIN. Por si só, isso não faz nada.No entanto, um programa C90 compatível deve terminar com uma
return
declaração ou algo equivalente; tudo o resto é comportamento indefinido. O gcc encerra a montagem gerada com um deret
qualquer maneira, portanto, qualquer valor que tenha sido casual no registro EAX será retornado pelo programa. Felizmente, a glibc'sgetchar
armazena o byte que lê de STDIN no EAX, então o valor desse byte é o código de saída do nosso programa.fonte
set -o fullexitcode
.return
ouexit
é um erro no que diz respeito ao padrão C90 e resulta em um código de saída que indica falha. Isso é tudo que um acidente faz no coração.C (gcc) no shell bash em x86, 230 bytes, 8 códigos de saída
Novas linhas adicionadas para facilitar a legibilidade. Comentários ignorados na pontuação.
Um recurso do shell bash:
Então, tudo o que precisamos fazer é acionar vários sinais do programa CA. Neste ponto, suponho que simplesmente fazer
kill(n-128);
é banido. Então, em vez disso, executamos um código que aciona vários sinais, o que faz com que os códigos de erro correspondentes sejam disponibilizados no shell de chamada.Os códigos de saída são 0, 130, 133, 134, 136, 139, 141, 142.
Experimente online . Expanda a seção "Debug" para ver o código de retorno.
Isso certamente pode ser jogado mais fundo. Mas eu estaria mais interessado em adicionar mais sinais.
fonte
__asm("UD2")
executa a "instrução indefinida" x86 que causará uma exceção de CPU que será retransmitida pelo kernel para o programa na forma de um sinal SIGILL. Porsocketpair
exemplo, o SIGPIPE será enviado pelo kernel ou glibc enquanto tentamos chegarwrite()
a um pipe que foiclose()
d na outra extremidade.int3
e nãoint $3
e 2) um caractere se declararv
comoint**
, desde que você não confie fundamentalmente nachar
integridade do tipo de dados na aritmética do ponteiro, mais 3) dois caracteres se você usar*p
em vez dep[0]
, ou 4) seis caracteres, se você quiser, confie nosfd
números previsíveis retornados por todos os syscalls que os criam e substituap[0]
ep[1]
pelos valores quase certos. Por fim,pipe(fd)
é muito menorsocketpair(...)
e gera o mesmo erro ao fecharfd[0]
e gravar em.fd[1]
.&63
vez de-128
. 2) Substituasleep(2)
porfor(;;)
. 3) Substituac=*(int*)c
poratoi(0)
. 4) Substituac/=c-2
porc/=0
.Python 2, 13 bytes, 2 códigos de saída
Se você digitar 0, ele tenta imprimir
1/-1
qual é -1, o que é perfeitamente adequado, portanto, sai o código 0. Se você digitar 1, obtém o1/0
que aumenta aZeroDivisionError
no qual existe um código de saída 1. No meu IDE, há apenas 0 e 1 para os códigos de saída ...Saídas:
fonte
PHP, 15 bytes, 2 códigos de saída
Sem
die
/exit
, o PHP não pode retornar nada, exceto0
ou255
(afaik; provavelmente~1
), então ...Se o argumento da linha de comando for falso, ele avalia
1
e sai com0
. Caso contrário, ele tenta chamar uma função e sai com<b>Fatal error</b>: Uncaught Error: Call to undefined function p()
.Corra com
-r
.fonte
exit()
define um status de saída ... que você não pode usar para este desafio, concedido. Mas seu código também é inválido. Ele define o status de saída para 2551
. Procurei uma lista de códigos de saída, mas não consegui encontrar um.Excel VBA,
414514 533 + 3 bytes, 14 códigos de saídaToma entrada como uma
Conditional Compilation Argument
,n=[input value]
e produz código de erro associado desse número.+3 para
n=[Value]
chamada de compilação condicionalLida com entradas onde
n=
Nota: O VBA não possui códigos de saída
0
ou1
. Incluí as soluções para3
e5
, que são os dois códigos de saída numerados mais baixos disponíveis para o VBAfonte
#
faz aqui?#if
e#ElseIf
são declarações de compilação condicional que significa que as declarações que se seguem só são compilados se a condição for verdadeira#
, onde elas seriam compiladas se as declarações são verdadeiras ou não? Sei como asIf
declarações funcionam, mas sou novo no que realmente compila , desculpe-me por uma pergunta tão simples.#if
é usado no lugar deIf
ouSelect Case
como apenastruthy
instruções condicionais são realmente compiladas. Neste caso especificamente, isso impede que o programa saia com código de erro3
,Return without GoSub
em todas as execuções, mas apenas saia com esse código quandon=3
Turtlèd, 4 bytes, 2 códigos de saída
Não sei se existem maneiras de obter mais códigos de saída ... existem ainda outras formas no idioma do intérprete
Encontrei algumas respostas de quatro comprimento
Experimente online!
Experimente online!
Experimente online!
Como estes funcionam:
no meu intérprete, há um recurso de
erroque causa erros quando a grade na memória possui mais de uma linha e não possui caracteres não espaciais. este programa apaga o * na célula de origem'[space]
, recebe uma entrada inteira não negativa?
(0 ou 1 realmente) e diminui a quantidade de;
zero, se for zero, a grade terá apenas uma linha e não haverá erro, caso contrário, será movida para baixo e o erro irá ocorrerparênteses e outras coisas não são analisados, eles são executados no tempo de execução para significar: "pule para o parêntese correspondente, se o símbolo da célula não estiver certo". Nesse programa, ao inserir (
!
), o programa é gravado na célula (.
), executa o paren, que verifica se o símbolo da célula é 0, tenta pular para o paren correspondente, mas gera um erro, pois não há nenhum. . se for zero, anota, verifica os parênteses, se encontra em um 0 e depois o ignora, e o programa terminapossui elementos da resposta anterior e a primeira. ele pega uma entrada inteira não negativa, diminui a quantidade e verifica se a célula é '*', procurando por um paren extra inexistente, caso contrário. se a entrada for 1, ela sairá do espaço inicial e descobrirá que a célula é um espaço e, se for zero, o erro permanecerá no espaço inicial e ignorará o parêntese.
fonte
Javascript (nó), 19 bytes, 2 códigos de saída
Programa completo:
Função:
process.argv
é uma matriz que contém o caminho para o nó executável, o caminho para o arquivo javascript executado e os argumentos da linha de comando. Nesse caso, será"1"
ou"0"
. A sequência é convertida em um número com o unário+
operador . Se o número for zero, o&&
operador preguiçoso não avaliará o lado direito, se o número for verdadeiro (não zero), o lado direito&&
é avaliado e um erro é gerado porque faz referência a uma variável indefinida e o programa existe com o código de saída 1.A função espera a entrada como um número. Se a entrada for verdadeira, a função se chamará e trava o tempo de execução do nó com um estouro de pilha. Se a entrada for 0, o
&&
operador lento retornará 0 sem avaliar o lado direito.fonte
+process.argv[2]&&a
.ReferenceError.prototype.name=process.argv[2]?a:0
válido?Perl 6 , 57 bytes, 256 códigos de saída
Tente
Esta é uma tradução do exemplo do Perl 5.
Expandido
fonte
Scala, 19 bytes, 2 códigos de saída
if(args(0)=="1")1/0
1/(args(0).toInt-1)
A JVM suporta apenas 1 e 0 como códigos de saída, se você não ligar
System.exit
.O primeiro programa tenta calcular
1/0
se o primeiro argumento é1
, o que travará a JVM com um código de saída 1. Se o argumento for 0, ele será encerrado com êxito.O segundo programa para converter o argumento em número inteiro, subtrai um e tenta dividir 1 por esse número. Se o argumento for 1, ele calcula
1/0
, então a JVM falhará; se o argumento for 0, ele calcula1/-1
e sai.fonte
Python 3 , 15 bytes, 2 códigos de saída
Obviamente, isso é mais longo que a solução Python 2 , porque no Python 3 não podemos receber uma entrada literal sem chamar
eval
. No entanto, podemos usar técnicas de comparação de seqüências de forma interessante ...A entrada será a string
0
ou1
- se for 1, a condição será avaliada como 0 (false), resultando em uma tentativa de computação1 / 0
que obviamente trava (código de saída 1). Caso contrário, nada acontece, e o Python sai com o código de saída regular 0.Tanto quanto sei, o Python é incapaz de falhar com outros códigos de saída.
fonte
Java,
7166 bytes, 2 códigos de saída4 bytes economizados graças ao Holger
Programa completo:
Função assumindo um int como argumento:
O programa pega o primeiro caractere do primeiro argumentador (
'0'
ou'1'
e subtrai 48 (valor ASCII de'0'
) para obter um número inteiro (0 ou 1) e, em seguida, tenta definir o argumento na posição desse número inteiro para a sequência vazia. a entrada é 1, o programa trava com umArrayIndexOutOfBoundsException
, porque a matriz de argumentos possui apenas um elemento na posição 0 (indexado a zero).fonte
a[a[0].equals("1")?1/0:1]="";
, que está em pé de igualdadeint x=a[0].equals("1")?1/0:1;
. Mas mudar o programa ainda mais para provocar umaArrayIndexOutOfBoundsException
vez deArithmeticException
salva alguns bytes:interface I{static void main(String[]a){a[a[0].charAt(0)-'0']="";}}
Python 2, 11 bytes, 2 códigos de saída
Três soluções diferentes de 11 bytes para três erros diferentes! (Apenas por diversão, isso não dá pontos.) Por padrão, o Python só possui códigos de saída 0 para saída bem-sucedida e 1 para erro. As execuções bem-sucedidas não produzem nada.
Na entrada 1, fornece "ValueError: contagem de turnos negativos". Na entrada 0, uma contagem de turno zero é bem-sucedida e fornece 1.
Na entrada 1, fornece "ZeroDivisionError: divisão inteira ou módulo por zero" devido a
~-input()
, também conhecidoinput()-1
como 0. Na entrada 1,1/-1
fornece -1.0**-input()
também funcionaria.Na entrada 1, fornece "NameError: o nome 'x' não está definido". Na entrada 0, essas primeiras desigualdades
0<0
são avaliadas como Falso, portanto, o restante não é avaliado e o resultado é apenas Falso.fonte
Node.js (ES6), 77 bytes, 2 códigos de saída
fonte
Gelatina , 4 códigos de saída, 18 bytes
Oferece suporte aos códigos de saída 0 , 1 , 137 (eliminados) e 139 (falha de segmentação).
Experimente online!
Como funciona
fonte
SmileBASIC, 640 bytes, 39 códigos de saída (de 52)
Definitivamente, isso poderia ser reduzido. O SB possui apenas códigos de erro de 0 a 51, e alguns são impossíveis de disparar.
fonte
ZX81 BASIC> 255 códigos de saída - 52 bytes (listagem)
Tecnicamente,
N
pode ser qualquer número de ponto flutuante de 24 bits dentro do intervalo, mas assumiremos números inteiros aqui. A linha 2 é equivalente aIF N>0 AND N <=255 THEN GOTO 3: ELSE GOTO 1
se o ZX81 BASIC tivesseIF/ELSE
em suas instruções simbólicas.fonte
the program caused some fatal unintended exception
? Isso apenas imprime algum texto e termina a execução.RAND USR N
causará efeitos não intencionais, pois chamar parte da ROM de um local inesperado não é uma boa ideia; portantoRAND USR 0
, foi excluído por ser muito gracioso.LD BC, 0000 RST 10 RET
em 0x1000, mas chamadoRAND USR 4097
, perderá o operando LD e, portanto, o código da máquina será inclinado. Não me lembro de todas as chamadas de ROM, mas resolverei todos os fins legais / legais e os excluírei mais tarde.