Encurtando um número longo

10

Ao lidar com números longos no código de golfe, pode ser difícil reduzir o tamanho do seu código. Você tem dicas para tornar um número mais curto e fácil de gerenciar?

Por exemplo, o seguinte código Pyth imprime "Hello world", mas com 44 bytes, isso é insatisfatório:

Vcjkj85942000775441864767076 2 7=k+kCiN2)k

Então, como diminuiria o número longo 85942000775441864767076?

Beta Decay
fonte

Respostas:

10

Momento perfeito para esta pergunta. A @isaacg acabou de adicionar um novo recurso hoje, que permite reduzir imensamente esses números.

A técnica básica é converter o número na base 256 e convertê-lo em caracteres. Você pode fazer isso usando o código ++NsCMjQ256N. Você pode usar a sequência resultante em combinação com C, que faz exatamente o oposto (converter caracteres em int e interpretar o resultado como número da base 256). De modo a obter 13 caracteres: C"2ìÙ½}ü¶d". Alguns dos caracteres não são imprimíveis.

Mas observe que eu disse 13 CHARS, não bytes. Se eu copiar os caracteres e contar com https://mothereff.in/byte-counter , ele diz 13 caracteres e 18 bytes. Isso ocorre devido à codificação de caracteres dos caracteres, que é UTF-8 por padrão. E o UTF-8 permite apenas 2 ^ 7 caracteres diferentes de 1 byte. Cada caractere ccom ord(c) > 127é armazenado usando dois bytes em vez de um.

E aqui está o novo recurso de @ isaacg . Ele mudou o formato de código padrão de UTF-8 para iso-8859-1. O iso-8859 pode representar 256 caracteres com apenas 1 byte. Então agora você pode alcançar 13 BYTES. Isso só é possível com o compilador padrão , mas isso não funciona no compilador online.

Primeiro você deseja converter o número para valores hexadecimais usando este script: jdm.[2.Hd"0"jQ256. Isso te dá 12 32 ec d9 bd 07 7d fc b6 64. Depois copie esses números no seu arquivo de código usando um editor hexadecimal (por exemplo, hexedit para linux).

demonstração hexedit

Aviso prévio:

  • Obviamente, você remove o "no final, se a string for a última parte do código.
  • Isso funciona apenas se não houver 34(o byte 22) na representação base-256 de seus números, pois esse é o "caractere e terminará a sequência. Escapar funciona embora ( 5C 22).
  • Aliás, quando você abre um arquivo com um editor hexadecimal, provavelmente verá o byte 0Aou 0d 0ano final, que pode ser removido. Isso indica apenas o fim da linha.
Jakube
fonte
Vou ter que colocar o intérprete offline na minha máquina, mas isso é brilhante, obrigado! :)
Decay Beta
11
A sequência também não pode incluir o byte nulo, do valor 00. Além disso, \byte 5c, pode ou não precisar ser escapado com outro ``, dependendo do byte após ele.
Isaacg