Jestem palindromem. Jesteś?


103

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

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 .

Wyjaśnienia

  • Chociaż truei falsesą 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 . 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).


12
Czy ktoś mógłby wyjaśnić, dlaczego () () nie byłby palindromem?
Emilio M Bumachar,

58
@EmilioMBumachar Spróbuj wymienić (z ai )z b. Czy ababpalindrom? Nie, musiałoby być abba. To też ()()nie jest palindrom; musiałoby być ())(.
DLosc

7
Rozwiązania wykorzystujące w całości komentarze, aby program palindromic wyglądał dla mnie jak luka :(
kennytm

15
@kennytm Nie zezwalanie na nie byłoby gorsze, ponieważ nie ma zadowalającego sposobu, aby to zrobić obiektywnie w sposób niezależny od języka. (Co to za komentarz? A co z umieszczeniem nieużywanej połówki w dosłownym łańcuchu znaków, który jest odrzucany? Co z językami 2D, w których można mieć doskonale wykonywalny kod, który po prostu nigdy nie jest dostępny?)
Martin Ender

9
()() is not a palindrome, but ())( is. Gratulacje, trafiłeś na reddit!
numbermaniac

Odpowiedzi:


137

Brachylog (2), 3 bajty na stronie kodowej Brachylog

I↔I

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 i false.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, lub true.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.


49
I 180-stopniowa symetria obrotowa, jest piękna.
ATaco,

7
... i symetria wzdłuż osi pionowej i poziomej :-)
Luis Mendo

13
@SteakOverflow Brachylog używa niestandardowej strony kodowej , więc te znaki nie są zakodowane w UTF-8
DJMcMayhem

4
Dołączyłem do tej społeczności tylko po to, aby głosować w tym programie. Łał.
Bill Michell

4
@ATaco Połączenie symetrii lewo / prawo i góra / dół implikuje symetrię obrotu o 180 stopni. ;)
Eric Duminil

55

Pyth , 3 bajty

_I_

Zwraca wartość prawda lub fałsz .

Wypróbuj online!

Jak to działa

  _  Reverse the input.
_I   Invariant-reverse; test if the reversed input is equal to its reverse.

1
Dlaczego potrzebujesz finału _?
busukxuan

34
@busukxuan Z pytania: „Dodatkowo program lub funkcja, którą piszesz, musi być samym palindromem”
isaacg,

1
Dlaczego tak wielu entuzjastów ... Ta odpowiedź nie wydaje się trudna do wymyślenia ...?
ghosts_in_the_code

1
Chyba tak. Nadal wydaje się to niesprawiedliwe. Na niektóre pytania trzeba włożyć dużo ciężkiej pracy, aby odpowiedzieć, a inne są znacznie łatwiejsze. Mimo to wypłata jest taka sama. Przy okazji również głosowałem: P
ghosts_in_the_code

4
@ghosts_in_the_code Tylko jedna z moich odpowiedzi dla 100+ była trudna do napisania, ale są odpowiedzi, na które spędziłem dni, które otrzymały tylko garść pozytywnych opinii. W końcu wszystko się wyrównuje ...
Dennis




23

Mathematica, 23 bajty

QemordnilaP;PalindromeQ

Niezbyt interesujące, ale ze względu na kompletność ...

Powyżej jest CompoundExpressionewaluacja PalindromeQwbudowanego rozwiązania problemu. QemordnilaPjest po prostu niezdefiniowanym identyfikatorem, który jest ignorowany z powodu ;.


21

Haskell, 87 85 44 34 bajtów

