Eine meiner mathematischen Lieblingsbeschäftigungen ist es, ein rechteckiges Gitter zu zeichnen und dann alle Rechtecke zu finden, die in diesem Gitter sichtbar sind. Hier, nimm diese Frage und wage es selbst!
Können Sie die Anzahl der Rechtecke zählen?
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
Die Gesamtzahl der Rechtecke für dieses 4 x 4 Minischachbrett ist genau
100
Hattest du recht
Verwandte Mathematik: Wie viele Rechtecke befinden sich auf einem 8 × 8-Schachbrett?
Die Herausforderung
Schreiben Sie die kürzeste Funktion / das kürzeste Programm , das die Gesamtzahl der sichtbaren Rechtecke auf einem nicht torusförmigen Gitter / Bild zählt .
Verwandte Herausforderungen: Zähle die einzigartigen Rechtecke! , Finden Sie die Anzahl der Rechtecke in einem 2D-Byte-Array .
Eingabeformat
Ihre Funktion oder Ihr Programm kann entweder mit textbasierter Eingabe oder mit grafischer Eingabe arbeiten.
Textbasierte Eingabe
Das Raster ist ein m- by- n ( m Zeilen, n Spalten) ASCII-Raster, das aus den folgenden Zeichen besteht:
- Räume,
-
für Teile eines horizontalen Liniensegments,|
für Teile eines vertikalen Liniensegments und+
für ecken.
Sie können dieses ASCII-Raster als Eingabe / Argument in Ihr Programm / Ihre Funktion in Form von einfügen
- eine einzelne Zeichenfolge, die durch Zeilenumbrüche begrenzt ist,
- eine Zeichenfolge ohne Zeilenumbrüche, jedoch mit ein oder zwei Ganzzahlen, die die Dimensionen des Rasters codieren, oder
- ein Array von Zeichenfolgen.
Hinweis: Die textbasierte Eingabe enthält mindestens 1 Zeile und mindestens 1 Spalte.
Grafische Eingabe
Alternativ werden die Gitter als Schwarzweiß- PNG- Bilder mit einer Breite von 5 · n Pixeln und einer Höhe von 5 · m Pixeln codiert . Jedes Bild besteht aus 5 px * 5 px- Blöcken, die der ASCII-Eingabe entsprechen durch:
- Leerzeichen werden in weiße Blöcke umgewandelt. Diese Blöcke werden als Whitespace- Blöcke bezeichnet.
- Liniensegmente und Ecken werden in Blöcke ohne Leerzeichen konvertiert . Das zentrale Pixel solcher Blöcke ist schwarz.
- Bearbeiten: Wenn zwei Ecken (in der ASCII-Eingabe) durch ein Liniensegment verbunden sind, sollten die entsprechenden Blockmitten (in der grafischen Eingabe) ebenfalls durch eine schwarze Linie verbunden werden.
Dies bedeutet, dass jeder Block nur ausgewählt werden kann (Klicken Sie hier für ein größeres Bild) .
Hinweis: Die blauen Grenzen dienen nur zur Veranschaulichung. Die grafische Eingabe ist mindestens 5 px breit und 5 px hoch. Sie können die grafische Eingabe in ein beliebiges monochromes Bild konvertieren (möglicherweise in ein anderes Bilddateiformat). Wenn Sie konvertieren möchten, geben Sie dies bitte in der Antwort an. Es gibt keine Konversionsstrafe.
Ausgabeformat
Wenn Sie ein Programm schreiben, muss es eine nicht negative Zahl anzeigen, die die Gesamtzahl der Rechtecke in der Eingabe angibt.
Wenn Sie eine Funktion schreiben, sollte auch eine nicht negative Zahl zurückgegeben werden, die die Gesamtzahl der Rechtecke in der Eingabe angibt.
Beispielfälle
Fall 1, Grafik: ( 30 px * 30 px), ASCII: ( 6 Zeilen, 6 Spalten)
+--+
| |
| ++-+
+-++ |
| |
+--+
Erwartete Ausgabe: 3
Fall 2, Grafik: ( 20 px * 20 px), ASCII: ( 4 Zeilen, 4 Spalten)
++-+
|+++
+++|
+-++
Erwartete Ausgabe: 6
Fall 3, Grafik: ( 55 px * 40 px), ASCII: ( 8 Zeilen, 11 Spalten)
+++--+
+-+++ |
| | ++--+
+--+--++ ++
| ||
| ||
++ +--++
++
Erwartete Ausgabe: 9
Fall 4, Grafik: ( 120 px * 65 px), ASCII: ( 13 Zeilen, 24 Spalten)
+--+--+ +--+ +--+ +--+
| | | | | | | | |
+--+--+ | | | | | |
| | | +--+--+--+--+--+
+--+--+ | | | |
| | | | ++
+-+-+-+-+ +--+ +--+ ++
| | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
Erwartete Ausgabe: 243
Fall 5, Grafik: ( 5 px * 5 px. Ja, es ist da!), ASCII: Nur ein Leerzeichen.
Erwartete Ausgabe: 0
Fall 6, Grafik: ( 35 px * 20 px), ASCII: ( 4 Zeilen, 7 Spalten)
+--+--+
|++|++|
|++|++|
+--+--+
Erwartete Ausgabe: 5
Annahmen
Um Ihnen das Leben zu erleichtern, ist Folgendes garantiert:
- Durch die atorischen , wird das Gitter nicht entweder horizontal oder vertikal wickeln.
- Es gibt keine losen Enden, zum Beispiel
+---
oder+- -+
. Alle Liniensegmente haben zwei Enden. - Zwei Linien, die sich bei treffen,
+
müssen sich an diesem Punkt schneiden. - Sie müssen sich nicht um ungültige Eingaben kümmern.
Es gelten Regeln gegen Standardlücken. Bitte behandeln Sie Quadrate als Rechtecke. Optional können Sie die nachgestellten Leerzeichen in jeder Zeile des Rasters entfernen.
Dies ist Code-Golf , also machen Sie Ihre Eingabe so kurz wie möglich. Textbasierte und grafische Lösungen werden miteinander konkurrieren.