Скорочення довгого числа


10

Якщо мати справу з великими цифрами, коли гольф з кодом, зменшити довжину коду може бути складно, тому у вас є поради щодо скорочення числа та їхнього простого управління?

Наприклад, наступний код Pyth друкує "Hello world", але в 44 байти, це незадовільно:

Vcjkj85942000775441864767076 2 7=k+kCiN2)k

То як би я скоротив довге число 85942000775441864767076,?

Відповіді:


10

Ідеальний термін для цього питання. Сьогодні @isaacg додав нову функцію, яка дозволяє дуже скоротити такі числа.

Основна методика - перетворити число на базу 256 і перетворити його на символи. Це можна зробити за допомогою коду ++NsCMjQ256N. Потім можна використовувати отриманий рядок у поєднанні з C, що робить прямо протилежне (конвертувати символи в int та інтерпретувати результат як число базового 256). Таким чином , ви отримуєте 13 символів: C"2ìÙ½}ü¶d". Деякі символи недруковані.

Але зауважте, що я сказав 13 ЧАРКІВ, а не байтів. Якщо я скопіював символи і порахував https://mothereff.in/byte-counter , він говорить про 13 символів і 18 байт. Це обумовлено кодуванням символів символів, яке за замовчуванням є UTF-8. І UTF-8 дозволяє лише 2 ^ 7 різних 1-байтових символів. Кожен char cіз ord(c) > 127фактично зберігається, використовуючи два байти замість одного.

І ось тут з'явилася нова функція @ isaacg . Він змінив формат коду за замовчуванням з UTF-8 на iso-8859-1. iso-8859 може представляти 256 символів із лише 1 байтом. Тож тепер ви можете фактично досягти 13 БЮТІВ. Це можливо лише у стандартному компіляторі, але це не працює в онлайн-компіляторі.

Спочатку ви хочете , щоб перетворити число в шістнадцяткові значення за допомогою цього скрипта: jdm.[2.Hd"0"jQ256. Це дає вам 12 32 ec d9 bd 07 7d fc b6 64. Потім скопіюйте ці номери у свій кодовий файл за допомогою шестигранного редактора (наприклад, hexedit для linux).

шестигранна демонстрація

Зверніть увагу:

  • Очевидно, ви видаляєте "в кінці, якщо рядок є останньою частиною коду.
  • Це працює лише в тому випадку, якщо в представленні базових-256 ваших чисел немає 34(байт 22), оскільки це "символ і закінчить рядок. Утеча працює, хоча ( 5C 22).
  • До речі, коли ви відкриєте файл із шестигранним редактором, ви, ймовірно, побачите байт 0Aабо 0d 0aв кінці, який ви можете видалити. Це вказує лише на кінець рядка.

Мені доведеться поставити офлайн-перекладача на свою машину, але це геніально, дякую! :)
бета-розпад

1
Рядок також не може включати нульовий байт значення 00. Крім того, \байт 5cможе бути або не потребувати уникнення за допомогою іншого ``, залежно від байту після нього.
isaacg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.