> <> , 137 131 octets
Quand j'ai vu ce défi, j'ai pensé que <<> pourrait enfin être un bon choix de langue car en l'utilisant, vous pouvez surtout ignorer les palindromes; il est simple de s'assurer que le pointeur ne reste que là où il devrait. Bien que cela soit vrai,> <> rend malheureusement les conditions de golf atroces (ou tout simplement le golf en général). J'espère utiliser des astuces étranges auxquelles j'ai pensé pour compenser cela, mais voici une réponse "rapide" (pas en fait, à la fois au niveau du programme et de la création). Vous pouvez l'essayer en ligne ici .
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
Renvoie 1 pour vrai et -1 pour faux (je pourrais le changer à 0 mais la longueur resterait la même, malheureusement)
Comme toujours, faites-moi savoir si cela ne fonctionne pas et si vous avez des idées sur la façon de jouer au golf. Je l'ai testé par rapport à quelques cas de test, mais il pourrait toujours y avoir une exception.
Voici une autre version, une qui je pense est un peu plus intelligente, mais hélas est de dix octets de plus. Les valeurs Truthy / falsey cette fois sont 1 et une erreur ( 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<
Explication:
Voici le code sans la partie ajoutée pour en faire un palindrome. Celui-ci n'utilise pas les astuces "plus intelligentes" que j'ai essayé d'utiliser pour la version alternative, il est donc un peu plus facile à expliquer (si quelqu'un est intéressé par une explication des "astuces", je serais heureux d'en donner une , bien que).
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
;n1<^ -*48< .00~< ;n-10<
Ligne 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
Voici comment fonctionne le swapping ( :{:@=?v$
) alambiqué - je vais utiliser un cas de test de cette pile: [5,1,8,1]
où le dernier caractère est le haut.
:{
Le haut de la pile est dupliqué:, [5,1,8,1,1]
et la pile déplacée vers la gauche:[1,8,1,1,5]
:@
Le haut est dupliqué:, [1,8,1,1,5,5]
puis les trois premières valeurs sont décalées vers la droite:[1,8,1,5,1,5]
=?v
Inutile pour cette partie de l'explication
$
La valeur supérieure est inversée une fois de plus [1,8,1,5]
, ce qui, si vous le remarquez, est la pile d'origine décalée une fois (comme si {
c'était la seule commande).
Donc, ce que cela fait en anglais ("Dieu merci, il explique en fait les choses") est de vérifier la pile entière par rapport à la valeur supérieure et de passer à un point dans la deuxième ligne si une valeur est égale au sommet. Cette vérification est effectuée proportionnellement au nombre de valeurs dans la pile ( l - 1
, où l
est la longueur de la pile) afin que toutes les valeurs soient vérifiées les unes par rapport aux autres.
Ligne 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 palindrome valide? Similaire pour[]
,{}
et<>
(le cas échéant).