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.
Bestenliste
quelle
Antworten:
Schmutz ,
3128 BytesProbieren Sie es online!
Übernimmt Eingaben im ASCII-Format.
Erläuterung
Die Syntax von Grime kommt regulären Ausdrücken sehr nahe. Jede Zeile definiert ein Muster, das mit einem Rechteck von Zeichen übereinstimmen kann oder nicht.
T
Stimmt mit einem Rechteck überein, dessen obere Zeile und linke Spalte gültig aussehen.Die zweite Zeile ist das "Hauptprogramm".
quelle
JavaScript (ES6),
176171 BytesNimmt die Eingabe als Array von Zeichenfolgen gleicher Länge. Erläuterung: Erstellt eine Reihe von regulären Ausdrücken, die mit Rechtecken aller möglichen Breiten und Höhen (und einigen unmöglichen Breiten und Höhen, aber das ist Code Golf für Sie) übereinstimmen, und zählt, wie viele Übereinstimmungen sie alle erzeugen. Da es in der regexp, eine Erfassungsgruppe ist
split
Renditen2n+1
fürn
Streichhölzer, so dass ich Verschiebung nach rechts um 1 die Anzahl der Spiele zu erhalten, da das ein Byte speichert über so dass die Gruppe nicht-Capturing.quelle
J ,
1039586807670 BytesProbieren Sie es online!
Nimmt Eingaben als ein Array von Zeichenfolgen mit nachgestellten Leerzeichen an (sodass jede Zeichenfolge dieselbe Größe hat). Verwendet den vollständigen Subarray-Operator
;._3
, um über jede mögliche Subarray-Größe zu iterieren, die größer als 2 x 2 ist, und zählt die Subarrays, die gültige Rechtecke sind. Schließt alle Testfälle fast sofort ab.quelle
Mathematica,
136134132 BytesVerwendung: (für alte 136-Byte-Version, aber die neue Version ist im Grunde identisch)
Hinweis:
@*
ist neu in Version 10. In älteren Versionen verwenden SieTr~Composition~Flatten
anstelle vonTr@*Flatten
.quelle
"Tr@" cannot be followed by "*Flatten".
@*
(Abkürzung fürComposition
) ist neu in Version 10.RectangleCount[]
?Jelly ,
60 53 52 5150 BytesEin vollständiges Programm, das eine Liste von Zeichenfolgen (Zeilen gleicher Länge) akzeptiert und die Anzahl ausgibt.
Probieren Sie es online!
... oder verwenden Sie dieses vollständige Programm (mit einem zusätzlichen Byte zum Teilen von Zeilen),um das Kopieren und Einfügen von Eingaben zu vereinfachen.
Beachten Sie jedoch, dass die Zeilen nachgestellte Leerzeichen enthalten müssen, damit das Programm ordnungsgemäß funktioniert.
Wie?
quelle
Beleg ,
3229 BytesProbieren Sie es online!
27 Byte Code + 2 Byte für die Flags
n
undo
. Nimmt Eingaben in demselben Format vor, das in der Frage angegeben ist (dh Zeilenblock mit Zeilenumbruch).quelle
Haskell,
180167166 BytesProbieren Sie es online!
Gehen Sie alle möglichen Eckpositionen mit vier verschachtelten Schleifen durch und prüfen Sie, ob alle Zeichen auf den Linien zwischen ihnen aus
+-
(horizontal) oder+|
(vertikal) bestehen.quelle
Jelly ,
41393433 BytesProbieren Sie es online! oder Alle Fälle anzeigen.
Basierend auf meiner Antwort in J.
Erläuterung
quelle