Wprowadzenie
Niektóre znaki ASCII są obecnie tak drogie ...
Aby zaoszczędzić pieniądze, postanowiłeś napisać program, który koduje drogie znaki przy użyciu niedrogich.
Jednak ceny postaci zmieniają się często i nie chcesz modyfikować programu za każdym razem, gdy musisz zakodować lub odkodować inny znak! Potrzebujesz bardziej dynamicznego rozwiązania.
Wyzwanie
Twoim zadaniem jest napisanie dwóch programów: kodera i dekodera .
Koder powinien przyjąć listę pięciu znaków niedrogie i jeden kosztowny charakter.
Powinien generować pojedynczy ciąg znaków złożony z niedrogich znaków, który koduje drogi znak.
Ciąg ten nie może być dłuższy niż 4 znaki , aby pozostać niedrogi. Jednak nie musi używać wszystkich niedrogich znaków w kodowaniu, a kodowanie może mieć różną długość.
Dekoder powinien przyjąć ciąg wyprowadzony przez koder, i wysyła drogie znaków.
Dekoder nie akceptuje żadnych danych wejściowych poza zakodowanym łańcuchem. Musi działać niezmodyfikowany z danych wyjściowych kodera dla dowolnej (prawidłowej) kombinacji danych wejściowych. Innymi słowy, twój program dekodujący nie wie, które znaki są drogie lub tanie.
Punktacja
Najkrótszy łączony kod wygrywa!
Notatki
Wszystkie znaki będą albo dużymi
[A-Z]
, małymi literami[a-z]
, albo cyframi[0-9]
.Lista niedrogich postaci nie będzie zawierać duplikatów. Żadna postać nie będzie zarówno tania, jak i droga.
Koder i dekoder nie muszą być napisane w tym samym języku, ale mogą być. Możesz napisać program lub funkcję.
Dane wejściowe i wyjściowe mogą być w dowolnym rozsądnym formacie dla twojego języka.
Oba programy mogą nie udostępniać żadnych zmiennych ani danych.
streszczenie
Wprowadzanie niedrogich i drogich znaków do kodera.
Koder wyprowadza ciąg niedrogich znaków, kodując drogi znak.
Dekoder otrzymuje dane wyjściowe kodera i wyświetla kosztowny charakter.
Przykłady
Wejście: a, b, c, d, e
f
Możliwości enkodera: a
eeee
caec
Dekoder: f
Wejście: a, b, c, d, e
h
Możliwości enkodera: bc
cea
eeaa
Dekoder: h
Wejście: q, P, G, 7, C
f
Możliwości enkodera: 777
P7
PPCG
Dekoder: f
Odpowiedzi:
Pyth, 46 bajtów
Koder, 22 bajty
Dekoder, 24 bajty
źródło
S4
zT
i zapisać każdy jeden bajt w obu programach.CJam,
55504847 bajtówKoder,
242221 bajtówWypróbuj online.
Dekoder,
31282726 bajtówWypróbuj online.
źródło
'
'
nie jest operatorem. Możesz go znaleźć na stronie składni .gawk, 163 + 165 = 328
Testowany z gawk 4.1.1, ale powinien również działać w starszych wersjach gawk. Musi zostać nieco zmodyfikowany (wydłużony), aby współpracował z mawk.
enkoder (163):
dekoder (165):
Cóż, działa, ale jestem świadomy, że może to nie być najlepsze podejście do tego. Nie mam pojęcia, do czego służy piąty niedrogi list, ponieważ używam tylko czterech.
Są tylko do jednorazowego użytku. Jeśli chcesz wprowadzić drugi kod, musisz go ponownie uruchomić. Spacje po przecinkach są wymagane na wejściu do kodowania.
O czym myślałem
Moje pierwsze pytanie brzmiało: „Co dekoder może uzyskać z tych 4 znaków?” (Nazywam je a, b, cid), a moim początkowym pomysłem było uzyskanie 6 bitów informacji z następujących relacji:
Wow, 6 bitów, to jest idealne! Myślałem, że to genialne, ale testy wykazały, że to nie zadziała. Istnieją tylko 24 możliwe kombinacje. Cholera.
Kolejnym krokiem była próba policzenia na podstawie tego, co już wiedziałam. Tak więc pierwsza litera pojawiająca się w ciągu będzie miała wartość 0, a następnie druga litera wprowadzona w ciągu będzie miała wartość 1 i tak dalej. Ale nie doprowadziłoby mnie to aż do potrzebnych 62 kombinacji.
Ale i tak podoba mi się ten pomysł.
Cóż, wtedy uderzyło mnie, że mogłem połączyć te dwa, ponieważ znaki na wejściu już mają relacje i nie musiałbym czekać, aż zostaną przedstawione, aby nadać im wartość.
Jak to działa
Uwaga: Nie tak już działają wersje w golfa, ale zasada pozostała taka sama.
Dla dekodera:
Konstruowana jest tablica, której indeks zawiera wszystkie czterocyfrowe liczby, których największa cyfra nie jest większa niż liczba odrębnych cyfr w tej liczbie. Istnieje 75 różnych czterocyfrowych liczb spełniających ten warunek. Brutalnie je zmuszam, bo jak dotąd nie mogłem znaleźć sposobu na ich zbudowanie i nie jestem pewien, czy i tak byłoby to krótsze w awk. Gdy je znajduję, przypisuję im drogie postacie w porządku asciibetycznym.
Następnie zastępuję każdy znak z ciągu wejściowego cyfrą. Najmniejszy (na przykład „B” mniejszy niż „a”) staje się 1, drugi najmniejszy staje się 2, i tak dalej do 4. Oczywiście zależy to od tego, ile różnych znaków jest na wejściu, jaka jest najwyższa cyfra w wynikowy ciąg będzie.
Następnie po prostu wypisuję element tablicy, który ma ten ciąg znaków jako indeks.
Enkoder działa odpowiednio.
Jak używać
Skopiuj kod bezpośrednio w linii poleceń awk bash lub utwórz dwa pliki „encode.awk” i „decode.awk” i odpowiednio wklej kod. Lub jeszcze lepiej użyj następującego kodu, który kończy się automatycznie po en / dekodowaniu, lub można go użyć wiele razy, usuwając polecenie exit na końcu.
encode.awk
decode.awk
Oto przykład użycia:
Pamiętaj, że wymagane jest miejsce po każdym przecinku, jeśli używasz wersji golfowych.
Jeśli chcesz, możesz użyć tego krótkiego i brudnego skryptu do wygenerowania przykładowych danych
i zrobić coś śmiesznego jak
Widziałem to bardziej jako zagadkę programistyczną. Myślę, że to trochę smutne, że prawie wszystko tutaj gra w golfa, ponieważ można dowiedzieć się o wiele więcej z dobrze udokumentowanego, czytelnego kodu, ale to tylko moja opinia. I grałem w golfa zgodnie z życzeniem;)
źródło