Vergrößern einer Karte

13

Ihre Aufgabe ist es, eine Karte als Eingabe zu erhalten und sie je nach Maßstab zu verkleinern oder zu vergrößern. Beachten Sie, dass der angegebene Maßstab der Maßstab ist, um den verkleinert werden soll , sodass ein Maßstab zwischen 0 und 1 tatsächlich vergrößert wird.

Zum Beispiel mit der folgenden (schlecht gemachten) Karte:

..____....
../OOO\...
..\OO/\...
..........

Und bei einem Skalierungsfaktor von 2 sollten Sie ihn zunächst in 2x2-Abschnitte unterteilen:

.. | __ | __ | .. | ..
.. | /O | OO | \. | ..
----------------------
.. | \O | O/ | \. | ..
.. | .. | .. | .. | ..

Und in jedem Abschnitt finden Sie den häufigsten Charakter:

.__..
.....

Beachten Sie, dass es einen mehrdeutigen Abschnitt gab:

__
OO

Ich habe mich _für diesen Abschnitt entschieden, aber die Verwendung Owäre auch vollkommen akzeptabel gewesen.

Wenn Sie zum Beispiel den Skalierungsfaktor 4 erhalten hätten, würden Sie ihn in 4x4-Abschnitte aufteilen, wie folgt:

..__ | __.. | ..
../O | OO\. | ..
..\O | O/\. | ..
.... | .... | ..

Wie Sie sehen können, passt die Karte nicht perfekt in 4x4-Abschnitte, aber das ist in Ordnung, da wir nur die Größe des Abschnitts an der Seite verringern können.

Außerdem schneiden wir, wenn wir unsere Karten abschneiden müssen, unten oder rechts ab.

Die resultierende Karte würde so aussehen:

...

Was für eine interessante Karte!

Bei Skalierungsfaktoren unter 1, z. B. 0,5, ist der Vorgang einfacher, da wir stattdessen zoomen. Nehmen Sie diese Karte:

./O\.
.\O/.

Zoomen mit einer Skala von 0,5:

..//OO\\..
..//OO\\..
..\\OO//..
..\\OO//..

Beachten Sie, dass , wenn Ihr Zoomfaktor kleiner als 1das Folgende immer wahr sein: 1/(zoom factor) % 2 == 0. Wenn es oben ist1 , ist die einzige Garantie, die Sie haben, dass es eine ganze Zahl sein wird. Wenn dies 1der Fall ist , sollte die Karte unverändert bleiben.

Beispiele:

4
/OO\
|OO|
|OO|
\OO/

O


0.25
ABCD

AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD

1
My zoom
should
not change

My zoom
should
not change

Sie können die Karte auch als durch Zeilenumbrüche getrenntes Array verwenden.

Okx
quelle
2
Ich denke, du hättest noch ein bisschen in der Sandbox warten sollen.
Erik der Outgolfer
@ JonathonAllan Nein, würde es nicht, in diesem Abschnitt gibt es mehr .als O. Wir schneiden rechts und unten ab.
Okx
Ah, mit "wir schneiden unten oder rechts ab" meinen Sie, dass die obere linke Ecke der Karte immer die obere linke Ecke eines Abschnitts ist?
Jonathan Allan
@ JonathanAllan Ja.
Ok,
OK, das Wort "oder" ist irreführend :)
Jonathan Allan

Antworten:

7

Mathematica, 105 Bytes

If[#<1,ArrayFlatten[#2/.n_String:>Table[n,1/#,1/#]],Map[First@*Commonest,#2~Partition~UpTo@{#,#},{2,3}]]&

Die Eingabe ist (Skala, Array von Zeichen). Die Skala muss eine Ganzzahl oder ein exakter Bruch sein.

Erläuterung

If[#<1, ..., ... ]

Wenn die erste Eingabe kleiner als 1 ist ...

#2/.n_String:>Table[n,1/#,1/#]

Ersetzen Sie alle Strings in der zweiten Eingabe in ein quadratisches Array mit der Länge 1 / (erste Eingabe).

ArrayFlatten[ ... ]

Reduzieren Sie das Ergebnis in ein 2D-Array.

If[#<1, ..., ... ]

Wenn die erste Eingabe nicht kleiner als 1 ist ...

#2~Partition~UpTo@{#,#}

Partitionieren Sie die (zweite Eingabe) in Partitionen, deren Breite / Länge maximal ist (erste Eingabe).

Map[ ..., ... ,{2,3}]

Karte auf Level 2 und Level 3 ...

First@*Commonest

Die Zusammensetzung der Commonest-Funktion (findet das häufigste Element in einer Liste) und First (nimm das erste Element; falls es mehrere häufigste Elemente gibt).

JungHwan min
quelle
2

Python, 191 182 180 Bytes

lambda m,s,j=''.join,i=int:[j((lambda p:max(p,key=p.count))(j(g[i(x*s):-i(~x*s//1)]for g in m[i(y*s):-i(~y*s//1)]))for x in range(-i(-len(m[0])//s)))for y in range(-i(-len(m)//s))]

Anruf _(map, scale_factor) , wobei map ein Array von Linien ist und ein Array von Linien zurückgibt.

Obwohl diese Antwort bereits geschlagen wurde, möchte ich sie erklären, da es keinen Sonderfall gibt, bei dem der Skalierungsfaktor kleiner als eins ist.

Es macht eine hdurch wMatrix, wo h = ceiling(map height / scale factor)undw = ceiling(map width / scale factor) .

Führen Sie für jeden Index (x, y) in der Matrix Folgendes aus:

  • Nehmen Sie eine Submatrix von den Koordinaten int(x * scale factor), int(y * scale factor)bis ceil((x + 1) * scale factor), ceil((y + 1) * scale factor).
  • Setzen Sie das häufigste Zeichen in diese Untermatrix bei (x, y).

Probieren Sie es online!

Probieren Sie Testfälle aus

Artyer
quelle