Accorciare un numero lungo


10

Quando si ha a che fare con numeri lunghi quando si gioca a golf con il codice, ridurre la lunghezza del codice può essere difficile, quindi hai qualche consiglio per rendere un numero più breve e più facile da gestire?

Ad esempio, il seguente codice Pyth stampa "Hello world", ma a 44 byte, non è soddisfacente:

Vcjkj85942000775441864767076 2 7=k+kCiN2)k

Quindi, come accorcerei il numero lungo 85942000775441864767076?

Risposte:


10

Tempismo perfetto per questa domanda. @isaacg ha appena aggiunto una nuova funzionalità oggi, che consente di abbreviare immensamente tali numeri.

La tecnica di base è convertire il numero in base 256 e convertirlo in caratteri. Puoi farlo usando il codice ++NsCMjQ256N. È quindi possibile utilizzare la stringa risultante in combinazione con C, che fa esattamente il contrario (convertire i caratteri in int e interpretare il risultato come numero base-256). Così si ottiene 13 caratteri: C"2ìÙ½}ü¶d". Alcuni caratteri non sono stampabili.

Ma nota che ho detto 13 caratteri, non byte. Se copio i caratteri e li conto con https://mothereff.in/byte-counter , si dice 13 caratteri e 18 byte. Ciò è dovuto alla codifica dei caratteri dei caratteri, che è UTF-8 per impostazione predefinita. E UTF-8 consente solo 2 ^ 7 caratteri a 1 byte diversi. Ogni carattere ccon ord(c) > 127viene effettivamente archiviato usando due byte anziché uno.

E qui entra in gioco la nuova funzionalità di @ isaacg . Ha cambiato il formato di codice predefinito da UTF-8 a iso-8859-1. iso-8859 può rappresentare 256 caratteri con solo 1 byte. Quindi ora puoi effettivamente raggiungere 13 BYTES. Questo è possibile solo con il compilatore standard , tuttavia non funziona nel compilatore online.

In primo luogo si vuole convertire il numero in hex-valori utilizzando questo script: jdm.[2.Hd"0"jQ256. Questo ti dà 12 32 ec d9 bd 07 7d fc b6 64. Successivamente copia quei numeri nel tuo file di codice usando un editor esadecimale (ad es. Hexedit per Linux).

dimostrazione hexedit

Avviso:

  • Ovviamente rimuovi il "alla fine, se la stringa è l'ultima parte del codice.
  • Funziona solo se non c'è 34(il byte 22) nella rappresentazione base-256 dei tuoi numeri, poiché questo è il "carattere e termina la stringa. Escaping funziona però ( 5C 22).
  • A proposito, quando apri un file con un editor esadecimale probabilmente vedrai il byte 0Ao 0d 0aalla fine, che puoi rimuovere. Questo indica solo la fine della linea.

Dovrò mettere l'interprete offline sulla mia macchina, ma questo è geniale, grazie! :)
Decadimento beta

1
Inoltre, la stringa non può includere il byte null, di valore 00. Inoltre, \byte 5c, potrebbe non essere necessario eseguire l'escape con un altro '', a seconda del byte successivo.
isaacg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.