> <> , 137 131 Bytes
Cuando vi este desafío, pensé que> <> finalmente podría ser una buena opción de lenguaje, ya que al usarlo puedes ignorar los palíndromos; es sencillo asegurarse de que el puntero solo permanezca donde debería. Si bien esto es cierto,> <> desafortunadamente hace que los condicionales de golf sean insoportables (o simplemente el golf en general). Espero usar algunos trucos extraños que pensé para compensar esto, pero aquí hay una respuesta "rápida" (no en realidad, tanto en lo que respecta al programa como a la creación). Puedes probarlo en línea aquí .
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
Devuelve 1 para verdadero y -1 para falso (podría cambiarlo a 0 pero la longitud se mantendría igual, desafortunadamente)
Como siempre, avíseme si esto no funciona y si tiene alguna idea sobre cómo jugar golf. Lo probé en algunos casos de prueba, pero siempre podría haber una excepción.
Aquí hay otra versión, una que creo que es un poco más inteligente, pero lamentablemente es diez bytes más. Los valores de verdad / falsey esta vez son 1 y un error ( 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<
Explicación:
Aquí está el código sin la parte agregada para convertirlo en un palíndromo. Este no usa los trucos "más inteligentes" que intenté usar para la versión alternativa, por lo que es un poco más fácil de explicar (si alguien está interesado en una explicación de los "trucos", me encantaría dar uno , aunque).
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
;n1<^ -*48< .00~< ;n-10<
Línea 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
Así es como funciona el intercambio enrevesado ( :{:@=?v$
): utilizaré un caso de prueba de esta pila: [5,1,8,1]
donde el último carácter es el superior.
:{
La parte superior de la pila se duplica: [5,1,8,1,1]
y la pila se desplaza hacia la izquierda:[1,8,1,1,5]
:@
La parte superior se duplica: [1,8,1,1,5,5]
luego, los tres valores superiores se desplazan a la derecha:[1,8,1,5,1,5]
=?v
Innecesario para esta parte de explicación
$
El valor superior se intercambia una vez más [1,8,1,5]
, lo que, si observará, es la pila original desplazada una vez (como si {
hubiera sido el único comando).
Entonces, lo que esto hace en inglés ("Gracias a Dios, en realidad está explicando las cosas") es verificar toda la pila con el valor superior y pasar a un punto en la segunda línea si algún valor es igual al superior. Esta comprobación se realiza de forma proporcional a la cantidad de valores que hay en la pila ( l - 1
donde l
está la longitud de la pila) para que todos los valores se verifiquen entre sí.
Línea 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 palíndromo válido? Similar para[]
,{}
y<>
(cuando corresponda).