p=(==)<*>reverse--esrever>*<)==(=p

Objaśnienie: ((->) a)jest instancją klasy Applicative (dzięki @faubiguy), <*>zdefiniowaną jako

(<*>) f g x = f x (g x)

Więc podstawiając argumenty, można zrozumieć, dlaczego to działa.


1
Czy potrafisz wyjaśnić kod?
bli

1
@bli wszystko po --komentarzu.
theonlygusti

3
@ thehelylygusti Haskell jest wystarczająco obcy, że tylko połowa pomaga.
Yakk

@Yakk To jakaś kombinacją (==), reverseoraz idfunkcje ( idjest funkcja tożsamości).
tbodt

Możesz zapisać 10 bajtów, używając <*>zamiast <$>i usuwając<*>id
faubi

20

05AB1E , 3 bajty

Kod:

ÂQÂ

Wyjaśnienie:

     # Bifurcate (duplicate and reverse the duplicate) implicit input
 Q    # Check if equal
  Â   # Bifurcate the result

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!


Dlaczego nie tylkoÂQ
Neil A.

1
@NeilA. Sam kod również musi być palindromem.
Adnan

17

PHP, 55 bajtów

<?=strrev($s=$_GET[s])==$s;#;s$==)]s[TEG_$=s$(verrts=?<

Dodatkowo, nazwa języka to palindrom, więc ... punkty bonusowe!


Podstępne rozwiązanie.
Martijn

16

MATL , 7 bajtów

tPX=XPt

Wypróbuj online!

Zwraca [1; 1] dla wprowadzania palindromowego i [0; 0] inaczej.

t       % duplicate the input
P       % reverse the second string
X=      % check the two strings are exactly equal (returns 0 or 1)
XP      % flip array (does nothing)
t       % duplicate the answer, giving either [1;1] or [0;0]
        % (implicit) convert to string and display

15

Pip , 12 11 bajtów

Teraz bez komentarzy!

x:RVaQaVR:x

Pobiera dane wejściowe jako argument wiersza poleceń; dane wyjściowe 1dla palindromu, 0dla nie-palindromu. Wypróbuj online!

Rdzeniem tego, co chcemy zrobić, to RVaQa: reverse(a) string-equals a. Kod x:RVaQaoblicza ten wynik i przypisuje go do x. Następnie VR:xprzypisuje wartość xzmiennej VR. 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.



9

R, 111 103 bajtów

all((s<-el(strsplit(scan(,"",,,"\n"),"")))==rev(s))#))s(ver==)))"",)"n\",,,"",(nacs(tilpsrts(le-<s((lla

Nie jest to najbardziej oryginalna odpowiedź. #jest znakiem komentarza w R.

Nie golfowany:

all((s<-el(strsplit(scan(,"",,,"\n"),"")))==rev(s))
#
))s(ver==)))"",)"n\",,,"",(nacs(tilpsrts(le-<s((lla

Łańcuch znaków z scanjest konwertowany na nieprzetworzone bajty dzięki charToRawfunkcji. Te nieprzetworzone bajty są porównywane jeden po drugim z odpowiednikami z rev()funkcji, która odwraca kolejność argumentów. Wyjście tej części jest wektorem TRUEi / lub FALSE. Funkcja następnie przesyła , gdy wszystkie te elementy są
allTRUETRUE

Tutaj, "\n"w scanfunkcji jest konieczne dla wejść z więcej niż jednym słowem.

Poprzednia odpowiedź (bajtowo), 81 bajtów

function(s)all((s=charToRaw(s))==rev(s))#))s(ver==))s(waRoTr‌​ahc=s((lla)s(noitcnu‌​f

z - 24 bajtami dzięki @rturnbull .


Możesz zaoszczędzić kilka dobrych bajtów, wykonując charToRawkonwersję przed przypisaniem do si zmieniając sposób ustawienia separgumentu na scan:all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
rturnbull

(Również to podejście nie działa np. Dla danych wejściowych ééw kodowaniu UTF-8, ale nie sądzę, że łamie to zasady wyzwania.)
rturnbull

@rturnbull: dzięki za dane wejściowe! Rzeczywiście testowałem ééz latin1kodowaniem.
Frédéric

Ponieważ test musi być przeprowadzony pod kątem znaków, myślę, że obecny program łamie zasady.
Frédéric

Nie jestem pewien, czy poprzednia wersja łamie zasady. OP stwierdza: „Między innymi oznacza to, ż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). „
rturnbull

8

RProgN , 11 bajtów

~]S.E E.S]~

Pierwsza połowa tego wszystkiego powoduje ciężkie podnoszenie, a dla wygody RProgN druga połowa to brak możliwości.

~]S.E E.S]~
~           # Treat the word as a Zero Space Segment
 ]          # Duplicate the top of the stack
  S.        # Reverse the top of the stack
    E       # Compare if these values are equal
      E.S]~ # A no-op, because the ~ is at the end of the word, not the start.

Wypróbuj online!


8

Siatkówka , 53 bajty

Liczba bajtów zakłada kodowanie ISO 8859-1.

$
¶$`
O$^`\G.
»
D`
M$`^.+$
$+.^`$M
`D
»
.G\`^$O
`$¶
$

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.


