Pamiętam ludzi, którzy mówili, że rozmiar kodu powinien być mierzony w bajtach, a nie w znakach, ponieważ możliwe jest przechowywanie informacji z dziwnymi znakami Unicode, które nie mają żadnego znaczenia wizualnego.
Jak źle może być?
W tym wyzwaniu powinieneś wydrukować następujący tekst Lorem Ipsum, pobrany z Wikipedii :
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Podaj liczbę znaków (nie bajtów) w kodzie. Wygrywa kod z minimalną liczbą znaków.
Twój kod powinien zawierać tylko prawidłowe znaki Unicode, jak opisano tutaj , to znaczy:
- Punkty kodowe do U + 10FFFF
- Bez surogatów (zakres D800 – DBFF jest zabroniony)
- Brak znaków FFFE i FFFF
- Brak znaków zerowych (kod 0)
Jeśli nie można wyświetlić Twojego kodu, podaj wersję ze zmienionymi postaciami obrażającymi i zrzut heksowy.
Niektóre uwagi:
- Dane wyjściowe muszą mieć jedną długą linię (445 znaków). Jeśli twój system nie może tego zrobić (np. Drukujesz na papierze), wyświetl najbliższe przybliżenie. Końcowe łamanie linii nie ma znaczenia.
- Wbudowane funkcje generujące tekst Lorem Ipsum są niedozwolone
- W razie potrzeby podaj prawidłowe kodowanie tekstu dla swojego kodu
code-golf
kolmogorov-complexity
unicode
anatolig
źródło
źródło
=lorem()
w MS Word nie wyświetla właściwej wersjiOdpowiedzi:
Dyalog APL , 123 znaki
Wszystkie oprócz ostatniego okresu są pakowane w 111 znaków 32-bitowych (UTF-32).
'.',⍨
okres dołączony do80⎕DR
8-bitowy (8
) znak (0
) D ata R reprezentacja'
...'
111 znaków Unicode U + 26F4C 9206D D7573 C6F64 32072 12074 C7465 E6F63 46365 27574 96461 37369 10676E 4696C 57320 F6420 56965 46F6D D6574 10726F 9636E 56469 52074 16C20 5726F 107465 F6E696 10620 46174 106E6F 16C6C 106F63 F6261 107369 97369 107475 1696C 107069 52078 F6320 46F6D F6320 16573 E7461 97544 56120 92065 57275 C6F64 92072 57220 86572 5646E 107469 6206E 10756C 57461 C6576 52074 106573 C6C69 4206D 26F6C 56520 77566 107461 C6C75 17020 46169 102E72 56378 56574 97320 F2074 56163 107461 97075 17461 F6E20 27020 56469 102C74 46E75 106E69 106C75 57120 66F20 96369 56420 57265 D2074 96C6C E6120 9206D 36520 16C20 5726F, które wszystkie mieszczą się w zakresie 12074–10756C, a zatem mieszczą się w dozwolonym zakresie OP 10000–10FFFF.źródło
JavaScript (ES7),
326283273249243242 znakówJak to działa
Pierwszym krokiem w mojej technice kompresji jest konwersja całego łańcucha na małe litery (nie jest to obowiązkowe, ale wygląda lepiej) i zamiana każdej pary znaków w
, exum.
(jak również sama spacja) na jej indeks w ciągu plus 2. To sprawia, że tekst jest poprawnym numerem 32:Następnym krokiem jest konwersja każdego przebiegu 4-znakowego na dziesiętny, a następnie uzyskanie znaku w tym punkcie kodu. Można to zrobić za pomocą następującej funkcji:
( Uwaga: Ponieważ wszystkie cyfry mają 2 lub więcej, minimalna możliwa wartość czterech cyfr to 2222₃₂. Jest to równe 95978₁₀ lub 176EA₁₆; dlatego punkty kodowe nigdy nie będą w ograniczonym zakresie).
A teraz mamy nasz skompresowany ciąg:
To 445 znaków skompresowanych do 106 znaków. Dekompresja po prostu odwraca ten proces:
n
z" , exum. ".substr(n,2)
.Jedyną używaną funkcją ES7 jest
**
. Wymień4**8
się65536
uruchomić w przeglądarce, która nie obsługuje jeszcze ES7.źródło
4**8
zamiast65536
.bash + coreutils + gzip + recode, 191 znaków
Łańcuch jest gzipem tekstu interpretowanego jako UTF-16BE, plus kilka dodatkowych bajtów do sparowania z niesparowanymi połówkami zastępczymi. Tr usuwa dodatkowe połówki surogatu.
Ten plik skryptu (lub powłoka, w której wpisano to polecenie) powinien interpretować tekst jako UTF-8, dlatego konieczne jest ponowne kodowanie.
źródło
JavaScript (ES6),
261255254 znakówZaoszczędzono 1 bajt dzięki produktom ETH
Awaria
Ładowność: 148 znaków Unicode
Kod: 107 bajtów
Jak to działa
Najpierw usuwamy wiodące
'L'
z oryginalnej wiadomości, aby pozostać z 444 = 148 * 3 znaków.Bez
'L'
znaków wiodących zestaw znaków składa się z 27 następujących znaków:Każda grupa 3 znaków jest kodowana jako:
gdzie a, b i c są wskaźnikami znaków w powyższym zestawie znaków.
Prowadzi to do punktu kodu Unicode z zakresu od U + 0020 do U + 801F, kończącego się gdzieś w „Unifikowanych ideografach CJK”.
źródło
05AB1E , 319 bajtów
Wykorzystuje kodowanie CP-1252.
Interpretuj następujący ciąg jako liczbę podstawową 36 i koduj do podstawy 214
Po tym my
Z jakiegoś powodu kodowanie nie działało z cyfrą 0 na końcu, dlatego potrzebujemy specjalnego przypadku dla końcowego „.”.
Wypróbuj online!
źródło
Y
aZ
przez1
a2
i zaoszczędzić kilka bajtów. A może może zmienić kolejność 0, 1 i 2, aby pozbyć się tajemniczego specjalnego przypadku?PHP, 247 znaków
połączenie 2 poprzednich wersji
PHP, 261 znaków
Kodowanie $ s zawiera ciąg znaków
Stara wersja PHP, 386 bajtów | Znaków
źródło
C #,
337333331 znaków-4 znaki, zastępując
.
s po „pariatur” i „laborum”!
przed połączeniem znaków do szerokich znaków i dodaniem nowej linii końcowej.-2 znaki poprzez ponowne przypisanie wyjściowego var zamiast dołączania
+=
.Jak to działa:
Łańcuch lorem ipsum został przekonwertowany na ten bałagan, zastępując
.
go!
,dzięki
_
czemu, gdy znaki ascii są umieszczane obok siebie, aby uzyskać szeroki znak, każdy szeroki znak jest pojedynczym znakiem.źródło
ISOLADOS, 44016 bajtów
http://pastebin.com/raw/Y2aAhdpi
Wciśnij kod ASCII dla każdego znaku w łańcuchu Lorem Ipsum, połącz wszystko i wyślij.
źródło
MATL , 354 znaków
To dekoduje z base-94 (używając drukowalnych znaków ASCII, z wyjątkiem pojedynczego cudzysłowu, więc używane są tylko znaki Unicode do 126) na alfabet wymaganych znaków, utworzony przez większość małych liter, niektóre wielkie litery, spację, przecinek i kropkę.
Kompilator online zajmuje kilka sekund.
Wypróbuj online!
źródło
JavaScript (ES5), 342 znaków
Całkiem proste, więc jestem pewien, że jest miejsce na ulepszenia. Zakodowałem każdą parę znaków wyjściowych jako pojedynczy znak Unicode.
źródło
var
?join('')
najoin``
. Jeśli nie, zmień język naJavaScript (ES5)
y/27|0
zamiast~~(y/27)
zaoszczędzić dwa bajty. Można również usunąć0
inx.charCodeAt(0)
..split('').map(function).join('')
może być.replace(/./g,function)
Galaretka , 300 znaków (niekonkurujących?)
Wypróbuj online!
Kodowanie to Jelly .
Dzięki skompresowanym ciągom udało mi się go skompresować o 3 bajty.
źródło