Contribution
Le plateau: Un conteneur 2D (matrice, liste de listes, etc.) de lettres comme:
["B", "C", "C", "C", "C", "B", "B", "C", "A", "A"],
["B", "A", "C", "B", "B", "A", "B", "B", "A", "A"],
["B", "C", "B", "C", "A", "A", "A", "B", "C", "B"],
["B", "B", "B", "A", "C", "B", "A", "C", "B", "A"],
["A", "A", "A", "C", "A", "C", "C", "B", "A", "C"],
["A", "B", "B", "A", "A", "C", "B", "C", "C", "C"],
["C", "B", "A", "A", "C", "B", "B", "C", "A", "A"]
Si vous choisissez une liste de listes, vous pouvez supposer que toutes les sous-listes sont de la même longueur.
Règles
- Pour faire un rectangle valide, vous avez besoin de tous les coins de rectangle avec la même «lettre».
- Exemple, regardez l' exemple de carte avec X ci-dessous. Vous pouvez voir 'X' sur (1,0) également sur (4,0) également sur (1,3) et sur (4,3) puis vous avez le rectange [1,0,4,3] qui signifie de (1,0) à (4,3):
Exemple de carte avec X :
["B", "X", "C", "C", "X", "B", "B", "C", "A", "A"],
["B", "A", "C", "B", "B", "A", "B", "B", "A", "A"],
["B", "C", "B", "C", "A", "A", "A", "B", "C", "B"],
["B", "X", "B", "A", "X", "B", "A", "C", "B", "A"],
["A", "A", "A", "C", "A", "C", "C", "B", "A", "C"],
["A", "B", "B", "A", "A", "C", "B", "C", "C", "C"],
["C", "B", "A", "A", "C", "B", "B", "C", "A", "A"]
- Le but est de trouver le rectangle ou l'un des rectangles avec la plus grande surface, calculé par (droite-gauche + 1) * (bas-haut + 1)
- S'il existe plusieurs rectangles avec la même zone maximale, sortez-en un. Facultativement celui avec (coordonnée supérieure, coordonnée gauche, coordonnée droite, coordonnée inférieure) lexicographiquement le plus petit.
- Les rectangles doivent avoir des bords parallèles au bord de la planche.
- Chaque lettre est un caractère ASCII imprimable de A à Z (tous deux inclus).
Sortie
La sortie doit être les positions gauche-haut et droite-bas des coins rectangulaires de la plus grande surface. Pour le premier échantillon "board", le grand carré est le jaune:
Et la réponse devrait être:
[1, 1, 8, 4]
Un deuxième exemple de cas de test
Une entrée de:
["C", "D", "D", "D", "A", "A"],
["B", "D", "C", "D", "A", "A"],
["B", "D", "D", "C", "A", "C"],
["B", "D", "B", "C", "A", "C"]
Devrait produire l'une de ces trois listes de coordonnées identifiant une zone de six rectangles:
[1, 0, 2, 2]
[1, 0, 3, 1]
[3, 2, 5, 3]
Cette question est publiée sur Stack Overflow avec le titre: Comment trouver le plus grand rectangle dans un tableau 2D formé de quatre coins identiques? et avec cette solution JS grossière (je peux dire "grossier" car c'est mon code;):
Ok, c'est mon premier post, soyez tolérant avec moi s'il vous plait. Je vais changer tout ce que vous dites pour améliorer le quiz.
((left,top),(right,bottom))
devrait être bien aussi. J'ai supprimé ma réponse et répondez à nouveau lorsque la question est complètement affinée.Réponses:
Python 2 ,
148130 octetsEssayez-le en ligne!
la source
Rétine ,
163162 octetsEssayez-le en ligne! Edit: enregistré 1 octet car la fin
)
correspondant à la$.(
est implicite. Explication:Cette expression régulière correspond aux rectangles. Les groupes sont les suivants: 1) Ligne du haut (comme nombre de captures) 2) Colonne de gauche (comme longueur) 3) Équilibrage pour assurer l'alignement des coins gauches 4) Lettre pour les coins 5) Largeur + 1 (comme longueur) 6) Équilibrage pour assurer l'alignement des coins droits 7) Colonne droite (en longueur) 8) inutilisée 9) Hauteur (en nombre de captures). L'
w
option garantit que toutes les largeurs possibles de rectangles correspondent à chaque coin supérieur gauche donné. Les$
options répertorient les résultats en utilisant le modèle de substitution suivant.Les substitutions sont les suivantes: la colonne de droite, la ligne du haut, la colonne de gauche, la négation de la zone du rectangle (calculée littéralement comme la longueur de la répétition de la chaîne de largeur par un de plus que la hauteur nombre de fois), la colonne de gauche , la ligne du haut, la colonne de droite, suivie d'une expression qui évalue la ligne du bas (une capture aurait coûté 12 octets et je n'ai plus de variables à un chiffre). Les quatre premières captures représentent l'ordre de tri par ordre de priorité. Comme Retina trie de manière stable, un tri multicolonne peut être établi en triant par chaque colonne de tri à tour de rôle de la priorité la plus faible à la plus élevée. (La zone doit être triée par ordre décroissant, de sorte qu'un seul tri de chaîne ne peut pas être utilisé.)
Quatre tris numériques sont ensuite effectués.
La colonne de tri est ensuite supprimée après chaque tri.
La première entrée est donc maintenant le résultat souhaité.
Remarque: La restriction sur le choix du rectangle d'une zone donnée a depuis été assouplie et la version
144 144octets suivante préfère un rectangle plus large que plus grand:Essayez-le en ligne!
la source
Gelée , (27?)
2928 octets27 si l'indexation basée sur 1 est autorisée - supprimer la fin
’
Un programme complet.
Essayez-le en ligne! (ou voir l'autre cas de test )
Comment?
la source
Perl 6 ,
8373 octetsEssayez-le en ligne!
Renvoie une liste de listes
((x0 y0) (x1 y1))
.Explication
la source
Haskell , 144 octets
Essayez-le en ligne!
la source
b<=d
, tant que vous conserveza<=c
.Gelée , 24 octets
Essayez-le en ligne!
⁺
s'avère utile.Format de sortie: [haut, bas], [gauche, droite] . 1-indexation.
la source
JavaScript (ES6), 121 octets
-1 octet grâce à @ l4m2
-1 octet grâce à @tsh
+2 octets pour se conformer à la nouvelle règle de notation rectangle
Prend l'entrée comme une matrice de chaînes. Renvoie les coordonnées indexées 0: [x0, y0, x1, y1] .
Essayez-le en ligne!
la source
a=>a.map(b=(r,y)=>r.map((v,x)=>a.map((R,Y)=>R.map((V,X)=>V+R[x]+r[X]!=v+v+v|(A=(X-x)*(Y-y))<=b||(o=[x,y,X,Y],b=A)))))&&o
(A=...)<=b
- être ->(A=...)<b
?APL (Dyalog Classic) , 38 octets
Essayez-le en ligne!
la source
Java 8,
208205 octetsPeut certainement être joué au golf. J'utilise maintenant l'approche la plus évidente de l'utilisation de
quatretrois boucles for imbriquées.-3 octets grâce à @ceilingcat combinant les boucles internes des lignes et des colonnes en une seule boucle.
Explication:
Essayez-le en ligne.
la source