> <> , 137 131 byte
Quando ho visto questa sfida, ho pensato che> <> potesse finalmente essere una buona scelta della lingua poiché usandola puoi principalmente ignorare i palindromi; è semplice assicurarsi che il puntatore rimanga solo dove dovrebbe. Sebbene ciò sia vero,> <> sfortunatamente rende le condizioni del golf lancinanti (o semplicemente il golf in generale). Spero di usare alcuni strani trucchi che ho pensato di compensare per questo, ma ecco una risposta "rapida" (non in realtà, sia dal punto di vista del programma che della creazione). Puoi provarlo online qui .
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
Restituisce 1 per vero e -1 per falso (potrei cambiarlo in 0 ma la lunghezza rimarrebbe la stessa, sfortunatamente)
Come sempre, fatemi sapere se non funziona e se avete idee su come giocarci. L'ho testato su alcuni casi di test, ma potrebbe esserci sempre un'eccezione.
Ecco un'altra versione, una che penso sia un po 'più intelligente, ma purtroppo è di dieci byte in più. I valori di verità / falsità questa volta sono 1 e un errore ( 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<
Spiegazione:
Ecco il codice senza la parte aggiunta per renderlo un palindromo. Questo non usa i trucchi "più intelligenti" che ho tentato di utilizzare per la versione alternativa, quindi è un po 'più facile da spiegare (se qualcuno è interessato a una spiegazione per i "trucchi", sarei felice di dartene uno , anche se).
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
;n1<^ -*48< .00~< ;n-10<
Linea 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
Ecco come funziona il contorto swapping ( :{:@=?v$
) - Userò un caso di prova di questo stack: [5,1,8,1]
dove l'ultimo carattere è il primo.
:{
La parte superiore della pila viene duplicata: [5,1,8,1,1]
e la pila spostata a sinistra:[1,8,1,1,5]
:@
La parte superiore viene duplicata:, [1,8,1,1,5,5]
quindi i primi tre valori vengono spostati a destra:[1,8,1,5,1,5]
=?v
Non necessario per questa parte della spiegazione
$
Il valore più alto viene scambiato ancora una volta cedendo [1,8,1,5]
, il che, se noterai, è lo stack originale spostato una volta (come se {
fosse stato l'unico comando).
Quindi, ciò che fa in inglese ("Grazie a Dio, in realtà sta spiegando le cose") è controllare l'intero stack con il valore più alto e passare a un punto nella seconda riga se un valore è uguale al valore più alto. Questo controllo viene effettuato in modo proporzionale al numero di valori presenti nello stack ( l - 1
, dove si l
trova la lunghezza dello stack) in modo che tutti i valori vengano confrontati.
Linea 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)
un palindromo valido? Simile per[]
,{}
e<>
(se del caso).