Agora, todos sabemos que a maioria dos idiomas possui maneiras muito simples de "auto-modificar" o código. No entanto, e se você realmente modificar o código e editar partes dele ... no disco?
Seu objetivo é criar um código que imprima um número e, em seguida, edite seu próprio arquivo para substituir o número pelo próximo na sequência de Fibonacci, da seguinte maneira:
$ ./program
1
$ ./program
1
$ ./program
2
$ ./program
3
$ ./program
5
[etc...]
Regras
- Você não pode armazenar os números "fora" do código. Sem comentários, sem dizer ao script para sair, sem EOF, etc.
- Se o seu código funcionar com qualquer nome de arquivo, subtraia 2 da quantidade de bytes e escreva
$BYTESNOW ($ORIGINALBYTES - 2)
no título. (Presume-se que os nomes de arquivos estejam dentro do intervalo de qualquer caminho alfanumérico do arquivo.) - Seu código deve gravar a saída no arquivo por si próprio, sem qualquer assistência de tubulação externa.
- Seu código pode começar de um ou zero. Não importa.
perl6 program
) ou precisa incluir a linha shebang para que possa ser chamada como./program
?program
, e podemos assumir que ele está localizado no diretório de trabalho atual?"a"
em vez dearg[0]
. Não parece valer a pena.Respostas:
Bater,
5247 (49-2) bytesEDITAR% S:
Golfe
Teste
fonte
-?
da expressão regular. E uma vez que você está lá, você também pode remover o primeiro grupo de captura :)Python 2,
118111 bytes (113-2)Funciona com qualquer nome de arquivo válido. Não há muito o que explicar aqui, o código em si é muito detalhado.
Graças ao FlipTack por me lembrar,
close()
não é obrigatório.fonte
f=open(...)
vez dawith
declaração?Lote, 81 bytes
Nota: a nova linha à direita é significativa. Requer que o script seja chamado usando seu nome completo, incluindo a extensão. A saída começa em 0.
Como o Lote não pode editar realisticamente um arquivo, apenas adiciono linhas extras ao final do arquivo, para que ele saiba qual será o próximo número a ser impresso. O
>>%0
canal salva um byte porque não posso precedê-lo com um dígito.fonte
C, 142 bytes (144-2)
É bem direto. Primeiro, ele lê e salva os dois caracteres na posição 0x1A no cabeçalho. Eu provavelmente poderia ter procurado mais fundo para encontrar um local mais seguro para salvar os dados, mas funciona para mim na minha máquina executando o OSX, compilado com o GCC 4.2ish e duvido que seja muito portátil. Além disso, como é baseado em caracteres, ele transborda após a 13ª iteração.
Dá a saída:
fonte
Node.js,
152137 bytes (139-2)Separado com novas linhas para maior clareza, não faz parte da contagem de bytes.
Explicação:
Uso:
fonte
Python 3.6,
9691 (93-2) bytescodificar o nome do arquivo economizaria 5 bytes (88 bytes):
Salvo alguns bytes graças a @Artyer
fonte
a,b=0,1
f=open('f','r+');next(f);f.write(f'a,b={b,a+b}\n{next(f)}{f.seek(0)}');print(b)#
utilitários bash + Unix, 43 bytes (45-2)
Na primeira vez em que é executado, ele usa dc para calcular o 1º número de Fibonacci através da fórmula Binet. Cada chamada para sed modifica o programa alterando a sequência passada para dc; essa alteração informa ao dc para adicionar um 1 adicional ao expoente na fórmula, o que faz com que calcule o próximo número na sequência de Fibonacci a cada vez.
Teste
Para ilustrar como funciona, neste ponto, após a impressão do 55, o programa foi modificado para ler:
então executá-lo novamente produz
e o programa agora lê:
fonte
SmileBASIC 3, 99 bytes (101 -2)
Bônus de -2 bytes, porque funciona com qualquer nome de arquivo.
Este funciona, e de alguma forma acabou sendo do mesmo tamanho que o meu quebrado!
fonte
PRGEDIT
comandos para substituir a primeira linha (e adicionar uma quebra de linha depoisA=0B=1
). E você também não precisaA=0
da primeira vez.R, 145 bytes (147-2)
(Tem uma nova linha à direita). Funciona com qualquer nome de arquivo válido.
fonte
Perl 6 ,
6762 bytes (64-2)fonte
Empilhados, não concorrentes, 65 (67 - 2) bytes
Alguns problemas relacionados às E / S de arquivos foram corrigidos na série de confirmações mais recente. Assim, não competitivo.
Aqui está um link para o github.
Execução de exemplo
(Omiti o caminho real para maior clareza.)
Explicação
Como isso funciona é usar um par de números para iniciar a sequência (
2:>
nesse caso, é o intervalo inteiro[0, 2)
, ou seja(0 1)
) e, em seguida, executar a transformação de Fibonacci neles, assim:Em cada execução, essa transformação é executada na parte superior da pilha. Em seguida, a pilha é empurrada para a pilha, duplicada e seu primeiro membro é obtido (
stack:0#
). Este item é emitido e é o número de Fibonacci desejado.repr
depois pega a representação da pilha e acrescenta uma nova linha. Em seguida, o programa é enviado para a pilha e dividido em novas linhas. Em seguida, pegamos o último membro (a última linha) e o anexamos à string mencionada acima. Finalmente, pressionamosd0
(o próprio arquivo; pense emd
sinal deoll0
==$0
.) E escrevemos nele.fonte
Ruby, 68 bytes (70-2)
fonte
Clojure,
209204195 bytes-5 bytes, alternando para analisar os números como um comprimento, em vez de um número inteiro, e removendo alguns espaços perdidos.
-9 bytes removendo o espaço entre o segundo número e
(let...)
(o espaço mais caro de todos os tempos!).Veja os comentários do código pré-escrito para obter uma descrição.
Testado novamente e não gera mais erros de colchete incomparáveis. Ele funciona até 7540113804746346429; nesse momento, lança uma exceção de estouro inteiro.
Observe também que isso pressupõe que o código fonte esteja localizado em "./src/s.clj".
fonte