Cel
Napisz procedurę, która akceptuje ciąg drukowalnych znaków ASCII, s , i zwraca ciąg zawierający te same znaki, co s , uporządkowany w taki sposób, aby nie składał się z dwóch znaków więcej niż jeden raz. Program musi przetworzyć wszystkie ciągi testów porównawczych (patrz poniżej) w niecałą minutę na każdym nowoczesnym komputerze . Przyznam również specjalną premię 50 powtórzeń do odpowiedzi o najniższym wyniku, która przetwarza dowolny prawidłowy ciąg 30 znaków w mniej niż minutę.
Na przykład, biorąc pod uwagę dane wejściowe Mississippi
, poprawne dane wyjściowe to issiMspiips
(żadne podciągi dwuznakowe nie pojawią się dwa razy), podczas gdy nieprawidłowe dane wyjściowe to ipMsispiiss
(ponieważ podłańcuch is
pojawia się dwa razy).
Procedura może przybrać postać:
- pełny program odczytujący z
stdin
(lub równoważny) lub z wiersza poleceń i wysyłający dostdout
(lub równoważny) - funkcja przyjmująca pojedynczy argument ciągu i zwracająca ciąg
Możesz założyć, że ciąg wejściowy zawsze dopuszcza co najmniej jedno prawidłowe wyjście.
Wyzwanie
Procedura musi zawierać 5 lub więcej wierszy kodu oddzielonych znakami nowej linii. Puste linie (w tym linie zawierające tylko białe znaki) są ignorowane we wszystkich kontekstach i nie liczą się do całkowitej liczby linii.
Zamiana dowolnych dwóch wierszy w kodzie źródłowym musi powodować błąd krytyczny. Przez „błąd krytyczny” odnosimy się do dowolnego z następujących warunków:
- kod źródłowy nie kompiluje się, a kompilator / interpreter deklaruje błąd krytyczny
- procedura przerywa się z błędem krytycznym środowiska wykonawczego lub nieobsługiwanym wyjątkiem środowiska uruchomieniowego
- procedura jest zmuszana do nagłego, nienormalnego zakończenia programu, które nie generuje żadnego wyjścia, z wyjątkiem możliwego komunikatu o błędzie i / lub zrzutu stosu
Alternatywnie , zamiast wierszy można zastosować ciągłe bloki kodu nie zawierające znaków nowej linii. Te bloki powinny być wyświetlane w osobnych wierszach w pliku źródłowym, przy założeniu, że znaki nowej linii są usuwane przed skompilowaniem / interpretacją kodu źródłowego.
Na przykład kod
aaaa
bbbb
cccc
skropliłbym się
aaaabbbbcccc
przed oceną.
W tym trybie warunek krytyczny błędu dotyczy zamiany dowolnych dwóch bloków kodu (a zatem zamiany wierszy w kodzie źródłowym przed usunięciem nowych linii). Tak więc, w powyższym przykładzie Procedury aaaaccccbbbb
, bbbbaaaacccc
i ccccbbbbaaaa
musi śmiertelnych błędów produktu, bądź na compiletime lub starcie.
Zgłoszenia korzystające z tego alternatywnego trybu powinny deklarować jego użycie.
Punktacja
Niech n będzie liczbą niepustych linii tekstowych w pliku źródłowym, gdzie n ≥ 5. Niech c będzie liczbą bajtów złożoną z najdłuższej linii tekstowej (w bajtach długości) w pliku źródłowym, nie licząc żadnej nowej linii.
Punktacja podana jest przez c ( n + 10).
Zgłoszenie o najniższym wyniku jest zwycięzcą.
Powodzenia. ;)
Ciągi wzorcowe
Abracadabra Alacazam
Is Miss. Mississauga Missing?
Ask Alaska's Alaskans
GGGGAAAATTTTCCCCgggaaatttccc
A Man A Plan A Canal Panama
Mspiisiipss
ważny, ponieważ jedyne powtórzenie ii
nie występuje Mississippi
?
CooliO
, wyjścieoOoCli
?