Étant donné une matrice bidimensionnelle de 0 et 1s. Trouvez le nombre d'îles pour 1 et 0 où les voisins sont uniquement à l'horizontale et à la verticale.
Given input:
1 1 1 0
1 1 1 0
output = 1 1
Number of 1s island = 1
xxx-
xxx-
Number of 0s island = 1
---x
---x
------------------------------
Given input:
0 0 0 0
1 1 1 1
0 0 0 0
1 1 1 1
output = 2 2
Number of 1s island = 2
----
xxxx <-- an island of 1s
----
xxxx <-- another island of 1s
Number of 0s island = 2
xxxx <-- an island
----
xxxx <-- another island
----
------------------------------
Given input:
1 0 0
0 0 0
0 0 1
output = 2 1
Number for 1's island = 2:
x-- <-- an island of 1s
---
--x <-- an island of 1s
Number of 0's island = 1:
-xx \
xxx > 1 big island of 0s
xx- /
------------------------------
Given input:
1 1 0
1 0 0
output = 1 1
Number for 1's island =1 and number of 0's island = 1
------------------------------
Given input:
1 1
1 1
output = 1 0
Number for 1's island =1 and number of 0's island = 0
code-golf
binary-matrix
KB joy
la source
la source
[[1,0];[0,1]]
pour vous assurer que la connectivité diagonale n'est pas incluse11111 / 10001 / 10101 / 10001 / 11111
→2 1
Réponses:
APL (Dyalog Unicode) ,
2928 octets SBCS-1 grâce à @ Adám
Essayez-le en ligne!
⊂,~∘⊂
la matrice et sa négation{
}¨
pour chacun d'eux⍸⍵
liste des paires de cordes de 1s+/↑|∘.-⍨
matrice des distances de manhattan2>
matrice voisine∨.∧⍨⍣≡
fermeture transitive≢∪
nombre de lignes uniquesla source
^:_
?J , 57 octets
Essayez-le en ligne!
C'est l'une de celles où l'idée est incroyablement simple (et je pense que c'est amusant), mais son exécution avait une certaine longueur mécanique qui masque la simplicité ... par exemple, déplacer la matrice d'origine dans toutes les directions avec un remplissage à 0 est le verbeux
((,-)#:i.3) |.!.0
.Il est probable que cette longévité mécanique puisse être étudiée plus loin, et je peux essayer demain soir, mais j'en posterai le point crucial maintenant.
Disons que notre contribution est:
Nous commençons avec une matrice d'entiers uniques de la même taille:
Ensuite, pour chaque cellule, nous trouvons le maximum de tous ses voisins, et multiplions par le masque de saisie:
Nous répétons ce processus jusqu'à ce que la matrice cesse de changer:
Et puis comptez le nombre d'éléments uniques non différents de zéro. Cela nous indique le nombre d'îlots.
Nous appliquons le même processus à "1 moins l'entrée" pour obtenir le nombre d'îlots 0.
la source
JavaScript (ES7),
138 ... 107106octetsRenvoie un tableau
[ones, zeros]
.Essayez-le en ligne!
Comment?
Pour économiser des octets, le même code exact est utilisé à la fois pour l'itération racine et les itérations récursives, mais il se comporte un peu différemment.
Lors de la première itération:
Lors des itérations récursives:
c[v ^ 1]++
Commenté
la source
MATL ,
1412 octetsEssayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
K (ngn / k) ,
60 55 51 5046 octetsEssayez-le en ligne!
~:\
une paire de l'entrée et sa négation (littéralement: nier itérer-converger){
}'
pour chaque,/x
aplatir l'argument&
où sont les 1? - liste des indices(0,#*x)\
largeur divmod (entrée) pour obtenir deux listes distinctes pour ys et xsx-\:'x:
distances par axe ∆x et ∆yx*x:
les mettre au carré+/
ajouter ∆x² et ∆y²2>
matrice voisine{|/'x*\:x}/
fermeture transitive#?
compter les lignes uniquesla source
Wolfram Language (Mathematica) ,
6462 octetsEssayez-le en ligne!
Merci à attinat : on peut écrire
1<0
au lieu deFalse
et économiser deux octets.version sans golf:
Il y a, bien sûr, un module intégré Mathematica
MorphologicalComponents
qui prend un tableau (ou une image) et le renvoie avec les pixels de chaque îlot morphologiquement connecté remplacés par l'index de l'îlot. La priseMax
de ce résultat donne le nombre d'îles (les zéros d'arrière-plan sont laissés à zéro et l'indice d'îlot commence à 1). Nous devons le faire séparément pour le tableau (en donnant le nombre d'îlots) et un moins le tableau (en donnant le nombre d'îlots 0). Pour s'assurer que les voisins en diagonale ne comptent pas comme voisins, l'optionCornerNeighbors->False
doit être donnée.la source
Rule
Python 3,
144127 octetsCette solution utilise
cv2
la puissance de traitement d'image impressionnante. Malgré les noms de méthode moins impressionnants, super longs et lisibles de cv, il bat les deux autres réponses Python!Golfé:
Étendu:
la source
4
au lieu deconnectivity=4
etn.uint8
au lieu dedtype=n.uint8
possible?cv2.connectedComponents
méthode, donc j'étais confus et pensais qu'il pourrait y avoir une raison différente pour avoir besoin des noms d'argument. Comme je l'ai dit, je ne connais pas trop Python. Tout ce que j'en ai appris, c'est d'ici sur le CCGC. ;) Mais il est logique d'utiliser les noms de variables pour ignorer les autres arguments facultatifs.J ,
46 4443 octets-1 octet grâce à @miles
Essayez-le en ligne!
tests et l'
,&
-.
emballage volés à la réponse de @ jonah,&
-.
pour l'entrée et sa négation:4$.$.
(y, x) coordonnées des 1 comme une matrice n × 21#.[:|@-"1/~
distances manhattan: abs (∆x) + abs (∆y)2>
matrice voisine[:+./ .*~^:_:
fermeture transitive#&~.&(
)
nombre de lignes uniquesla source
,&#&~.
à- dire pour éviter le plafond[:
Retina 0.8.2 , 155 octets
Essayez-le en ligne! Le lien inclut un cas de test. Explication:
S'il y a un
1
, changez-le en;
et ajoutez-en una
à la fin de l'entrée afin qu'il ne soit pas sur le chemin.Inondez remplissez tout
1
s adjacent avec;
s.Répétez jusqu'à ce que toutes les îles de
1
s aient été transformées en;
s.S'il y a un
0
, changez-le en:
et ajoutez unb
à la fin de l'entrée afin qu'il ne soit pas sur le chemin.Inondez remplissez tout
0
s adjacent avec:
s.Répétez jusqu'à ce que toutes les îles de
0
s aient été transformées en:
s.Comptez séparément le nombre d'îles de
1
s et0
s.la source
Haskell ,
228227225224 octetsEssayez-le en ligne!
Explication:
L'idée de cette solution est la suivante: initialiser la matrice avec des valeurs uniques dans chaque cellule, positives pour
1
et négatives pour0
. Ensuite, comparez à plusieurs reprises chaque cellule avec ses voisins et, si le voisin a le même signe mais un nombre avec une valeur absolue plus grande, remplacez le numéro de la cellule par le numéro du voisin. Une fois que cela atteint un point fixe, comptez le nombre de nombres positifs distincts pour le nombre de1
régions et les nombres négatifs distincts pour le nombre de0
régions.Dans du code:
peut être séparé en prétraitement (attribution de numéros aux cellules), itération et post-traitement (comptage des cellules)
Prétraitement
La partie prétraitement est la fonction
Qui utilise
z
comme abréviation pourzipWith
raser quelques octets. Ce que nous faisons ici est de compresser le tableau bidimensionnel avec des indices entiers sur les lignes et des indices entiers impairs sur les colonnes. Nous faisons cela car nous pouvons construire un entier unique à partir d'une paire d'entiers en(i,j)
utilisant la formule(2^i)*(2j+1)
. Si nous ne générons que des entiers impairs pourj
, nous pouvons ignorer le calcul de2*j+1
, en économisant trois octets.Avec le nombre unique, il ne nous reste plus qu'à multiplier dans un signe basé sur la valeur dans la matrice, qui est obtenue comme
2*x-1
Itération
L'itération se fait par
Étant donné que l'entrée se présente sous la forme d'une liste de listes, nous effectuons la comparaison des voisins sur chaque ligne, transposons la matrice, effectuons à nouveau la comparaison sur chaque ligne (qui, en raison de la transposition, est ce qu'étaient les colonnes auparavant) et transposons à nouveau. Le code qui accomplit l'une de ces étapes est
((.)>>=id$transpose.map l)
où se
l
trouve la fonction de comparaison (détaillée ci-dessous) ettranspose.map l
effectue la moitié des étapes de comparaison et de transposition.(.)>>=id
exécute son argument deux fois, étant la forme sans point\f -> f.f
et d'un octet plus court dans ce cas en raison des règles de priorité de l'opérateur.l
est défini dans la ligne ci-dessus commel x=z(!)(z(!)x(0:x))$tail x++[0]
. Ce code effectue un opérateur de comparaison(!)
(voir ci-dessous) sur chaque cellule avec d'abord son voisin gauche, puis avec son voisin droit, en zippant la listex
avec la liste décalée à droite0:x
et la liste décalée à gauchetail x++[0]
tour à tour. Nous utilisons des zéros pour garnir les listes décalées, car elles ne peuvent jamais se produire dans la matrice prétraitée.a!b
est défini dans la ligne au-dessus de cela commea!b=div(max(a*a)(a*b))a
. Ce que nous voulons faire ici, c'est la distinction de cas suivante:sgn(a) = -sgn(b)
, nous avons deux zones opposées dans la matrice et ne souhaitons pas les unifier,a
reste inchangésgn(b) = 0
, nous avons le cas du coin oùb
est le rembourrage eta
reste donc inchangésgn(a) = sgn(b)
, nous souhaitons unifier les deux zones et prendre celle avec la plus grande valeur absolue (pour des raisons de commodité).Notez que
sgn(a)
cela ne peut jamais l'être0
. Nous accomplissons cela avec la formule donnée. Si les signes dea
etb
diffèrent,a*b
est inférieur ou égal à zéro, tandis quea*a
est toujours supérieur à zéro, nous le sélectionnons donc comme le maximum et divisons aveca
pour revenira
. Sinon,max(a*a)(a*b)
estabs(a)*max(abs(a),(abs(b))
, et en divisant cela para
, nous obtenonssgn(a)*max(abs(a),abs(b))
, qui est le nombre avec la plus grande valeur absolue.Pour itérer la fonction
((.)>>=id$transpose.map l)
jusqu'à ce qu'elle atteigne un point fixe, nous utilisons(until=<<((==)=<<))
, qui est tiré de cette réponse stackoverflow .Post-traitement
Pour le post-traitement, nous utilisons la partie
qui est juste une collection d'étapes.
(>>=id)
écrase la liste des listes en une seule liste,nub
supprime les doubles,(\x->length.($x).filter<$>[(>0),(<0)])
partitionne la liste en une paire de listes, une pour les nombres positifs et l'autre pour les nombres négatifs, et calcule leurs longueurs.la source
Java 10,
359355281280261246 octets-74 octets grâce à @NahuelFouilleul .
Essayez-le en ligne.
Explication:
la source
|=2
: 0 -> 2 et 1 -> 3, mais a>0
été changé en==1
|=2
! Et je pourrais toujours utiliser à la<2
place de==1
-1 octet en vérifiant d'abord0
(et donc ils sont changés en2
, puis en utilisant le<2
pour vérifier1
(qui sont changés en3
).)Python 3 , 167 octets
Essayez-le en ligne!
Python 2 , 168 octets
Essayez-le en ligne!
-2 octets grâce à Kevin Cruijssen
Correction de formatage +2 octets
Explication
Un compteur est conservé pendant 0s et 1s. Pour chaque entrée de la matrice, les actions suivantes sont effectuées:
Il en résulte un faux positif pour les cas alignés à gauche comme
ou
Si une telle situation se présente, le compteur est diminué de 1.
La valeur de retour est
[#1, #0]
la source
[#1, #0]
. Bit imo inutile pour appliquer cela, mais c'est ce qu'il est pour l'instant. Quoi qu'il en soit, vous pouvez jouer au golf l'{not c}
à{c^1}
, et résoudre le problème je l' ai mentionné en changeantn[c]+=
àn[c^1]+=
une question similaire. Belle réponse cependant, +1 de ma part. :)Perl 5 (
-0777p
), 110 octetsPeut être amélioré, utilise une expression régulière pour remplacer
1
par3
, puis0
par2
.TIO
la source
Gelée ,
4436 octetsEssayez-le en ligne!
Un lien monadique acceptant une liste de listes d'entiers comme argument et renvoyant une liste du nombre d'îlots 1 et 0 dans cet ordre.
Explication
Étape 1
Générer la liste de tous les indices matriciels, chacun avec les indices de son voisin à droite (sauf à droite) et en bas (sauf en bas)
Étape 2
Divisez ces indices selon qu'il y avait 1 ou 0 en entrée. Renvoie une liste d'index avec des voisins pour 1s et une autre pour 0s.
Étape 3
Fusionner des listes avec des membres en nombre commun et en sortie
la source
T-SQL 2008, 178 octets
L'entrée est une variable de table.
Les données de test utilisées dans cet exemple:
Essayez-le en ligne
la source
R ,
194172 octetsEssayez-le en ligne!
Effectuez une recherche en profondeur en commençant dans chaque cellule de la matrice qui est égale à 1 (ou zéro).
la source