8

GNU sed , 64 59 + 1 (flaga r) = 60 bajtów UTF-8

Chwilę zajęło mi wymyślenie odpowiedzi sed, która nie używa sekcji komentarzy, aby kod stał się palindromem. Zamiast tego używam cpolecenia, które wypisze pierwszą połowę kodu w odwrotnej kolejności, tylko upewniam się, że instrukcja nie została osiągnięta.

:;s:^(.)(.*)\1$:\2:;t;/../c1
d
1c/../;t;:2\:$1\)*.().(^:s;:

Skrypt jest drukowany, 1jeś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!

me@LCARS:/PPCG$ sed -rf palindrome_source.sed <<< "level"
me@LCARS:/PPCG$ sed -rf palindrome_source.sed <<< "game"
1

Wyjaśnienie:

:                              # start loop
s:^(.)(.*)\1$:\2:              # delete first and last char, if they are the same
t                              # repeat if 's' was successful
/../c1                         # if at least 2 chars are left, print 1. 'c' reads
                               #till EOL, so next command must be on a new line.
d                              # delete pattern space. This line must be a
                               #palindrome itself, and must end the script.
1c/../;t;:2\:$1\)*.().(^:s;:   # (skipped) print first half of code in reverse
                               #order. Everything after 'c' is treated as string.

1
TIO obsługuje teraz sed. -rnie działa, ale możesz po prostu owinąć całość w BASH. Wypróbuj online!
Riley,

@ Riley Niezłe użycie nagłówka i stopki w TIO, dzięki. Poprzednie obejście polegało na przeniesieniu kodu na listę argumentów za pomocą -e, ale twoja droga jest o wiele ładniejsza. Czekałem na to, aby to naprawić, ale w ten sposób nie muszę.
seshoumara,

7

Alice , 19 bajtów

/@.nzRoi\
\ioRzn.@/

Wypróbuj online!

Drukuje Jabberwockydla 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:

/ . z o
 i R n @

Który jest wykonywany zygzakiem od lewej do prawej.

/   Reflect the IP southeast, enter Ordinal mode.
i   Read all input as a single string.
.   Duplicate the input.
R   Reverse the copy.
z   Pop the reverse Y and the original X. If X contains Y, drop everything
    up to its first occurrence. Since we know that X and Y are the same length,
    Y can only be contained in X if X=Y, which means that X is a palindrome.
    So this will result in an empty string for palindromes and in the non-empty
    input for non-palindromes.
n   Logical NOT. Replaces non-empty strings with "", and empty strings with
    "Jabberwocky", the "default" truthy string.
o   Output the result.
@   Terminate the program.

6

Haskell , 34 bajty

f=(==)=<<reverse--esrever<<=)==(=f

Wypróbuj online! Zadzwoń za pomocą f "some string", zwraca Truelub False.

=<<Operator na funkcjach działa podobnie f=<<g = \s -> f (g s) s, więc kod jest równoważne f 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)

e x y=x/=y
p=e=<<reverse
esrever<<=e=p
y=/x=y x e

Wypróbuj online!

Zadzwoń z p "some string". Wywołuje to, Falsejeśli dany ciąg jest palindromem, a Truejeśli nie jest palindromem.

Wyjaśnienie:

Znalazłem ten komentarz bez palindromu, zaczynając od wersji komentarza i zastępując komentarz nową linią:

p=(==)=<<reverse
esrever<<=)==(=p

Druga linia kończy się niepowodzeniem, ponieważ nawiasy nie pasują, więc musimy się ich pozbyć. Gdybyśmy mieli funkcję esprawdzającą równość, to

p=e=<<reverse
esrever<<=e=p

obydwie kompilacji z drugą linią wyznaczającą Infix Operator <<=które przyjmuje dwa argumenty esreveri ei zwraca funkcję p.

Aby zdefiniować ejako funkcję równości, zwykle pisze się e=(==), ale )==(=eponownie nie kompiluje. Zamiast tego możemy jednoznacznie wziąć dwa argumenty i przekazać je do ==: e x y=x==y. Teraz kod odwrócony y==x=y x ekompiluje się, ale redefiniuje ==operatora, co powoduje e x y=x==yniepowodzenie definicji . Jeśli jednak przejdziemy do operatora nierówności /=, odwrócona definicja staje się y=/x=y x ei definiuje =/operator, który nie koliduje z /=operatorem pierwotnym .


5

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, 40jeśli ciąg nie jest palindromem, 0jeśli tak jest.

5
0
12
0
40
1
40
2
1
40
34
10
2
3
22
16
9
2
8
35
6
11
6
37

3
4
4
27
26
0
1
10
1

40
13
2
31
04

1
01
1
0
62
72
4
4
3

73
6
11
6
53
8
2
9
61
22
3
2
01
43
04
1
2
04
1
04
0
21
0
5

2
Czysty język! :)
DLosc

