Simplificando, seu objetivo é criar um programa completo que modifique seu próprio código-fonte até que cada caractere da fonte seja diferente do que foi iniciado.
Inclua a fonte inicial e a fonte final em sua postagem, bem como uma descrição. Por exemplo, descreva o que (mais) seu programa faz, o idioma que você usou, sua estratégia etc.
Regras
- Seu programa deve parar algum tempo após a conclusão da modificação.
- Na verdade, ele deve modificar seu próprio código-fonte em execução no momento (não necessariamente o arquivo que você passou para o intérprete, ele modifica suas instruções), não imprimir um novo programa ou gravar um novo arquivo.
- As brechas padrão não são permitidas.
O programa mais curto vence.
Se seu idioma puder modificar seu próprio arquivo e executar um novo processo do compilador, mas não puder modificar seu próprio código-fonte (atualmente em execução), você poderá escrever um programa como esse com uma penalidade de + 20% bytes, arredondados para cima. Linguagens auto-modificadoras reais devem ter uma vantagem.
Editar : se o seu programa parar com erros, especifique-o como tal (e talvez diga quais são os erros).
fonte
Respostas:
/// , 1 byte
O programa localiza um
/
(o início de um grupo de substituição de padrão) e o remove em preparação para fazer a substituição. Então atinge EOF, então desiste e pára.fonte
Labirinto , 2 bytes
O
>
gira a fonte para que ela se torneO ponteiro de instruções está agora em um beco sem saída e se vira para atingir o
@
que encerra o programa.Claro,
<@
também funcionaria.fonte
Python 2, 225 bytes
O código-fonte final é uma sequência de
"0"
s cujo comprimento é igual ao número de bytes no objeto de código compilado original.O código localiza o objeto de código em execução,,
sys._getframe().f_code.co_code
e cria uma estrutura que representa objetos de string python. Em seguida, ele obtém a memória que o código realmente leva e o substitui"0"*len(c)
.Quando executado, o programa sai com o seguinte rastreamento:
Isso mostra que a substituição foi bem-sucedida e o programa morre porque
0
não é um código de operação válido.Estou surpreso que isso seja possível em python, os objetos de quadro são somente leitura, não consigo criar novos. A única coisa complicada que isso faz é alterar um objeto imutável (uma string).
fonte
"1"
string no código não faz parte do 'code', é apenas uma constante mencionada no bytecode. Na verdade, estou mudando os opcodes da máquina virtual python compilada, não as constantes ou variáveis. Então, o que estou mudando não é o código fonte, por exemplo, apenas o código compilado. Eu poderia alterar o código-fonte como armazenado, mas isso não afetaria o código em tempo de execução, porque ele já teria sido compilado. Se você quisesse, eu poderia postar isso em um 'código de código compilado do Python 2.7 com constantes', mas isso seria idiota da IMO."1"
para<backtick>1+1<backtick>
por apenas mais 2 bytes1+1
da minha sugestão se transformou em um2
na versão compilada ... O compilador é inteligente demais para o seu próprio bem!mal , 1 byte
o mal tem vários armazenamentos de memória - um é o próprio código-fonte e o outro é a roda, que é uma fila circular que é inicializada em um único zero.
q
troca o código fonte e a roda, substituindo a fonte por um byte nulo. No entanto, apenas letras minúsculas são operadores reais no mal, de modo que o caractere é simplesmente um não-op e o programa termina.fonte
MSM , 8 bytes
Transforma o código fonte em
pqpqpqpq
MSM opera em uma lista de seqüências de caracteres. Os comandos são obtidos da esquerda e tratam o lado direito como uma pilha. O MSM sempre trabalha em sua própria fonte.
Rastreio de execução:
fonte
Malbolge, 1 ou 2 bytes.
A linguagem Malbolge "criptografa" cada instrução após executá-la; portanto, esta carta (Malbolge NOP) se tornará uma
!
(que também é um nop) e será encerrada. Por alguma razão, o intérprete de Malbolge que eu uso requer dois bytes para ser executado, dandoDC
(ambos os nops)!U
(os dois também são nops)Edit: O estado inicial da memória Malbolge depende dos dois últimos caracteres no código, portanto, não está bem definido para programas de um caractere. (Embora esse código não se importe com o estado inicial da memória)
fonte
x86 asm - 6 bytes
não tenho certeza se "até que cada caractere da fonte seja diferente do que foi iniciado" se refere a cada byte, cada modificação nemônica ou geral. se eu for inválido, posso alterar o xor para um rep xor, para que cada bit mude os valores, mas esperava não fazer isso para economizar mais 6 bytes para permanecer pelo menos um pouco comparável a esses idiomas de golfe especializados.
Tudo o que isso faz é alterar um c2 para um c3 retn, obtendo o endereço ativo de eip e xorando 5 bytes à frente.
fonte
SMBF , 92 bytes
Pode jogar golfe, e provavelmente vou trabalhar mais nisso mais tarde.
Explicação
O programa gera os seguintes comandos no final de sua fita para se apagar, portanto, ele precisa gerar os seguintes valores na fita:
Faça um monte de
91
s, com nulos (mostrados como_
) entre para usar para valores temporários.Ajuste os valores pelas diferenças
A fita após a execução será toda zerada, com exceção do código gerado
[_[_-_]_<_]
.Nota:
Esse programa me fez perceber que meu intérprete Python para SMBF tem um bug ou dois
e ainda não descobri uma correção.Está consertado agora.fonte
Emacs Lisp 22 bytes
Execute a partir do REPL:
A função agora é avaliada como
nil
.Como alternativa (desvincular-se) 30 bytes
Avalie e erros como
void-function
. A função existia antes de ser executada.fonte
Código vermelho , 7 bytes, 1 instrução (Apenas um exemplo. Não competindo)
Este é um exemplo trivial.
Move a próxima localização da memória para si mesma e depois pára (porque toda a memória é inicializada
DAT 0 0
, o que interrompe o programa quando executado).fonte
Powershell 65 bytes
Defina uma função que se reescreve como nula.
Avalie uma vez e se elimina.
Como alternativa (exclui-se da memória) 36 bytes
Chamar primeiro remove e depois tenta avaliar recursivamente. Erro como um comando desconhecido.
fonte
MIXAL, 6 bytes (contando 2 guias)
O programa inicia no local de memória 0 e depois grava 0 no local de memória 0, apagando-se. A máquina pára automaticamente.
Essa é a linguagem assembly para o hipotético computador MIX de Donald Knuth, que pode ser montado e executado usando o kit de desenvolvimento GNU MIX ( https://www.gnu.org/software/mdk/ ).
fonte
> <> ,
403430 bytesExperimente aqui!
Explicação:
Basicamente, isso coloca um monte de 3 blocos de caracteres na pilha da seguinte forma: (ypos, xpos, caractere ASCII) que é revertido no final para que o comando final 'p' leia (caractere, xpos, ypos) e define essa posição no código para esse caractere. O primeiro caractere é definido manualmente como '<', para que o código acabe sendo '> p <' no final para executar um loop no comando. Todos os outros caracteres são substituídos como "", incluindo o caractere p. O '' é realmente "ASCII CHAR 0", que NÃO é um NOP e causará um erro quando lido.
Também deve haver um número ímpar (?) De caracteres antes do comando 'p' ou ele não será repetido pela última vez e substituído.
fonte
Lote, 11 bytes
Modifica o código fonte para
ECHO is on.
O
@
existe para que o comando não seja repetido, mas principalmente para que os doisecho
não se alinhem.fonte
@
pode ser removido, porqueECHO
(maiúsculas) =!echo
(em minúsculas)echo
s não podem se alinhar.Jolf, 4 bytes, não-competitivo
Isso
₯S
ativa o₯C
valor do elemento ode na entrada,undefined
pois nenhum é fornecido. Experimente aqui!fonte
(Sistema de arquivos) Entre 98, 46 bytes
Observe que este programa cria e manipula um arquivo chamado
a
. Como funciona:a
contendo o código inteiro (com 256 caracteres em cada dimensão) deslocou um espaço para cima e dois para a esquerda.a
como uma linha, substituindo a primeira linha inteira pelo conteúdo doa
arquivo.a
arquivo na segunda linha mudou duas posições para a direita.Como efeito colateral, o código-fonte final não é válido Befunge! (porque contém novas linhas como dados em uma única linha)
fonte
Python 2, 238 bytes + 20% = 285,6
Basicamente, isso alterna a codificação de arquivo atual da fonte python entre
ascii
eutf-8
, portanto, essencialmente alterando todos os caracteres da fonte!fonte
) as
->)as
,) else
->)else
,"utf-8"if
,'w',encoding
.