Où suis-je maintenant?
Étant donné une chaîne d
, contenant uniquement les lettres NSWE
, déterminez les coordonnées que j'ai parcourues (de gauche à droite, en consommant goulûment) et la coordonnée finale où je réside.
Les règles de lecture des coordonnées de gauche à droite:
- Si le caractère suivant est
N
ouS
:- Si le caractère après le
N
ouS
est un autreN
ouS
:- Consommez seulement le premier
N
ouS
. - Production
[0,1]
pourN
- Sortie
[0,-1]
pourS
- Consommez seulement le premier
- Si le caractère après le
N
ouS
estW
ouE
:- Consommez à la fois le
N
ouS
et leW
ouE
. - Sortie
[1,1]
ou[-1,1]
pourNE
etNW
, respectivement. - Sortie
[1,-1]
ou[-1,-1]
pourSE
etSW
, respectivement.
- Consommez à la fois le
- Si le caractère après le
- Si le caractère est un
E
ouW
non précédé d'unS
ouN
:- Consommez le
E
ouW
. - Sortie
[1,0]
pourE
. - Sortie
[-1,0]
pourW
.
- Consommez le
Exemple travaillé
NSWE
[0,1] (North N)
[-1,-1] (South-west SW)
[1,0] (East E)
[0,0] (N+SW+E = Didn't actually move)
Notez que cela peut être dans n'importe quel format, voici d'autres exemples de sortie valide:
[[0,1],[-1,-1],[1,0],[0,0]]
[[[0,1],[-1,-1],[1,0]],[0,0]]
"0,1\n0,-1\n-1,0\n1,0\n0,0"
Etc...
Plus d'exemples
SWSENNESWNE
[-1,-1]
[1,-1]
[0,1]
[1,1]
[-1,-1]
[1,1]
[1,0]
NNEESESSWWNW
[0,1]
[1,1]
[1,0]
[1,-1]
[0,-1]
[-1,-1]
[-1,0]
[-1,1]
[0,0]
NENENEE
[1,1]
[1,1]
[1,1]
[1,0]
[4,3]
NEN
[1,1]
[0,1]
[1,2]
EEE
[1,0]
[1,0]
[1,0]
[3,0]
Règles
- Vous pouvez produire dans n'importe quel format pratique qui ne viole pas les failles.
- Il faut consommer goulûment, ce
NWE
n'est jamaisN,W,E
, c'est toujoursNW,E
.- Ceci est valable pour:
SW*
,SE*
,NW*
,NE*
. - Vous consommez de gauche à droite, avidement.
- Ceci est valable pour:
- C'est le code-golf , le plus petit nombre de victoires.
[4, 3]
ou ainsi faciliterait un peu plus facilement ce qui se passe dans la sortie de test.1
,-1j
,(-1+1j)
etc un format de sortie valide?NE
c'est juste,N+E
ça ne devrait pas avoir d'importance?Réponses:
Python 2 , 116 octets
Essayez-le en ligne!
Avec sortie as
[(3+4j), 1, -1j, …]
, 91 octetsEssayez-le en ligne!
Ce lambda renvoie une liste d' entiers gaussiens : le premier est la coordonnée finale, et toutes les autres sont les étapes nécessaires pour y arriver.
la source
Attaché , 80 octets
Essayez-le en ligne!
Il s'agit d'une fonction anonyme qui prend un argument de chaîne.
Explication
La première tâche consiste à implémenter la phase d'analyse de cette question. J'ai trouvé plus court d'utiliser une simple regex pour analyser l'entrée (
_
):Cela correspond à toutes les occurrences de l'expression régulière
[NS][WE]|.
, comme on le voit dans de nombreuses autres réponses. Cela donne goulûment les directions demandées.Maintenant, nous allons appliquer une fonction de hachage à chaque direciton. Nous prenons les points de code de chaque direction et les additionnons. Cela donne le mappage suivant:
Nous allons essayer de mapper ces valeurs à un domaine plus petit; modulo est utile pour cela, et nous pouvons démontrer que le plus petit modulo qui donne des valeurs uniques pour toutes les entrées données est 11. Le tri par reste, cela nous donne le tableau suivant:
Maintenant, nous avons une correspondance d'entrée, comme le codage par
Sum@Ords=>[...]%11
. Ensuite, nous devons transformer ces restes en points. Nous allons essayer de dériver une autre cartographie, ce qui signifie qu'il sera utile d'insérer des «valeurs de remplissage clairsemé» dans des hachages qui ne correspondent pas aux directions:Nous avons actuellement une série de points, ce qui peut donner une liste indexable par le hachage:
Maintenant, nous allons compresser cela, vu que son seul composé de
-1
s,0
s et1
s. Puisque la liste représente des paires, nous pouvons aplatir la liste sans perdre de données. Ensuite, si nous prenons chaque nombrex
et calculons1-x
, nous obtenons la liste suivante:Nous pouvons le convertir en un nombre de base 3:
Conversion en base 10:
Pour résumer, nous avons pris nos points, les découplés, pris chaque élément soustrait
1
et converti de la base3
, ce qui nous donne22260446188
. On peut décompresser comme tel:ToBase[22260446188,3]
1-ToBase[22260446188,3]
Chop[1-ToBase[22260446188,3],2]
Cela nous donne notre ensemble de paires d'origine. Ensuite, nous pouvons effectuer l'indexation susmentionnée comme ceci:
Puisque, dans Attache, l'indexation par un tableau renvoie tous les éléments correspondant à ces indices. (Donc
[1,2,3,4][ [0,0,-1,1] ] = [1,1,4,2]
,.) Maintenant, nous avons les directions du chemin parcouru par l'OP. Il ne reste plus qu'à calculer la somme.Nous capturons donc ce résultat dans un lambda
{...}
et le mettons comme première fonction dans une composition de fonction (a##b
), la seconde étantV#Sum
. Ceci est un fork, qui, étant donné l'entréex
, se développe pour être:Sum
, lorsqu'il est donné un tableau 2D, arrive à additionner chaque colonne du tableau (à la suite de la sommation vectorisée). Donc, cela associe les directions avec la destination finale, et nous avons notre résultat final.la source
JavaScript (ES6), 102 octets
Renvoie une chaîne.
Essayez-le en ligne!
la source
MATL , 45 octets
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication (avec exemple)
Considérez la saisie
'NSWE'
comme exemple.la source
Java (JDK 10) , 171 octets
Essayez-le en ligne!
Explications
Grâce à
c=~-s[i]/6%4
, la cartographie suivante est effectuée:NS
est vérifié avecc<2
et mappé à+1
/ en-1
utilisant1-c*2
;EW
est vérifié avecc>1
et mappé à+1
/ en-1
utilisantc*2-5
.Crédits
la source
Retina 0.8.2 , 93 octets
Essayez-le en ligne! Explication:
Dupliquez l'entrée.
Divisez la première copie en directions.
Supprimez les lignes vierges étrangères créées par le processus ci-dessus.
Changez
W
enJ
pour qu'il trie entreE
etN
. (PasserE
entreS
etW
fonctionnerait aussi.)Triez chaque ligne dans l'ordre.
Supprimez les paires de directions opposées (cela n'affecte que la dernière ligne bien sûr).
Comptez le nombre de mouvements horizontaux et verticaux, en ajoutant des panneaux si nécessaire.
Ceux d'entre vous qui connaissent les différences entre Retina 0.8.2 et Retina 1 voudront souligner que je peux enregistrer 2 octets dans Retina 1 car il utilise à la
*
place de$*
. Pendant que j'étais là, j'ai essayé de simplifier le processus de fractionnement, mais je n'ai pas pu réduire davantage le nombre d'octets, je ne pouvais que l'égaler avec ceci:la source
Java 10,
269265243 octetsCertainement pas la bonne langue pour ce défi ..
Essayez-le en ligne.
Explication:
la source
Perl 5
-n
, 94 octetsEssayez-le en ligne!
la source
JavaScript (ES6), 102 octets
Renvoie une chaîne.
la source
Rubis ,
7571 octetsEssayez-le en ligne!
-4 octets grâce à benj2240.
Étant donné que le retour de nombres complexes semble être un format de sortie acceptable, je suppose que cela ne deviendra pas beaucoup plus golfique que de simplement faire un portage de la très belle réponse de Lynn .
la source
map
, en passant directement son bloc àsum
: Essayez-le en ligne!F # (Mono) , 269 octets
Essayez-le en ligne!
la source
NSWE
vous restituent(0,1)
,(-1,-1)
,(1,0)
mais une quatrième sortie devrait être la somme de ces coordonnées, donc(0,0)
(car0+-1+1 = 0
et1+-1+0 = 0
).sed, 125
La prise de libertés avec la version du format de sortie :
Le score inclut +1 pour le
-r
paramètre à sed.Essayez-le en ligne .
La sortie est la suivante:
A
caractères représente le nombre entier + velen(string)
a
caractères représente l'entier -ve-len(string)
0
Par exemple:
,
est [0,0],AA
est [0,2]aaa,
est [-3,0]sed 4.2.2 avec extension GNU exec , 147
La version de format de sortie sensible :
Le score inclut +1 pour le
-r
paramètre à sed.La sortie est donnée sous forme de coordonnées séparées par des espaces, une par ligne. Il y a une nouvelle ligne supplémentaire entre l'avant-dernier et les ensembles ultimes de coordonnées - je ne sais pas si c'est problématique ou non.
Essayez-le en ligne!
la source
PHP, 153 octets
laissez un regex faire le fractionnement; parcourir les correspondances, imprimer et résumer les résultats intermédiaires:
Exécuter en tant que pipe avec
-nR
ou l' essayer en ligne .la source
C (gcc) , 173 octets
C'est intéressant de faire celui-ci dans une langue sans support regex!
Essayez-le en ligne!
la source