O código golf sempre envolve algumas respostas que distorcem as regras mais ou menos quebrando as restrições que os desafiadores deram como certa ou simplesmente não pensaram e não listaram nas regras. Uma dessas brechas interessantes é a possibilidade de gerar mais do que o desafio exige para obter um resultado melhor.
Levando isso a extremos, podemos escrever um solucionador de golfe com código universal que imprima a saída desejada - se você não se importa que isso pode levar séculos e gera muitas outras coisas antes e depois dela.
Tudo o que precisamos produzir é uma sequência que é garantida para conter todas as subsequências possíveis. Para este código de golfe, esta será a sequência de Ehrenfeucht-Mycielski :
A sequência começa com os três bits 010; cada dígito sucessivo é formado pela localização do sufixo mais longo da sequência que também aparece mais cedo na sequência e complementando o bit após a aparência anterior mais recente desse sufixo.
Toda subsequência finita de bits ocorre contígua, infinitamente, freqüentemente na sequência
Os primeiros dígitos da sequência são:
010011010111000100001111 ... (sequência A038219 em OEIS ).
Combinando 8 bits da sequência em um byte, obteremos uma saída ASCII que podemos gerar na tela ou em um arquivo e que contém todas as saídas finitas possíveis . O programa produzirá partes de pi, as letras de "Never never desist you" , algumas belas obras de arte ASCII, seu próprio código-fonte e tudo o mais que você desejar.
Para testar a exatidão, aqui estão os hashes dos primeiros 256 bytes da sequência:
MD5: 5dc589a06e5ca0cd9280a364a456d7a4
SHA-1: 657722ceef206ad22881ceba370d32c0960e267f
Os primeiros 8 bytes da sequência em notação hexadecimal são:
4D 71 0F 65 27 46 0B 7C
Regras:
Seu programa deve gerar a sequência Ehrenfeucht-Mycielski (nada mais), combinando 8 bits em um byte / caractere ASCII.
O programa mais curto (contagem de caracteres) vence. Subtraia 512 da sua contagem de caracteres se você conseguir gerar a sequência em tempo linear por byte gerado .
Respostas:
C, -110 caracteres
Esta versão do programa usa o algoritmo de tempo de execução linear para gerar a sequência. Subtrair 512 dos 402 caracteres do programa fornece um total de 110 negativo.
Conforme o problema, o programa é executado em um loop infinito, o que exige muita alocação de memória, e o uso
realloc()
para manter a sequência contígua pode contribuir para a fragmentação da pilha. Você pode melhorar o uso da memória do programa substituindocalloc(7,8)
na primeira linha porcalloc(1,sizeof*v)
. Isso ajudará especialmente em uma máquina de 32 bits, onde 56 é provavelmente muito grande por um fator de dois.O código é meio ilegível, e não de uma maneira interessante; por isso peço desculpas. Francamente, mesmo a versão não-gasta não é muito clara:
(O código não destruído acima é baseado no código escrito por Grzegorz Herman e Michael Soltys, conforme referenciado na descrição do problema e na página inicial de Soltys .)
Agradecemos a @schnaader e @res por reportar um erro na versão inicial.
fonte
malloc
versões modificadas , não golfadas e modificadas param a saída após cerca de 10.000 bytes e continuam alocando memória , causandoprog > out.dat
uma falha instantânea com apenas ~ 700 KB de uso de memória. Se eu inserirprintf("\n%i\n", size);
depoisrealloc
, a maior saída é4
. Sistema: Windows 7 Prof. 64 bits, 4 GB de RAM, GCC 4.6.1Ruby,
10910410194 caracteresImplementação em Ruby usando expressões regulares para pesquisa de sufixos. Como leva muito tempo até ficar sem memória, o programa deve ser encerrado pelo usuário.
Edit: Acabei de notar que é o suficiente para começar com a sequência
0
.Edit 2: A proposta de res salva 2 caracteres, alguns outros porque não precisamos cortar um único byte antes
pack
.fonte
s=(s[/(.*).*\1/][/.#{$1}/]<?1??1:?0)+s
salvará outros dois caracteres.?C
?Perl, 95 caracteres
Na verdade, eu tinha uma versão meio decente disso no começo. Então, enquanto jogava golfe, cada versão ficava mais lenta. Cada vez mais lento.
Os três primeiros caracteres (
$|=
) não são necessários, falando estritamente ... mas sem isso, você normalmente teria que esperar o script terminar de gerar 4096 bytes completos antes de ver qualquer saída. E isso levaria horas. Talvez séculos; Não tenho certeza. Eu mencionei que o desempenho deste programa se deteriora com o tempo? Então, por causa disso, eu me senti compelido a incluí-los na contagem.Por outro lado, esse script tem uma das expressões mais feias que eu já criei, então acho que tenho orgulho disso.
fonte