To jest moje pierwsze wyzwanie na ppcg!
Wejście
Ciąg składający się z dwóch różnych znaków ascii. Na przykład
ABAABBAAAAAABBAAABAABBAABA
Wyzwanie
Zadaniem jest odkodowanie tego ciągu zgodnie z następującymi regułami:
- Pomiń pierwsze dwa znaki
- Podziel resztę ciągu na grupy po 8 znaków
- W każdej grupie zamień każdy znak na,
0
jeśli znak ten jest taki sam jak pierwszy znak oryginalnego łańcucha, i na1
inny - Teraz każda grupa reprezentuje bajt. Konwertuj każdą grupę na znak z bajtowego kodu znaków
- Połącz wszystkie postacie
Przykład
Dekodujmy powyższy ciąg.
AB AABBAAAA AABBAAAB AABBAABA
^^ ^ ^ ^
| | | |
| \---------|---------/
| |
Skip Convert to binary
Zauważ, że A
jest to pierwszy znak w oryginalnym ciągu znaków i B
jest on drugim. W związku z tym, należy wymienić każdy A
z 0
a każdy B
z 1
. Teraz otrzymujemy:
00110000 00110001 00110010
który jest [0x30, 0x31, 0x32]
w formacie binarnym. Wartości te reprezentują ["0", "1", "2"]
odpowiednio znaki , więc końcowy wynik powinien być 012
.
Punktacja
Jest to oczywiście code-golf , co oznacza, że kod powinien być jak najkrótszy. Wynik mierzony jest w bajtach.
Ograniczenia i format IO
Obowiązują standardowe zasady. Oto kilka dodatkowych zasad:
- Możesz założyć prawidłowe dane wejściowe
- Łańcuch wejściowy składa się z dokładnie dwóch różnych znaków
- Pierwsze dwa znaki są różne
- Minimalna długość ciągu wejściowego wynosi 2 znaki
- Długość zawsze daje 2 modulo 8
- Możesz założyć, że ciąg będzie zawsze składał się tylko z drukowalnych znaków ASCII
- Zarówno na wejściu, jak i w dekodowanym ciągu
- Wiodące i końcowe białe znaki są dozwolone w danych wyjściowych (wszystko, co pasuje
/\s*/
)
Odpowiedzi:
pieprzenie mózgu ,
76 7165 bajtów-6 bajtów dzięki Nitrodon!
Wypróbuj online!
Czuje się dziwnie pokonując Pythona ...
źródło
Stax ,
1511 bajtówUruchom i debuguj na staxlang.xyz!
Szybkie i brudne podejście. Pracuję nad ulepszeniem.Poprawiłem to!Rozpakowano (13 bajtów) i wyjaśnienie
źródło
JavaScript (Node.js) , 67 bajtów
Wypróbuj online!
W jaki sposób?
Używamy dwóch różnych składni
Buffer
konstruktora:Buffer([n])
generuje bufor zawierający jedyny bajt n i jest wymuszany na odpowiedni znak ASCII. Uwzględniane są tylko 8 najmniej znaczących bitów n .Buffer(n)
generuje bufor n bajtów. DlategoBuffer(0)
generuje pusty bufor, który jest wymuszany na pusty ciąg.Uwaga: Oba są przestarzałe w najnowszych wersjach węzłów.
Buffer.from([n])
iBuffer.alloc(n)
powinny być używane zamiast tego.Skomentował
źródło
bash,
595852 bajtówWypróbuj online!
Dzięki kwakowi Krowy za oszczędność 6 bajtów.
To wyzwanie działa wyjątkowo dobrze z serią coreutils (i
dc
do konwersji i wyjścia na końcu). Po pierwsze używamyaby transliterować dwa znaki na wejściu do zer i jedynek.
-t
Flag obcina pierwszy argument do długości sekundę, więc ta zmniejsza się do transliteracji dwa pierwsze znaki z wejścia do0
i1
, co jest, co chcemy. Następnie,usuwa pierwsze dwa znaki i
wyprowadza 8 znaków w linii. Na koniec
sed
polecenie zamienia każdą linię wdc
fragment kodu, który odczytuje liczbę jako binarną i generuje bajt.źródło
cut -c
może zostać usunięta)Kod maszynowy Z80 na Amstrad CPC,
32 3130 bajtówKod pobiera instrukcję zastępującą każdy znak,
0
jeśli ten znak jest taki sam jak pierwszy znak oryginalnego łańcucha, a w1
przeciwnym razie dosłownie i nigdy nie zadaje sobie trudu, aby sprawdzić, czy znak pasuje do drugiego znaku w ciągu wejściowym. Po prostu sprawdza, czy znak jest taki sam jak pierwszy i różni się od pierwszego.Pobiegłem z rejestrów (Z80 ma tylko 7 łatwo użytkowej rejestry 8-bitowe, potrzeba reszta dłuższe instrukcje), więc kładę
&01
sięH
wraz z użyciemL
budować znak ASCII (zdałem sobie sprawę, że to konieczne, aby zainicjowaćL
, oszczędzając jeden bajt ). KiedyH
pojawi się flaga Flagi, postać wL
jest gotowa do wyjścia. Na szczęście istnieje 16-bitowyADC
( Ad d z C arry), który wykonuje instrukcje lewoskrętne.(DE)
może być odczytany tylko do,A
chociaż(HL)
może być odczytany do dowolnego 8-bitowego rejestru, więc był to kompromis, którego użyć. Nie mogłem porównać(DE)
zC
bezpośrednio, więc musiałam załadować jeden wA
pierwszej kolejności. Etykiety są tylko losowymi słowami, które zaczynają się odL
(wymaganie asemblera).A
Akumulator - jedyny rejestr, który może dokonywać porównańB
rejestr licznikadla instrukcji. Zmieniając kod, byłem w stanie wykonać zadanieDJNZ
: D ecrement (B
) i J UMP jeśli N o Z eroDJNZ
z jednym mniejszym bajtemC
pierwszy znak w ciągu wejściowymD
,E
jakoDE
adres bieżącego znaku wejściowegoH
wyzwalacz przenoszenia (co 8 pętla)L
budowany jest znak wyjściowyźródło
05AB1E , 10 bajtów
Wypróbuj online!
-3 dzięki emignie.
źródło
01‡
zamiast pętli. EDYCJA: lub nawet lepiej:¦¦Sk8ôJCçJ
J,
1713 bajtów-4 dzięki FrownyFrog
Stara wersja:
Wyjaśnienie:
Przykłady:
źródło
2}.1{=
aby zapisać 4 bajty.[:
na początku :)Python 2 , 77 bajtów
Wypróbuj online!
źródło
R , 71 bajtów
Wypróbuj online!
Zaskakująco golfowy!
Najpierw konwertuje ciąg znaków na punkty kodu ascii za pomocą
utf8ToInt
, zapisując go jakoy
. Usunięcie pierwszych dwóch znaków z ujemnym indeksowaniem jest krótsze niż użycietail
.Tablica
y[-1:-2]==y[2]
jest równoważna bitom, gdy%*%
stosowane jest (mnożenie macierzy), ale najpierw przekształcamy tę tablicę w znak „matrix
z”nrow=8
, konwertując z tablicy liniowej na grupy bajtów. Na szczęście możemy następnie przekonwertować na punkty kodu ascii za pomocą mnożenia macierzy z odpowiednimi potęgami 22^(7:0)
, a następnie przekonwertować punkty kodu z powrotem na ciąg znaków za pomocąintToUtf8
.źródło
Python 3 , 77 bajtów
Wypróbuj online!
źródło
PHP,
7371 bajtówUruchom jako potok z
-nR
lub spróbuj online .gra w golfa:
-6
i inkrementuj o8
strtr
ignorujący nadmierne znaki w dłuższym parametrze (substr
niepotrzebne)10
a następnie odwrócenie nie wymaga cudzysłowów -> -1 bajt~
służy jako granica słowa -> -1 bajt.źródło
for(;$s=substr($argn,2+8*$i++,8);)echo~chr(bindec(strtr($s,$argn,10)));
Pyth,
209 bajtówZaoszczędzono 11 bajtów dzięki FryAmTheEggman.
Wypróbuj tutaj
Wyjaśnienie
źródło
Rubin ,
8279 bajtówWypróbuj online!
źródło
.join
można zastąpić przez*''
is[0..1]
przezs[0,2]
.Japt, 11 bajtów
Spróbuj
Wyjaśnienie
źródło
s2
skrótu, miło.PHP + GNU Multiple Precision,
6361niestety rozszerzenie GMP nie jest domyślnie aktywowane (ale dostarczane).
Uruchom tak:
źródło
<?=
oszczędza 2 bajty i prawdopodobnie dzień. ;-)-R
(próbowałem).-F
zamiast tegoHaskell , 75 bajtów
Wypróbuj online!
źródło
Java 8,
143142141 141 bajtów-1 bajt dzięki @ OlivierGrégoire .
Wypróbuj online.
Wyjaśnienie:
źródło
Python 3 ,
9986 bajtówWypróbuj online!
Dzięki ASCII tylko za właściwie wszystko
źródło
APL + WIN, 30 bajtów
Początek indeksu 0. Monity o wprowadzenie ciągu
Wyjaśnienie:
źródło
Czerwony , 110 bajtów
Wypróbuj online!
Wyjaśnienie:
Proste, proste rozwiązanie, bez wbudowanych funkcji.
źródło
Arkusze Google, 123 bajty
Dane wejściowe są w komórce
A1
. Google automatycznie doda)))
na końcu formuły.Wyjaśnienie:
Mid(A1,3+8*(Row(A:A)-1),8)
chwyta kawałki znaków 8 na raz, zaczynając od trzeciego.Substitute(Mid(~),Left(A1),0)
zamienia każdą instancję pierwszego znaku na 0.Substitute(Substitute(~),Mid(A1,2,1),1)
zamienia drugą postać na 1.Char(Bin2Dec(Substitute(~)))
konwertuje porcję na dziesiętną, a następnie na ASCII.IfError(Char(~,""))
koryguje wszystkie błędy wynikające z faktu, żeRow(A:A)
zwraca znacznie więcej wartości niż my, więcBin2Dec
daje nam dużo zerowych wartości iChar
błędów na zero.ArrayFormula(Join("",IfError(~)))
łączy wszystkieChar
wyniki iArrayFormula
jest tym, co powoduje, żeRow(A:A)
zwracana jest tablica wartości zamiast tylko pierwszej wartości.źródło
Rubin ,
6142 bajtów-19 bajtów dzięki benj2240
Wypróbuj online!
źródło
pack
to zainspirowany wybór, ale teraz masz dość długą drogę. Może wykonać dla Ciebie jeszcze więcej pracy.Perl 5
-lp
, 34 bajtówWypróbuj online!
źródło
REXX, 41 bajtów
Wypróbuj online!
źródło
Python 2 , 88 bajtów
Wypróbuj online!
Nie najkrótszy - tylko alternatywny sposób.
Następująca wersja drukuje dane wyjściowe w jednym wierszu dla 98 bajtów, chociaż reguły mówią, że końcowe białe znaki są dozwolone:
Wypróbuj online!
źródło
/\s*/
.C # (kompilator Visual C #) , 158 bajtów
Wypróbuj online!
źródło
Perl 5
-p
, 40 bajtówWypróbuj online!
źródło
Scala , 95 bajtów
Wypróbuj online!
źródło
Haskell ,
12410593 bajtówWypróbuj online!
f
konwertuje ciąg na listę bitów, porównując każdy znak z pierwszym, zamieniającBool
s na zera i jedynki zfromEnum
.g
dzieli tę listę na grupy po 8, konwertuje je na dziesiętne i przyjmuje wartość wynikowej liczby jako anEnum
, coChar
jest instancją.Zmiany:
map
w funkcji)take
przez skompresowanie krótszej listy)źródło
toEnum
zamiastchr
i upuścić import. Równieżmap
mogą być włączone dog
. Przestrzeń między8 s
można usunąć.Dalej (gforth) , 83 bajty
Wypróbuj online!
Wejście jest standardowym ciągiem Forth (adres i długość), wyjście jest wypisywane na standardowe wyjście
Wyjaśnienie
źródło