Un de mes passe-temps mathématiques préférés est de dessiner une grille rectangulaire, puis de trouver tous les rectangles visibles dans cette grille. Ici, prenez cette question et aventurez-vous par vous-même!
Pouvez-vous compter le nombre de rectangles?
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
Le nombre total de rectangles pour cette planche minichess 4 x 4 est exactement
100
Aviez-vous raison?
Mathématiques connexes: Combien de rectangles y a-t-il sur un damier 8 × 8?
Le défi
Écrivez la fonction / le programme le plus court qui compte le nombre total de rectangles visibles sur une grille / image non toroïdale .
Défis connexes: comptez les rectangles uniques! , Trouver le nombre de rectangles dans un tableau d'octets 2D .
Format d'entrée
Votre fonction ou programme peut choisir de fonctionner avec une entrée textuelle ou une entrée graphique.
Saisie basée sur du texte
La grille sera une grille ASCII m- par- n ( m lignes, n colonnes) composée des caractères suivants:
- les espaces,
-
pour les parties d'un segment de ligne horizontale,|
pour les parties d'un segment de ligne verticale, et+
pour les coins.
Vous pouvez introduire cette grille ASCII comme entrée / argument dans votre programme / fonction sous la forme de
- une seule chaîne délimitée par des sauts de ligne,
- une chaîne sans retour à la ligne mais avec un ou deux entiers codant les dimensions de la grille, ou
- un tableau de chaînes.
Remarque: L'entrée textuelle contient au moins 1 ligne et au moins 1 colonne.
Entrée graphique
Alternativement, les grilles sont codées en noir et blanc images PNG de 5 * n pixels de large et 5 * m pixels de haut. Chaque image se compose de blocs de 5 px * 5 px qui correspondent à l'entrée ASCII par:
- Les espaces sont convertis en blocs blancs. Ces blocs sont appelés blocs d' espaces .
- Les segments de ligne et les coins sont convertis en blocs non blancs. Le pixel central de ces blocs est noir.
- Modifier: si deux coins (dans l'entrée ASCII) sont connectés par un segment de ligne, les centres de blocs correspondants (dans l'entrée graphique) doivent également être connectés par une ligne noire.
Cela signifie que chaque bloc ne peut être choisi que parmi (Cliquez ici pour agrandir l'image) .
Remarque: Les limites bleues sont uniquement à des fins d'illustration. L'entrée graphique mesure au moins 5 px de large et 5 px de haut. Vous pouvez convertir l'entrée graphique en n'importe quelle image monochrome, potentiellement d'autres formats de fichier image). Si vous choisissez de convertir, veuillez préciser dans la réponse. Il n'y a aucune pénalité à la conversion.
Format de sortie
Si vous écrivez un programme, il doit afficher un nombre non négatif indiquant le nombre total de rectangles dans l'entrée.
Si vous écrivez une fonction, elle doit également renvoyer un nombre non négatif indiquant le nombre total de rectangles dans l'entrée.
Exemples de cas
Cas 1, graphique: ( 30 px * 30 px), ASCII: ( 6 lignes, 6 cols)
+--+
| |
| ++-+
+-++ |
| |
+--+
Production attendue: 3
Cas 2, graphique: ( 20 px * 20 px), ASCII: ( 4 lignes, 4 cols)
++-+
|+++
+++|
+-++
Production attendue: 6
Cas 3, graphique: ( 55 px * 40 px), ASCII: ( 8 lignes, 11 colonnes )
+++--+
+-+++ |
| | ++--+
+--+--++ ++
| ||
| ||
++ +--++
++
Production attendue: 9
Cas 4, graphique: ( 120 px * 65 px), ASCII: ( 13 lignes, 24 cols)
+--+--+ +--+ +--+ +--+
| | | | | | | | |
+--+--+ | | | | | |
| | | +--+--+--+--+--+
+--+--+ | | | |
| | | | ++
+-+-+-+-+ +--+ +--+ ++
| | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
Production attendue: 243
Cas 5, graphique: ( 5 px * 5 px. Oui, il est là!), ASCII: un seul espace.
Production attendue: 0
Cas 6, graphique: ( 35 px * 20 px), ASCII: ( 4 lignes, 7 colonnes )
+--+--+
|++|++|
|++|++|
+--+--+
Production attendue: 5
Hypothèses
Pour vous faciliter la vie, vous avez la garantie que:
- En étant non toroïdal , la grille ne s'enroule ni horizontalement ni verticalement.
- Il n'y a aucune extrémité libre, par exemple
+---
ou+- -+
. Tous les segments de ligne ont deux extrémités. - Deux lignes qui se rencontrent à
+
doivent se croiser à ce point. - Vous n'avez pas à vous soucier des entrées invalides.
Les règles contre les failles standard s'appliquent. Veuillez traiter les carrés comme des rectangles. Vous pouvez éventuellement supprimer les espaces de fin sur chaque ligne de la grille.
Il s'agit de code-golf , alors faites votre entrée aussi courte que possible. Les solutions textuelles et graphiques seront en concurrence.
Classement
la source
Réponses:
Grime ,
3128 octetsEssayez-le en ligne!
Prend l'entrée au format ASCII.
Explication
La syntaxe de Grime est très proche des expressions régulières. Chaque ligne définit un motif qui peut correspondre ou non à un rectangle de caractères.
T
correspond à un rectangle dont la ligne supérieure et la colonne de gauche semblent valides.La deuxième ligne est le "programme principal".
la source
JavaScript (ES6),
176171 octetsPrend l'entrée comme un tableau de chaînes de longueur égale. Explication: crée une série d'expressions régulières qui correspondent à des rectangles de toutes les largeurs et hauteurs possibles (et certaines largeurs et hauteurs impossibles, mais c'est le code golf pour vous) et compte le nombre de correspondances qu'ils produisent tous. Parce qu'il y a un groupe de capture dans l'expression régulière,
split
retourne2n+1
pour lesn
correspondances, donc je décale vers la droite de 1 pour obtenir le nombre de correspondances, car cela économise un octet par rapport à la non-capture du groupe.la source
J ,
1039586807670 octetsEssayez-le en ligne!
Prend l'entrée comme un tableau de chaînes avec des espaces de fin (de sorte que chaque chaîne ait la même taille). Utilise l' opérateur de sous-tableau complet
;._3
pour itérer sur toutes les tailles de sous-tableau possibles supérieures à 2 x 2 et compte les sous-tableaux qui sont des rectangles valides. Complète tous les cas de test presque instantanément.la source
Mathematica,
136134132 octetsUtilisation: (pour l'ancienne version de 136 octets, mais la nouvelle version est fondamentalement identique)
Remarque:
@*
est nouveau dans la version 10. Dans les anciennes versions, utilisezTr~Composition~Flatten
plutôt queTr@*Flatten
.la source
"Tr@" cannot be followed by "*Flatten".
@*
(raccourci pourComposition
) est nouveau dans la version 10.RectangleCount[]
?Gelée ,
60 53 52 5150 octetsUn programme complet acceptant une liste de chaînes (lignes de longueur égale) et imprimant le nombre.
Essayez-le en ligne!
... ou pour faciliter la copie et le collage, utilisez ce programme complet (avec un octet supplémentaire pour séparer les lignes)
- notez que les lignes doivent contenir des espaces de fin pour que le programme fonctionne correctement.
Comment?
la source
Slip ,
3229 octetsEssayez-le en ligne!
27 octets de code + 2 octets pour les drapeaux
n
eto
. Prend la saisie dans le même format que celui fourni dans la question (c.-à-d. Bloc de lignes délimité par des sauts de ligne).la source
Haskell,
180167166 octetsEssayez-le en ligne!
Parcourez toutes les positions de coin possibles avec quatre boucles imbriquées et vérifiez si tous les caractères sur les lignes entre eux sont constitués de
+-
(horizontal) ou+|
(vertical).la source
Gelée ,
41393433 octetsEssayez-le en ligne! ou Voir tous les cas.
D'après ma réponse dans J.
Explication
la source