5

JavaScript, 64 bajty

f=s=>s==[...s].reverse().join``//``nioj.)(esrever.]s...[==s>=s=f

Funkcja wywołania fz ciągiem znaków

f("abba") // returns true
f("abab") // returns false

Twój kod źródłowy nie jest palindromem!
seshoumara,

@seshoumara Zaktualizowałem kod
Prasanth Bendra

Teraz jest dobrze. Może wspomnieć o wartości zwracanej, jeśli ciąg nie jest palindromem, tylko ze względu na zakończenie.
seshoumara,

@apsillers dziękuję Zredagowałem odpowiedź.
Prasanth Bendra

Nie ma funkcji f, kod nie przypisuje funkcji strzałki do zmiennej, więc nie można jej wywołać
spex

5

Japt , 7 2 bajty

êê

Uruchom

Stare rozwiązanie:

U¥UwU¥U

Wypróbuj online!

Wyjaśnienie

U¥UwU¥U
U¥        U is the input, ¥ is a shortcut for == 
  Uw      w is a reverse function.
    U¥U   This calculates U == U (always true), but the result is ignored
          because w does not look at its arguments.

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¥UwU==Uw. W Japt nawias opuszczony na początku i na końcu funkcji jest wstawiany automatycznie.


Wszystko to ma sens, z wyjątkiem sytuacji, gdy wfunkcja nie przyjmuje argumentów, jak się ma U? Czy jest coś takiego U.reverse()?
DLosc

@DLosc Prawidłowe. Odwraca się Uw taki sam sposób jak U.reverse().
Oliver

4

Narzędzia Bash + Unix, 49 bajtów

[ "$1" = "`rev<<<$1`" ] # ] "`1$<<<ver`" = "1$" [

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!


