Diese Frage ähnelt dem größten Platz in einem Raster .
Herausforderung
Bei einer Matrix von 1
und 0
in einem Zeichenfolgen- "xxxx,xxxxx,xxxx,xx.."
oder Array-Format ["xxxx","xxxx","xxxx",...]
erstellen Sie eine Funktion, die den Bereich der größten quadratischen Submatrix bestimmt, die alle enthält 1
.
Eine quadratische Submatrix hat die gleiche Breite und Höhe, und Ihre Funktion sollte den Bereich der größten Submatrix zurückgeben, die nur enthält 1
.
Beispielsweise:
Gegeben "10100,10111,11111,10010"
, das sieht aus wie die folgende Matrix:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Sie können sehen, dass die Fettschrift 1
die größte quadratische Submatrix der Größe 2x2 erstellt, sodass Ihr Programm den Bereich zurückgeben sollte, der 4 ist.
Regeln
- Die Submatrix muss gleich breit und hoch sein
- Die Submatrix darf nur Werte enthalten
1
- Ihre Funktion muss den Bereich der größten Submatrix zurückgeben
- Falls keine Submatrix gefunden wird, kehren Sie zurück
1
- Sie können die Fläche der Submatrix berechnen, indem Sie die Anzahl
1
der Submatrix zählen
Testfälle
Eingabe: "10100,10111,11111,10010"
Ausgabe: 4
Eingabe: "0111,1111,1111,1111"
Ausgabe: 9
Eingabe "0111,1101,0111"
Ausgabe: 1
Dies ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Antworten:
Gelee , 18 Bytes
+2, um die aktuelle Ausgabe der Nicht-Unterliste 1 zu verarbeiten
Probieren Sie es online aus! Oder sehen Sie sich die Testsuite an
Wie?
quelle
Haskell ,
113 121 118117 BytesProbieren Sie es online aus!
-3 Bytes dank Laikoni !
-1 Byte danke an Lynn !
+8 Bytes für die lächerliche Anforderung, 1 für keine All-1s-Submatrix zurückzugeben.
Erklärung / Ungolfed
Die folgende Hilfsfunktion erstellt nur Offsets, um
x
sie dekrementieren zu können ums
:x#y
löschty
Elemente aus einer Liste und nimmt dannx
:Die Funktion
f
durchläuft alle möglichen Größen für Untermatrizen der Reihe nach, generiert jede Untermatrix der entsprechenden Größe, prüft, ob sie nur'1'
s enthält, und speichert die Größe. Somit ist die Lösung der letzte Eintrag in der Liste:quelle
Haskell ,
9997 BytesÜberprüft, ob die Eingabe eine quadratische Matrix von nur Einsen
s==('1'<$s<$s)
ist. Wenn dies der Fall ist, lautet die Antwort Länge ^ 2, sonst 0. Dann wird die erste / letzte Spalte / Zeile rekursiv zerhackt und der maximal gefundene Maximalwert verwendet.Probieren Sie es online aus!
quelle
K (ngn / k) ,
3328 BytesProbieren Sie es online aus!
quelle
J ,
3327 Bytes-6 Bytes dank FrownyFrog!
Probieren Sie es online aus!
Erläuterung:
Ich werde den ersten Testfall in meiner Erklärung verwenden:
Ich generiere alle möglichen quadratischen Submatrizen mit einer Größe von 1 bis zur Anzahl der Zeilen der Eingabe.
,~@#\
,.
Erstellt eine Liste von Paaren für die Größe der Submatrizen, indem die Länge der aufeinanderfolgenden Präfixe#\
der Eingabe zusammengefügt wird:Dann benutze ich sie, um
x u ;. _3 y
die Eingabe in Submatrizen zu schneiden . Ich habe bereitsx
(die Liste der Größen);y
ist das richtige Argument]
(die Eingabe).Für jede Submatrix überprüfe ich, ob sie vollständig aus 1s besteht:
(#**/)@,
- Reduzieren Sie die Matrix und multiplizieren Sie die Anzahl der Artikel nach Produkt. Wenn alle Elemente 1s sind, ist das Ergebnis ihre Summe, andernfalls - 0:Schließlich reduziere ich die Ergebnisliste für jede Submatrix und finde das Maximum:
>./@,
quelle
,~@#\
und"1 2
->"$
"$
#
ist kürzer als die Addition der Einsen.APL (Dyalog Unicode) ,
353432 ByteProbieren Sie es online aus!
Adáms SBCS enthält alle Zeichen im Code
Erklärung kommt irgendwann!
quelle
Netzhaut , 143 Bytes
Probieren Sie es online aus! Link enthält Testfälle. Übernimmt die Eingabe als durch Kommas getrennte Zeichenfolgen. Erläuterung:
Fügen Sie a hinzu,
,
um die letzte Zeichenfolge zu beenden, a;
, um die Zeichenfolgen von#
s zu trennen, und a#
als Zähler.Wiederholen Sie den Block, bis keine Unterteilungen mehr auftreten (da jede Zeichenfolge nur noch eine Ziffer lang ist).
Verdreifachen Sie die Zeile, setzen Sie den Zähler in der ersten Zeile auf 1 und erhöhen Sie ihn in der letzten Zeile.
Löschen Sie in der ersten Zeile die erste Ziffer jeder Zeichenfolge, während Sie in der zweiten Zeile alle Ziffern außer der ersten löschen.
In der dritten Zeile bitweise und die ersten beiden Ziffern zusammen.
Zu diesem Zeitpunkt besteht jede Zeile aus zwei Werten, a) einem Zähler für die horizontale Breite und b) dem bitweisen Wert und den vielen Bits, die aus jeder Zeichenfolge entnommen wurden. Konvertieren Sie alle verbleibenden
1
s in#
s, damit sie mit dem Zähler verglichen werden können.Suchen Sie alle Bitläufe (vertikal), die mit dem Zähler (horizontal) übereinstimmen, entsprechend den Quadraten von
1
s in der ursprünglichen Eingabe, und quadrieren Sie die Länge.Numerisch sortieren.
Nimm den größten.
Sonderfall die Nullmatrix.
quelle
JavaScript, 92 Bytes
Code-Snippet anzeigen
quelle
APL (Dyalog Classic) ,
21 bis20 ByteProbieren Sie es online aus!
quelle
Python 2 ,
117109 BytesDank an @etene für den Hinweis auf eine Ineffizienz, die mich ein zusätzliches Byte gekostet hat.
Probieren Sie es online aus!
Übernimmt die Eingabe als durch Kommas getrennte Zeichenfolge. Dies ist ein Regex-basierter Ansatz, bei dem versucht wird, die Eingabezeichenfolge mit Mustern des Formulars
111.....111.....111
für alle möglichen Größen des Quadrats abzugleichen.In meinen Berechnungen ist dies mit einem anonymen Lambda nur ein bisschen kürzer als die definierte Funktion oder ein vollständiges Programm. Der
or 1
Teil am Ende ist nur notwendig, um den seltsamen Kantenfall zu behandeln, bei dem wir ausgeben müssen,1
wenn keine in der Eingabe sind.quelle
Python 2 ,
116115117109 BytesDank an @Kirill, der mir geholfen hat, noch mehr Golf zu spielen, und für seine clevere und frühe Lösung
Bearbeiten : 1 Byte mit einem Lambda gespielt, ich wusste nicht, dass das Zuweisen zu einer Variablen nicht zur Anzahl der Bytes zählt.
Edit 2 : Kirill wies darauf hin, dass meine Lösung in Fällen, in denen die Eingabe nur
1
s enthält , nicht funktionierte. Ich musste sie reparieren und verlor zwei wertvolle Bytes ...Edit 3 : Mehr Golf dank Kirill
Nimmt eine durch Kommas getrennte Zeichenfolge und gibt eine Ganzzahl zurück.
Probieren Sie es online aus!
Ich habe unabhängig eine Antwort gefunden, die Kirils nahe kommt, dh auf Regex basiert, außer dass ich
re.search
und a verwende.def
Es verwendet einen regulären Ausdruck, der während jeder Schleife erstellt wird, um einem inkrementell größeren Quadrat zu entsprechen, und gibt das größte oder 1 zurück.
quelle
if
Ansatz irgendwie automatisch als "sicher zu lang" verworfen , musste dann aber einen anderen Weg finden, um aus dem Match einen Bool-Wert zu machen. Leider verfehlt Ihre Lösung einen Punkt - Sie können nicht einfach habenrange(l)
- es wird den Fall verfehlen, wenn es überhaupt keine Nullen gibt. Nehmen Sie zum Beispiel den 2. Testfall und machen Sie alle 1s - es sollte 16 werden, nicht 9.find
. Jetzt, da unsere Codes nicht mehr identisch sind, schlage ich vor, dass wir zumindest die offensichtlichen Fehler voneinander beheben - in Ihrem Fall stammt das zusätzliche Byte aus der Verwendung von Tupel("1"*i,)
anstelle von Liste.find
auch, das war klug von dir.Ruby
-n
, 63 BytesProbieren Sie es online aus!
Ruby-Version meiner Python-Antwort . Golfier als volles Programm. Alternativ kann ein anonymes Lambda:
Ruby ,
7068 BytesProbieren Sie es online aus!
quelle
Perl 6 ,
616058 BytesProbieren Sie es online aus!
quelle
Python 2 ,
138128 BytesProbieren Sie es online aus!
Gerettet
quelle
Clojure, 193 Bytes
Wow, die Dinge eskalierten: o
Weniger Golf:
quelle