Le scénario
Je roule sur une route avec ma voiture et il commence à pleuvoir. Les gouttes de pluie tombent sur ma fenêtre au hasard et maintenant je me demande, où est la plus grande zone humide connectée?
La tâche
Pour le rendre plus facile, la fenêtre est divisée en une matrice de 10 * 10 carrés. Votre travail consiste à trouver la plus grande zone de goutte d'eau connectée sur la fenêtre.
Contribution
Il y a deux entrées possibles, vous pouvez utiliser un tableau à 2 dimensions ou un tableau à 1 dimension. Vous pouvez choisir entre n'importe quelle entrée comme stdin, etc ...
Exemple:
// 2-dimensional:
[[0,1,0,0,0,0,1,0,0,0],
[0,1,1,0,0,0,0,1,1,0],
[0,1,1,0,0,0,0,1,0,0],
[0,1,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0],
[0,0,0,1,1,0,0,0,1,0],
[0,0,0,1,1,0,0,0,1,0],
[0,0,0,0,0,1,1,0,1,0],
[0,0,0,0,0,1,1,0,1,0],
[0,0,0,0,0,0,0,0,0,0]]
// 1-dimensional
[0,1,0,0,0,0,1,0,0,0,
0,1,1,0,0,0,0,1,1,0,
0,1,1,0,0,0,0,1,0,0,
0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,
0,0,0,1,1,0,0,0,1,0,
0,0,0,1,1,0,0,0,1,0,
0,0,0,0,0,1,1,0,1,0,
0,0,0,0,0,1,1,0,1,0,
0,0,0,0,0,0,0,0,0,0]
Production
Votre code doit indiquer la taille de la plus grande zone connectée et les coordonnées x et y des gouttes d'eau qui appartiennent à cette zone au format
"Taille: Coordonnées Z: (X1, Y1) (X2, Y2) .. . "
Exemple pour l'entrée précédente:
Size: 6 Coordinates: (1,0) (1,1) (2,1) (1,2) (2,2) (1,3)
L'ordre des coordonnées n'a pas d'importance.
Règles
- Les gouttes d'eau sont connectées, si elles se touchent orthogonalement
- Les connexions diagonales ne comptent pas
- Il peut y avoir de nombreux domaines et votre code doit trouver le plus grand
- Un champ vide est représenté par "0" et un champ humide par "1"
- Publiez votre solution avec une brève explication et la sortie de l'entrée précédente
- Le code le plus court dans les 7 prochains jours gagnera
- S'il y a deux zones de même taille, vous pouvez en choisir une
Réponses:
Ruby, 171 caractères
Entrée via le paramètre de ligne de commande sous forme de tableau unidimensionnel.
Sortie pour l'entrée échantillon:
Size: 6 Coordinates: (1,0) (1,1) (1,2) (1,3) (2,2) (2,1)
Cette réponse utilise une approche de remplissage par inondation simple, créant une liste de coordonnées pour chaque groupe de gouttes de pluie. La plupart du code est en fait utilisé pour la vérification des limites et les E / S.
la source
Python - 192
Entrée (coller avant le code):
Merci Calvin's Hobbies pour les modifications suggérées!
la source
map(f,range(100))
au lieu de[f(i)for i in range(100)]
pour enregistrer 8 caractères. Je crois aussi que vos coordonnées ne sont pas (y, x) pas (x, y).C # -
548523522511503476(moins de 500 ... oui)
Je suis sûr qu'il y a beaucoup de place pour l'amélioration.
La façon dont j'ai entré les données était d'initialiser un tableau. Je n'ai pas inclus ce tableau dans la partition (si vous pensez que c'est de la triche, je peux changer le code, mais cela ajoutera relativement beaucoup de code parce que C # n'est pas excellent pour analyser les tableaux)
Testez-le sur http://ideone.com/UCVCPM
Remarque: La version actuelle ne fonctionne pas dans ideone parce qu'elle n'aime pas
using l=System.Collections...
, donc la version ideone est légèrement dépassée (et plus longue)Comment ça fonctionne
Il vérifie essentiellement s'il y a un
1
. S'il en trouve un, il utilise l'algorithme Flood Fill pour remplacer tous les adjacents1
par0
et ajoute les coordonnées remplacées à une liste temporaire. Ensuite , il compare la liste supérieure (m
) à la liste temporaire (t
) et ensemblesm
àt
set
contient plus d' éléments.la source
Mathematica - 180 octets
Cette fonction prend un tableau bidimensionnel.
Golfé
Jolie
Exemple
La sortie est légèrement anormale. Mathematica commence l'indexation à 1 au lieu de 0 et utilise
{}
pour indiquer la position. Ajoutez 2 octets (-1
) si les positions doivent être indexées sur 0. Ajoutez beaucoup d'octets s'ils doivent utiliser()
au lieu de{}
:(Explication
f
est fonction dex
. Il se définitc
comme une transformation dex
, où chaque (i, j) est maintenant égal à un entier correspondant au composant connecté auquel il appartient. Il implique le travail principal:m
Calcule ensuite le nombre d'éléments dans chaque composant, les trie par ce nombre et prend le dernier résultat (c'est-à-dire avec le plus d'éléments). La dernière ligne affiche le nombre et les positionsc
de l'index contenu dansm
.la source
Haskell, 246
Contribution
Deux dimensions et collez avant le code comme
g
, par exemple:Non golfé
la source
Fonction C # 374 octets
Ceci est une version fortement modifiée de ma réponse à Êtes-vous dans la plus grande salle?. Il prend un tableau unidimensionnel d'entiers et renvoie une chaîne dans le style requis. Il fonctionne en créant des ensembles disjoints à partir de l'entrée (première boucle), en comptant la taille de chaque ensemble et en trouvant le plus grand ensemble (deuxième boucle), puis en ajoutant toutes les cellules de cet ensemble à une chaîne de sortie (troisième boucle) qui est ensuite renvoyée .
Moins golfé (et avec code de test):
la source
JavaScript (EcmaScript 6) 183
189Une fonction avec entrée de tableau et valeur de retour de chaîne. Si une sortie réelle est nécessaire (pas claire pour moi), ajoutez 7 octets pour 'alert ()'.
Sortie de test
Plus lisible
Explication
Obtenez un tableau à une dimension et un paramètre facultatif avec la taille d'une ligne. La fonction fonctionne également avec différentes dimensions de tableau, même x! = Y.
Pseudo code:
la source
JavaScript, 273
La fonction prend un tableau et renvoie une chaîne. Ma première tentative était d'environ 500 caractères et n'a pas utilisé Flood Fill. Celui-ci le fait. J'apprends JavaScript, donc toute suggestion serait appréciée.
Cette fonction parcourt le tableau d'entrée et pour chaque 1 trouvé, elle commence là et change tous les 1s connectés à 0 en utilisant la fonction Fill. Ce faisant, il se souvient du blob avec le plus de 1s. La fonction Remplir modifie la position actuelle à 0, puis s'appelle sur la position au-dessus, à droite, en dessous et à gauche.
Testez ici: http://goo.gl/9Hz5OH
Code lisible
la source
Scala, 420
Salut, mon entrée prend un tableau 2D comme un
List[List[Int]]
, renvoie unString
Explication
Étant donné une fenêtre en tant que
List[List[Int]]
, nous trouvons d'abord chaque "1" et enregistrons les coordonnées dans une liste. Ensuite, nous transformons cette liste enMap
des coordonnées de chaque "1" en une liste des coordonnées de chaque "1" adjacent. Ensuite, utilisez la carte d'adjacence pour lier de manière transitoire les sous-blobs en blobs, et enfin nous renvoyons le plus gros blob (et en ignorant les blobs en double car l'ordre des coordonnées retournées n'a pas d'importance).Plus lisible
La critique est très appréciée.
la source