Yürüyen Kareler , bir örnek ızgaradan 2B izocontours'ları kurtarmak için kullanılan bilgisayar grafiklerinden bir algoritmadır (ayrıca bkz. Ağabeyi 3D ayarları için büyük küpü Yürüyen Küpleri ). Fikir, ızgaranın her hücresini bağımsız olarak işlemek ve köşedeki değerlere dayanarak o hücreden geçen konturları belirlemektir.
Bu işlemdeki ilk adım, köşelerin kontur değerinin üstünde veya altında olup olmadığına bağlı olarak hangi kenarların konturlarla bağlandığını belirlemektir. Basitlik için, değer boyunca konturları dikkate alacağız 0
, böylece köşelerin pozitif veya negatif olup olmadığıyla ilgileniyoruz. Ayırmak için durumlar var :24 = 16
Görüntü Kaynağı: Wikipedia
Beyaz ve siyahın tanımlanması burada gerçekten önemli değil, ama kesin olarak beyazın pozitif ve siyahın negatif olduğunu söylüyor. Köşelerden birinin tam olarak olduğu vakaları görmezden geleceğiz 0
.
Sele noktaları (5 ve 10 numaralı vakalar) biraz ekstra zorluk sağlar: sadece köşelere bakarak hangi diyagonallerin kullanılması gerektiği açık değildir. Bu, dört köşenin ortalamasını (yani merkez değerinin yaklaşık bir değerini) bularak ve konturları merkezin köşelerden ters işaretle ayıracağı şekilde köşegenler seçerek çözülebilir. Ortalama tam ise 0
, her iki durum da seçilebilir.
Normalde, bu 16 vaka basitçe bir arama tablosunda saklanır. Bu verimlilik için harika, ama elbette, kodun burada kısa olmasını tercih ederiz . Yani sizin göreviniz bu arama adımını gerçekleştirmek ve bir ASCII temsilini mümkün olduğunca az kodda yazdırmaktır.
Meydan okuma
Seçtiğiniz sabit bir sırayla dört köşenin (sıfır olmayan tamsayı) değerlerini alırsınız. Daha sonra konturların doğru düzenini oluşturmalı ve eyer noktası durumlarını doğru bir şekilde çözmelisiniz.
STDIN (veya en yakın alternatif), komut satırı bağımsız değişkeni veya işlev bağımsız değişkeni ile girdi alarak ve sonucu STDOUT (veya en yakın alternatif), işlev dönüş değeri veya işlev (çıkış) parametresi aracılığıyla çıktı alarak bir program veya işlev yazabilirsiniz.
Giriş herhangi bir uygun dize veya liste formatında alınabilir.
16 vaka, aşağıdaki 5x5 bloklardan biri kullanılarak ASCII sanatında temsil edilecektir:
o---o o---o o---o
| | | | | | |
| | |---| | | |
| | | | | | |
o---o o---o o---o
o---o o---o o---o o---o
|/ | | \| | | | |
| | | | | | | |
| | | | |\ | | /|
o---o o---o o---o o---o
o---o o---o
|/ | | \|
| | | |
| /| |\ |
o---o o---o
Öncü veya sondaki boşlukları yazdırmamalısınız, ancak tek bir isteğe bağlı yeni satır yazdırabilirsiniz.
Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır.
Test Durumları
Test durumları bu giriş sırası verilmiştir varsayalım Sol üstteki , sağ üst , sol alt , sağ alt . Test vakaları, yukarıda verilen 9 gösterimden her birine karşılık gelen 9 grupta sunulur (aynı sırayla, boş hücreden başlayarak, iki sele noktasıyla biter).
[1, 2, 1, 3]
[-9, -2, -2, -7]
[4, 5, -1, -2]
[-1, -2, 3, 4]
[7, -7, 7, -7]
[-5, 5, -5, 5]
[1, -6, -4, -1]
[-2, 3, 3, 4]
[-1, 6, -4, -1]
[2, -3, 3, 4]
[-1, -6, 4, -1]
[2, 3, -3, 4]
[-1, -6, -4, 1]
[2, 3, 3, -4]
[3, -8, -9, 2]
[-3, 8, 9, -2]
[8, -3, -2, 9]
[-8, 3, 2, -9]
Ayrıca, aşağıdaki test senaryoları eyer noktalarından herhangi birini döndürebilir (seçiminiz):
[1, -4, -2, 5]
[-1, 4, 2, -5]