Vous devez écrire un programme ou une fonction.
L'entrée est une «carte» de nombres. Vous pouvez choisir de prendre la carte sous la forme d'une chaîne avec de nouveaux caractères de ligne ( \n
) ou d'un tableau 2D de chaînes.
Toutes les cartes sont de 5 caractères par 5 caractères, et les caractères sont toujours des chiffres supérieurs à 0 ou des espaces.
Voici un exemple de carte:
12 45
11233
233
1
2 899
Votre tâche consiste à trouver les composants connectés sur la carte. Un composant valide est une série d'au moins trois chiffres identiques connectés horizontalement et / ou verticalement (et non en diagonale ) ( pas des espaces ). Vous devrez alors remplacer les caractères des composants connectés valides par x
s et imprimer ou renvoyer ce résultat.
Ainsi, la sortie de l'exemple ci-dessus serait:
x2 45
xx2xx
2xx
1
2 899
Voici un autre cas de test (merci à Martin Ender):
Input:
2 3
4
1 5
111 6
11 7
Output:
2 3
4
x 5
xxx 6
xx 7
C'est le code golf, donc le code le plus court en octets gagne!
la source
Réponses:
JavaScript (ES6),
171161139 139137136133132 octetsCeci est une traduction de ma réponse Python. E / S en tant que tableaux de caractères.
Dommage qu'il n'y ait pas de moyen efficace de faire
sum
...la source
Python 3,
238237200199192 192181 octetsDéfinit une fonction
f(a)
qui prend l'entrée comme un tableau de caractères et renvoie le même tableau modifié. (Les tableaux de caractères sont acceptés comme chaînes par défaut. )Non golfé avec explication
Le code modifié est récursif, mais fonctionne de la même manière.
la source
Rubis, 304 octets
exemple d'utilisation:
le code réutilise la méthode «blot» pour calculer la longueur du chemin.
variables / méthodes:
Tentative d'explication plus détaillée:
faire une copie de la chaîne d'entrée, que nous utilisons pour trouver la longueur du chemin à partir de n'importe quel point donné de la carte.
définir une fonction anonyme 'ps' (longueur de chemin) (lambda) qui prend l'index de la carte i comme argument. il renvoie la longueur du chemin à partir de ce point. il le fait en appelant la méthode 'b' (blot) pour insérer des x sur une copie de la carte d'origine, puis en comptant le nombre de x dans la chaîne renvoyée.
la partie suivante parcourt chaque caractère de la carte (index i, caractère s [i]). il appelle la fonction «b» (blot) sur la position de carte i si la longueur du chemin depuis la position i est supérieure à 2, et s'il ne s'agit pas d'un espace ou d'un caractère de nouvelle ligne.
la fonction b (blot) prend comme argument la chaîne de carte et un index. il initialise @v (tableau visité) et appelle la fonction d'assistance b2.
la fonction b2 prend la chaîne de carte, une position de carte (i) et un caractère dans le chemin courant (c). il s'appelle récursivement pour remplacer les sections de chiffres connectées par le caractère «x». il retourne la chaîne d'entrée (c'est ainsi que la fonction ps peut appeler scan () sur la valeur de retour).
cette instruction if vérifie que la position de la carte (i) donnée est dans les limites de la chaîne (0 ... s.size) et que le caractère à s [i] est le même que le caractère de départ. @v [i] est également vérifié pour éviter une récursion infinie.
c'est le bit qui remplace le caractère de l'index (i) par le caractère 'x'. il marque également cet index comme visité.
c'est là que b2 s'appelle récursivement en recherchant le chemin. i + 1 est un caractère à droite, i-1 est un caractère à gauche, i + 6 est une ligne vers le bas (5 chiffres + 1 nouvelle ligne = 6 caractères), i-6 est une ligne vers le haut.
la source
C (Ansi),
243233179188 octetsGolfé:
Avec annotations:
}
Contribution:
Attend une nouvelle ligne au début et à la fin de la chaîne.
Exemple d'entrée:
Exemple de sortie:
Mise à jour
Fixer la grille m'a permis de raser près de 60 octets.
la source
Mathematica, 180 octets
Explication:
Fonction pure qui accepte un
5x5
tableau.
est le caractère à usage privé de 3 octetsU+F3C7
représentant l'opérateur de transposition postfix\[Transpose]
.(f=Flatten@#;p=Partition)
: Aplanit la liste d'entrée et la stockef
. Définitp = Partition
et retourne.g=p[r,5]
: Le tableau{{1,2,3,4,5}, ..., {21,22,23,24,25}}
(c'est parce qu'ilr
est réglé surRange@25
).Join[g=p[r,5],g]
: la liste des lignes et colonnes deg
.p[#,2,1]&
: Fonction pure qui partitionne la liste#
en sous-listes de longueur2
avec chevauchement1
; c'est-à-dire la liste des paires adjacentes dans#
.##&@@p[#,2,1]&
: Identique à ci-dessus sauf qu'il renvoie aSequence
.##&@@p[#,2,1]&/@Join[g=p[r,5],g]
: Mappe la fonction précédente des lignes et des colonnes deg
pour obtenir une liste de toutes les entrées adjacentes dansg
. Mon instinct dit qu'il existe un moyen plus court de le faire.r~Graph~Cases[...]
: Graphique dont les sommets sont les entiers1, ..., 25
et dont les arêtes sont les arêtes entre les entrées adjacentes dansg
lesquelles ont les mêmes entrées correspondantes dans le tableau d'entrée (autre que" "
){a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" "
: Modèle qui correspond{a,b}
tel quef[[a]] == f[[b]]
(même valeur dans le tableau d'entrée) et qui n'est pas égal à" "
. RéglezA = f[[a]]
pour enregistrer l'1
octet....:>a<->b
: Remplacez chaque correspondance par un bord non orienté de a à b.VertexComponent
: Renvoie la composante connectée du deuxième argument (un sommet) dans le premier argument (un graphique).Tr[1^VertexComponent[...]]
: La taille du composant connecté. Enregistre l'1
octet deLength@VertexComponent[...]
.If[Tr[...]<3,f[[#]],"x"]&
: Pure fonction qui prend une entrée#
dansg
. Si la taille de son composant connecté est inférieure à3
, remplacez-la par l'entrée correspondante dans l'entrée. Sinon, remplacez-le par"x"
.(f=Flatten@#;p=Partition)[...,5]
: Et enfin remodeler le résultat en un5x5
tableau.la source
Clojure, 188 octets
C'est assez écrasant: D
Appelé comme ceci (il faut un vecteur de caractères 1D):
Trop paresseux pour le dé-golfer, mais
for[m(range 30)]
visite essentiellement chaque index et pour chaque index, l'intérieurlet[n(for[p[-1 -6 1 6]...(+ m p))]
fait une liste de 0 à 4 éléments qui répertorie les emplacements qui ont la même valeur (1 - 9) que l'emplacement du milieu. Si plus d'un voisin correspond à la pièce centrale, cela signifie que tous ceux-ci forment un cluster, donc ces emplacements sont ajoutés à l'ensemble utilisé à(if((set(flatten(...)))i)
. Si l'indexi
est trouvé dans l'ensemble, il\x
est émis et la valeur d'origine dans le cas contraire. C'est:when( ... )
assez intéressant ...la source