> <> , 137 131 bajtów
Kiedy zobaczyłem to wyzwanie, pomyślałem, że> <> może w końcu być dobrym wyborem języka, ponieważ używając go można w większości zignorować palindromy; łatwo jest upewnić się, że wskaźnik pozostaje tylko tam, gdzie powinien. Chociaż jest to prawda,> <> niestety powoduje, że warunki do gry w golfa są męczące (lub po prostu gra w golfa w ogóle). Mam nadzieję, że skorzystam z kilku dziwnych sztuczek, o których pomyślałem, aby to zrekompensować, ale oto „szybka” (właściwie nie programowa i kreacyjna) odpowiedź. Możesz spróbować online tutaj .
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
;n1<^ -*48< .00~< ;n-10<01-n; >~00. >84*- ^>1n;
<.0e&$v?=@:}:&v?)1:-1lv?("Z":<v?)0:i
Zwraca 1 dla prawdy i -1 dla fałszu (mógłbym zmienić to na 0, ale długość pozostanie taka sama, niestety)
Jak zawsze, daj mi znać, jeśli to nie zadziała i jeśli masz jakieś pomysły na grę w golfa. Przetestowałem to na kilku testowych przypadkach, ale zawsze może istnieć wyjątek.
Oto kolejna wersja, która moim zdaniem jest nieco mądrzejsza, ale niestety jest o dziesięć bajtów więcej. Wartości true / falsey tym razem wynoszą 1 i błąd ( something smells fishy...
):
>i:0(?v>:"Z")?vl: 2(?v&{:@$:@=01-*2.
< ;n1<^ -*48<f6+0.0<
&1-:1)e*1.1*e(1:-1&
>0.0+6f>84*- ^>1n; >
.2*-10=@:$@:}&v?)2 :lv?("Z":<v?)0:i<
Wyjaśnienie:
Oto kod bez dodanej części, aby uczynić go palindromem. Ten nie używa „bardziej sprytnych” sztuczek, których próbowałem użyć w alternatywnej wersji, więc trochę łatwiej jest to wytłumaczyć (jeśli ktoś jest zainteresowany wyjaśnieniem „sztuczek”, chętnie bym go podał , chociaż).
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
;n1<^ -*48< .00~< ;n-10<
Linia 1:
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
i:0(?v #Pushes input and directs down if negative
>:"Z")?v #Directs down if input is greater than "Z"
#(reduces lowercase input to uppercase)
l #Pushes length
#Main loop begins
1-:1(?v #Decrements top, and then directs down if less than 1
& #Pushes top of stack onto register (length minus 1)
:{ #Duplicates top, shifts stack to the left
:@ #Duplicates top, shifts top three values of the stack to the right
=?v #If top two values are equal, directs down
$ #Swaps top two values of the stack
& #Pushes register onto stack
e0. #Jumps back to the "1" after "?vl"
#Main loop ends
> #Makes sure when the pointer jumps back to i it goes the right way
Oto jak działa zawiłe zamiana ( :{:@=?v$
) - użyję testowego przypadku tego stosu: [5,1,8,1]
gdzie ostatni znak jest na górze.
:{
Górna część stosu jest zduplikowana:, [5,1,8,1,1]
a stos przesunięto w lewo:[1,8,1,1,5]
:@
Góra jest zduplikowana: [1,8,1,1,5,5]
następnie trzy górne wartości są przesunięte w prawo:[1,8,1,5,1,5]
=?v
Niepotrzebne w tej części wyjaśnień
$
Najwyższa wartość jest ponownie wymieniana [1,8,1,5]
, co daje , jak zauważysz, oryginalny stos przesunięty jeden raz (tak jakby {
to było jedyne polecenie).
Więc to, co robi to po angielsku („Dzięki Bogu, on tak naprawdę wyjaśnia”), polega na sprawdzeniu całego stosu względem najwyższej wartości i przejściu do punktu w drugiej linii, jeśli jakakolwiek wartość jest równa górnej. Sprawdzanie odbywa się proporcjonalnie do liczby wartości na stosie ( l - 1
gdzie l
jest długość stosu), dzięki czemu wszystkie wartości są sprawdzane względem siebie.
Linia 2:
;n1<^ -*48< .00~< ;n-10<
n1< #If input is less than 0 (i.e. there is none), print 1
; #and terminate
< #If redirected because input is greater than "Z"
-*48 #Push 32, subtract (reducing lowercase to uppercase, numerically)
^ #And move back to the portion that tests if input
#is uppercase (which it will pass now)
< #If counter is less than 1 (for main loop)
.00~ #Pop the counter and jump to the beginning (i)
< #If any two values in the stack are equal
-10 #Push -1 (subtract 1 from 0)
;n #Print and terminate
(hellolleh)
ważny jest palindrom? Podobne dla[]
,{}
i<>
(w stosownych przypadkach).