Angenommen, Sie erhalten verschiedene Großbuchstaben, die in einer rechteckigen Anordnung von ansonsten leeren Zellen verteilt sind. Jede Zelle im Array gehört zu dem nächstgelegenen Buchstaben , definiert als der Buchstabe, der in der kleinsten Anzahl horizontaler und / oder vertikaler Schritte erreichbar ist - keine diagonalen Schritte. (Wenn eine Zelle , die von zwei oder mehr Buchstaben nächsten gleich weit entfernt ist, gehört sie zu welchen diesen Briefen zuerst in alphabetischer Reihenfolge. Eine Zelle mit einem Buchstaben Großbuchstaben in er dieses Schreiben gehört.) Boundary -Cells sind solche , die horizontal oder vertikal sind , benachbart zu einer oder mehreren Zellen, die nicht zu dem Buchstaben gehören, zu dem sie selbst gehören.
Schreiben Sie ein Prozedur-Unterprogramm mit folgendem Verhalten und erstellen Sie eine Art Voronoi-Diagramm ...
Eingabe : Eine beliebige ASCII-Zeichenfolge, die nur aus Punkten, Großbuchstaben und Zeilenumbrüchen besteht, sodass beim Drucken ein rechteckiges Array der oben beschriebenen Art mit Punkten als Leerzeichen angezeigt wird.
Ausgabe : Ein Ausdruck der Eingabezeichenfolge, wobei jede leere Begrenzungszelle durch die Kleinbuchstabenversion des Buchstabens ersetzt wird, zu dem sie gehört. (Das Unterprogramm druckt.)
Beispiel 1
Eingang:
......B..
.........
...A.....
.........
.......D.
.........
.C.......
.....E...
.........
Ausgabe:
...ab.B..
....ab.bb
...A.abdd
aa...ad..
cca.ad.D.
..caeed..
.C.ce.edd
..ce.E.ee
..ce.....
Eine Skizze, die die Grenzen hervorhebt:
Beispiel 2
Eingang:
............................U...........
......T.................................
........................................
.....................G..................
..R.......S..........F.D.E............I.
.........................H..............
.....YW.Z...............................
......X.................................
........................................
........................................
......MN...........V....................
......PQ................................
........................................
.............L...............J..........
........................................
........................................
....C...........K.......................
........................................
..................................A.....
...........B............................
Ausgabe:
..rt.....ts...sg......gduu..U.....ui....
..rt..T..ts...sg......gddeu......ui.....
...rt...ts....sg......gddeeu....ui......
....rttts.....sggggggGgdde.euuuui.......
..R.rywss.S....sfffffFdDdEeeeeeei.....I.
...ryywwzs.....sf....fddhHhhhhhhhi......
..ryyYWwZzs..sssffff.fddh.......hi......
..rxxxXxzzs.sllvvvvvffddh....hhhhi......
rrrxxxxnzzssl.lv....vfddh...hjjjjii.....
mmmmmmmnnnnnl.lv.....vvdh..hj....jai....
mmmmmmMNnnnnl.lv...V...vvhhj.....jaai...
ppppppPQqqql...lv.......vhj......ja.ai..
ppppp.pq.ql....lkv.....vjj.......ja..aii
cccccppqql...L.lkkv...vj.....J...ja...aa
.....cpqqlll..lk..kvvvvj........ja......
......cccbbbllk....kkkkj.......ja.......
....C...cb..bk..K......kj.....ja........
.......cb....bk........kjjjjjja.........
......cb......bk.......kaaaaaa....A.....
.....cb....B...bk......ka...............
Farbverbesserung:
Antworten:
GolfScript,
138144137 ZeichenDie Eingabe wird dem Unterprogramm als einzelne Zeichenfolge auf dem Stapel übergeben. Leider musste ich
puts
wegen der Anforderung, dass die Routine das Ergebnis ausdrucken muss, eine verwenden.Erklärung des Codes
Der äußere Block durchläuft im Wesentlichen alle Positionen (x, y) entsprechend der Größe der Eingaberechtecke. Innerhalb der Schleife bleiben die Koordinaten x und y jedes Mal auf dem Stapel. Nach Abschluss jeder Zeile wird das Ergebnis auf der Konsole ausgegeben.
Der Code, der in der Schleife ausgeführt wird, erhält zuerst das entsprechende Zeichen der Eingabe.
Dann prüfen wir grundsätzlich, ob wir eine haben
.
, dh ob wir den Charakter (möglicherweise) ersetzen müssen.Wieder beginnt der innere Code mit einer Schleife, die nun über alle Koordinaten (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y) verläuft.
Das aktuelle innere Codefragment gibt einfach den (Kleinbuchstaben) des nächstgelegenen Punkts zurück, wenn die beiden Koordinaten gegeben sind.
Also von den fünf nächsten Buchstaben für die Koordinaten (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y) nehmen Sie den ersten, wenn nicht alle gleich, sonst nimm a
.
.quelle
Python 3 -
424422417332295 Zeichen:Es gibt drei Teile, von denen jeder aufgrund der Python-Syntax in einer eigenen Zeile stehen muss:
w
ist die Breite einer Reihe des Brettes (einschließlich der Zeilenvorschublinie am Ende, die als Polstersäule wiederverwertet wird).r
ist einrange
Objekt, das alle Zeichen in indexierts
.n
ist ein Tupel von Index-Offsets, um an die Nachbarn eines Zeichens zu gelangen (wenn Sie also zulassen möchten, dass sich die Buchstaben diagonal ausbreiten, müssen Sie nur-w-1,-w+1,w-1,w+1
das Tupel ergänzen ).x
ist eine Kurzbezeichnung für diestr.replace
Methode, die im späteren Code mehrmals verwendet wird (die Aufrufe sehen jedoch merkwürdig aus, da ichx(s,*"xy")
Zeichen speichere, anstatt der herkömmlichens.replace("x", "y")
). Dies
Parameterzeichenfolge wird an dieser Stelle ebenfalls leicht geändert, und die.
Zeichen und Zeilenumbrüche werden durch ersetzt~
Zeichen (weil sie nach allen Buchstaben sortieren). Die Füllzeichen einer Zeile~
werden ebenfalls am Ende hinzugefügt.t
wird später als Verweis auf die "alte" Version von verwendets
, muss jedoch zus
Beginn auf einen Wert initialisiert werden, der nicht gleich ist , und Null benötigt nur ein Zeichen (ein pythonischerer Wert wäreNone
, aber das sind drei zusätzliche Zeichen). .s
anhand eines Listenverständnisses aktualisiert wird . Während das Verständnis über die Indizes von iterierts
, werden die~
Zeichen durch diemin
ihrer Nachbarn ersetzt. Wenn ein~
Charakter vollständig von anderen~
s umgeben war, wird dies nichts bewirken. Wenn es neben einem oder mehreren Buchstaben steht, wird es der kleinste von ihnen (Bevorzugung"a"
gegenüber"b"
usw.). Die Zeilenumbrüche, die in~
Zeichen umgewandelt wurden, werden beibehalten, indem ihre Indizes mit dem Moduloperator ermittelt werden. Die Füllzeile am Ende wird im Listenverständnis nicht aktualisiert (da der Bereich der Indizesr
berechnet wurde, bevor sie hinzugefügt wurdens
). Stattdessen eine neue Reihe von~
Zeichen werden hinzugefügt, nachdem das Verständnis abgeschlossen ist. Beachten Sie, dasss
nach dem ersten Durchlauf der Schleife eher eine Liste von Zeichen als eine Zeichenfolge angezeigt wird (da Python jedoch in Bezug auf Typen flexibel ist, können wir dennoch einen Index erstellen, um die Zeichen auf die gleiche Weise zu ermitteln).~
Zeichen aus der Polsterung) umgeben ist, durch ersetzt.
. Als nächstes werden alle Zeichen zu einer einzigen Zeichenfolge zusammengefügt. Schließlich werden die~
Füllzeichen wieder in Zeilenumbrüche umgewandelt und die Zeichenfolge gedruckt.quelle
r=range
Element innerhalb des Funktionskörpers befinden, um als Teil einer aufrufbaren Prozedur betrachtet zu werden, aber Sie können Zeichen durch Schreiben speichernr=range;s=[l.replace
. Sie können auch mehr Zeichen ausdrücken, indem Sie schreibenif"~"==s[y][x]else
undif"~"==s[y][x]else
für insgesamt 422. (Übrigens lief dies für mich mit Python 2.7)r=range
am Ende der ersten Zeile der Funktion (wo ich andere Variablen eingerichtet habe) ein paar Leerzeichen entfernt, die ich zuvor verpasst hatte. Ich bin mir nicht sicher, ob ich beide habe, auf die Sie sich bezogen haben, da Sie anscheinend dasselbe zweimal erwähnt haben. Und in Python 2.7 können zwei weitere Zeichen kürzer sein, da Sie die Klammern danach nicht benötigenprint
(normalerweise speichert dies nur 1 Zeichen,print"\n".join(...)
funktioniert aber ).s[y][x]for
(ein Leerzeichen entfernen), aber Sie scheinen es trotzdem gefunden zu haben.Python,
229226 ZeichenFüllt sich eine Flut, um das Ergebnis zu berechnen? Das Nachziehen
for
/zip
Kombinieren erzeugt ein Arrayx
für jede Zelle, die den Wert in dieser Zelle und ihren vier Nachbarn enthält. Dann verwenden wir den Trick von Blckknght undmin
eine Reihe von Möglichkeiten für jede Zelle. Dies sind die ursprünglichen Zellenwerte, etwaige Nachbarn, wenn die Zelle noch nicht besucht wurde, oder a,.
wenn sie besucht wurden und alle Nachbarn.
der Zelle selbst entsprechen oder gleich sind .quelle
return s
zuprint s
. Kann auch nichty!=b
geändert werdeny>b
? Das würde 226 Zeichen ergeben, denke ich.Hier ist es. Dies ist mein erstes F # -Programm. Wenn ich ein Feature der Sprache verpasst habe, benachrichtigen Sie mich bitte, da ich noch lerne.
Hier ist meine Beispieleingabe
Hier ist die Ausgabe
Hier ist der Code. Genießen.
Jetzt müssen wir diese Daten in ein Array mit doppelter Dimension konvertieren, damit wir über Indexer darauf zugreifen können.
Lassen Sie uns eine Matrix erstellen, die den Besitz jeder Zelle darstellt
Lassen Sie uns eine nützliche Methode haben, um zu sehen, was passiert ist.
Erstellen wir einen Datensatz, der angibt, wo sich ein bestimmter Großbuchstabe befindet.
Jetzt wollen wir alle Großbuchstaben finden.
Während wir uns bewegen, brauchen wir ein Konzept der Richtung.
Während wir uns fortbewegen, müssen wir über die Größe Bescheid wissen. Dies hilft uns zu überwachen, ob wir uns außerhalb der Grenzen bewegen.
Aktives Muster: Entspricht den Kriterien einer bestimmten Zelle.
Jetzt kommen wir zur Messingsteuer. Das beansprucht die Zelle!
Beanspruchen Sie diese Zelle unter Verwendung des aktiven Musters, wenn sie nicht beansprucht wird, und geben Sie die Koordinaten der benachbarten Zellen zurück.
Wir fangen an, Listen dieser Datentasche zu erstellen. Lassen Sie uns einen Typ erstellen, um die Dinge klarer zu machen.
Wenn eine Liste mit Kriterien zum Beanspruchen von Zellen gegeben ist, werden wir die Liste durchlaufen, um die nächsten zu beanspruchenden Zellen zurückzugeben und in diese Liste zurückzukehren.
Erstellen Sie für jedes Kapital ein Anspruchskriterium für jede Richtung und beanspruchen Sie diese Zellen dann rekursiv.
Jedes Programm braucht eine Hauptleitung.
quelle