Das Szenario
Ich fahre mit meinem Auto eine Straße entlang und es beginnt zu regnen. Die Regentropfen fallen zufällig auf mein Fenster und jetzt frage ich mich, wo ist das größte zusammenhängende Nassgebiet?
Die Aufgabe
Zur Vereinfachung ist das Fenster in eine Matrix von 10 * 10 Quadraten aufgeteilt. Ihre Aufgabe ist es, den größten zusammenhängenden Wassertropfenbereich am Fenster zu finden.
Eingang
Es gibt zwei mögliche Eingaben, Sie können ein zweidimensionales Array oder ein eindimensionales Array verwenden. Sie können zwischen beliebigen Eingaben wie stdin usw. wählen.
Beispiel:
// 2-dimensional:
[[0,1,0,0,0,0,1,0,0,0],
[0,1,1,0,0,0,0,1,1,0],
[0,1,1,0,0,0,0,1,0,0],
[0,1,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0],
[0,0,0,1,1,0,0,0,1,0],
[0,0,0,1,1,0,0,0,1,0],
[0,0,0,0,0,1,1,0,1,0],
[0,0,0,0,0,1,1,0,1,0],
[0,0,0,0,0,0,0,0,0,0]]
// 1-dimensional
[0,1,0,0,0,0,1,0,0,0,
0,1,1,0,0,0,0,1,1,0,
0,1,1,0,0,0,0,1,0,0,
0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,
0,0,0,1,1,0,0,0,1,0,
0,0,0,1,1,0,0,0,1,0,
0,0,0,0,0,1,1,0,1,0,
0,0,0,0,0,1,1,0,1,0,
0,0,0,0,0,0,0,0,0,0]
Ausgabe
Ihr Code muss die Größe des größten verbundenen Bereichs und die x- und y-Koordinaten der Wassertropfen, die zu diesem Bereich gehören, im Format
"Größe: Z-Koordinaten: (X1, Y1) (X2, Y2)" ausgeben. "
Beispiel für die vorherige Eingabe:
Size: 6 Coordinates: (1,0) (1,1) (2,1) (1,2) (2,2) (1,3)
Die Reihenfolge der Koordinaten spielt keine Rolle.
Regeln
- Wassertropfen sind verbunden, wenn sie sich orthogonal berühren
- Diagonale Verbindungen zählen nicht
- Es kann viele Bereiche geben und Ihr Code muss den größten finden
- Ein leeres Feld wird als "0" und ein nasses Feld als "1" dargestellt.
- Veröffentlichen Sie Ihre Lösung mit einer kurzen Erläuterung und der Ausgabe der vorherigen Eingabe
- Der kürzeste Code innerhalb der nächsten 7 Tage gewinnt
- Wenn es zwei Bereiche mit derselben Größe gibt, können Sie einen auswählen
Antworten:
Ruby, 171 Zeichen
Eingabe über Kommandozeilenparameter als eindimensionales Array.
Ausgabe für die Beispieleingabe:
Size: 6 Coordinates: (1,0) (1,1) (1,2) (1,3) (2,2) (2,1)
In dieser Antwort wird ein einfacher Flood-Fill-Ansatz verwendet, bei dem für jeden Regentropfencluster eine Koordinatenliste erstellt wird. Der größte Teil des Codes wird tatsächlich für die Überprüfung der Grenzen und für E / A-Vorgänge verwendet.
quelle
Python - 192
Eingabe (Einfügen vor dem Code):
Vielen Dank an Calvins Hobbys für die vorgeschlagenen Änderungen!
quelle
map(f,range(100))
anstelle von[f(i)for i in range(100)]
8 Zeichen speichern. Ich glaube auch, dass Ihre Koordinaten (y, x) nicht (x, y) sind.C # -
548523522511503476(unter 500 ... yey)
Ich bin sicher, es gibt viel Raum für Verbesserungen.
Die Art und Weise, wie ich die Daten eingab, bestand darin, ein Array zu initialisieren. Ich habe dieses Array nicht in die Partitur aufgenommen (wenn Sie glauben, dass dies ein Betrug ist, kann ich den Code ändern, aber es wird relativ viel Code hinzufügen, da C # beim Parsen von Arrays nicht besonders gut ist).
Testen Sie es unter http://ideone.com/UCVCPM
Hinweis: Die aktuelle Version funktioniert nicht in Ideone, weil sie nicht gefällt
using l=System.Collections...
. Daher ist die Ideone-Version etwas veraltet (und länger).Wie es funktioniert
Grundsätzlich wird geprüft, ob es eine gibt
1
. Wenn es einen findet, ersetzt es mit dem Flood-Fill-Algorithmus alle benachbarten1
durch0
und fügt die ersetzten Koordinaten einer temporären Liste hinzu. Anschließend vergleicht es die Top-Liste (m
) mit der temporären Liste (t
) und setztm
auf,t
wennt
mehr Elemente enthalten sind.quelle
Mathematica - 180 Bytes
Diese Funktion benötigt ein zweidimensionales Array.
Golf gespielt
Ziemlich
Beispiel
Die Ausgabe ist leicht anomal. Mathematica beginnt mit der Indizierung bei 1 anstelle von 0 und
{}
gibt die Position an. Fügen Sie 2 Bytes (-1
) hinzu, wenn die Positionen mit 0 indiziert werden müssen. Fügen Sie viele Bytes hinzu, wenn sie()
anstelle von{}
:( verwendet werden müssen.Erläuterung
f
ist eine Funktion vonx
. Es definiertc
als eine Transformation vonx
, wobei jedes (i, j) nun einer Ganzzahl entspricht, die der verbundenen Komponente entspricht, zu der es gehört. Es beinhaltet die Hauptarbeit:Dann wird
m
berechnet , wie viele Elemente in jeder Komponente sind, sortiert sie nach dieser Nummer, und nimmt das letzte Ergebnis (dh, mit den meisten Elementen). Die letzte Zeile gibt den Zählerstand und die Positionenc
des Index ausm
.quelle
Haskell, 246
Eingang
Zweidimensional und vor dem Code einfügen
g
, zum Beispiel:Ungolfed
quelle
C # 374-Byte-Funktion
Dies ist eine stark veränderte Version meiner Antwort auf Sind Sie im größten Raum? . Es benötigt ein eindimensionales Array von Ints und gibt eine Zeichenfolge im erforderlichen Stil zurück. Es funktioniert, indem disjunkte Mengen aus der Eingabe (erste Schleife) aufgebaut werden, die Größe jeder Menge gezählt und die größte Menge (zweite Schleife) ermittelt wird und dann alle Zellen in dieser Menge an eine Ausgabezeichenfolge (dritte Schleife) angehängt werden, die dann zurückgegeben wird .
Weniger Golf (und mit Testcode):
quelle
JavaScript (EcmaScript 6) 183
189Eine Funktion mit Array-Eingabe und String-Rückgabewert. Wenn eine echte Ausgabe benötigt wird (mir nicht klar), fügen Sie 7 Bytes für 'alert ()' hinzu.
Ausgang testen
Mehr lesbar
Erläuterung
Rufen Sie ein einzelnes Dimensionsarray und einen optionalen Parameter mit der Größe einer Zeile ab. Die Funktion arbeitet auch mit verschiedenen Array-Dimensionen, sogar x! = Y.
Pseudocode:
quelle
JavaScript, 273
Die Funktion nimmt ein Array und gibt einen String zurück. Mein erster Versuch bestand aus ca. 500 Zeichen und verwendete Flood Fill nicht. Dieser tut es. Ich lerne JavaScript, daher sind alle Vorschläge willkommen.
Diese Funktion durchläuft das Eingangsarray und startet für jede gefundene 1 dort und ändert alle mit 1s verbundenen mit der Fill-Funktion auf 0. Dabei merkt es sich den Blob mit den meisten 1s. Die Funktion Füllen ändert die aktuelle Position auf 0 und ruft dann die Position oben, rechts, unten und links auf.
Testen Sie hier: http://goo.gl/9Hz5OH
Lesbarer Code
quelle
Scala, 420
Hallo, mein Eintrag nimmt ein 2d-Array als ein
List[List[Int]]
, gibt einString
Erläuterung
Bei einem Fenster als
List[List[Int]]
finden wir zuerst jede "1" und speichern die Koordinaten in einer Liste. Als nächstes wandeln wir diese Liste in eineMap
der Koordinaten jeder "1" in eine Liste der Koordinaten jeder benachbarten "1". Verwenden Sie dann die Adjazenzkarte, um die Unter-Blobs transitiv zu Blobs zu verknüpfen. Schließlich geben wir den größten Blob zurück (und ignorieren doppelte Blobs, da die Reihenfolge der zurückgegebenen Koordinaten keine Rolle spielt).Mehr lesbar
Kritik wird sehr geschätzt.
quelle