[[ $1 = `rev<<<$1` ]]jest krótszy. ( [[Składnia Bash , bez cytatu)
Arthur2e5

2
@ Arthur2e5 Wypróbowałem twoją sugestię, ale myślę, że cytaty wokół rev<<<$1są 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.
Mitchell Spector

Ładny chwyt! Zapomniałem, że RHS ==in [[będzie interpretowane jako casewzór podobny.
Arthur2e5

@ Arthur2e5 Nadal uważam, że istnieje prawdopodobnie sprytny sposób na skrócenie tego.
Mitchell Spector

Czy to nadal zadziała, jeśli na wejściu będą nowe linie? Myślę, że potrzebujesz rev | tac zamiast tylko rev.
b_jonas

4

> <>, 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.


Wymaganie, aby dane wejściowe znajdowały się już na stosie, sprawia, że ​​jest to fragment kodu. To wyzwanie wymaga programów lub funkcji, a nie fragmentów.
pppery

4

Java - 171 169 160 bajtów

int q(String s){return s.equals(new StringBuffer(s).reverse().toString())?1:2;}//};2:1?))(gnirtSot.)(esrever.)s(reffuBgnirtS wen(slauqe.s nruter{)s gnirtS(q tni

Komentarz na końcu ma uczynić z niego palindrom. Zwraca, P(alindrome)gdy wejście jest palindromem, a N(ot)gdy nie.

Wersja bez golfa:

int q(String s) {
    return s.equals(new StringBuffer(s).reverse().toString()) ? 'P' : 'N';
}//};'N':'P'?))(gnirtSot.)(esrever.)s(reffuBgnirtS wen(slauqe.s nruter{)s gnirtS(q tni

2 bajty zapisane dzięki @DLosc

Dzięki @Olivier Grégoire za wskazanie nieprawidłowej ilości bajtów! Naprawiono teraz


Wierzę, że możesz zaoszczędzić kilka bajtów, zwracając ints zamiast chars.
DLosc

Nie wiem, jak sprawdzić liczbę bajtów, ale masz 160 bajtów, a nie 161.
Olivier Grégoire

Możesz zapisać 2 bajty, zwracając 80 for 'P'i 78 for 'N'lub użyj różnych znaków, aby zapisać jeszcze więcej bajtów.
Selim

1
Możesz zaoszczędzić jeszcze więcej bajtów, wykonując new StringBuffer(s).reverse()+""zamiastnew StringBuffer(s).reverse().toString()
Selim

1
z jakiegoś powodu zwracasz intzamiast bool?
CodesInChaos

4

Java 8, 92 90 bajtów

To jest wersja z komentarzem. Jeśli łańcuch zawiera odwrotność, oznacza to palindrom ( true), w przeciwnym razie nie jest ( false).

s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s

Wypróbuj online!

Aktualizacja

  • -2 [18-04-05] Przełączono na zawiera. Dzięki @Kevin Cruijssen !
  • -2 [17-02-20] Usunięto ;'S
  • -16 [17-02-22] Automatyczna konwersja

Ten kod nie jest wyrażeniem lambda.
Jakob

@Jakob Myślałem, że tak. Gdybyś użył lambda, prawdopodobnie chciałbyś mieć wiodącą i końcową linię nowego wiersza. (Dodałem link tio)
NonlinearFruit

Tak, moja skarga była taka, że ​​komentarz wiersza sprawia, że ​​przesłanie jest czymś więcej niż tylko wyrażeniem lambda, a zatem nie jest ważne jako rozwiązanie lambda. Na razie nie martw się o to; Prawdopodobnie w końcu zrobię meta post, aby uzyskać konsensus.
Jakob

@Jakob Rozwiązania Lambda mogą czasami zawierać dodatkowy kod , dlatego uważam, że jest poprawny. Ale jeśli nie zostaniesz sprzedany, meta post nie zaszkodzi.
NielinioweOwoce

1
Wiem, że minęło trochę czasu, ale możesz zagrać w golfa 2 bajty, zmieniając go na s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s. Wypróbuj online 90 bajtów .
Kevin Cruijssen

3

Właściwie 5 bajtów

;R=R;

Wypróbuj online!

Prawdziwe wyjście jest [1]\n[1], a wyjście falsey jest []\n[](w obu wyjściach \nreprezentuje dosłowną nową linię).

Wyjaśnienie:

;R=R;
;R=    duplicate input, reverse one copy, test equality (the main palindrome-testing part)
   R   range(1, x+1) - if palindrome, this pushes [1], else it pushes []
    ;  duplicate

Dlaczego po prostu tego nie zrobisz ?
Leaky Nun

1
@LeakyNun to musi być palindrom
caird coinheringaahing

3

C ++, 154 bajtów

int m(){std::string g,p="";g=p;std::reverse(p.begin(),p.end());return g==p;}//};p==g nruter;))(dne.p,)(nigeb.p(esrever::dts;p=g;""=p,g gnirts::dts{)(m tni

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.


3

Prolog, 44 bajty

p-->[]|[_]|[E],p,[E].%.]E[,p,]E[|]_[|][>--p

Wykorzystuje to określone gramatyki klauzul. W rzeczywistości jest to gramatyka bezkontekstowa:

p -->
      []            % the empty string
   |                % or
      [_]           % a one character string
   |                % or
      [E],          % one character, followed by
      p,            % a palindrome, followed by
      [E].          % that same character

Stosowanie:

?- phrase(p,"reliefpfeiler").
true 

?- phrase(p,"re").
false.

2

CJam, 13 bajtów

l_W%=e#e=%W_l

Wyjaśnienie:

l_W%=e#e=%W_l
l_            e#Read input twice
  W%          e#Reverse one input
    =         e#Test for equality
     e#e=%W_l e#Comment to be a palindrome

Przykład:

> l_W%=e#e=%W_l
l_W%=e#e=%W_l
1

> l_W%=e#e=%W_l
Hi
0

> l_W%=e#e=%W_l
hh
1

Spróbuj tego:l_W%#e#%W_l
aditsu

2

J, 15 bajtów, 15 znaków

-:|.NB. .BN.|:-

Zwraca 1 jeśli palindrom, 0 jeśli nie.

Wynik:

   f '())('
1
   f 'nope'
0

Wyjaśnienie:

-:    NB. "Match" verb, checks for equality
|.    NB. Reverses the string
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.