Inspiré par l' une des vidéos de Vi Hart (qui sont un trésor plein d'idées de défis potentiels)
Un serpent est composé de segments de même longueur et la connexion entre chaque segment peut être droite ou faire un virage à 90 °.
Nous pouvons encoder un tel serpent (jusqu'à une rotation, qui dépend de la direction initiale) en écrivant un slither , la direction des virages (Droite / Gauche / Droite) qu'il faut. Celui-ci, commençant en haut à gauche et pointant vers la droite
-+ +--+ SR RSSR
| +-+ | S RSL S
+--+ --+ LSSL SSR
Serait représenté par le slither SRSLSSLRLRSSRSRSS
Et bien sûr, un serpent plan ne peut pas se croiser (comme dans SSSSLLLSS
), ce qui entraînerait un horrible Game Over pixelisé.
Votre tâche consiste à déterminer si un slither est valide ou non (entraîne au moins une auto-intersection)
Input
Une chaîne faite de lettres SLR
avec 2 < length < 10000
Output
Something Truthy s'il s'agit d'un slither valide et quelque chose Falsey dans le cas contraire.
Cas de test
__Valid__
SSLSLSRSRSSRSSSLLSSSRRLRSLRLLSSS
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR (A hilbert curve)
RLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRR
SRRSRSRSSRSSRSSSRSSSRSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS (Spiral)
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS (bigger, squigglier spiral)
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLL
__Invalid__
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRLSLLRRLLSLRRSRLLRSRRLLSRSSSRSSSSSSSRSRSSSSSSSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRSRSRSSRSSRSSSRSSSRSSSSSSSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLRLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLLSLRLSLRSLRSLRSLSLSLRSRLSLRSLRLSRSLLLRLRLRRRRSLSLSSLLSLSLSLSSLLSLSLLRLRSLLRSRLSLSSLLLLSSSSSSSSSSSSSSSSSSSSRLRLLRRLRLRLLRLRLRLRLRLSSSSLSLRLLRLSLSSLSLSLSLSLRLLRLSLLLSRSSSSSSSSSSSSSSSRLRLRLLRLRLSLSRSRSSSLSRLRLRLRSLSLSLSRLLSRLSLSLSLSLSSLSLSLLSLSRLLRLRLRLRLRLRLRLRLRLRLSLSRLRLSLLRRLSLLSLSLSLSLSLLSLSLSLRLRLRLRLRLRLRLRLRLRRLRSLSLSLSLSLSLSLSSLSSSSSLSLSSSLSLSLSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
Vous pouvez dessiner les slithers ici (R et L sont inversés, mais cela n'affecte pas la validité)
la source
SRRR
sur un papier millimétré avec un carré par segment, il se chevaucherait et n'est donc pas valide, tout simplementRRR
cependant, occuperait exactement un carré 2x2 sans chevauchements (tout comme dans le jeu classique)Réponses:
Pyth,
2220 octetsEssayez-le vous - même ou exécutez la suite de tests .
Notez les valeurs ASCII de SRL, respectivement 83, 76, 82. J'abuse du fait que:
De là, je garde juste une variable pour la position actuelle et la direction actuelle. Pour chaque caractère, je multiplie la direction actuelle par le nombre complexe ci-dessus, puis je l'ajoute à la position actuelle.
À la fin, je vérifie si toutes les positions visitées sont uniques.
la source
CJam, 30 octets
Explication à suivre bientôt.
Essayez-le en ligne ici ou exécutez toute la suite .
la source
S
, cela signifie-t-il que le serpent a déjà occupé à la fois (0,0) et (1,0)?JavaScript (ES6), 84
89Exécutez l'extrait dans Firefox pour tester.
Quelques notes:
undefined
. Lors de la première visite, l'opérateur tilde le change en -1, ce qui est vrai. Finalement, lors d'une deuxième visite, la valeur passe à 0, ce qui est faux et laevery
boucle se termine en retournant false.la source
TI-BASIC,
49 56 5351 octetsSemblable à la méthode orlp, cela crée une liste de tous les points dans le plan complexe visité par le serpent, en commençant à l'origine. Si la liste ne contient aucun élément en double, le code renvoie une valeur positive. Notez que sur une chaîne de plus de 999 éléments, la calculatrice ne pourra pas générer une liste suffisamment longue et fera une erreur.
EDIT: deux octets enregistrés au prix de la laideur car aucun point de réseau sur le plan complexe ne peut être à la même distance de e ^ i.
la source
TI-BASIC,
6058 octetsEdit: Ignorez tout ci-dessous: une solution ti-basique est là , par thomas-kwa. Allez voter!
⁻
est la[(-)]
clé, et Ans l'est[2ND]->[(-)]
. Exécutez-le en plaçant les instructions du serpent entre guillemets ([ALPHA]->[+]
) suivies de deux points puis du nom du programme. Par exemple, si vous nommez le programme "SNAKE", vous exécuterez le cas de test dans l'OP en tant que"SRSLSSLRLRSSRSRSS":prgmSNAKE
.Edit: échoue
SRRLSLLRRRS
. J'ai une version révisée à 61 octets, mais elle échoue sur le premier cas de test invalide:J'essaierai de réparer demain.
Mise à jour: le problème est donc que mon algorithme est défectueux. Si j'avais utilisé une boucle For (par opposition à seq ((pour obtenir la même chose), elle (les deux algorithmes ci-dessus, en fait) pourrait être décrite comme suit:
Cependant, cela échoue sur des slithers invalides comme
SRLRLRLRLRRRSS
. Je vais maintenant essayer de trouver un meilleur algorithme ... ou voler une autre réponse.Je suis sûr à 90% que cela peut être remplacé par une seule
seq(
commande, en fait, mais pour l'instant, c'est aussi petit que possible. Si vous avez l'intention de le construire sur un 8xp en utilisant Sourcecoder au lieu de le taper, notez que cela≠
doit être remplacé par!=
et le⁻1+
bit doit être remplacé par~1+
.la source
Rubis 87
89Test en ligne: http://ideone.com/pepeW2
Version non golfée:
la source
Golfscript 48
49 50Attend que la chaîne existe sur la pile et renvoie soit
0
ou1
.Vous pouvez l'essayer en ligne avec des tests pour les serpents valides et invalides .
C'est fondamentalement la même idée que dans ma réponse Ruby . Seul le tableau de direction est traité différemment, car AFAIK Golfscript n'a pas de fonction de rotation araire. Dans ce cas, je crée un tableau de directions suffisamment grand, en le multipliant 10000 fois, puis en coupant à partir de son début 0, 1 ou 3 éléments, selon la commande en cours (S, R ou L). La "direction" actuelle vers laquelle se déplacer est toujours le premier élément du tableau.
Le voici avec des commentaires:
Modifier:
1 char sauvé en modifiant la façon dont le tableau "directions" est consommé.
Modifier:
enregistré 1 caractère en déplaçant les incréments de 10 au lieu de 1 pour utiliser la
?
syntaxe (puissance).la source