Seu desafio é jogar um programa que imita um fluxo de transmissão de dados. Seu programa deve ler a entrada de stdin e enviá-la diretamente para stdout. Para tornar o problema mais interessante, o fluxo de saída está com defeito e deve atender a vários requisitos:
- Deve haver uma chance de 10% de que cada caractere seja alterado com +1 código ASCII (ex 'a' se torna 'b', '9' se torna ':'), etc.
- A entrada e a saída devem cobrir apenas valores ascii imprimíveis ('!' A '~', de 33 a 126 de decimal, inclusive). Se o +1 aleatório ocorrer em um '~' (decimal 126), um '!' (decimal 33) deve ser impresso.
- Se três caracteres forem deslocados aleatoriamente em uma linha, o programa deverá gerar "CÓDIGO DE ERRO 4625: ERRO INCORREVÍVEL, ENTRE EM CONTATO COM O ADMINISTRADOR DO SISTEMA" (seguindo a nova linha opcional) e interrompa a execução.
Para simplificar o problema, aqui estão alguns outros critérios:
- Você pode assumir que a entrada sempre será válida; isto é, ele conterá apenas valores '!' através de '~'.
- O programa deve continuar até que três caracteres sejam deslocados aleatoriamente seguidos; é seguro assumir que o EOF nunca ocorrerá.
- A aleatoriedade deve diferir entre as corridas; se o seu gerador de números aleatórios precisar ser semeado para obter um resultado exclusivo a cada execução, seu código precisará semear.
- Você deve escrever um programa, não uma função.
- Você deve pegar a entrada do stdin e gravar a saída no stdout.
- Você não pode usar bibliotecas ou recursos externos.
- Seu código deve ter um interpretador ou compilador disponível e funcionando gratuitamente.
Aplicam-se as regras padrão de código de golfe. O vencedor é quem tiver o programa mais curto postado em duas semanas (quinta-feira, 20 de fevereiro de 2014).
Respostas:
Befunge-98,
166159156155148Este melhora na outra excelente resposta Befunge com a probabilidade correta (1/10) e é um pouco mais compacto:
fonte
x
é usado em dois lugares como um "ir". O empacotamento de borda é (ab) usado extensivamente, incluindo o controle que flui através do espaço entreASE
eCONTACT
. O contador "3 em linha" é mantido na parte inferior da pilha; barra invertida é usada para trocar e acessar onde necessário.?
instruções (uma das quais é atingida por dois caminhos, portanto a probabilidade ainda é exatamente 1/10) e fez alguns outros pequenos ajustes para raspar mais 7 caracteres!C, 168 caracteres
A propagação desta solução do PRNG tira proveito do fato de que os sistemas operacionais modernos alteram a localização da pilha na memória a cada execução, como uma medida básica contra explorações de quebra de pilha.
fonte
c
completamente movendo agetchar()
chamada emputchar()
e usar alguma fantasia matemática ...c
para poder testargetchar()
o valor contra 126, além de passá-lo paraputchar()
.putchar((getchar()-33+(rand()%10?i=0:1))%94+33))
deveria funcionar. Usando sua solução como base, me reduzi a 165 caracteres.Ruby, 156
fonte
:3while
?:3
verdade, é o fim desta declaração:e=r>0?e-r :3
que define o valor de e (número de erros sequenciais restantes antes de abortar) com base em r (1 se o último caractere processado for um erro, 0 se não). É apenas empurrado contra o tempo para economizar espaço:>while
sem espaço antes dele? Isso é tão obscuro e ilegível! ;)Lote - 359
Aberto a sugestões para torná-lo completamente compatível com as regras de desafio.
Vou trabalhar para torná-lo menor / melhor - eu queria publicá-lo enquanto estiver trabalhando, antes de quebrá-lo.
Definitivamente, existem algumas maneiras de jogar golfe.
Sem golfe -
fonte
Befunge-93 (206)
Possui 142 caracteres que não são espaços em branco. Tecnicamente, não está em conformidade, pois tem probabilidade 1/9 e não 1/10 de erro.
Executar como
cat /dev/urandom | tr -dc '!-~' | ./befungee.py -c 100 ../rand
.Com esta entrada
!!!!aaaaaaa~~~~~~~~~~
, obtemos a saída!"!!aabaaba~~~!~~~~!!
indicando que os erros foram tratados corretamente.fonte
PHP 190
isso é o máximo que eu poderia jogar, mas acho que é muito bom que seja menos de 100 caracteres dos principais
fonte
C # -
346330313309297288278274Meio longo, mas faz o trabalho.
fonte
c=n==0?c+1:0
é menor do quec+=(n==0?1:-c)
...(n==1?1:0)
é menor do que(n==1?n--:(--n-n))
(e, em seguida, é claro alterar o mais tarden==0
an==1
)(false)
? Se alguma coisa, você não quer(true)
?shbash, no OSX,211,208,203,200,196, 185Um pouco melhor que 10%, uma vez que o aleatório irá gerar números entre 0 e 32767, então, na verdade, são 3.277 em 32.768 chances (10.0006%).
Obrigado, @Gilles (mas não sei o que você quer dizer com a reestruturação do tempo. Também tivemos outras idéias no chuveiro.
fonte
[ $RANDOM -gt 3276 ]
para((RANDOM>3276))
e[ $[t++] -eq 2 ]
para((t++==2))
. Eu acho que você também pode salvar alguns caracteres, reestruturando comowhile read -n1 a;((RANDOM>3276))&&…
.while read...
parte?while …;do :;done
ouuntil …;do :;done
, você poderá raspar alguns caracteres.C,
260257237225189174Meu primeiro golfe, sugestões apreciadas.
7 é muito aleatório.
A compilação fornecerá avisos.
Obrigado pela ajuda da breadbox e Josh.
fonte
#include
; C aceitará (com avisos) chamadas para funções não declaradas (dentro dos limites). Use variáveis globais para obter a inicialização zero automática. Encontre maneiras de usar o operador ternário em vez deif
/else
instruções. Usarfor
no lugar dewhile
oferece mais oportunidades para reduzir o número de instruções de nível superior e omitir os colchetes ao redor do corpo do loop. Muito mais que poderia ser mencionado: examine outras soluções C neste site.n
ec
no escopo global. Isso permitiria descartar aint
declaração e deixar a inicialização em zero ser automática.c
o valor não inicializado desrand
. Eu acho que eu poderia usar&c
ou&n
, em vez disso, que é o breadbox usado.