Skracanie długiej liczby


10

Jeśli masz do czynienia z długimi liczbami podczas gry w golfa, zmniejszenie długości kodu może być trudne, więc czy masz jakieś wskazówki, jak skrócić liczbę i ułatwić zarządzanie?

Na przykład następujący kod Pyth wypisuje „Hello world”, ale przy 44 bajtach, co jest niezadowalające:

Vcjkj85942000775441864767076 2 7=k+kCiN2)k

Jak mam skrócić długi numer 85942000775441864767076?

Odpowiedzi:


10

Idealny czas na to pytanie. @isaacg właśnie dodał dziś nową funkcję, która pozwala znacznie skrócić takie liczby.

Podstawową techniką jest konwersja liczby na bazę 256 i konwersja na znaki. Możesz to zrobić za pomocą kodu ++NsCMjQ256N. Następnie możesz użyć wynikowego łańcucha w połączeniu z C, co robi dokładnie odwrotnie (konwertuje znaki na int i interpretuje wynik jako liczbę podstawową-256). Więc masz 13 znaków: C"2ìÙ½}ü¶d". Niektórych znaków nie można wydrukować.

Ale zauważ, że powiedziałem 13 znaków, nie bajtów. Jeśli skopiuję znaki i policzę za pomocą https://mothereff.in/byte-counter , powie 13 znaków i 18 bajtów. Wynika to z kodowania znaków znaków, którym jest domyślnie UTF-8. A UTF-8 dopuszcza tylko 2 ^ 7 różnych znaków 1-bajtowych. Każdy znak cz ord(c) > 127faktycznie jest zapisywany przy użyciu dwóch bajtów zamiast jednego.

A oto nowa funkcja @ isaacg do gry. Zmienił domyślny format kodu z UTF-8 na iso-8859-1. iso-8859 może reprezentować 256 znaków z tylko 1 bajtem. Teraz możesz teraz osiągnąć 13 BYTES. Jest to możliwe tylko w przypadku standardowego kompilatora, ale to nie działa w kompilatorze online.

Pierwszy chcesz przekonwertować numer HEX-wartości za pomocą tego skryptu: jdm.[2.Hd"0"jQ256. To daje ci 12 32 ec d9 bd 07 7d fc b6 64. Następnie skopiuj te liczby do pliku kodu za pomocą edytora szesnastkowego (np. Hexedit dla systemu Linux).

demonstracja hexedit

Ogłoszenie:

  • Oczywiście usuwasz "na końcu, jeśli ciąg znaków jest ostatnią częścią kodu.
  • Działa to tylko wtedy, gdy nie ma 34(bajtu 22) reprezentacji liczb podstawowych w 256, ponieważ jest to "znak char i zakończy ciąg. Funkcja Escaping działa ( 5C 22).
  • Przy okazji, po otwarciu pliku w edytorze szesnastkowym prawdopodobnie zobaczysz bajt 0Alub 0d 0ana końcu, który możesz usunąć. To tylko wskazuje koniec linii.

Będę musiał zainstalować tłumacza offline na moim komputerze, ale to jest wspaniałe, dzięki! :)
Beta Decay

1
Ciąg nie może również zawierać bajtu zerowego wartości 00. Ponadto \bajt 5cmoże być lub nie musi być poprzedzony innym znakiem ``, w zależności od bajtu po nim.
isaacg
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.