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]
).