Cette question est similaire à Biggest Square dans une grille .
Défi
Étant donné une matrice de 1
et 0
dans un format de chaîne "xxxx,xxxxx,xxxx,xx.."
ou un format de tableau ["xxxx","xxxx","xxxx",...]
, vous allez créer une fonction qui détermine la zone de la plus grande sous-matrice carrée qui contient tout 1
.
Une sous-matrice carrée est une largeur et une hauteur égales, et votre fonction doit renvoyer la zone de la plus grande sous-matrice qui contient uniquement 1
.
Par exemple:
Étant donné "10100,10111,11111,10010"
, cela ressemble à la matrice suivante:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Vous pouvez voir les caractères gras 1
créer la plus grande sous-matrice carrée de taille 2x2, donc votre programme doit retourner la zone qui est 4.
Règles
- La sous-matrice doit avoir une largeur et une hauteur égales
- La sous-matrice doit contenir uniquement des valeurs
1
- Votre fonction doit renvoyer la zone de la plus grande sous-matrice
- Si aucune sous-matrice n'est trouvée, retournez
1
- Vous pouvez calculer l'aire de la sous-matrice en comptant le nombre de
1
dans la sous-matrice
Cas de test
Entrée: "10100,10111,11111,10010"
Sortie: 4
Entrée: "0111,1111,1111,1111"
Sortie: 9
Sortie d' entrée "0111,1101,0111"
: 1
C'est le code-golf , donc la réponse la plus courte en octets gagne.
Réponses:
Gelée , 18 octets
+2 pour gérer la sortie actuelle de la sous-liste no-all-1
Essayez-le en ligne! Ou consultez la suite de tests
Comment?
la source
Haskell ,
113 121 118117 117 octetsEssayez-le en ligne!
-3 octets grâce à Laikoni !
-1 octet merci à Lynn !
+8 octets pour l'exigence ridicule de renvoyer 1 pour aucune sous-matrice tout-1.
Explication / Non golfé
La fonction d'assistance suivante crée simplement des décalages pour
x
permettre de les décrémenter des
:x#y
supprimera desy
éléments d'une liste, puis prendrax
:La fonction
f
parcourt toutes les tailles possibles pour les sous-matrices dans l'ordre, génère chaque sous-matrice de la taille correspondante, teste si elle ne contient que'1'
s et stocke la taille. Ainsi, la solution sera la dernière entrée de la liste:la source
Haskell ,
9997 octetsVérifie si l'entrée est une matrice carrée de seulement avec
s==('1'<$s<$s)
, si elle l'est, la réponse est la longueur ^ 2, sinon 0. Ensuite, coupe récursivement la première / dernière colonne / ligne et prend la valeur maximale qu'elle trouve n'importe où.Essayez-le en ligne!
la source
K (ngn / k) ,
3328 octetsEssayez-le en ligne!
la source
J ,
3327 octets-6 octets grâce à FrownyFrog!
Essayez-le en ligne!
Explication:
Je vais utiliser le premier cas de test dans mon explication:
Je génère toutes les sous-matrices carrées possibles avec une taille de 1 au nombre de lignes de l'entrée.
,~@#\
crée une liste de paires pour les tailles des sous-matrices en cousant,.
ensemble la longueur des préfixes successifs#\
de l'entrée:Ensuite, je les utilise pour couper
x u ;. _3 y
l'entrée en sous-matrices. J'ai déjàx
(la liste des tailles);y
est le bon argument]
(l'entrée).Pour chaque sous-matrice, je vérifie si elle est entièrement composée de 1:
(#**/)@,
- aplatissez la matrice et multipliez le nombre d'articles par leur produit. Si tous les éléments sont 1s, le résultat sera leur somme, sinon - 0:Enfin j'aplatis la liste des résultats pour chaque sous-matrice et trouve le maximum:
>./@,
la source
,~@#\
et"1 2
->"$
"$
#
est plus court que l'addition des 1.APL (Dyalog Unicode) ,
353432 octetsEssayez-le en ligne!
Le SBCS d'Adám possède tous les caractères du code
Explication à venir éventuellement!
la source
Rétine , 143 octets
Essayez-le en ligne! Le lien inclut des cas de test. Prend l'entrée sous forme de chaînes séparées par des virgules. Explication:
Ajoutez un
,
pour terminer la dernière chaîne, un;
pour séparer les chaînes du#
s et un#
comme compteur.Répétez le bloc jusqu'à ce qu'il n'y ait plus de substitution (car chaque chaîne ne comporte plus qu'un seul chiffre).
Tripliquez la ligne en mettant le compteur à 1 sur la première ligne et en l'incrémentant sur la dernière ligne.
Sur la première ligne, supprimez le premier chiffre de chaque chaîne, tandis que sur la deuxième ligne, supprimez tous les chiffres sauf le premier.
Sur la troisième ligne, au niveau du bit et des deux premiers chiffres ensemble.
À ce stade, chaque ligne se compose de deux valeurs, a) un compteur de largeur horizontale et b) au niveau du bit et du nombre de bits pris dans chaque chaîne. Convertissez tous les
1
s restants en#
s afin qu'ils puissent être comparés au compteur.Trouvez toutes les séries de bits (verticalement) qui correspondent au compteur (horizontalement), correspondant aux carrés de
1
s dans l'entrée d'origine, et mettez la longueur au carré.Trier numériquement.
Prenez le plus gros.
Cas particulier de la matrice zéro.
la source
JavaScript, 92 octets
Afficher l'extrait de code
la source
APL (Dyalog Classic) ,
2120 octetsEssayez-le en ligne!
la source
Python 2 ,
117109 octetsNous remercions @etene d'avoir signalé une inefficacité qui m'a coûté un octet supplémentaire.
Essayez-le en ligne!
Prend l'entrée comme une chaîne séparée par des virgules. Il s'agit d'une approche basée sur l'expression rationnelle qui essaie de faire correspondre la chaîne d'entrée avec les modèles du formulaire
111.....111.....111
pour toutes les tailles possibles du carré.Dans mes calculs, le faire avec un lambda anonyme est juste un peu plus court que la fonction définie ou un programme complet. La
or 1
partie à la fin n'est nécessaire que pour gérer le cas de bord étrange, où nous devons sortir1
s'il n'y a personne dans l'entrée.la source
Python 2 ,
116115117 117109 octetsCrédits à @Kirill pour m'avoir aidé à jouer au golf encore plus et pour sa solution intelligente et précoce
Edit : Golfé 1 octet en utilisant un lambda, je ne savais pas que l'affecter à une variable ne comptait pas dans le nombre d'octets.
Edit 2 : Kirill a souligné que ma solution ne fonctionnait pas dans les cas où l'entrée ne contient que des
1
s, j'ai dû le réparer et perdu deux précieux octets ...Edit 3 : plus de golf grâce à Kirill
Prend une chaîne séparée par des virgules, retourne un entier.
Essayez-le en ligne!
J'ai trouvé indépendamment une réponse qui est proche de celle de Kiril, c'est-à-dire basée sur l'expression rationnelle, sauf que j'utilise
re.search
et a.def
Il utilise une expression régulière construite pendant chaque boucle pour correspondre à un carré incrémentiel plus grand et renvoie le plus grand, ou 1.
la source
if
approche comme "trop longue pour sûr", mais j'ai ensuite dû trouver un autre moyen de faire une valeur booléenne du match. Malheureusement, votre solution manque un point - vous ne pouvez pas l'avoir justerange(l)
- elle manquera le cas quand il n'y aura aucun zéro. Par exemple, prenez le 2ème cas de test et faites-en tous les 1 - il devrait devenir 16, pas 9.find
. Maintenant que nos codes ne sont plus identiques, je suggère que nous corrigions au moins les erreurs évidentes les uns des autres - dans votre cas, l'octet supplémentaire provient de l'utilisation de tuple("1"*i,)
au lieu de list.find
aussi, c'était intelligent de votre part.Rubis
-n
, 63 octetsEssayez-le en ligne!
Version Ruby de ma réponse Python . Golfier comme programme complet. Alternativement, un lambda anonyme:
Rubis ,
7068 octetsEssayez-le en ligne!
la source
Perl 6 ,
616058 octetsEssayez-le en ligne!
la source
Python 2 ,
138128 octetsEssayez-le en ligne!
Enregistré
la source
Clojure, 193 octets
Wow, les choses ont dégénéré: o
Moins golfé:
la source