Memperpendek nomor yang panjang

10

Ketika berhadapan dengan angka panjang ketika bermain golf, menurunkan panjang kode Anda bisa sulit, jadi apakah Anda punya tips untuk membuat angka lebih pendek dan lebih mudah dikelola?

Misalnya, kode Pyth berikut mencetak "Hello world", tetapi pada 44 byte, itu tidak memuaskan:

Vcjkj85942000775441864767076 2 7=k+kCiN2)k

Jadi bagaimana saya akan mempersingkat nomor lama , 85942000775441864767076?

Peluruhan Beta
sumber

Jawaban:

10

Waktu yang tepat untuk pertanyaan ini. @isaacg baru saja menambahkan fitur baru hari ini, yang memungkinkan untuk mempersingkat nomor seperti itu.

Teknik dasar adalah untuk mengkonversi nomor ke basis 256 dan mengubahnya menjadi karakter. Anda dapat melakukan ini menggunakan kode ++NsCMjQ256N. Anda kemudian dapat menggunakan string yang dihasilkan dalam kombinasi dengan C, yang melakukan kebalikannya (konversikan karakter ke int dan interpretasikan hasilnya sebagai nomor basis-256). Jadi Anda mendapatkan 13 chars: C"2ìÙ½}ü¶d". Beberapa karakter tidak patut ditulis.

Tetapi perhatikan bahwa saya mengatakan 13 CHAR, bukan byte. Jika saya menyalin karakter dan menghitung dengan https://mothereff.in/byte-counter , dikatakan 13 karakter dan 18 byte. Ini karena pengkodean karakter karakter, yang secara default adalah UTF-8. Dan UTF-8 hanya memungkinkan 2 ^ 7 karakter 1 byte yang berbeda. Setiap char cdengan ord(c) > 127benar-benar disimpan menggunakan dua byte, bukan satu.

Dan inilah fitur baru @ isaacg yang mulai dimainkan. Dia mengubah format kode standar dari UTF-8 ke iso-8859-1. iso-8859 dapat mewakili 256 karakter dengan hanya 1 byte. Jadi sekarang Anda benar-benar dapat mencapai 13 BYTES. Ini hanya mungkin dengan kompiler standar , ini tidak bekerja di kompiler online.

Pertama Anda ingin mengkonversi nomor ke hex-nilai dengan menggunakan script ini: jdm.[2.Hd"0"jQ256. Ini memberimu 12 32 ec d9 bd 07 7d fc b6 64. Setelah itu salin nomor-nomor itu ke file-kode Anda menggunakan hex-editor (mis. Hexedit untuk linux).

demonstrasi hexedit

Memperhatikan:

  • Jelas Anda menghapus "di bagian akhir, jika string adalah bagian terakhir dari kode.
  • Ini hanya berfungsi jika tidak ada 34(byte 22) dalam representasi basis-256 dari nomor Anda, karena ini adalah "char dan akan mengakhiri string. Lolos bekerja meskipun ( 5C 22).
  • Btw, ketika Anda membuka file dengan hex-editor Anda mungkin akan melihat byte 0Aatau 0d 0adi akhir, yang dapat Anda hapus. Ini hanya menunjukkan akhir dari garis.
Jakube
sumber
Saya harus meletakkan penerjemah offline di mesin saya, tetapi ini brilian, terima kasih! :)
Beta Decay
1
String juga tidak dapat menyertakan nilai byte nol 00. Selain itu, \byte 5c, mungkin atau mungkin tidak perlu diloloskan dengan `` lainnya, tergantung pada byte setelahnya.
isaacg