Com base nesta pergunta Math.SE ; número copiado desta resposta . Número originalmente de um vídeo Numberphile , é claro.
Sua tarefa é gerar o seguinte número primo de 1350 dígitos:
888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888111111111111111111111111888888111111111111111111111111888888111111811111111118111111888888111118811111111118811111888888111188811111111118881111888888111188811111111118881111888888111888811111111118888111888888111888881111111188888111888888111888888111111888888111888888111888888888888888888111888888111888888888888888888111888888111888888888888888888111888888811188888888888888881118888188811188888888888888881118881188881118888888888888811188881118888111888888888888111888811111888811118888888811118888111111188881111111111111188881111111118888111111111111888811111111111888811111111118888111111111111188881111111188881111111111111118888811118888811111111111111111888881188888111111111111111111118888888811111111111111111111111888888111111111111111111111111118811111111111111111111111111111111111111111111062100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
Opcionalmente, você pode incluir novas linhas na saída.
Regras
- Isso é complexidade kolmogorov , portanto, não há entrada.
- Seu programa deve terminar dentro de uma hora em um computador padrão - se estiver próximo, usarei o meu para testes. Se o seu programa for executado por mais de um minuto ou não terminar no TIO, inclua o horário no seu computador.
- Isso é código-golfe , então o código mais curto, em bytes, vence.
code-golf
kolmogorov-complexity
primes
Stephen
fonte
fonte
Respostas:
Geléia ,
7471696866 bytesExperimente online!
Como funciona
O literal
“©ạ-3ṗÇñ"ỤḍV8żṢ?ḤsMVE[,Ṃƭ"ḞÇsẇʂ(ụFsẠʂẆŀṣ’
substitui todos os caracteres com seus pontos de código na página de códigos do Jelly e interpreta o resultado como um número de base 250 (bijetivo), produzindo o número inteiro a seguir.Em seguida,
ḃ19
converte esse número na base bijetiva 19, produzindo a seguinte matriz de dígitos.Agora,
ĖŒṙ
enumera os dígitos e executa decodificação no comprimento da execução, produzindo a seguinte matriz.Em seguida,
ị⁾81
indexa a sequência 81 , substituindo números ímpares pelo caractere 8 , número par pelo caractere 1 . Depois,s30
divide o resultado em pedaços de comprimento 30. Exibindo um pedaço por linha, o resultado é o seguinte.Agora,
m0
concatena a matriz de partes com uma cópia invertida de si mesma. Depois,Z
fecha o resultado, transpondo linhas e colunas.0
é um nilad inseparável; portanto, o resultado de antes é impresso (sem quebras de linha) e o valor de retorno é definido como 0 .62
é outro nilad não analisável; portanto, o resultado de antes ( 0 ) é impresso e o valor de retorno é definido como 62 .ȷ446
é mais uma nilad inseparável. 62 é impresso e o valor de retorno é definido como 10 446 .Por fim,
‘
incrementa o resultado. O resultado final ( 10 446 + 1 ) é impresso quando o programa termina.fonte
[8, 1]
... Oh, isso é esperto! Estou roubando esse truque, espero que você não se importe :))) e, em seguida, adicione todas essas coisas estranhas do 06210..01. bom :)SOGL V0.12 ,
81787573 bytesExperimente aqui!
Explicação:
fonte
Geléia , 136 bytes
Experimente online!
Explicação (números encurtados)
-121 bytes graças a Dennis usando
“...’
literais em vez de números normaisfonte
“...’
literais economizam um monte de bytes. tio.run/…0;6;2;1;
parece terrivelmente prolixo.Geléia ,
133 8473 bytesExperimente online! (rodapé formata o número decimal com as dimensões que produzem o brasão).
Quão?
Uma forma codificada na execução de um formato binário do lado esquerdo do brasão de armas
8
e1
até a linha anterior àquela que começou0621
refletida com a0621
adicionada e, em seguida, multiplicada por 10 446 e incrementada.fonte
Carvão ,
10710498968779 bytesExperimente online! Link para código detalhado para explicação
fonte
Próton , 368 bytes
Experimente online!
fonte
Ruby , 180 bytes
Experimente online!
178 bytes + 2 bytes para
-Kn
(força a codificação ASCII.)43 caracteres na maioria imprimíveis entre as primeiras aspas. Hexdump:
Quão?
Todo mundo estava usando a codificação de comprimento de execução, então eu queria tentar algo diferente.
A versão formatada da "imagem" do primo pode ser separada em duas partes - uma grade 30x30 de 8 e 1 e uma segunda seção, na maioria das vezes, zeros que podem ser codificados. Focando a primeira parte, observamos que é simétrica no centro; portanto, se pudermos produzir a metade esquerda, podemos apenas imprimir metade de cada linha com seu reverso.
Metade de uma linha tem 15 caracteres. Se substituirmos os 8 por zeros, cada linha poderá ser interpretada como um número binário de 15 bits. Convenientemente, na maioria das vezes a distância de edição entre cada linha consecutiva é pequena, então decidi implementar minha solução armazenando a primeira linha
s
(888888888888888
que passa a ser 0) e aplicando uma série de operações de inversão de bitss
, imprimindo o resultado sempre .Como cada linha tem 15 bits de comprimento, codifiquei essas operações como dígitos hexadecimais - por exemplo, se a operação for
b
(ou 11), invertemos o bit 11. Algumas linhas diferem em mais de um bit, portanto, exigem uma sequência de caracteres hexadecimais. dígitos. Temos um pouco de sobra (f
) para que possamos usá-lo como um delimitador entre essas strings e também como um valor "não fazer nada". Exemplo abaixo (você pode ver essas linhas na postagem mencionada na pergunta):Para juntar tudo isso, codificaríamos
0123456789ab
, em seguida , nos separaríamos , semf
fazer nada comf
, então5
. Isso funciona porque faremos.split(?f)
mais tarde para obter cada conjunto de operações por linha, o que renderá["0123456789ab", "", "5"]
e""
será um não operacional.A diferença entre as linhas 3 e 4 acima é de longe o conjunto mais longo de edições, e a distância de edição entre duas linhas consecutivas é geralmente de 0 a 2, então eu diria que essa codificação é razoavelmente barata, embora eu tenha certeza de que pode ser melhorado.
Toda a cadeia codificada acaba sendo
fff0123456789abff5f6f7ff8f4f3f012fff8bfef7af69df458cf01237bf6af59f48f237f16f045f3f12f0
(86 bytes), que obterá toda a grade 30x30. Mas ainda não terminamos ...Dígitos hexadecimais podem ser representados por 4 bits (
b
->1100
, etc.) Isso significa que, se estivermos dispostos a codificar nossa string 4 bits por vez, em vez de usar bytes, podemos cortar o comprimento da string pela metade. Foi o que eu fiz - o hexdump mostra a string representada em 43 bytes. Depois disso, é só uma questão de usar bacana de Ruby String # descompactar comH*
(interpretar como string hexadecimal, alta mordidela primeiro) para expandir a seqüência de 43 bytes para a versão 86-byte que conhecemos e amamos, e loop para cada conjunto de operações lançando bits - para nossa string armazenadas
e uma operaçãoc
que fazemoss ^ 2**c.to_i(16)
para virar o bit correspondente.Após a conclusão de cada conjunto de edições, aumentamos o binário resultante para 15 bits, alternamos todos os 0 para 8 e imprimimos o resultado e seu inverso. Como observado anteriormente, a parte do número após a grade 30x30 pode ser codificada, então fazemos isso como
puts'0621'+?0*445+?1
.A sequência codificada final não tem possibilidade de trabalhar no TIO, portanto, a versão do TIO usa escapes, que ainda funcionam, mas são mais longos.
fonte
Python 2 ,
760523329205196 bytes-237 bytes graças a Stephen. -124 bytes graças a Jonathan Frech.
Experimente online!
fonte
8
e1
e combinando621
621
. Obrigado!CJam,
532412340231210209 bytesExperimente Online
A codificação de execução expandida da base 92 (a Base 250 levou a caracteres multibyte, portanto, foi necessário ajustar). Além disso,
4341089843357287864910309744850519376
é expandido da base 92 e convertido em binário. Um 1 significa que o comprimento da execução é de dois dígitos, 0 significa que é um dígito. Por exemplo, os 4 primeiros dígitos da representação binária são 1101 porque as quatro primeiras execuções são[93,8],[24,1],[6,8],[24,1]
(93 8, 24 1, etc ...)fonte
JavaScript,
454450332207204 bytes-4 bytes graças a Stephen. -125 bytes graças a Shaggy e Dom Hastings.
Há um monte de imprimíveis nesta resposta, então aqui está um hexdump:
fonte
+'1'
, pois já é umString
e+'0621'
pode ser+0+621
![...`]
faz-me tão loucoJavaScript (ES6),
206205204203198197194 bytesSurgiu isso enquanto trabalhava na solução da i cri everytim , e achava que era diferente o suficiente para garantir a publicação por si própria.
Isso inclui uma carga de não-imprimíveis entre
]
e,
siga o link do TIO abaixo para visualizá-lo com escapes Unicode (cada sequência\u
seguida por 4 dígitos conta como 1 byte).Experimente online
fonte
MATLAB / oitava ,
319318 bytesEsta é a minha primeira tentativa neste desafio. Ainda um pouco grande e provavelmente existem maneiras mais eficientes de fazer isso, mas pensei em publicá-lo de qualquer maneira, pois o método era mais interessante do que apenas compactá-lo.
Experimente online!
O método usado aqui é fazer uso de um tipo de esquema de codificação de comprimento de execução.
Começamos com o número original e contamos o número de dígitos consecutivos. Eles são escritos no resultado abaixo como a contagem seguida diretamente pelo dígito (espaço separado para maior clareza).
Se qualquer um dos valores for maior que 95, dividimos isso em vários blocos de 95 ou menos - isso só acontece para os 445 0, que se tornam quatro conjuntos de 95 0 e um conjunto de 65 0. Também preenchemos contagens inferiores a 10 com um 0 para tornar todos os elementos com três caracteres. Isso gera os espaços removidos:
Em retrospectiva, neste ponto, eu poderia ter feito esse passo antes de juntar tudo, mas como você vive e aprende. Fazemos algo inteligente que é fazer a contagem de cada grupo (2 dígitos) e adicionamos 31. Como todos eles são <96, o número resultante é o valor ASCII para um caractere imprimível (32 a 126). Dando-nos conta de:
Depois de um pouco de reformulação no MATLAB para torná-lo mais favorável à decodificação e também escapar
'
caracteres com''
(caso contrário, o MATLAB divide literais de strings por lá), ficamos com a string inteligente:Essa é a raiz do código. No código, tudo o que faço é remodelar a matriz em uma sequência 2D com 128 pares de caracteres. Para cada par, o primeiro caractere 31 subtraiu e, em seguida, o segundo caractere é exibido tantas vezes.
O resultado é o primo original:
Edições:
fonte
05AB1E , 76 bytes
Experimente online!
Roubou isso de Dennis:
Note que sempre alterna entre 8 e 1, então contei os comprimentos de cada execução (Base 20):
Juntou tudo e converteu em um número inteiro de base 10:
Comprimiu ainda mais na base-255:
Depois de criar o bit compactado ... Nós apenas precisamos manipulá-lo de volta ao original.
Saída final:
fonte
C (gcc) , 277 bytes
Tenho a sensação de que a corda pode ser encurtada de alguma forma.
Experimente online!
fonte
Perl 5 , 307 bytes
Experimente online!
fonte
Chiclete , 88 bytes
Experimente online!
fonte
Ruby , 194 bytes
A parte superior é codificada em RLE, o restante é simplesmente codificado.
Experimente online!
fonte
Kotlin , 339 bytes
Experimente online!
fonte
CJam (
10881 bytes)Demonstração online
No caso de codificação de caracteres atrapalhar o acima, aqui está codificado em xxd:
A execução inicial de 8s e 1s é dividida na metade esquerda e no comprimento da execução codificado como apenas os comprimentos das execuções alternadas. Execuções de mais de 24 são divididas em execuções de no máximo 24, separadas por execuções de 0, para que os comprimentos possam ser codificados na base 25 e depois na codificação base 256 para compactá-los.
fonte
JavaScript (ES2017), 287 bytes
Usa uma abordagem ligeiramente diferente para a resposta de @icrieverytim . -10 bytes graças à sugestão de @Shaggy de usar em
replace
vez dematch
!fonte
/// , 260 bytes
Experimente online!
Nada terrivelmente interessante, apenas alguma compressão.
fonte
Mathematica, 192 bytes
Veja: http://reference.wolfram.com/language/ref/Compress.html
fonte
Python 2 ,
191190188 bytesExperimente online!
O mesmo princípio da minha resposta aqui
fonte