Dans ce défi, vous calculerez la taille de votre terrain.
Écrivez un programme ou une fonction qui calcule la taille de votre terrain, compte tenu d'un mur que vous avez construit. On vous donne une chaîne d'entrée non vide contenant un ensemble de 4 caractères distincts de votre choix qui représentent les quatre directions "haut", "bas", "gauche" et "droite" (je vais l'utiliser ^ v < >
dans ce défi). Il n'est pas possible de faire des virages à 180 degrés ( <>
ou ^v
), mais vous pouvez traverser votre mur.
La façon dont vous "capturez" la terre est en l'entourant de votre mur. Le mur lui-même est également considéré comme faisant partie de votre terrain. Quelques exemples le rendront plus clair. Je vais utiliser o
pour un terrain qui a été entouré par le mur, x
pour le mur lui-même et S
pour le point de départ du mur, juste pour illustrer comment le mur est construit. La sortie doit correspondre à la taille totale de votre terrain (le nombre de o
, x
et S
dans les cas de test ci-dessous).
Input: >>>>
Land: Sxxxx
Output: 5
Input: <<<^^^>>>vv
Land:
xxxx
xoox
xoox
xxxS
Output: 16
Input: <<<^^^>>>v
Land:
xxxx
x x
x
xxxS
Output: 11
Input: <
Land: xS
Output: 2
Input: >>>>>>vvvvvvvvv<<<<<^^^^>>>>>>>>vvvvvvvvvv<<<<<<<<<<<<<<<^^^^^^^^^>>>vvvvvv<<<<<
Land:
Sxxxxxx
x
x
x
x
xxxxxxxxx
xxxx xoooox x
xoox xoooox x
xoox xoooox x
xoox xxxxxx x
xoox x
xoox x
xxxxxx x
x x
x x
xxxxxxxxxxxxxxxx
Output: 101
Input: >>vvvv>>^^<<<<^
Land:
Sxx
xox
xxxxx
xox
xxx
Output: 17
Input: <<^^^>>>vv
Land:
xxxx
x x
x x
xxS
Output: 11 <- Note, diagonal edges do not close the "loop"
Précisions:
- Vous n'avez pas besoin de dessiner le mur, la sortie ne doit être qu'un entier
- Le format d'entrée est facultatif. Vous pouvez prendre une chaîne avec
<>^v
, une liste de chiffres(1, -1, i, -i)
, une liste de caractères,ABCD
etc.
Il s'agit de code-golf, donc le code le plus court dans chaque langue l' emporte. N'oubliez pas que les explications sont importantes, même dans les langues "normales"!
Réponses:
Python 2 ,
385345332 octetsEssayez-le en ligne! ou Essayez tous les cas de test
L'entrée est numérique, 0 ~ 3, l'indice 0 des symboles ici:
>v<^
Voici la matrice résultante:
la source
Octave,
83858379 octetsEssayez-le sur Octave Online!
Une fonction qui prend en entrée un vecteur de colonne contenant
(1, -1, i, -i)
En utilisant l'approche de la réponse Mathematica de @ lanlock4, ajoutez la longueur de l'entrée aux coordonnées pour éviter les coordonnées non positives, au lieu de leur soustraire un minimum de coordonnées. Enregistré 4 octets.
Réponse précédente:
Essayez-le sur Octave Online!
Modifié pour une meilleure visualisation.
Explication:
la source
Haskell,
579530 octetsm
est la fonction principale, qui prend une chaînev^<>
et retourne l'entier approprié.Non golfé:
la source
Mathematica, 124 octets
Vous ne serez probablement pas surpris d'apprendre que Mathematica a une fonction intégrée pour mesurer la zone entourée par un mur. Malheureusement, il est tout à fait bytey:
ComponentMeasurements[..., "FilledCount", CornerNeighbors -> False]
.Dans cet esprit, voici ma réponse complète. C'est une fonction qui prend une liste de 1, i, -1 ou -i:
Explication:
FoldList[#+#2&,2(1+I)Length@#,#]
construit le mur en commençant à la coordonnée 2 (1 + i) (longueur du mur) et en ajoutant successivement les éléments de la liste d'entrée. (Nous devons commencer par la coordonnée ridiculement grande 2 (1 + i) (longueur du mur) pour nous assurer que les coordonnées du mur restent positives, sinon les choses se brisent.)SparseArray[{Re@#,Im@#}&/@...->1]
transforme ces coordonnées de nombres complexes en paires d'entiers, et crée un tableau avec 1s où le mur est et 0s ailleurs.1/.ComponentMeasurements[...,"FilledCount",CornerNeighbors->1<0]&
utilise la magie Mathematica intégrée pour mesurer la zone délimitée par le mur.la source
PHP> = 5.6.2, 888 octets
Version en ligne
la source