A complexidade Kolmogorov de uma sequência s é definida como o comprimento do programa mais curto P que gera s. Se o comprimento de P for menor que o comprimento de s, então se diz que s é compressível , caso contrário s é incompressível . A maioria das strings é incompressível ...
Escreva o programa mais curto que produz essa string (sem espaços e sem novas linhas):
d9 a6 b6 33 56 a7 95 4b 29 b0 ac 7f 2a aa 6d 19 b8 4b 4c f8 b6 2a ac 95
a1 4b 4e a5 9d b3 e7 c9 4c 49 59 ec 94 b3 aa 6c 93 8f 11 5a 4d 39 75 82
ec ea 24 cc d3 2d c3 93 38 4e b7 a6 0d d2 b5 37 23 54 ad 1b 79 aa 6e 49
55 52 94 5a a7 3a 6a e9 e4 52 cd 2d 79 ad c6 12 b5 99 5b b4 76 51 17 4e
94 f3 9a a2 e7 15 6a 55 14 4d 4e 4a a3 5c 2f ab 63 cc b5 a6 a4 92 96 8a
2e c3 d8 88 9b 8c a9 16 f5 33 22 5b a2 e2 cc 1b 27 d4 e8 db 17 a4 39 85
ca aa 5b 4f 36 24 d3 c6 f6 94 ad d7 0f 71 24 e1 b1 c5 ef 65 35 6c 8d d7
1a 87 1e 25 df 5d c0 13 b2 6f 5a 57 28 98 bd 41 66 04 ed a2 52 c9 ac 83
b3 6c 56 7e d1 c6 cc 53 4a 62 c5 59 a9 b2 d4 af 22 a5 a9 f4 b2 99 23 32
f8 fb ae 48 6a 8a 9a b5 46 7a 36 59 9f 92 d3 25 b5 19 bd 8a 4a 49 62 a5
e4 59 fb e5 ba a2 35 dd a9 36 1d a9 c9 69 89 77 6a b2 34 2d 1d 22 61 c5
c2 66 1c e2 76 74 52 a5 d9 84 b9 8a a6 b5 14 ec 29 58 b2 bc 96 16 16 48
f5 c5 bd 2f 32 1b 3d 4f 4b 2e b2 6b 9a d9 32 a4 4b 5c bc 92 b7 b3 26 39
fa 42 2d 64 ed 1a 79 49 4c a3 b7 85 b2 a6 e2 8c d9 55 90 e1 a8 87 4b 60
a6 e1 ba c4 bb ec 32 39 76 90 a6 b4 c6 65 79 61 91 aa 3d 54 b7 18 3d 15
4b 06 db 30 8a 4d 4a a1 35 75 5d 3b d9 98 ac 55 5b 10 dd b3 e2 cc f1 5e
b3 2b 53 90 b6 ee 2b ac 8f 88 8d 95 5a 75 df 59 2d 1c 5a 4c e8 f4 ea 48
b9 56 de a0 92 91 a9 15 4c 55 d5 e9 3a 76 8e 04 ba e7 b2 aa e9 ab 2a d6
23 33 45 3d c4 e9 52 e3 6a 47 50 ba af e4 e5 91 a3 14 63 95 26 b3 8b 4c
bc aa 5a 92 7a ab ad a6 db 53 2e 97 06 6d ba 3a 66 49 4d 95 d7 65 c2 aa
c3 1a 92 93 3f ca c2 6c 2b 37 55 13 c9 88 4a 5c 62 6b a6 ae cc de 72 94
A saída deve se parecer com:
d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4e...7294
Nota: nenhuma entrada do usuário é permitida, nem acesso à Web, nem bibliotecas (exceto a necessária para imprimir a saída).
Edit I: a sequência parece aleatória ... mas acaba sendo altamente compressível, manipulando um pouco de números primos ...
Edit II: Muito bem! Analisarei as respostas nas próximas horas e depois atribuirei a recompensa. Esta é a minha ideia de como isso pode ser resolvido:
- Se você tentar compactar os dados, não vai muito longe ...
- Na internet, você encontra a (bem conhecida?) Enciclopédia On-Line de Sequências Inteiras (OEIS);
- tentar os primeiros dígitos hexadecimais
d9, a6, b6, 33, ...
(ou sua representação decimal) não dá resultado; - mas se você converter os números em binário (
1,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0
) e pesquisá-los no OEIS, obterá esse resultado . - Como observado por Claudiu, também dei uma pequena dica na pergunta (Editar I acima) ... :-)
O vencedor é : Peter Taylor (GolfScript, 50), com uma menção especial para Claudiu (Python, 92), o primeiro que "resolveu".
fonte
Respostas:
GolfScript (50 bytes)
Como todo mundo agora está revelando seu código, eu também anteciparei a solicitação do OP para ocultar:
Visão geral dissecção
38200,{:x,{)x\%!},,2=},
4/
p
parap&2 != 0
e faça uma conversão de base 2 em base 16:{3\{2&!!1$++}/.57>39*+}%
(é aqui que estão os truques interessantes)+
Dissecção mais detalhada da conversão de base
Dada uma pilha contendo uma string vazia e uma lista de primos, precisamos fazer duas conversões:
Existem muitas maneiras igualmente longas de fazer 1; por exemplo
ou mesmo
Para 2, a abordagem óbvia é
Mas base é uma palavra longa e, desde 16 = 2 4 , podemos salvar facilmente alguns caracteres com
Agora, o desperdício mais óbvio são os 18 caracteres dedicados a essa sequência. Nós apenas queremos uma função de dígito para código ASCII. Queremos mapear
0
para'0' = 48
, ...,9
para'9' = 57
,10
para'a' = 97
, ...15
para'f' = 102
.Mas agora jogue na mistura uma proibição
base
. Precisamos implementá-lo nós mesmos. A implementação óbvia (nessa direção, a mais fácil) é quek base
é uma dobra{\k*+}*
. A alternativa ligeiramente mais longo é uma iteração simples, que precisa de um cenário base:0\{\k*+}/
. A base 2 é um pouco especial:1$++
é equivalente ao\2*+
mesmo comprimento, e eu adotei essa abordagem.Ambos são mais longos que o 5-char
2base
, mas como agora estamos iterando sobre os valores, podemos extrair a parte 1 para ter um único loop. Nós substituímoscom
para uma boa economia de 1 caractere ou
para uma perda de 1 caractere.
Mas, embora essa perda de 1 caractere pareça um passo atrás, considere o que acontece com esse 0. Ele é multiplicado por 16 e adicionado à saída de conversão base. E a última coisa que fazemos é adicionar um múltiplo de 16 à saída. Para que possamos combinar os dois como
A menor articulação e a esperteza do bônus a tornam mais interessante.
fonte
base
? Todas as outras soluções de usar um equivalente (usos de minashex
, o C uma utilidadesprintf("%x")
, usos HaskellshowHex
)base
é mais longa que essa, porque fiz a maior parte da otimização depois de esclarecer que não poderia usá-la.base
me fornece um valor de 0 a 15, por isso ainda precisa de algum trabalho para converter0-9a-f
. Eu poderia revisitar usandobase
em algum momento, mas não hoje à noite.Python, 92 caracteres
Aqui estão senhoras e senhores, o próprio código!
Marzio deixou uma dica inteligente dizendo que "é altamente compressível manipular um pouco dos números primos". Eu tinha certeza de que o "pouco" não estava em itálico por acidente, então converti a sequência hexadecimal em bits e tentei encontrar padrões. Eu pensei que no começo ele estava representando todos os números primos como bits e concatenando-os juntos, mas isso não deu certo. Então talvez pegue apenas alguns dígitos ou solte todos os zeros na cadeia de bits - ainda não. Talvez seja uma sequência de bits do bit menos significativo dos primeiros primos? Não é bem assim. Mas, eventualmente, encontrei o que funcionava - é uma sequência de bits do segundo bit menos significativo dos primeiros números primos.
Portanto, meu código faz exatamente isso: gerar números primos suficientes, pegar o segundo bit de cada (
i/2%2
), concatená-los como uma sequência binária, depois convertê-lo em base-10 (int(..., 2)
) e depois em base-16 (hex(...)
).fonte
Haskell, 105
Hash SHA1:
a24bb0f4f8538c911eee59dfc2d459194ccb969c
Saída:
Editar: Código:
Eu errei a regra de não usar nenhuma função da biblioteca, exceto a impressão (putStr). Eu diria que operadores matemáticos, embora tecnicamente funcionem, são permitidos.
fonte
C,
136116109103 caracteresOK, então, aqui está o meu esforço:
fonte
printf
retorna o número de caracteres gravados, que sempre é diferente de zero aqui, você pode usar em!printf(...)
vez deprintf(...)*0
salvar um caractere.JS, 764
se considerarmos essa sequência como base64, podemos ter uma versão menor usando a versão un-base-64-ed:
Mas acho que o autor quer que encontremos a lógica por trás dessa sequência não aleatória.
fonte
Mathetmatica - 56
O mistério já está resolvido, então apenas implemente a ideia
fonte
J - 46 char
Não se importe comigo, basta registrar o J golf aqui para posteridade. Não foi inteligente o suficiente para descobrir o truque.
Explicado:
p:i.1007 4
- Crie uma matriz de 1007 linhas e 4 colunas com números inteiros a partir de 0 e, em seguida, pegue os números primos correspondentes a esses números inteiros. Sim,p:
é um J embutido. Sim, somos quatro primos curtos.2|<.-:
- Divida pela metade cada número (-:
), coloque-o no chão (<.
) e pegue o módulo 2 (2|
). É o mesmo que pegar o bit significativo do próximo arrendamento.#.
- Converta cada linha do resultado da base 2 em um número inteiro. Isso nos dá 1007 números de 0 a 15, inclusive.'0123456789abcdef'{~#.
- Pegue cada linha dessa matriz de bits como o binário de um número e use esse número para selecionar na lista de dígitos hexadecimais. Isso converte a cada quatro bits no hexadecimal.1!:2&4
- O intérprete J tem um problema com a saída de strings com mais de 256 caracteres, portanto, temos que enviar esses dados diretamente para o stdout. Você ganha um pouco, perde um pouco.4[
- Finalmente, descarte o resultado1!:2
e, em vez disso, produza os 4 ausentes da saída. Fazemos isso porque é mais curto do que incluir os últimos quatro números primos e retornar um resultado vazio aqui.fonte
JS, 503
Seguindo a ideia @xem:
fonte
Mathematica, 55
Testado no Mathematica 8. Isso faz uso de duas observações:
FromDigits
não verifica realmente o intervalo de dígitos fornecido, portanto, se você o aplicar a uma lista do formulário,{2,0,2,2,0,...}
obterá o dobro do resultado como se estivesse aplicando{1,0,1,1,0,...}
. Mas essa é exatamente a forma gerada peloBitAnd
números primos com 2.fonte