Heatmaps
Stellen Sie sich einen rechteckigen Raum vor, an dessen Decke eine Wärmebildkamera nach unten zeigt. In dem Raum gibt es eine Anzahl von Wärmequellen mit einer Intensität 1-9
, wobei die Hintergrundtemperatur ist 0
. Die Wärme wird von jeder Quelle abgegeben und fällt pro (nicht diagonaler) Stufe um eine Einheit ab. Zum Beispiel das 20x10
Zimmer
...........1........
....................
...8................
..5...............2.
....................
.1..................
................1...
.................65.
....................
............2.......
enthält 9 Wärmequellen und der von der Wärmekamera angezeigte Temperaturgradient ist
34565432100100000000
45676543210000000000
56787654321000000110
45676543210000001221
34565432100000012321
23454321000000123432
12343210000001234543
01232100000012345654
00121000000011234543
00010000000121123432
In grafischer Form könnte dies so aussehen:
Aus dem Gradienten können wir die Positionen und Intensitäten einiger, aber nicht aller Wärmequellen ableiten. Zum Beispiel 9
kann immer auf alle s geschlossen werden, da sie die maximale Temperatur haben, und 8
in diesem Fall auch, da sie ein lokales Maximum im Gradienten erzeugen. Der 2
nahe der rechten Grenze kann ebenfalls abgeleitet werden, auch wenn er kein lokales Maximum aufweist, da er keinen anderen 2
Nachbarn hat. Die 5
s hingegen werden nicht abgeleitet, da ihre Wärme genauso gut von den intensiveren Quellen in ihrer Nähe erzeugt werden kann. Es 0
ist bekannt, dass die s keine Wärmequellen enthalten, aber alle anderen Kacheln können möglicherweise eine enthalten. Bezeichnen wir die unsicheren Kacheln mit Bindestrichen-
, bestimmte Wärmequellen durch die entsprechenden Ziffern und bestimmte Leerstellen durch Zeiträume .
:
---------..1........
----------..........
---8-------......--.
----------......--2-
---------......-----
--------......------
-------......-------
.-----......-----6--
..---.......--------
...-.......-2-------
Ihre Aufgabe soll es sein, dieses abgeleitete Muster aus dem Temperaturgradienten zu erzeugen.
Regeln
Sie erhalten die Eingabe als Zeichenfolge, die entweder durch Zeilenumbrüche oder vertikale Pipes begrenzt wird |
, je nachdem, was bequemer ist, und die Ausgabe muss dieselbe Form haben. Möglicherweise befindet sich in der Eingabe und / oder Ausgabe ein nachgestelltes Trennzeichen, jedoch kein vorangestelltes. Die Größe der Eingabe kann variieren, aber die Breite und Höhe sind immer mindestens 4
. Beide Funktionen und vollständige Programme sind akzeptabel. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind verboten.
Zusätzliche Testfälle
Eingang:
898778765432100
787667654321100
677656543211210
678765432112321
567654321123210
Das sieht in grafischer Form so aus:
Ausgabe:
-9---8-------..
-------------..
--------------.
--8---------3--
-----------3--.
Eingang:
7898
8787
7676
6565
Ausgabe:
--9-
8---
----
----
Eingang:
00001
00000
00000
10000
Ausgabe:
....1
.....
.....
1....
Antworten:
CJam,
73 69 6255 BytesUPDATE : Neuer Algorithmus. Kürzere und mehr Verbesserungsmöglichkeiten
Wie es funktioniert
Die Logik ist ähnlich wie der folgende Algorithmus, aber hier überprüfe ich nicht alle 4 Nachbarn in einer einzelnen Iteration. Stattdessen benutze ich einen kleineren Ansatz, um alle Zeilen und Spalten in beide Richtungen zu durchlaufen. Hier sind die Schritte beteiligt:
.
oder-
.Hier ist ein Beispiel für eine kleine Eingabe:
Nach dem ersten Schritt:
Nach dem zweiten Schritt:
Nach der letzten Zuordnung zu einem einzelnen Zeichen erfolgt die endgültige Ausgabe:
Code Erklärung :
Probieren Sie es hier aus
Älterer Ansatz
Wie es funktioniert
Die Logik ist einfach, durchlaufen Sie das Raster und prüfen Sie, ob der aktuelle Wert größer oder gleich den verbleibenden vier Nachbarn ist - oben, unten, links und rechts. Transformieren Sie dann den aktuellen Wert basierend auf der obigen Regel, und geben Sie "." Ein, wenn der Wert gleich 0 ist. .
Code Erklärung
Probieren Sie es hier online aus
quelle
JavaScript (ES6) 99
Test In der Firefox / FireBug-Konsole
Ausgabe
quelle
Python 2: 154 Byte
Die Eingabe muss von der Form sein
"00001\n00000\n00000\n10000"
.Das Konvertieren eines Strings in eine 2D-Matrix ist in Python ziemlich langwierig. Also behalte ich das ursprüngliche String-Format. Ich zähle über die Eingabe auf,
i
ist der Index,v
ist das Zeichen (schließlich zähle gespeicherte Bytes in einer Golflösung auf !!). Für jedes Paar(i,v)
berechne ich das korrekte Zeichen der Ausgabe und verbinde sie. Wie wähle ich das richtige Ausgabezeichen aus? Wennv == '\n'
das Ausgabezeichen es ist\n
, dann ist esv == '0'
das Ausgabezeichen'.'
. Ansonsten teste ich die 4 Nachbarn vonv
, dieb[i-b.index('\n')-1]
(oben),b[i-1]
(links,b[i+1]
(rechts) undb[i+b.index('\n')+1]
( unten) sind,<= v
und wähle die Zeichen'-'
oderv
. Hier vergleiche ich Zeichen nicht mit den Zahlen, aber es funktioniert ganz gut, weil die ASCII-Werte in der richtigen Reihenfolge sind. Auch gibt es keine Probleme, wennb[i-1]
oderb[i+1]
gleich'\n'
, weilord('\n') = 10
.Pyth:
6158Mehr oder weniger eine Übersetzung des Python-Skripts. Ziemlich hässlich ;-)
Probieren Sie es online aus: Pyth Compiler / Executor Gleiches Eingabeformat wie die Python-Lösung.
quelle
Perl,
77, 75, 72,70Standard 2d Regex Matching Tricks.
Beispiel:
Probieren Sie es hier aus
quelle
Java,
307,304,303,299,298Dies ist mit Sicherheit eine "perfekte" Herausforderung für einige Java-Codegolf :)
Eingabe (Pipe '|' - Methode):
Ausgabe:
quelle
char[]r=a[0].replace("|", <--here"").toCharArray()
.APL, 92
Beispiel:
quelle
Ruby 140
Nichts Besonderes; iterieren Sie einfach durch die Karte und vergleichen Sie den aktuellen Wert mit dem Wert der vier Nachbarn.
Führen Sie es online mit Tests aus: http://ideone.com/AQkOSY
quelle
R 223
Über das Beste, was ich mir im Moment einfallen lassen kann. Der Umgang mit der Saite ist recht teuer. Ich denke, es gibt Raum für Verbesserungen, aber ich kann es im Moment nicht sehen
Testergebnis
quelle
J - 69 Bytes
Beispiele:
PS: Dies
(0 : 0)
ist die Standard-J-Methode zum Angeben von Zeichenfolgen. Sie können auch|
begrenzte Zeichenfolgen verwenden (mit einem abschließenden Zeichen|
).quelle
Excel VBA - 426
Es wird eine seltene Gelegenheit sein, dass VBA Codegolfspiele gewinnt, aber da es das ist, was ich am häufigsten benutze, macht es Spaß, damit herumzuspielen. Die erste Zeile ist ein Randfall, der dies länger machte, als es den Anschein hat, als müsste es sein.
Die Zählung enthält kein Leerzeichen für die Anfangszeile.
Ich habe mit der Idee herumgespielt, die Eingabe auf ein Blatt zu senden und von dort aus zu arbeiten, aber ich denke, dass das Schleifen der übergebenen Zeichenfolge Zeichen für Zeichen Code spart.
Anruf aus dem Sofortfenster:
Ausgabe (in einem Fenster):
quelle
Perl - 226
Sie können es auf ideone versuchen . Wenn jemand an einer Erklärung interessiert ist, lass es mich wissen.
quelle
Haskell - 193
f
ist eine Funktion, die eine Zeichenfolge in der Form annimmt0001\n0000\n0000\n1000
und die erforderliche Zeichenfolge zurückgibt.g
ist eine Funktion, die eine Liste von Listen von Zeichen aufnimmt und eine Liste von Listen von ((links, oben), dies (rechts, unten)) zurückgibt.quelle