> <> , 137 131 Bytes
Quando vi esse desafio, pensei que> <> finalmente seria uma boa escolha de linguagem, pois, ao usá-lo, você pode ignorar palíndromos; é simples garantir que o ponteiro permaneça apenas onde deveria. Embora isso seja verdade,> <> infelizmente torna as condições do golfe excruciantes (ou apenas o golfe em geral). Espero usar alguns truques estranhos que pensei em compensar isso, mas aqui está uma resposta "rápida" (na verdade não, tanto em termos de programa quanto de criação). Você pode experimentá-lo online aqui .
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
Retorna 1 para true e -1 para false (eu poderia alterá-lo para 0, mas o comprimento permaneceria o mesmo, infelizmente)
Como sempre, deixe-me saber se isso não funciona e se você tem alguma idéia de como jogar golfe. Eu testei em alguns casos de teste, mas sempre poderia haver uma exceção.
Aqui está outra versão, que eu acho que é um pouco mais inteligente, mas, infelizmente, são dez bytes a mais. Os valores de Truthy / Falsey neste momento são 1 e um erro ( 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<
Explicação:
Aqui está o código sem a parte adicionada para torná-lo um palíndromo. Este não usa os truques "mais inteligentes" que tentei usar para a versão alternativa, por isso é um pouco mais fácil de explicar (se alguém estiver interessado em uma explicação para os "truques", ficaria feliz em dar um , Apesar).
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
;n1<^ -*48< .00~< ;n-10<
Linha 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
Aqui está como a troca complicada ( :{:@=?v$
) funciona - usarei um caso de teste dessa pilha: [5,1,8,1]
onde o último caractere é o topo.
:{
A parte superior da pilha é duplicada: [5,1,8,1,1]
e a pilha deslocada para a esquerda:[1,8,1,1,5]
:@
A parte superior é duplicada:; em [1,8,1,1,5,5]
seguida, os três principais valores são deslocados para a direita:[1,8,1,5,1,5]
=?v
Desnecessário para esta parte da explicação
$
O valor superior é trocado mais uma vez [1,8,1,5]
, o que, se você notar, é a pilha original deslocada mais uma vez (como se {
tivesse sido o único comando).
Então, o que isso faz em inglês ("Graças a Deus, ele está realmente explicando as coisas") é verificar a pilha inteira em relação ao valor superior e passar para um ponto na segunda linha, se algum valor for igual ao topo. Essa verificação é feita proporcionalmente a quantos valores existem na pilha ( l - 1
, onde l
está o comprimento da pilha), para que todos os valores sejam verificados um contra o outro.
Linha 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)
um palíndromo válido? Semelhante para[]
,{}
e<>
(quando apropriado).