Wyzwanie
Twoim zadaniem jest zakodowanie liczby całkowitej jako ciągu znaków ASCII , a następnie pomyślne jej odkodowanie po losowym przetasowaniu tego ciągu.
Napiszecie dwa programy / funkcje , które będą nazywane Enkoderem i Dekoderem .
Enkoder
- Wejście: liczba całkowita mieści się w zakresie .
- Wyjście: string od ASCII znaków (niekoniecznie do druku).
Dekoder
- Dane wejściowe: losowa permutacja ciągu .
- Dane wyjściowe: liczba całkowita .
Punktacja
Niech być maksymalna długość od s we wszystkich możliwych wartości n . Jeśli enkoder działa niedeterministycznie (co jest dozwolone, patrz poniżej), wówczas A będzie maksymalną długością s, która może wystąpić (ewentualnie ∞ ).
Niech jest długością kodera w bajtach i długościowego dekodera w bajtach.
Zatem twój wynik to .
Zwycięstwo przyznawane jest do złożenia najniższego wyniku .
Limit czasu
Istnieje nieco arbitralny limit 1 minuty na czas wykonania zarówno Enkodera, jak i Dekodera dla pojedynczej skrzynki testowej (tj. Pojedynczej wartości ).
Celem jest uniknięcie rozwiązania, które okaże się brutalne w kodowaniu, poprzez wyliczenie wszystkich sekwencji o określonych właściwościach. Jeśli twoje rozwiązanie robi coś mądrzejszego, najprawdopodobniej będzie pasować do ograniczenia czasowego i zostanie uznane za prawidłowe. Podobnie, jeśli działa on na TIO dla niektórych losowo wybranych wartości , zostanie uznany za prawidłowy. W przeciwnym razie przetestuję to na moim komputerze, ale zauważ, że jeśli twoje rozwiązanie jest czystą brutalną siłą, prawie na pewno zawiedzie.
Zasady
- Koder i dekoder musi być napisana w tym samym języku .
- Dekoder wyjściowy musi określać prawidłowe całkowitą dla wszystkich możliwych permutacji łańcucha zwrócony przez koder .
- Enkodera i dekodera są nie wolno informacji zakładowego w jakikolwiek sposób (np za pomocą zmiennych globalnych lub pliki).
- Wyjście enkodera nie musi być deterministyczne (to znaczy, to samo wejście może generować różne ciągi wyjściowe, jeśli enkoder jest uruchamiany wiele razy), ale dekoder musi zawsze odgadnąć poprawną liczbę całkowitą .
- Koder i dekoder może podjąć i przywrócić całkowitą w dowolny sposób (na przykład, jeśli jest w porządku w wejściowym być
14
,"14"
lub[1,4]
). - Koder może dać na wyjściu łańcuch albo drukowanie go na
stdout
lub przez powrót łańcuch, listę / układ znaków lub lista / tablicę liczb w zakresie ; zauważ, że Dekoder otrzyma jako dane wejściowe permutację zwróconą przez Enkoder , więc powinien zaakceptować ciąg w tym samym formacie co . - Standardowe luki są zabronione.
- Jeśli to możliwe, wyjaśnij, jak działa Twój kod i dlaczego wynik, który uważasz za prawidłowy.
Przykład
Załóżmy, że .
- Nadajnika odbiera
14
jako wejścia. Może generować"qwerty"
.- Dekoder odbiera permutacji
"qwerty"
jako dane wejściowe, na przykład"tweyqr"
. Musi być wyprowadzany14
(w dowolnym dogodnym formacie).
Koder może być zwracane [113,119,101,114,116,121]
, jak również, w przypadku których dekoder otrzymałby (na przykład) [116,119,101,121,113,114]
.
Zauważ, że ciąg zwracany przez Enkoder może również zawierać niedrukowalne znaki ASCII (ale zawsze w zakresie [0x00, ..., 0x7F]
).
Odpowiedzi:
Galaretka , (17 bajtów + 18 bajtów) × długość 6 = 210 punktów
Wypróbuj online! (lub z dodatkowymi informacjami debugowania)
Mając okazję do rozwiązania tego wyzwania, mającego na celu spełnienie warunków zwycięstwa, pomyślałem, że byłoby interesujące, aby wybrać hipotetyczny alternatywny warunek zwycięstwa: golf golfowy, biorąc pod uwagę minimalną możliwą maksymalną długość wyniku.
Wyjaśnienie
Kodowanie
Pierwszym krokiem w kodowaniu jest przedstawienie danych wejściowych jako podstawy 36 (
b36
). 36 6 = 2176782336> 2147483647, więc wynik będzie maksymalnie 6 cyfr, z których każda mieści się w zakresie 0–35.Następnie przekształcamy to w reprezentację zawierającą 6 różnych cyfr. Istnieje wiele możliwych algorytmów, ale jednym z nich jest dodanie 1 do najmniejszej cyfry, 2 do drugiej-najmniejszej, 3 do trzeciej-najmniejszej i tak dalej. Oznacza to, że jeśli dwie cyfry będą takie same, jedna z nich zostanie arbitralnie uznana za mniejszą, a zatem staną się inne; i oczywiście ten algorytm nie może spowodować, że dwie różne cyfry staną się takie same. Aby przedstawić to w Jelly, używamy
Ụ
(„sortuj indeksy według wartości”), aby uzyskać listę indeksów w posortowanej kolejności;Ụ
ponownie, aby to odwrócić, skutecznie mapując każdy element oryginału do jego pozycji w posortowanej kolejności; iµ…+
aby dodać oryginał do nowej listy. Wynik jest reprezentacją liczby wejściowej jako sześciu różnych cyfr w zakresie 1–41 (minimum 0 + 1, maksimum 35 + 6).Następnie podzieliliśmy to na jeszcze jedną formę: posortowaną listę cyfr w zakresie 1–41, wraz z liczbą od 1 do 720, która reprezentuje, w której z 720 możliwych permutacji były cyfry. (
Œ¿
IṢ
wyodrębnij numer permutacji i posortuj odpowiednio listę).Na koniec konwertujemy liczbę od 1 do 720 na podstawę 3 (
b3
), odwracamy ją (U
) i kodujemy sześć podstawowych 3 cyfr i sześć 1–41 cyfr, pakując je w jeden znak ASCII za pomocą odwrotnego divmod (wartość znak mod 3 to podstawowa 3 cyfra, wartość podzielona przez 3 to 1–41 cyfra). Możliwy zakres wyników to (1 × 3) + 0 = 3 co najmniej, i (41 × 3) + 2 = 125 maksymalnie, pasując do naszego zakresu ASCII. Pakowanie odbywa się za pośrednictwem×3
i+
wraz z dodatkowym,µ
aby upewnić się, że każde polecenie działa na odpowiednim bicie danych. (Jest tu trochę sztuczki golfowej, polegającej na tym, że mnożymy przez 3 przed wyodrębnieniem permutacji; to oszczędza potrzeby wydawania bajtu na postać grupującą.)Nawiasem mówiąc, powodem do odwrócenia liczby podstawowej 3 jest to, że może ona zawierać mniej cyfr niż liczba 1–41. (Nie może mieć więcej; najmniejsza liczba, dla której n !> 3 n jest nieco powyżej 6.) Galaretka skutecznie wstawia końcowe zera, dodając do siebie dwie liczby o różnych długościach, aby je dopasować; końcowe zera wpłynie na interpretację liczby, ale wiodące zera nie będzie, więc odwrotna jest używany w celu zapewnienia, że dodatkowe zera skończyć gdzieś, że nie będzie bałagan naszej odpowiedzi.
Rozszyfrowanie
Pierwszym krokiem w dekodowaniu jest wyodrębnienie dwóch liczb (podstawowej liczby 3 i liczby 1–41). Ich cyfry możemy łatwo odczytać za pomocą odpowiednio div (
:3
) i modulo (%3
), ale jak sprawdzić, w jakiej kolejności są? Cóż, liczby 1–41 miały cyfry w posortowanej kolejności, a cyfry w odpowiednich pozycjach dwóch liczb były przechowywane w tych samych znakach; w ten sposób możemy ustalić, w jakiej kolejności numery 1–41 zostały wtasowane (patrząc na ich względne wartości) i wiemy, że cyfry liczby 3 muszą być przetasowane w ten sam sposób. W rzeczywistości, ponieważ znaki naszego kodowania ASCII są sortowane w ten sam sposób, co cyfry 1–41 (wszystkie były odrębne i mają większe znaczenie niż liczby podstawowe 3),Ṣ
. Tak więc obie ekstrakcje rozpoczynają się odṢ
, a następnie%3
lub:3
odpowiednio.Podczas gdy cyfry 1–41 są nadal posortowane, mamy bardzo wygodny / zwięzły sposób powrotu do 0–35 cyfr podstawy 36; wystarczy odjąć 1 od pierwszego, 2 od drugiego, 3 od trzeciego i tak dalej. W Galaretce możemy to zrobić za pomocą
_J
(„odejmij indeks”).Tymczasem w drugiej gałęzi dekodowania odwracamy cyfry liczby 3 z powrotem do porządku (
U
) i przekształcamy ją z bazy 3 z powrotem w indeks permutacji za pomocąḅ3
.Następnie możemy połączyć dwie gałęzie z
œ?Ç
;œ?
oznacza „permute, biorąc pod uwagę ten wskaźnik permutacji”, iÇ
oznacza „wynik zastosowania powyższej linii”, tj. to mówi Jelly, aby uruchamiała obie linie osobno na tym samym wejściu.Mamy teraz cyfry oryginalnego numeru, w bazie 36 (z powodu
_J
) i w oryginalnej kolejności (z powoduœ?
), więc możemy po prostu wykonaćḅ36
konwersję z bazy 36 z powrotem na jedną liczbę całkowitą.Komentarz
TIO! powyższy link używa 312699167 jako numeru do zakodowania. Ta liczba w podstawie 36 jest
[5, 6, 6, 8, 7, 35]
, a zatem pokazuje wszystkie aspekty kodowania: 35 testuje limit zakresu 0–127, który mamy; duplikat 6s testuje rozdzielczość identycznych cyfr w oryginalnej bazie 36; a fakt, że cyfry są prawie (ale nie do końca) posortowane, oznacza, że liczba permutacji jest bardzo mała, co daje jej o wiele mniej cyfr niż podstawowa liczba 36, a zatem pokazuje potrzebę odwrócenia jej przed dodaniem jej do oryginału.To naprawdę wygodne, jak wszystkie stałe tutaj pasują do siebie. 36 6 jest tylko wystarczająco wysoki, aby zmieścić 2 31 , 3 6 jest tylko wystarczająco wysoki, aby zmieścić 6 !, a (36 + 6) × 3 jest tylko wystarczająco wysoki, aby zmieścić się w 128 możliwościach, które mamy. (Ostatnie ograniczenie tutaj jest najmniej restrykcyjne, ponieważ moglibyśmy użyć indeksowania 0 zamiast 1-indeksowania, aby użyć znaków z zakresu 0-2. Mimo to dałoby to wystarczająco dużo miejsca, aby użyć 37 jako podstawy niż 36.)
źródło
Galaretka , (
43 bajty +65 bajtów) × długość 8 =8064 punktówWypróbuj online!
Galaretka , (
21 bajt +43 bajty) × długość 10 =6040 punktówWypróbuj online!
Wyjaśnienie
Rozwiązanie 1
To używa innego algorytmu niż większość innych odpowiedzi. Zaczynamy od zakodowania wartości w systemie szesnastkowym (
b⁴
), podobnie jak w przypadku innych odpowiedzi, a następnie pobieramy sumę sumaryczną (Ä
). Każde wejście będzie wyraźnie dawało inny wynik (ponieważ obie te operacje są odwracalne), a biorąc pod uwagę, że kodowanie szesnastkowe będzie zawierało co najwyżej 8 cyfr, których maksimum to 7 (dla 8-tej ostatniej cyfry) i 15 (dla ostatniej do 7- ostatnie cyfry), maksymalna liczba na liście wyników wyniesie 7+ (7 × 15) = 112, mniej niż 127 wymagana przez pytanie. Dodatkowo dane wyjściowe będą koniecznie posortowane, co pozwoli nam odwrócić losowanie.W przypadku dekodera najpierw odwracamy odtwarzanie losowe za pomocą sort (
Ṣ
); następnie odwróć sumę skumulowaną, przygotowując zero (Ż
) i biorąc różnicę między kolejnymi parami (I
); następnie przekonwertuj z powrotem z funkcji szesnastkowej (ḅ⁴
).Rozwiązanie 2
Pytanie faktycznie pozwala nam wziąć dane wejściowe jako listę (przypuszczalnie dziesiętną) cyfr, dzięki czemu możemy „oszukać”, po prostu usuwając konwersję podstawową; maksymalna liczba użyta w danych wyjściowych wyniesie wówczas 2 + (9 × 9) = 83 (faktycznie 82, ponieważ 2999999999 jest poza zakresem, więc najgorszym możliwym wejściem jest 1999999999). Wynikowe kodowanie jest dość okropne w miarę kodowania tego problemu, ale ma tę zaletę, że jest bardzo zwięzłe w generowaniu, co przeważa nad szczegółowością kodowania.
Ta odpowiedź jest tak bardzo podobna do oszukiwania, że nie jest to moje podstawowe rozwiązanie tego problemu, ale wydaje się, że warto ją dodać, ponieważ technicznie jest zgodna z zasadami i daje lepszy wynik.
Komentarz
Mam na myśli kilka algorytmów, aby uzyskać długość poniżej 8, ale wydaje się mało prawdopodobne, abyś mógł wdrożyć algorytm długości 7 w ≤9 bajtach (bez oszustwa) lub ≤5 bajtach (oszustwo), więc dzięki punktacji w pytaniu, to jest prawdopodobnie najlepszym sposobem na zrobienie tego. (Mógłbym jednak spróbować rozwiązania alternatywnego wyzwania „zminimalizowania długości kodowania”, tak dla zabawy).
W przeciwieństwie do niektórych rozwiązań, użycie 16 jako podstawy tutaj nie jest krytyczne; istnieje wiele innych liczb, które działałyby dla rozwiązania o długości 8 (np. 18). Wybrałem 16 dla pierwszego rozwiązania po prostu dlatego, że Jelly ma jednobajtowy sposób na przedstawienie tego, a inne realne bazy musiałyby zużywać wiele bajtów z programu. Oczywiście drugie rozwiązanie wymaga użycia 10 jako podstawy, aby wykorzystać lukę.
Dzięki @Dennis za wskazanie niektórych nowszych poleceń Jelly, które sprawiły, że ten algorytm jest jeszcze prostszy do napisania.
źródło
Ä
jest skrótem od+\
,Ż
jest skrótem od0;
.Język programowania Szekspira , 10 * (264 + 494) =
8650 79107580Koder: 264 bajty
Wypróbuj online!
Dekoder: 494
Wypróbuj online!
To była rzecz.
Koder koduje każdą cyfrę jako cyfrę plus indeks cyfry razy dwanaście. Dekoder przechowuje wszystkie dane wejściowe w pamięci Forda, a następnie zapętla się nad licznikiem, wysyłając i usuwając każdą cyfrę niższą niż licznik * 12 + 10.
Wyjaśnienie:
Enkoder
Dekoder
źródło
Python 2.7, 31 * (52 + 37) = 2759
Koder (
6952 bajtów):Dekoder (
4137 bajtów):Przechowuje wszystkie niezerowe bity w liczbie wejściowej jako wartości ascii. Wartość znaku ascii przechowuje pozycję ustawionego bitu. Na przykład wartość „a” oznacza, że ustawiony jest 97 bit.
Kilka ulepszeń, dzięki @ Delfad0r
Wypróbuj online!
źródło
e =
id =
na początku - anonimowe funkcje są w porządku. Zauważ również, że w opisie problemu wyraźnie powiedziano, że Enkoder może zwrócić listę liczb całkowitych zamiast znaków, dzięki czemu można uniknąć konwersji liczby całkowitej -> znak -> liczba całkowita. Co więcej, możesz użyćn&(1<<i)
zamiastn&(1<<i)>0
i zapisać 2 bajty. Wreszcie górna granica dlai
(127) to zdecydowanie za dużo, 32 wystarczy i oszczędza 1 bajt.(52+37)*31=2759
najdłuższy, gdy wszystkie 31 bitów jest ustawione.lambda n:[chr(i)*(n&1<<i>0)for i in range(32)]
zapisywać 6 bajtów.Stax , wynik 8 × (10 + 9) = 152
Enkoder, 10 bajtów
Uruchom i debuguj
Koder wysyła ciąg w rosnącej kolejności.
Dekoder, 9 bajtów
Uruchom i debuguj
źródło
05AB1E , 8 maksymalna długość * (8 + 7) bajtów = 120
Enkoder (8)
Wypróbuj online!
Dekoder (7)
Wypróbuj online!
Używa tej samej techniki co wastl i Jonathan .
źródło
Python 3 , 8 * (45 + 38) = 664
Koder (45 bajtów):
Dekoder (38 bajtów):
Wypróbuj online!
źródło
lambda l:sum(x%16<<x//16*4for x in l)
działa dobrze :)lambda n:[n>>4*i&15|i<<4for i in range(8)]
i 1 w dekoderze:lambda l:sum(x%16<<x//16*4for x in l)
aby uzyskać łączny wynik 632JavaScript (ES6), 8 * (40 + 32) = 576
Koder wyprowadza tablicę0 do 8 liczby całkowite. Dekoder ma taki sam format jak wejście.
Enkoder (40 bajtów)
Dekoder (32 bajty)
Próbny
Wypróbuj online!
W jaki sposób?
Dane wejściowe są podzielone na 8 bloków po 4 bity, a każdy blok jest kodowany 1 z 16 możliwych znaków. Najbardziej znaczący bit ostatniego bloku nigdy nie jest ustawiony.
źródło
Galaretka , (8 + 9) bajtów * 8 maksymalna długość = 136
Enkoder (stopka formatuje listę tak, jak by ją wyrazić Python)
Dekoder
Teoretycznie możliwe jest uzyskanie maksymalnej długości sześciu, czy można to zrobić w 22 bajtach lub mniej?
Od tego czasu jest to niemożliwe przy maksymalnej długości pięciu∑i = 5i = 0( 127+i127) =321402081<231- 1
W jaki sposób?
Od2)31- 1 jest kodowalny jako 8 cyfr szesnastkowych (
7fffffff
lub[7,15,15,15,15,15,15,15]
) możemy następnie dodać liczony od zera indeks każdej cyfry szesnastkowej pomnożonej przez 16, aby zapewnić, że taka konwersja jest zawsze posortowana, zachowując nawet najdalszą z prawej strony wartość (tj[7,15,15,15,15,15,15,15] + [0,16,32,48,64,80,96,112] = [7,31,47,63,79,95,111,127]
.). Dekodowanie następnie odwraca ten sam proces.Enkoder :
Dekoder :
źródło
Język programowania Szekspira , 31 * (472 +
383379344) =265052638125296Poprzedni wynik: 16909322 * (246 + 217) = 7829016086
To wciąż bardzo wysoka wartość, ale jest to najniższa wartość, o której mogę teraz myśleć.
Enkoder:
Wypróbuj online!
Dekoder:
Wypróbuj online!
Zasadniczo, jeśli ciąg zawiera znak z kodem ASCII (n + 1), ustawiana jest n-ta cyfra binarna.
źródło
Python 3, (208 bajtów + 200 bajtów) * 6 długość = 2448
Wypróbuj online!(zawiera oba, dodatkowy bajt to nowa linia między nimi).
-4 bajty (wynik -24) dzięki wykorzystaniu pustej listy (co pozwoliło rozpocząć więcej rzeczy od 0)
Koder (208 bajtów)
Dekoder (200 bajtów)
Obserwacje:
Tasowanie można bezstratnie odwrócić w przypadku ściśle nie rosnących (tj. Posortowanych) list.
Ściśle rosnące listy numeryczne o tej samej długości można całkowicie uporządkować (tak jak w Pythonie).
Możemy zdefiniować, że listy są najpierw uporządkowane według długości, aby utworzyć całkowitą kolejność wszystkich posortowanych list.
Możemy utworzyć indeksowalną sekwencję tych list, jeśli zdefiniujemy, że jedynymi prawidłowymi wartościami na liście są liczby całkowite od
0
do127
włącznie (tj. Istnieje skończona liczba prawidłowych list o długościL
).Strategia:
Koder: Biorąc pod uwagę liczbę
N
, znajdźN
prawidłową listę, która nie jest rosnąca.Dekoder: Biorąc pod uwagę (przetasowaną) prawidłową listę, posortuj ją i zwróć jej indeks w sekwencji prawidłowych list.
Wspólne objaśnienie kodu:
T=lambda n,d:n*T(n+1,d-1)//d if d>1else d and n or 1
Oblicz liczbę
n
thd
-simplexBo
d=0
zawsze1
Dla
d=1
,n
(liczba kropek w linii kropek o długościn
)dla∑ni = 1ja , (liczba kropek w trójkącie kropek o długości boku
d=2
,n
)dla∑nj = 1∑joti = 1ja , (liczba kropek w czworościanie kropek o długości boku
d=3
,n
)Objaśnienie enkodera:
def E(n,h=128):
d=l=0
,s=[]
n
to liczba wejściowa,h
to „wysoka wartość” (tj. najwyższa dozwolona liczba + 1),d
to długość, jaką będzie wyjście,s
to wynik,l
to „niska wartość” (od 0, wyjaśnione później)while n>=T(h,d):
,n-=T(h,d)
,d+=1
Istnieją
T(h,d)
prawidłowed
listy długości , a nasze obliczenia są łatwiejsze, jeślin
jest indeksem względem listy[0]*d
(w indeksie0
) zamiast faktycznego indeksu, więcn
odpowiednio zmniejszamy . To również dostosowujed
(długość), aby była poprawna dla podanegon
.for i in range(d):
Skutecznie: „dla
i+1
numeru th na liście”Tutaj wyjaśnię
l
„niską wartość”Po umieszczeniu numeru na liście, nie może być on umieszczony na liście nie mniejszej niż liczba (aby zachować porządek), podobnie
l
jak ostatni numer, który został dodany do listy.while n>=T(h-l,d+~i):
,n-=T(h-l,d+~i)
,i+=1
Jeśli
n
jest za duży, aby go zakodowaćl
przy tej „cyfrze”, dostosujn
odpowiednio i zwiększajl
s+=[l]
Zakoduj
n
za pomocąl
tej „cyfry”.Na początku mamy
h
opcje, które „cyfrę” wprowadzić, ale kiedy wstawimy „cyfrę” (do której jest przypisanal
), ograniczamy się doh-l
opcji na następną „cyfrę”.Początkowo istniały
T(h,d)
prawidłowe listy, ale dodaliśmy „cyfrę”l
, zmniejszając liczbę „cyfr” pozostałych dod-1
i liczbę ważnych następnych „cyfr” doh-l
, więc liczba prawidłowych list po tym wynosiT(h-l,d-1)
Objaśnienie dekodera:
def D(s):
,s.sort()
,l=0
,d=len(s)
s
jest (tasowaną) listą wejściową, więcs.sort()
jest;l
to „niska wartość” (h
„wysoka wartość” to po prostu literały128
s w kodzie, aby zapisać bajty),n
to liczba wyjściowa,d
to długość.n=sum(T(128,D)for D in range(d))
Dostosuj
n
do punktu w sekwencji[0]*length
for i in s:
Dla każdej cyfry:
for j in range(l,i):
,n+=T(128-j,d-1)
Dostosuj
n
do punktu w sekwencji[...prevdigits, thisdigit, 0...]
l=i
: Ustaw „niską wartość” na najnowszą cyfręd-=1
: Zmniejsz długość, ponieważ użyliśmy cyfryreturn n
: Pon
dostosowaniu dla wszystkich cyfr jest to poprawna liczba; zwróc to.Przepraszam, jeśli nie jest to jasne, ale oto moja oryginalna wersja debugowania bez klucza. Wypróbuj online! , który nie korzysta z pustej listy, więc jest 1 wyłączony ze wszystkich liczb użytych w tej wersji
źródło
Rubin , (36 + 29 bajtów) * 8, wynik 520
Kodować:
Wypróbuj online!
Rozszyfrować:
Wypróbuj online!
Jak to działa:
Liczba jest kodowana przy użyciu 4-bitowych fragmentów i 3-bitowego indeksu.
Dekoder pobiera tablicę wejściową i ponownie umieszcza każdy skubek na swoim miejscu.
źródło
Węgiel drzewny , wynik 10 * (10 + 15) = 250.
Wykorzystuje dziesiętny; poprzednie bazowe rozwiązanie oparte na 16 uzyskało
328296264.Może generować znaki niedrukowalne. W szczególności trudno jest wprowadzić postać 10 na węgiel drzewny.
Enkoder, 10 bajtów:
Wypróbuj online! Link jest do pełnej wersji kodu.
Dekoder, 15 bajtów:
Wypróbuj online! Link jest do pełnej wersji kodu.
Wersja wykorzystująca wyniki liczb całkowitych
360296 (podstawa 16; liczba dziesiętna to 310):Koder, 19 bajtów:
Wypróbuj online! Link jest do pełnej wersji kodu.
Dekoder, 18 bajtów:
Wypróbuj online! Link jest do pełnej wersji kodu.
Wersja wykorzystująca znaki do wydrukowania uzyskała wynik 360 (było
416384368 w bazie 16):Koder, 19 bajtów:
Wypróbuj online! Link jest do pełnej wersji kodu.
Dekoder, 17 bajtów:
Wypróbuj online! Link jest do pełnej wersji kodu.
źródło
Brachylog , 17 + 18 bajtów * 8 długość = 280
Enkoder:
Dekoder:
P można dodać na końcu enkodera bez efektu. Dekoder jest uruchamiany przez umieszczenie wyniku (losowego) jako wyjścia i uzyskanie oryginalnej liczby na wejściu.
Gdyby istniał (prawidłowo wdrożony) predykat sumarycznych, wynik mógłby spaść do 20
Wypróbuj online!
źródło
05AB1E , wynik: (2 + 2 bajty ) * 11 maksymalna długość = 44
Enkoder (2 bajty ):
Wypróbuj online.
Dekoder (2 bajty ):
Wypróbuj online.
Wejście enkodera i wyjście dekodera to lista cyfr.
Port drugiej odpowiedzi galaretki @ ais523 .
Wyjaśnienie:
Ponieważ2)31- 1 ma długość 10 cyfr, maksymalna długość wyniku to 11.
.¥
wstawia zero na wyjście, długość wyjścia to długość wejścia + 1. Odźródło
Gol> <> , 8 * (14 + 13) = 216
Koder Wypróbuj online! , 14 bajtów:
Dekoder Wypróbuj online! , 13 bajtów:
Ponieważ może to generować niedrukowalne znaki ascii, a tym samym zadzierać z dekoderem, istnieje teraz wersja wykorzystująca liczby na wyjściu / wejściu:
Koder Wypróbuj online! , 14 bajtów:
Dekoder Wypróbuj online! , 13 bajtów:
Kodowanie:
Kodowanie polega na rozbiciu podanej liczby na 8 x 4-bitowe fragmenty. Te fragmenty są następnie przesuwane w prawo o 3 bity, a pierwotna lokalizacja fragmentu jest dołączana na końcu jako liczba od 0 do 7. W ten sposób kodowanie wygląda następująco:
źródło
Perl 6 , 10 * (10 + 12) =
340220Enkoder:
Dekoder:
Wypróbuj online!
Funkcja enkodera zamyka każdą cyfrę indeksem 0 liczby. Następnie koder sortuje listę liczb i otrzymuje modulo o 10, innymi słowy druga cyfra liczby.
Łącznie jest to 10, ponieważ to maksymalna długość 2 31 -1.
źródło
Haskell , 10 * (23 + 51) = 740
Oto program, który koduje, tasuje, dekoduje i sprawdza wartości: Wypróbuj online!
Koder, 23 bajty
Wypróbuj online!
Dekoder, 51 bajtów
Wypróbuj online!
Wyjaśnienie
Ponieważ wolno nam używać danych wejściowych jako cyfr dziesiętnych, użyjemy tego. Koder odwzorowuje każdą występującą cyfrę
10*index + digit
, pamiętaj, że wszystkiedigit
s będą[0..9]
obecne, abyśmy mogli odwrócić powyższe za pomocądivMod
. Po przywróceniu indeksów i cyfr jest to tylko kwestia sortowania według wskaźników i pozbycia się ich.Rozwiązanie powinno działać dla wartości do2)31- 1 = 2147483647 który ma 10 cyfr, więc otrzymamy maksymalny punkt kodowy 9 ⋅ 9 = 81 < 128 . Również każda cyfra zostanie przekonwertowana na „znak”, więc otrzymamy maksymalną długość 10.
źródło
Łuska , 10 * (7 + 8) = 150
Prosty port mojego rozwiązania Haskell tylko z tą obserwacją10 ⋅ 9 = 90 < 128 (Łuska
N
jest oparta na 1):Enkoder, 7 bajtów
Wypróbuj online!
Dekoder, 8 bajtów
Wypróbuj online!
źródło
APL (Dyalog Unicode) ,L.mi+ L.re= 36 ; A = 8 → 288 .
Wypróbuj online! (zawiera 5 dodatkowych bajtów dla przypisań i nowego wiersza).
Używa
⎕IO←0
W jaki sposób:
źródło
PHP, 8 * (44 + 53) = 776
enkoder, 44 bajty:
wyświetla listę liczb całkowitych oddzielonych spacjami. Uruchom jako potok z
-nR
.maksymalnie 8 bajtów z 4 bitami danych (dolny skrawek) i 3 bity wagowe (górny skrawek).
Po prostu: umieść
każdą cyfrę szesnastkową we własnym znaku i użyj górnej połowy bajtu, aby zapisać pozycję cyfry.
przykład:
1457893891
(0x56e5b203
) Zmieni się0x03
,0x10
,0x22
,0x3b
,0x45
,0x5e
,0x66
,0x75
→
3 16 34 59 69 94 102 117
dekoder, 53 bajty:
lub
lub
weź liczby całkowite z argumentów wiersza poleceń. Uruchom z
-nr
.Wypróbuj je online .
źródło
Python 2 , 10 * (68 + 54) = 1220
Wypróbuj online!
EDYCJA: Dzięki Jo King za wskazówki - nie jestem pewien, dlaczego przesunąłem się o 32, z perspektywy czasu.
Koduje pozycję i wartość każdego miejsca jako pojedynczy znak, zaczynając od
[spacja] (pozycja 0, wartość 0)bajt NUL 0x0.Dekoduje:
źródło
32
przesunięcia? Również[-1]
może być%10
zamiast tego, we właściwym miejscuC (gcc) , 10 * 112 = 1120
Wypróbuj online!
Mam zmienne globalne, ale tak naprawdę nie przekazują żadnych informacji między dwiema funkcjami. Deklaracja zmiennej dla
c
jest używana w obu funkcjach, oszczędzając mi 2 bajty długości kodu.Wersja, która używa drukowalnego ASCII tylko dla kary
35 bajtów, jest tutaj:Dzięki @ceilingcat za poprawę o 70 punktów.
źródło