Memperbesar peta

13

Tugas Anda adalah, diberi peta sebagai input, memperkecil atau memperkecil, tergantung pada skala. Perhatikan bahwa skala yang diberikan adalah skala yang digunakan untuk memperkecil , sehingga skala antara 0 dan 1 akan benar-benar diperbesar.

Misalnya, diberikan peta berikut (dibuat dengan buruk):

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

Dan faktor skala 2, Anda harus memisahkannya menjadi bagian 2x2:

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

Dan di setiap bagian menemukan karakter yang paling umum:

.__..
.....

Perhatikan bahwa ada bagian yang ambigu:

__
OO

Saya memilih untuk menggunakan _untuk bagian ini, tetapi menggunakan Oakan bisa diterima juga.

Jika, misalnya, Anda diberi faktor skala 4, Anda akan membaginya menjadi bagian 4x4, seperti:

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

Seperti yang Anda tahu, peta tidak masuk dengan sempurna ke bagian 4x4, tapi tidak apa-apa, karena kami hanya bisa menurunkan ukuran bagian di samping.

Juga, setiap kali kita perlu memotong peta kita, kita memotong di bagian bawah atau di sisi kanan.

Peta yang dihasilkan akan terlihat seperti ini:

...

Sungguh peta yang menarik!

Untuk faktor skala di bawah 1, seperti 0,5, prosesnya lebih sederhana karena kami memperbesarnya. Ambil peta ini:

./O\.
.\O/.

Zooming dengan skala 0,5:

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

Perhatikan bahwa setiap kali faktor zoom Anda kurang dari 1, berikut ini akan selalu benar: 1/(zoom factor) % 2 == 0. Ketika itu di atas 1, satu-satunya jaminan yang Anda miliki adalah bahwa itu akan menjadi nomor keseluruhan. Saat itu 1, peta harus tetap sama.

Contoh:

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

O


0.25
ABCD

AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD

1
My zoom
should
not change

My zoom
should
not change

Anda juga dapat menggunakan peta sebagai larik yang dipisahkan oleh baris.

Okx
sumber
2
Saya pikir Anda harus menunggu lagi di Sandbox.
Erik the Outgolfer
@ JonathonAllan Tidak, tidak, pada bagian itu ada lebih .dari O. Kami memotong di sisi kanan dan bawah.
Okx
Ah, dengan "kami memotong di bagian bawah atau di sisi kanan" maksud Anda bahwa bagian kiri atas peta selalu bagian kiri atas bagian?
Jonathan Allan
@ JonathanAllan Ya.
Okx
OK, kata "atau" itu menyesatkan :)
Jonathan Allan

Jawaban:

7

Mathematica, 105 byte

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

Inputnya adalah (skala, array karakter). Skala harus berupa bilangan bulat atau fraksi yang tepat.

Penjelasan

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

Jika input pertama kurang dari 1 ...

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

Ganti semua Strings pada input kedua menjadi array persegi, dengan panjang 1 / (input pertama)

ArrayFlatten[ ... ]

Ratakan hasilnya menjadi array 2D.

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

Jika input pertama tidak kurang dari 1 ...

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

Partisi (input kedua) menjadi partisi yang lebar / panjangnya paling banyak (input pertama).

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

Peta ke level 2 dan level 3 ...

First@*Commonest

Komposisi fungsi paling umum (menemukan elemen paling umum dalam daftar) dan pertama (ambil elemen pertama; kalau-kalau ada beberapa elemen paling umum).

JungHwan Min
sumber
2

Python, 191 182 180 byte

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))]

Panggilan _(map, scale_factor) , di mana peta adalah array garis, dan mengembalikan array garis.

Meskipun jawaban ini sudah dikalahkan, saya ingin menjelaskannya, karena tidak ada kasus khusus di mana faktor skala kurang dari satu.

Itu membuat holeh wmatriks, di mana h = ceiling(map height / scale factor), danw = ceiling(map width / scale factor) .

Untuk setiap indeks (x, y) dalam matriks, lakukan:

  • Ambil submatrix dari koordinat int(x * scale factor), int(y * scale factor)keceil((x + 1) * scale factor), ceil((y + 1) * scale factor) .
  • Masukkan karakter paling umum dalam submatrix itu di (x, y).

Cobalah online!

Coba uji kasus

Artyer
sumber