Haritada yakınlaştırma


13

Göreviniz, haritayı girdi olarak vermek, ölçeğe bağlı olarak haritayı uzaklaştırmak veya uzaklaştırmaktır. Verilen ölçeğin uzaklaştırma ölçeği olduğuna dikkat edin , böylece 0 ile 1 arasındaki bir ölçek gerçekten yakınlaşacaktır.

Örneğin, aşağıdaki (kötü yapılmış) harita verildiğinde:

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

Ölçek faktörü 2 ise, önce 2x2 bölümlerine ayırmalısınız:

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

Ve her bölümde en yaygın karakteri bulun:

.__..
.....

Belirsiz bir bölüm olduğunu unutmayın:

__
OO

_Bu bölüm için kullanmayı seçtim , ancak kullanmak Oda mükemmel bir şekilde kabul edilebilirdi.

Örneğin, size 4 ölçek faktörü verildiyse, 4x4 bölüme ayırırsınız, şöyle:

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

Anlayacağınız gibi, harita 4x4 bölümlere mükemmel uymuyor, ancak yandaki bölümün boyutunu azaltabileceğimiz için bu iyi.

Ayrıca, haritalarımızı kesmemiz gerektiğinde, alttan veya sağdan kesiyoruz.

Ortaya çıkan harita şöyle görünecektir:

...

Ne ilginç bir harita!

0,5 gibi 1'in altındaki ölçek faktörleri için işlem, yakınlaştırdığımız için daha basittir. Bu haritayı kullanın:

./O\.
.\O/.

0.5 ölçeğinde yakınlaştırma:

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

Yakınlaştırma faktörü az olduğunda Not olduğunu 1, şu her zaman doğru olacaktır: 1/(zoom factor) % 2 == 0. Yukarıda olduğunda 1, sahip olduğunuz tek garanti, bunun bir tam sayı olacağıdır. 1Harita olduğu zaman harita aynı kalmalıdır.

Örnekler:

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

O


0.25
ABCD

AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD

1
My zoom
should
not change

My zoom
should
not change

Haritayı yeni satırla ayrılmış bir dizi olarak da alabilirsiniz.


2
Sanırım Sandbox'ta biraz daha beklemeliydin.
Outgolfer Erik

@JonathonAllan Hayır olmazdı, bu bölümde daha .fazlası var O. Sağ ve alt tarafta kestik.
Okx

"Altta veya sağda kesiyoruz" derken haritanın sol üst kısmı her zaman bir bölümün sol üst kısmı mıdır?
Jonathan Allan

@JonathanAllan Evet.
Okx

Tamam, "veya" kelimesi yanıltıcı :)
Jonathan Allan

Yanıtlar:


7

Mathematica, 105 bayt

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

Girdi (ölçek, karakter dizisi). Ölçek bir tamsayı veya tam bir kesir olmalıdır.

açıklama

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

İlk giriş 1'den küçükse ...

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

İkinci girişteki tüm Dizeleri uzunluk 1 / (ilk giriş) olan bir kare diziye değiştirin

ArrayFlatten[ ... ]

Sonucu bir 2D diziye düzleştirin.

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

İlk giriş 1'den az değilse ...

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

(İkinci giriş), genişliği / uzunluğu en fazla olan bölümlere bölünür (ilk giriş).

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

Seviye 2 ve seviye 3 ile eşleştirin ...

First@*Commonest

Commonest fonksiyonunun bileşimi (bir listedeki en yaygın elemanı bulur) ve First (ilk elemanı alır; birden fazla ortak eleman olması durumunda).


2

Python, 191 182 180 bayt

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

Çağrı _(map, scale_factor), burada harita bir satır dizisidir ve bir satır dizisi döndürür.

Bu cevap zaten dövülmüş olsa da, ölçek faktörünün birden az olduğu özel bir durum olmadığı için açıklamak istiyorum.

Bu yapar hgöre wmatris, h = ceiling(map height / scale factor)ve w = ceiling(map width / scale factor).

Matristeki her dizin (x, y) için şunları yapın:

  • Koordinatlardan bir submatrix al int(x * scale factor), int(y * scale factor)için ceil((x + 1) * scale factor), ceil((y + 1) * scale factor).
  • Bu alt matristeki en yaygın karakteri (x, y) konumuna koyun.

Çevrimiçi deneyin!

Test senaryolarını deneyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.