Wyzwanie
Napisz program, który może pobierać dane wejściowe z ciągu jednowierszowego zawierającego dowolne znaki drukowalne ASCII i wypisywać ten sam ciąg zakodowany w Base85 (używając konwencji big-endian). Możesz założyć, że dane wejściowe zawsze będą miały ≤ 100 znaków.
Przewodnik po Base85
Cztery oktety są zakodowane (zwykle) w pięciu znakach Base85.
Base85 znaków ma zakres od
!
dou
(ASCII 33–117 ) iz
(ASCII 122).Aby zakodować, ciągle wykonujesz dzielenie przez 85 na czterech oktetach (liczba 32-bitowa) i dodajesz 33 do reszty (po każdym dzieleniu), aby uzyskać znak ASCII dla zakodowanej wartości. Na przykład pierwsze zastosowanie tego procesu powoduje, że w zakodowanym bloku jest znak skrajnie prawy.
Jeśli zestaw czterech oktetów zawiera tylko bajty puste, są one kodowane jako
z
zamiast!!!!!
.Jeśli ostatni blok jest krótszy niż cztery oktety, jest wypełniany bajtami zerowymi. Po zakodowaniu ta sama liczba znaków, które zostały dodane jako dopełnianie, są usuwane z końca danych wyjściowych.
Zakodowana wartość powinna być poprzedzona znakiem
<~
i po nim~>
.Zakodowana wartość nie powinna zawierać białych znaków (dla tego wyzwania).
Przykłady
In: easy
Out: <~ARTY*~>
In: test
Out: <~FCfN8~>
In: code golf
Out: <~@rGmh+D5V/Ac~>
In: Programming Puzzles
Out: <~:i^JeEa`g%Bl7Q+:j%)1Ch7Y~>
Poniższy fragment kodu koduje dane wejściowe do Base85.
źródło
Odpowiedzi:
CJam,
433935 bajtówWypróbuj online w interpretatorze CJam .
Jak to działa
Jeśli dane wejściowe były puste,
N,)
zostaną zastosowane do ciągu"<~"
. PonieważN
początkowo zawiera pojedynczy znak, wynik będzie poprawny.Nie musimy zajmować się z ani wstawiać zakodowanych fragmentów do długości 5, ponieważ dane wejściowe będą zawierały tylko drukowalne znaki ASCII.
źródło
a program that can take an input of a single-line string containing any ASCII printable characters,...
Python 3, 71 bajtów
Nigdy nie grałem w golfa w Pythonie, więc prawdopodobnie nie jest to optymalne.
Dzięki @ZachGates za grę w golfa z 3 bajtów!
źródło
input().encode()
zamiaststr.encode(input())
zapisać 3 bajty.Python 2,
193162 bajtyTo jest mój pierwszy kod golfowy, więc jestem pewien, że coś jest nie tak z moim podejściem. Chciałem także zaimplementować base85 zamiast wywoływać funkcję biblioteki. :)
źródło
[:4+len(s)/4*4]
i żadne znaki nie są usuwane z końca wyniku.while
pętlę do jednej jak tak:while b:d=chr(b%85+33)+d;b/=85
. Możesz także usunąć spację międzyprint
wyciągiem a ciągiem. Ponadto usuń spację między przekazanymi argumentamis.unpack
.Oktawa,
133131 bajtówDzięki @ojdo za sugestię, że biorę dane z argv zamiast standardowego, co oszczędza mi 2 bajty.
Nie golfowany:
Opublikowałem kod na ideone . Samodzielna funkcja nie wymaga
end
instrukcji i instrukcji, ale ponieważ ideone ma funkcję i skrypt wywołujący w tym samym pliku, wymaga separatora.Nadal nie byłem w stanie dowiedzieć się, jak zacząć
stdin
pracować nad ideonem. Jeśli ktoś wie, nadal jestem zainteresowany, więc proszę o komentarz.Przykładowe dane wyjściowe z ideone :
źródło
argv()
? Opis zadania nie wymaga odczytywania danych wejściowychstdin
.dec2base
w Octave dopuszcza zasady powyżej 36?BASE
musi być liczbą od 2 do 36 lub ciągiem symboli . Tutaj wyrażenie'i':'u'
rozszerza ciąg znaków o długości 85 znaków,!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu
który służy jako podstawa.Matlab, 175 bajtów
Przykład:
źródło
PHP, 181 bajtów
Wersja online
Rozszerzony
źródło
Pure Bash, ~ 738
Najpierw koder (coś golfowego):
Testy:
i dekoder teraz:
Skopiuj to na
enc85.sh
idec85.sh
,chmod +x {enc,dec}85.sh
, a następnie:Ale możesz zrobić silniejszy test:
Zmniejszony do 724 znaków:
źródło