Potencialmente muito difícil, mas já vi coisas incríveis saindo deste site.
O objetivo é escrever um programa, em qualquer idioma, que faça o que você quiser. O problema é que o programa deve ser válido após qualquer mudança circular dos caracteres.
Um deslocamento de caractere circular é muito semelhante a um deslocamento circular . Alguns exemplos são minhas coisas claras.
Para o programa int main() { return 0; }
deslocar para a esquerda em 6 caracteres produz: in() { return 0; }int ma
deslocar para a esquerda em 1 caractere gera: nt main() { return 0; }i
deslocar para a direita em 10 caracteres produz: eturn 0; }int main() { r
No entanto, este programa obviamente não cumpre as regras.
Regras
- Qualquer língua
- O vencedor é decidido pela contagem de votos positivos
- As soluções que fazem a mesma coisa, ou coisas completamente diferentes para cada rotação, receberão 100 votos virtuais positivos em sua pontuação.
ATUALIZAÇÃO Acho que isso já dura bastante tempo. O vencedor, com mais votos (votos virtuais incluídos), é Mark Byers. Bem feito!
fonte
Respostas:
Use o idioma certo para a tarefa. Nesse caso, é o Befunge .
Esse idioma naturalmente permite rotações porque:
Este programa Befunge imprime exatamente a mesma saída ("Hello"), independentemente de quantas "trocas de caracteres circulares" você usar:
Ele roda em Befungee . Requer que o tabuleiro seja aumentado (não o padrão de 80 caracteres). Pode ser executado assim:
Ele funciona primeiro gerando e armazenando dinamicamente um programa que imprime "Hello" e substituindo o primeiro byte para redirecionar o controle para o programa recém-gravado. O programa é gravado duas vezes para que, se um byte não for gravado corretamente na primeira vez, ele será corrigido na segunda vez.
A idéia poderia ser estendida para produzir qualquer programa de complexidade arbitrária.
fonte
Brainf * ck
Escolha a ferramenta certa para o trabalho - um ditado que nunca foi tão relevante quanto este trabalho aqui!
O programa não deslocado que você vê aqui simplesmente imprime
SHIFT
(mais uma nova linha). Mudanças circulares abitrariamente produzirão várias outras saídas, embora sempre produza seis caracteres ASCII.fonte
Commodore 64 BASIC
?
é abreviação dePRINT
e:
é um separador de instrução, portanto:É claro que variações mais longas são possíveis:
etc ...
fonte
Golfscript
Este programa imprime alguns dígitos que sempre somam 2, independentemente de como o programa é alterado:
A primeira linha é impressa
1010
(10 em binário), a segunda linha é impressa02
e todas as outras linhas são impressas2
.Atualizar:
O programa pode ser testado aqui . Observe que eu adicionei
n
s no final de cada linha apenas para formatar a saída; estes podem ser removidos e o programa ainda funciona.fonte
Ruby, provavelmente uma das soluções mais curtas possíveis:
E outra um pouco mais longa e mais interessante:
fonte
binário x86 de 16 bits
Construído manualmente com a ajuda dessas ( 1 2 ) tabelas, nasm e ndisasm. Isso sempre retornará sem uma falha ou loop infinito, porque nenhum bytes salta ou altera a pilha e é preenchido com NOPs para terminar com uma
ret
instrução de byte único em qualquer caso.Na maioria dos casos, isso resultará em
FOO
uma substring. SeAX
estiver quebrado, isso chamará um int 10 aleatório (isso mudou a velocidade de piscar do cursor em um dos meus testes), mas geralmente não resulta em uma falha.Para experimentar, coloque o hexdump em um arquivo e use-o
xxd -r foo.hex > foo.com
e execute em um ambiente DOS (usei o dosbox).Aqui está um dump hexadecimal deste arquivo:
E algumas compensações desmontadas interessantes:
+0
(para os exemplos abaixo, o restante do binário ainda é válido)
+1
+2
+6
+11
+12
+18
(outras compensações são apenas repetições acima)
+58
fonte
Resposta Unária:
^ 44391 Zeros
Programa Cat. Não importa como você gire, é o mesmo programa.
fonte
PHP
Aqui está, um programa PHP válido:
fonte
Scala
Citações aninhadas:
C ++ / Java / C # /ScalaComente:
Comando vazio:
Bater
Combinação de comentário, espaço em branco e shell incorporada:
Sed
Comandos válidos independentes:
p
P
n
N
g
G
d
D
h
H
Uma combinação dos anteriores:
p;P;n;N;g;G;d;D;h;H;
AWK
Para imprimir todas as linhas do arquivo:
ou
Não imprima nada:
Perl
fonte
;P;n;N;g;G;d;D;h;H
válido?J
Primeiro, um script para verificar rotações válidas de um programa
s
:Por exemplo, o programa
+/1 5
(soma de 1 e 5) fornece:Então, um programa chato e válido:
fonte
dc
programas dc são facilmente válidos em qualquer rotação. Por exemplo:
fonte
Código da máquina
Que tal o código de máquina Z80 / Intel 8051 para NOP .
Claro que não faz nenhuma operação, mas leva um ciclo ou dois ... você pode ter quantos deles desejar.
E eu discordo da resposta Ruby acima - acho que um único byte 00h é mais curto que um Ruby
p
.fonte
k
Avalia uma sequência vazia
Retorna um caractere de ponto
Retorna a aplicação parcial de '.' (forma diânica) para uma lista de caracteres vazia.
fonte
sh bash
cc rodado é cc novamente, mas não é muito amigável se chamado assim.
dh debhelper também não é muito cooperativo, enquanto o hexdump espera apenas pela entrada.
O Ghostscript inicia o modo interativo, enquanto o grupo de switches mostra uma mensagem de uso - uma solução válida aqui também.
E aqui está o script para encontrar candidatos para esses programas:
Se encontrar sequências mais longas também, como (arj, jar) ou (luatex, texlua), que não são válidas após cada turno, mas somente após alguns turnos, que eu interpretei errado no começo, mas há poucas, então é fácil para filtrá-los manualmente.
fonte
arj
/jar
não é válido, pois não hárja
comando (embora eu goste deste exemplo). +1 para o script - ótima ideia :) #every
, quer dizera random one
. O exemplo comshift left by 6
,left by 1
eright by 10
me garantiu na interpretação, que eu só preciso encontrar uma possibilidade de mudança única.... in any language ...
- minha solução só funciona no bash (e sh, zsh, ash e mais algumas), mas todas essas outras soluções também usam nomes de programas.Exemplo de Python trivial:
Pode ser trocado três caracteres repetidamente para revelar cada vez mais o alfabeto.
fonte
Pitão
Apenas avalie alguns números
fonte
dc já está sendo usado, mas o programa a seguir sempre gera o mesmo , independentemente da rotação: D
saídas
fonte