Ein einfacher Wettbewerb, inspiriert von dieser Stackoverflow-Frage :
Sie erhalten ein Bild einer Oberfläche, die von einem Satelliten fotografiert wurde. Das Bild ist eine Bitmap, auf der Wasser mit "
.
" und Land mit "*
" markiert ist . Gruppen benachbarter*
's bilden eine Insel. (Zwei '*
' sind benachbart, wenn es sich um horizontale, vertikale oder diagonale Nachbarn handelt.) Ihre Aufgabe ist es, die Anzahl der Inseln in der Bitmap zu drucken.
Eine Single *
zählt auch als Insel.
Beispiel Input:
.........**
**......***
...........
...*.......
*........*.
*.........*
Beispielausgabe:
5
Gewinner ist der Eintrag mit der kleinsten Anzahl von Bytes im Code.
*
Insel*
s sind auch inseln.Antworten:
Mathematica
188 185 170 115 130 4648 ZeichenErläuterung
In früheren Versionen habe ich ein Diagramm mit Positionen erstellt, die einen Schachbrettabstand von 1 voneinander haben.
GraphComponents
Dann ergab sich die Anzahl der Inseln, eine pro Komponente.In der vorliegenden Version werden
MorphologicalComponents
Gruppen von Gruppen in den Array - Regionen gefunden und nummeriert, in denen sie1
physikalisch zusammenhängen. Da keine grafischen Darstellungen erforderlich sind, ergibt sich eine enorme Codeeinsparung.Code
Beispiel
5
Wie es funktioniert
Daten werden als Array eingegeben; In Mathematica ist dies eine Liste von Listen.
Im Eingabearray werden die Daten durch die Ersetzung in
1
's und0
' s konvertiertWo
/.
ist ein Infix vonReplaceAll
gefolgt von Ersetzungsregeln. Dadurch wird das Array im Wesentlichen in ein Schwarzweißbild umgewandelt. Alles was wir tun müssen, ist die Funktion anzuwendenImage
.Die weißen Quadrate entsprechen den Zellen mit dem Wert 1.
Das Bild unten zeigt einige Schritte, die der Ansatz verwendet. Die Eingabematrix enthält nur
1
's und0
' s. Die Ausgabematrix kennzeichnet jeden morphologischen Cluster mit einer Nummer. (Ich habe sowohl die Eingabe- als auch die Ausgabematrizen eingewickeltMatrixForm
, um ihre zweidimensionale Struktur hervorzuheben.)MorphologicalComponents
Ersetzt1
s durch eine Ganzzahl, die der Clusternummer jeder Zelle entspricht.Max
Gibt die größte Clusternummer zurück.Anzeigen der Inseln
Colorize
färbt jede Insel einzigartig.quelle
MorphologicalComponents
willImage
, aber sollte es nicht auch auf v9 seinMax@MorphologicalComponents[d/.{"."->0,"*"->1}]
? Das heißt, der Austausch erfolgt zuerst?Max
würde verschwinden, bevor der Austausch durchgeführt wurde, nicht wahr?Max@MorphologicalComponents@d/.{"."->0,"*"->1}
nicht funktioniert, was Sinn machtMax@MorphologicalComponents[d /. {"." -> 0, "*" -> 1}]
, ist , dass du noch ein Zeichen hast.Ruby 1.9 (
134121113110)Nimmt die Karte in Standard oder den Dateinamen der Karte als erstes Befehlszeilenargument und gibt die Anzahl der Inseln in Standard aus. Verwenden einer rekursiven Grundfüllung. Verbesserungen wie immer willkommen!
Ähnlich wie bei Davids Kolorierung können Sie auch die verschiedenen Inseln anzeigen, indem Sie
$_[i]=?.
zu$_[i]=c.to_s
undp c
zu wechselnputs$_
, was ungefähr so aussieht:(Zumindest bis dir die Ziffern ausgehen!)
Einige Testfälle:
5
9
1
2
3
quelle
C 169 Zeichen
Liest die Karte von stdin. Hatte kein Glück, die rekursive Füllfunktion zu verbessern,
r(j)
obwohl es so aussieht, als könnte es sein.quelle
Python 2,
223203 BytesVielen Dank an Step Hen und Arnold Palmer für das Abschneiden von 20 Leerzeichen und unnötigen Klammern!
Ich dachte, dass die Verwendung von Listenverständnissen die Anzahl der Bytes verringern könnte, aber dies brachte keine signifikante Verbesserung.
Probieren Sie es hier aus.
Ich versuche immer wieder, es um die n (Nachbarn) Liste zu kürzen, aber ich war nicht erfolgreich. Vielleicht hat jemand anderes Ideen für diesen Abschnitt.
quelle
(s.index(l),i)
undfor
,enumerate(l)
undif
,-v[0])<2
undand
,p=0:
undp
, und ,bool(x&n[p])
undelse
. Sie haben auch mehr Klammern als in Ihrer Druckanweisung benötigt, da Sie 2 Gruppen umgebenset
. Edit: Beat by StepHen, weil es nicht ideal ist, Sachen auf dem Handy zu machen.Perl 5 , 100 Bytes
98 Byte Code + 2 Byte für
-p0
Flags.Probieren Sie es online!
Eine Anpassung (oder eher eine Vereinfachung) meiner Antwort auf die Herausforderung Wie viele Löcher? . Erklärungen zur Funktionsweise dieses Codes finden Sie in dieser anderen Antwort (die Erklärung ist etwas lang, daher ziehe ich es vor, nicht die gesamten Erklärungen erneut einzugeben).
quelle
Python 2, 233 Bytes
Im Vergleich zu anderen Antworten zu lang. Port meiner Antwort auf diese Frage .
Probieren Sie es online aus
quelle
JavaScript, 158 Byte
Nicht konkurrierende ES6-Antwort (Sprachnachstellung) für 132 Bytes:
Port meiner Antwort auf Wie viele Löcher? (Ja, ich springe auf den Zug, jetzt, wo ich gesehen habe, dass zwei andere Leute ihre Antworten portieren).
quelle
Python 2 , 225 Bytes
Probieren Sie es online!
quelle