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).
(
za
i)
zb
. Czyabab
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!Odpowiedzi:
Brachylog (2), 3 bajty na stronie kodowej Brachylog
Wypróbuj online!
Jest to pełny program, który pobiera dane wejściowe za pomocą standardowego wejścia (przy użyciu składni Brachylog dla stałych, tzn. Ciągi są ujęte w podwójny cudzysłów), a dane wyjściowe za pośrednictwem standardowego wyjścia. Dane wyjściowe dotyczą
true.
wejścia palindromowego ifalse.
wejścia niepalindromicznego.Ten program jest nie tylko palindromiczny, ale ma także lewą / prawą (i prawdopodobnie w niektórych czcionkach góra / dół) lustrzaną symetrię.
Wyjaśnienie
W Brachylog wielkie litery oznaczają punkty w programie, które mają identyczne wartości; jest to używane prawie jak obwód elektryczny do przenoszenia informacji z jednej części programu do drugiej. Jedną z konsekwencji tego jest to, że jeśli umieścisz polecenie między identyczną parą wielkich liter, skutecznie zapewnisz, że dane wejściowe i wyjściowe polecenia są takie same. Brachylog domyślnie przyjmuje dane wejściowe, więc w tym przypadku twierdzimy również, że dane wejściowe do polecenia są takie same jak dane wejściowe do programu. W tym programie używamy polecenia
↔
, które odwraca rzeczy (w tym przypadku ciągi znaków); więc program skutecznie zapewnia, że dane wejściowe są takie same do przodu i do tyłu.Pełny program (w przeciwieństwie do funkcji) w Brachylog zwraca wartość logiczną,
false.
jeśli nie ma sposobu, aby wszystkie asercje w programie były poprawne jednocześnie, lubtrue.
jeśli wszystkie asercje w programie są ze sobą kompatybilne. Mamy tutaj tylko jedno stwierdzenie - że odwrócenie danych wejściowych tego nie zmienia - więc program działa jak kontroler palindromu.źródło
Pyth , 3 bajty
Zwraca wartość prawda lub fałsz .
Wypróbuj online!
Jak to działa
źródło
_
?Python , 39 bajtów
Wypróbuj online!
Nudne, ale jeśli jest krótszy w Pythonie, będzie imponujący.
źródło
(
,)
kilka dobrych (i mylące) Wejścia :)Galaretka , 5 bajtów
Zwraca 1 lub 0 . Pierwsza linia to niewykonane łącze pomocnicze, druga linia wywołuje test palindromu.
Wypróbuj online!
źródło
Galaretka , 5 bajtów
Wypróbuj online!
Wyrównuje wsteczny i wsteczny.
Lub bardziej wydajne, ale mniej estetyczne:
lub
źródło
Mathematica, 23 bajty
Niezbyt interesujące, ale ze względu na kompletność ...
Powyżej jest
CompoundExpression
ewaluacjaPalindromeQ
wbudowanego rozwiązania problemu.QemordnilaP
jest po prostu niezdefiniowanym identyfikatorem, który jest ignorowany z powodu;
.źródło
Haskell,
87854434 bajtówObjaśnienie:
((->) a)
jest instancją klasy Applicative (dzięki @faubiguy),<*>
zdefiniowaną jakoWięc podstawiając argumenty, można zrozumieć, dlaczego to działa.
źródło
--
komentarzu.(==)
,reverse
orazid
funkcje (id
jest funkcja tożsamości).<*>
zamiast<$>
i usuwając<*>id
05AB1E , 3 bajty
Kod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
ÂQ
PHP, 55 bajtów
Dodatkowo, nazwa języka to palindrom, więc ... punkty bonusowe!
źródło
MATL , 7 bajtów
Wypróbuj online!
Zwraca [1; 1] dla wprowadzania palindromowego i [0; 0] inaczej.
źródło
Pip ,
1211 bajtówTeraz bez komentarzy!
Pobiera dane wejściowe jako argument wiersza poleceń; dane wyjściowe
1
dla palindromu,0
dla nie-palindromu. Wypróbuj online!Rdzeniem tego, co chcemy zrobić, to
RVaQa
:reverse(a) string-equals a
. Kodx:RVaQa
oblicza ten wynik i przypisuje go dox
. NastępnieVR:x
przypisuje wartośćx
zmiennejVR
. Ponieważ to przypisanie jest ostatnią instrukcją w programie, jego wartość jest również automatycznie drukowana. Voila!Aby zobaczyć poprzednią interesującą wersję używającą niezdefiniowanego zachowania, zobacz historię zmian.
źródło
Perl 6 , 25 bajtów / znaków utf8
Spróbuj
źródło
R,
111103 bajtówNie jest to najbardziej oryginalna odpowiedź.
#
jest znakiem komentarza w R.Nie golfowany:
Łańcuch znaków z
scan
jest konwertowany na nieprzetworzone bajty dziękicharToRaw
funkcji. Te nieprzetworzone bajty są porównywane jeden po drugim z odpowiednikami zrev()
funkcji, która odwraca kolejność argumentów. Wyjście tej części jest wektoremTRUE
i / lubFALSE
. Funkcja następnie przesyła , gdy wszystkie te elementy sąall
TRUE
TRUE
Tutaj,
"\n"
wscan
funkcji jest konieczne dla wejść z więcej niż jednym słowem.Poprzednia odpowiedź (bajtowo), 81 bajtów
z - 24 bajtami dzięki @rturnbull .
źródło
charToRaw
konwersję przed przypisaniem dos
i zmieniając sposób ustawieniasep
argumentu nascan
:all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
éé
w kodowaniu UTF-8, ale nie sądzę, że łamie to zasady wyzwania.)éé
zlatin1
kodowaniem.RProgN , 11 bajtów
Pierwsza połowa tego wszystkiego powoduje ciężkie podnoszenie, a dla wygody RProgN druga połowa to brak możliwości.
Wypróbuj online!
źródło
Siatkówka , 53 bajty
Liczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
Jestem pewien, że nie jest to jeszcze optymalne (
»
linia wydaje się szczególnie marnotrawna, a ja mam 45-bajtowe rozwiązanie, które jest palindromiczne z wyjątkiem jednej postaci), ale myślę, że to początek.źródło
GNU sed ,
6459 + 1 (flaga r) = 60 bajtów UTF-8Chwilę zajęło mi wymyślenie odpowiedzi sed, która nie używa sekcji komentarzy, aby kod stał się palindromem. Zamiast tego używam
c
polecenia, które wypisze pierwszą połowę kodu w odwrotnej kolejności, tylko upewniam się, że instrukcja nie została osiągnięta.Skrypt jest drukowany,
1
jeśli ciąg wejściowy nie jest palindromem (pomyśl o nim jako o błędzie). Jeśli ciąg znaków jest palindromem, to nie podaje żadnych danych wyjściowych (pomyśl o tym, że zakończyło się pomyślnie).Uruchom przykłady: lub Wypróbuj online!
Wyjaśnienie:
źródło
-r
nie działa, ale możesz po prostu owinąć całość w BASH. Wypróbuj online!Alice , 19 bajtów
Wypróbuj online!
Drukuje
Jabberwocky
dla palindromów i nic dla non-palindromów. Działa dla dowolnego wejścia UTF-8.Wyjaśnienie
Ponieważ jest to zadanie przetwarzania łańcucha, Alice będzie musiała działać w trybie porządkowym, aby je rozwiązać. To z kolei oznacza, że wskaźnik instrukcji musi przesuwać się po przekątnej, dlatego potrzebujemy co najmniej dwóch linii, aby IP mógł podskakiwać w górę iw dół. Linefeed w takim programie zapewnia dobrą pozycję do umieszczenia środkowego znaku palindromu. Oznacza to, że druga linia musi być odwrotnością pierwszej. Ale ponieważ wykonujemy tylko każdy inny znak w każdej linii, jeśli upewnimy się, że długość linii jest nieparzysta, reszta kodu będzie dobrze pasować do własnych przerw. Jedyną postacią, która w ogóle nie jest używana, jest ukośnik odwrotny, ale ponieważ była arbitralna, wybrałem ją, aby program wyglądał ładnie i symetrycznie.
Właściwie odpowiedni kod jest następujący:
Który jest wykonywany zygzakiem od lewej do prawej.
źródło
Haskell , 34 bajty
Wypróbuj online! Zadzwoń za pomocą
f "some string"
, zwracaTrue
lubFalse
.=<<
Operator na funkcjach działa podobnief=<<g = \s -> f (g s) s
, więc kod jest równoważnef s=s==reverse s
, które, jak właśnie zauważył, skutkowałoby tym samym liczby bajtów.Wersja bez komentarza: (49 bajtów)
Wypróbuj online!
Zadzwoń z
p "some string"
. Wywołuje to,False
jeśli dany ciąg jest palindromem, aTrue
jeśli nie jest palindromem.Wyjaśnienie:
Znalazłem ten komentarz bez palindromu, zaczynając od wersji komentarza i zastępując komentarz nową linią:
Druga linia kończy się niepowodzeniem, ponieważ nawiasy nie pasują, więc musimy się ich pozbyć. Gdybyśmy mieli funkcję
e
sprawdzającą równość, toobydwie kompilacji z drugą linią wyznaczającą Infix Operator
<<=
które przyjmuje dwa argumentyesrever
ie
i zwraca funkcjęp
.Aby zdefiniować
e
jako funkcję równości, zwykle pisze sięe=(==)
, ale)==(=e
ponownie nie kompiluje. Zamiast tego możemy jednoznacznie wziąć dwa argumenty i przekazać je do==
:e x y=x==y
. Teraz kod odwróconyy==x=y x e
kompiluje się, ale redefiniuje==
operatora, co powodujee x y=x==y
niepowodzenie definicji . Jeśli jednak przejdziemy do operatora nierówności/=
, odwrócona definicja staje sięy=/x=y x e
i definiuje=/
operator, który nie koliduje z/=
operatorem pierwotnym .źródło
OLEJ , 178 bajtów
Odczytuje dane wejściowe, rozbija je, powoli dodaje swoją długość (poprzez zwiększanie i zmniejszanie) do adresu, aby znać adres po ciągu, przeskakuje do innej części kodu (w środku), odwraca kierunek pasma, wszczepia ciąg ponownie i sprawdza, czy jest taki sam jak oryginalny ciąg. TL; DR: Jak zwykle ból.
Wyprowadzane,
40
jeśli ciąg nie jest palindromem,0
jeśli tak jest.źródło
JavaScript, 64 bajty
Funkcja wywołania
f
z ciągiem znakówźródło
f
, kod nie przypisuje funkcji strzałki do zmiennej, więc nie można jej wywołaćJapt ,
72 bajtyUruchom
Stare rozwiązanie:
Wypróbuj online!
Wyjaśnienie
Japt nie unika funkcji, dopóki nie zostanie zamknięty nawias zamykający (lub spacja).
Można to zapisać ponownie:
U¥Uw(U¥U)
→U¥Uw
→U==Uw
. W Japt nawias opuszczony na początku i na końcu funkcji jest wstawiany automatycznie.źródło
w
funkcja nie przyjmuje argumentów, jak się maU
? Czy jest coś takiegoU.reverse()
?U
w taki sam sposób jakU.reverse()
.Narzędzia Bash + Unix, 49 bajtów
Dane wejściowe są przekazywane jako argument.
Dane wyjściowe są zwracane w kodzie wynikowym - 0 dla palindromu, 1 dla non-palindromu.
Może ktoś może zrobić lepiej i nie polegać tylko na komentarzu, aby sam kod był palindromiczny.
Wypróbuj online!
źródło
[[ $1 = `rev<<<$1` ]]
jest krótszy. ([[
Składnia Bash , bez cytatu)rev<<<$1
są potrzebne nawet w[[...]]
rozwiązaniu. Przetestuj za pomocą ciągu wejściowego'[$]]$['
(który jest palindromem). Po dodaniu tych cytatów, aby działało, Twoje rozwiązanie ma taką samą długość jak moje rozwiązanie.==
in[[
będzie interpretowane jakocase
wzór podobny.> <>, 11 bajtów
Wypróbuj tutaj!
Zwraca „\ n coś pachnie podejrzanie ...” po prawidłowym palindromie, brak danych wyjściowych po nieprawidłowym palindromie. Umieść palindrom na stosie.
źródło
Java -
171169160 bajtówKomentarz na końcu ma uczynić z niego palindrom. Zwraca,
P(alindrome)
gdy wejście jest palindromem, aN(ot)
gdy nie.Wersja bez golfa:
2 bajty zapisane dzięki @DLosc
Dzięki @Olivier Grégoire za wskazanie nieprawidłowej ilości bajtów! Naprawiono teraz
źródło
int
s zamiastchar
s.'P'
i 78 for'N'
lub użyj różnych znaków, aby zapisać jeszcze więcej bajtów.new StringBuffer(s).reverse()+""
zamiastnew StringBuffer(s).reverse().toString()
int
zamiastbool
?Java 8,
9290 bajtówTo jest wersja z komentarzem. Jeśli łańcuch zawiera odwrotność, oznacza to palindrom (
true
), w przeciwnym razie nie jest (false
).Wypróbuj online!
Aktualizacja
;
'Sźródło
s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s
. Wypróbuj online 90 bajtów .Właściwie 5 bajtów
Wypróbuj online!
Prawdziwe wyjście jest
[1]\n[1]
, a wyjście falsey jest[]\n[]
(w obu wyjściach\n
reprezentuje dosłowną nową linię).Wyjaśnienie:
źródło
C ++, 154 bajtów
Muszę powiedzieć, że zwrotne stwierdzenie było kosztowne, ale nie wyobrażam sobie wiele, co mogę zrobić, aby to zmienić. Możliwość wycięcia symboli std :: zaoszczędziłaby mi około 10 znaków, ale „użycie std przestrzeni nazw”; to całkiem sporo.
Przypuszczam, że C ++ nie był tak naprawdę przeznaczony do zwięzłości.
źródło
Prolog, 44 bajty
Wykorzystuje to określone gramatyki klauzul. W rzeczywistości jest to gramatyka bezkontekstowa:
Stosowanie:
źródło
CJam, 13 bajtów
Wyjaśnienie:
Przykład:
źródło
l_W%#e#%W_l
J, 15 bajtów, 15 znaków
Zwraca 1 jeśli palindrom, 0 jeśli nie.
Wynik:
Wyjaśnienie:
źródło