Japt , 43 bajty
"Ýûÿ©ÿßY÷ß"®c s4äëAU ¬£2839¤ë4X÷d0S1U
Zawiera niektóre niedrukowalne. Wypróbuj online!
Tallies: 13 bajtów skompresowanych danych, 9 bajtów na dekompresję i 21 bajtów na dane wyjściowe.
Wyjaśnienie
Nieskluczony kod:
"Ýûÿ©ÿßY÷ß"® c s4à ¤ ëAU ¬ £ 2839¤ ë4Xà · d0S1U
"Ýûÿ©ÿßY÷ß"mZ{Zc s4} s2 ëAU q mX{2839s2 ë4X} qR d0S1U
Istnieją dokładnie 4 różne możliwości wierszy: ( #reprezentuje cyfrę)
#
#
# #
###
W ten sposób każda liczba może być zapisana jako zestaw pięciu cyfr podstawowych 4. Ponieważ każda liczba może być następnie zapisana w 10 bitach, w sumie jest to 100 bitów, co odpowiada 13 bajtom. Pominę proces kompresji i wyjaśnię dekompresję.
mZ{Zc s4}
mZ{ } // Replace each character Z in the compressed string with the following:
Zc // Take the char-code of Z.
s4 // Convert to a base-4 string.
Po dekompresji 13-bajtowy skompresowany ciąg wygląda następująco:
3131332333332111200122213333313321011121213133133133
Zauważ, że to się nie powiedzie, jeśli którykolwiek z 4-cyfrowych przebiegów zacznie się od 0, ponieważ zera wiodące byłyby pominięte podczas s4uruchamiania. Możemy to naprawić poprzez 0reprezentację # , która pojawia się tylko trzy razy i żadna z nich nie spada na początku 4-cyfrowego przebiegu.
s2 // Slice off the first two chars of the result.
Ok, więc aby nasz 50-cyfrowy ciąg ładnie kompresował się w kawałkach po 4, musieliśmy dodać dwie dodatkowe cyfry. Dodanie ich na początku sznurka oznacza, że możemy je odciąć pojedynczo ¤.
ëAU // Take every 10th (A) char in this string, starting at index <input> (U).
Żenujące jest to, że Japt nie ma wbudowanej funkcji dzielenia łańcucha na plasterki o długości X. Ma jednak wbudowaną funkcję pobierania co X znaku, więc możemy przechowywać wszystkie dane, najpierw kodując wszystkie górne rzędy, a następnie wszystkie drugie rzędy itp.
Więc teraz mamy 5-cyfrowy ciąg kodujący cyfrę, którą chcemy utworzyć, np . 32223Dla 0.
q mX{2839s2 ë4X} qR
q // Split the resulting string into chars.
mX{ } // Replace each char X with the result of this function:
2839s2 // Convert the magic number 2839 to a binary string.
ë4X // Take every 4th char of this string, starting at index X.
qR // Join the result with newlines.
Aby wyjaśnić magiczną liczbę, powróć do czterech różnych rzędów. Jeśli zastąpi #się 1i z 0, masz
100
001
101
111
Przełożenie tego, a następnie połączenie w pojedynczy ciąg daje nam 101100010111. Konwertuj na dziesiętne i, voilà, masz 2839. Odwrócenie procesu odwzorowuje cyfry0123 na cztery pokazane powyżej wiersze binarne.
Prawie skończone! Teraz pozostaje tylko dodać spacje i cyfry:
d0S1U // In the resulting string, replace 0 with " " (S) and 1 with <input> (U).
A presto, niejawna produkcja zajmuje się resztą. Przykro mi, że to wyjaśnienie jest tak długie, ale nie widzę żadnego prawdziwego sposobu na grę w golfa bez uczynienia go mniej zrozumiałym (jeśli jest zrozumiałe ...)