Jeśli kiedykolwiek próbowałeś pisać kod palindromiczny, będziesz wiedział, ile nawiasów przeszkadza. ()()
nie jest palindrom, choć to trochę wygląda jak powinno być, podczas gdy ())(
i ()(
to zarówno palindromiczna i oba bardzo głupi patrząc. Czy nie byłoby wygodnie, gdyby było na odwrót?
Łańcuch jest dogodnie palindromiczny, jeśli jest równy łańcuchowi pochodnemu, gdy jego odwrotność ma obrócone wszystkie nawiasy ( ()
), nawiasy ( []
) i nawiasy klamrowe ( {}
). Żadne inne postacie nie są wyjątkowe i wymagają przewracania. ( <>
czasami są sparowane, ale często nie, więc są pomijane).
Twoim zadaniem jest napisanie w Twoim języku programu (przyjmującego dane wejściowe na STDIN) lub funkcji (przyjmującego pojedynczy argument łańcuchowy), który (a) daje spójną prawdziwą wartość *, gdy jej argument jest dogodnie palindromiczny i inny, spójny fałszywy wartość inaczej, i (b) to samo dogodnie palindromową.
Na przykład następujące dane wejściowe są dogodnie palindromiczne:
racecar
(a)(bb)(a)
void main(int argc, *char[] argv) {} (vgra []rahc* ,cgra tni)niam diov
A następujące nie są:
non-palindrome
A nut for a jar of tuna?
(old [style] parens) )snerap ]elyts[ dlo(
ingirumimusnocte)etconsumimurigni
Nie możesz polegać na żadnym stanie zewnętrznym (konkretna nazwa pliku, struktura katalogów, inne dane wejściowe użytkownika, dostęp do Internetu itp.), Z wyjątkiem flag interpretera / kompilatora.
Nie możesz również używać „sztuczki komentowania”, gdy komentujesz lub renderujesz nieużywany fragment kodu, korzystając z możliwości komentowania w swoim języku. Na przykład wszystkie poniższe elementy są niedozwolone, ponieważ zawierają niefunkcjonalne części, które można bezpiecznie usunąć lub zniszczyć (kosztem utraty dogodnej palindromii):
{some code} // {edoc emos}
{some code} NB.BN {edoc emos}
"n\" ;{edoc emos} ;"; {some code}; "\n"
Oczywiście może to nie dotyczyć każdego takiego przypadku, ale duchem wyzwania nie jest tutaj stosowanie komentarzy i nieparsowanego ** kodu w celu osiągnięcia palindromii, zamiast korzystania z poprawionych części i nawiasów. Patrzę na ciebie, LISP, Brainfuck.
To jest golfowy kod , więc wygrywa najkrótszy kod, ale mile widziane są wszystkie długości kodu.
* Przez spójne wartości prawda i fałsz rozumiem, że możesz zwrócić jedną z dwóch wartości, na przykład 1
prawda i 0
fałsz lub False
prawda i "no"
fałsz, o ile wartości te różnią się od siebie i nie zmień z uruchomienia na uruchomienie programu. Użyj tego, co ocali ci postacie.
** Nie należy mylić z niewykonanym : kod, który jest prawidłowy i może robić dziwne rzeczy, ale nigdy nie wywoływany jest w porządku.
źródło
if(false){some code}
zmiennymi lub nieużywanymi zmiennymi? Czy są dozwolone?(eslaf)fi
, możesz użyćif(false)
.()()
ustalenie , dlaczego nie jest palindromemOdpowiedzi:
J (60)
Ta funkcja przyjmuje argument:
Wyjaśnienie:
f :: g
uruchamia funkcjęf
nad wejściem i zwraca wynik, jeśli zwraca bez błędu. Jeśli sięf
nie powiedzie, działag
zamiast tego.f
O to(|.-:'())([]][{}}{'&charsub)
, co robi rzeczywistej pracy:|.
: rewers-:
: jest równe'())([]][{}}{'&charsub
: wymiana każdego wspornika na przeciwny wspornikg
funkcja jest(busrahc&'}{{}][[])(()':-.|)
nonsensowna, ale poprawna pod względem składniowym.busrahc
nie jest zdefiniowany, ale to nie ma znaczenia, ponieważ jest rozwiązywany tylko wtedy, gdy jest uruchamiany (i nie działa).źródło
f :: g
wg@-@f
.g
jest równoważny hakowi,(-.|)
ponieważ:
wyniki stają się -1 i pustą listą odpowiednio dla palindromic, a nie odpowiednio.GolfScript,
10791Newlines są artystyczne.
fi
,c43
Ic
są noops, ale cały kod jest wykonywany.Drukuje
-3-1-1
dla wygodnych palindromów, w-4-1-1
przeciwnym razie. Wypróbuj online!Alternatywna wersja, 155 bajtów
Kosztem 64 bajtów można to poprawić:
Tak jak poprzednio, cały kod jest wykonywany, a każdy bajt wpływa na wynik.
Drukuje
010
dla wygodnych palindromów, w-100
przeciwnym razie. Wypróbuj online!Testy i przykłady
Jak to działa
źródło
Ruby, 110
Drukuje,
true
jeśli wejście jest wygodnym palindromem, afalse
jeśli nie jest. Zauważ, że to rozwiązanie zakłada, że dane wejściowe nie są zakończone znakiem nowej linii, więc przetestuj je za pomocąecho -n
:Jest to dość prosty port mojej odpowiedzi na Palindromic Palindrome Checker (i do tej pory nie grał w golfa). Główna sztuczka polega na tym, że pierwsze wyrażenie w nawiasach zawsze zwraca
1
, więc druga połowa wyrażenia boolowskiego nigdy nie jest oceniana (ale jest analizowana).Jedyną trudnością w dostosowaniu tego było wymyślenie, jak dodać wywołanie, aby
z.tr
jego „wygodny rewers” był również poprawny pod względem składniowym - ale mógłbym po prostu użyć tej samej sztuczki, którą już użyłem,:*
która w pierwszej połowie jest analizowana jako operator splat (użyj zawartości tablicy jako parametrów funkcji) i jako operatora mnożenia tablicy (lub powtarzania) w drugiej połowie.Ruby, 157
297, cały kod wykonanyTa (nieco dłuższa) wersja wykonuje cały kod i wszystkie oprócz dwóch wierszy wpływają na wynik, który jest drukowany w ostatnim wierszu - ale wszystkie wiersze są analizowane i wykonywane bez błędów. Ta wersja interpretuje każdy końcowy
echo -n
znak nowej linii jako część danych wejściowych, więc użyj go, aby go przetestować, lub uzupełnij swój tekst znakiem nowej linii. Drukuje,true
jeśli wejście jest wygodnym palindromem, i wfalse
przeciwnym razie.Wyjaśnienie
źródło
GolfScript, 61 znaków
OK, oto podstawowe rozwiązanie w GolfScript. Jestem pewien, że można to jeszcze poprawić:
Jak zwykle dla GolfScript, ten program odczytuje dane wejściowe ze standardowego wejścia. Wyprowadza:
jeśli dane wejściowe to wygodny palindrom, jak zdefiniowano w powyższym wyzwaniu, i:
Jeżeli nie jest.
Objaśnienie: Ten program w dużej mierze opiera się na stwierdzeniu, że niewykonywany kod jest OK, o ile jest analizowany. Składa się z dwóch bloków kodu, ograniczonych nawiasami klamrowymi (
{ }
), które są lustrzanymi odbiciami.Pierwszy blok kodu jest wykonywany
~
po nim i sprawdza, czy dane wejściowe są wygodnym palindromem, wyświetlając1
je, jeśli tak jest, a0
jeśli nie. Drugi blok kodu nie jest wykonywany, a więc po prostu pozostaje na stosie, dopóki program się nie skończy, a wszystko na stosie zostanie automatycznie oznaczone i wydrukowane przez interpreter GolfScript.Należy zauważyć, że interpreter GolfScript wykonuje bardzo niewiele kontroli składni w czasie analizy (lub kiedykolwiek, jeśli o to chodzi); literał bloku kodu GolfScript może zawierać prawie wszystko, nawet jeśli może ulec awarii podczas wykonywania. Mimo to kilka błędów składniowych, takich jak nieokreślone literały łańcuchowe, powoduje błąd nawet w niewykonywanym kodzie, więc uważam, że to rozwiązanie (ledwo) mieści się w zakresie reguł.
Ps. Patrząc na faktycznie wykonany kod, zawiera kilka dogodnych elementów palindromicznych, takich jak
@[.]@
literał ciągu"([{}])"
, a nawet pętla%{ ... }%
. Daje to kuszącą sugestię, że „wewnętrznie palindromiczne” rozwiązanie GolfScript, w którym pełny program palindromiczny zostałby wykonany i działał, może być faktycznie możliwe. Ponieważ nie udało mi się jeszcze go wyprodukować, niniejszym oferuję premię +100 powtórzeń pierwszej osobie, która zdoła ją wymyślić!źródło
"n\";X;";X;"\n"
Skłaniam się do rozważenia tego rozwiązania bardziej jako rodzaju komentowania, ale dam ci korzyść z wątpliwości. Naprawdę jednak szukałem takich „wewnętrznie palindromicznych” rozwiązań, a przynajmniej takich, w których niewykonywanie bloków było nieco bardziej niedoceniane.1;
.). Czy to nadal liczy się jako w pełni funkcjonalne?JavaScript (ES6), 245 bajtów
Chciałem odpowiedzi JS, którą można uruchomić w przeglądarce, więc oto jest.
Usuwając cały kod, który nigdy nie jest uruchomiony, otrzymujemy:
Co można uprościć do tego:
źródło
n1=>n1==(('',n1))['nioj','split']``['esrever','map'](c=>`()[]{}`[`()[]{}`['indexOf'](c)^1]||c||[1^(c)['fOxedni']`{}[]()`]`{}[]()`>=c)['pam','reverse']``['tilps','join']((1n,''))==1n>=1n
(185 bajtów)JavaScript (ES6) 288
Działa w powłoce wiersza poleceń Spidermonkey . Odczytuje pojedynczy wiersz ze STDIN i wyjścia
true
lub wfalse
zależności od tego, czy wejście jest wygodnym palindromem.Ten kod jest poprawny pod względem składniowym, ale wszystko po nim
&&
nie jest wykonywane, ponieważprint
funkcja zwraca wartość falsey.Możesz uruchomić ten kod w konsoli Firefox, uruchamiając najpierw ten podkładka, aby emulować funkcje
readline
iprint
. Edytuj dane wejściowe wreadline
razie potrzeby:A oto krótki przykład wyniku:
źródło
&&
było naprawdę sprytne, pochwalam cię (ale wydaje się to trochę podstępne)05AB1E, 35 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
"()[]{}"
możesz zrobićžu„<>-
q
przynajmniej parsowana pod kątem poprawności składniowej? Jeśli nie, uważam to za równoznaczne z komentowaniem drugiej połowy kodu.CJam, 38 bajtów
Drukuje,
"=re%W_@%W_q"1
jeśli dane wejściowe są wygodnie palindromiczne i w"=re%W_@%W_q"0
inny sposób.Wypróbuj online w interpretatorze CJam .
Jak to działa
Po uruchomieniu programu CJam automatycznie drukuje wszystkie trzy elementy na stosie: sprawdzony ciąg, wartość logiczną z porównania ciągów i pusty ciąg.
źródło
Perl, 83 + 2 = 85 bajtów
Biegnij z
-nl
Kod kończy działanie po wydrukowaniu prawdziwości danych wejściowych. Wszystko po średniku jest interpretowane (i ulega awarii, gdy skrypt osiągnie ten punkt, gdyby nie
exit
napotkane), ale nie jest wykonywane. Gdybym pominąłexit;tixe;
kod, nadal drukowałby wynik poprawnie, zanim się zawiesił.źródło