Było kilka wcześniejszych prób zadawania tego pytania, ale żadna z nich nie jest zgodna ze współczesnymi standardami na tej stronie. W ramach dyskusji na temat Meta publikuję ją w sposób, który pozwala na uczciwą konkurencję zgodnie z naszymi nowoczesnymi zasadami.
tło
Palindrom to ciąg znaków, który „czyta te same przodu i do tyłu”, czyli odwrotność łańcucha jest taka sama jak samego łańcucha. Nie mówimy tu o „wygodnych palindromach”, ale o ścisłym odwróceniu charakteru po znaku; na przykład ()()
nie jest palindromem, ale ())(
jest.
Zadanie
Napisz program lub funkcję, która pobiera ciąg S (lub odpowiedni odpowiednik w Twoim języku) jako wejściowy i ma jedno wyjście Q ( dowolnego rodzaju). Możesz użyć wszelkich rozsądnych środków, aby pobrać dane wejściowe i dostarczyć dane wyjściowe.
- Gdy wejście S jest palindromem, wyjście Q powinno mieć wartość A (to jest taka sama dla każdego palindromicznego S ).
- Gdy wejście S nie jest palindromem, wyjście Q powinno mieć wartość B (to jest taka sama dla każdego niepalindromicznego S ).
- A i B muszą się od siebie różnić.
Innymi słowy: zamapuj wszystkie palindromy na jedną wartość, a wszystkie inne palindromy na inną.
Dodatkowo program lub funkcja, którą piszesz, musi być samym palindromem (tzn. Jego kod źródłowy musi być palindromiczny), co czyni to wyzwanie ograniczonego źródła .
Wyjaśnienia
- Chociaż
true
ifalse
są oczywistymi wyborami dla A i B , możesz użyć dowolnych dwóch odrębnych wartości dla danych wyjściowych „jest palindromem” i „nie jest palindromem”, które nie muszą być wartościami logicznymi. - Definiujemy odwrócenie ciągu znaków na poziomie postaci ;
éé
jest palindromiczny niezależnie od tego, czy program jest zakodowany w UTF-8 czy Latin-1, nawet jeśli nie jest to palindromiczna sekwencja oktetów po kodowaniu UTF-8. - Jednak nawet jeśli twój program zawiera znaki spoza ASCII, musi działać tylko dla wprowadzania ASCII. W szczególności wejście S będzie zawierać tylko drukowalne znaki ASCII (łącznie ze spacją, ale nie zawiera nowego wiersza). Oznacza to między innymi, że jeśli potraktujesz dane wejściowe raczej jako sekwencję bajtów niż sekwencję znaków, twój program prawdopodobnie nadal będzie zgodny ze specyfikacją (chyba że kodowanie we / wy w twoim języku jest bardzo dziwne). W związku z tym definicja palindromu w poprzednim punkcie ma znaczenie tylko podczas sprawdzania, czy program ma poprawną formę.
- Ukrywanie połowy programu w komentarzu lub dosłownym łańcuchu znaków, choć nie jest kreatywne, jest legalne; jesteś oceniany za długość, a nie za kreatywność, więc możesz swobodnie korzystać z „nudnych” metod, aby mieć pewność, że Twój program jest palindromem. Oczywiście, ponieważ otrzymujesz ocenę za długość, części programu, które nic nie robią, pogorszą twój wynik, więc możliwość korzystania z obu połówek programu będzie prawdopodobnie pomocna, jeśli będziesz w stanie to zrobić .
- Ponieważ kryterium zwycięstwa jest mierzone w bajtach, musisz określić kodowanie, w którym napisany jest Twój program, aby móc go zdobyć (chociaż w wielu przypadkach będzie oczywiste, jakiego kodowania używasz).
Kryterium zwycięstwa
Mimo że program musi być palindromem na poziomie postaci, używamy bajtów, aby zobaczyć, kto wygra. W szczególności im krótszy jest twój program, mierzony w bajtach, tym lepiej; to wyzwanie dla golfa . Aby umożliwić porównywanie zgłoszeń (zwłaszcza zgłoszeń w tym samym języku), umieść liczbę bajtów dla swojego programu w nagłówku zgłoszenia (plus liczbę znaków, jeśli różni się od liczby bajtów).
(
z a
i )
z b
. Czy abab
palindrom? Nie, musiałoby być abba
. To też ()()
nie jest palindrom; musiałoby być ())(
.
()() is not a palindrome, but ())( is.
Gratulacje, trafiłeś na reddit!