Zindan Paletli


40

Giriş

  • Bir zindanın duvarlarını temsil eden bir ikili matris M
  • Oyuncunun zindandaki konumu (x,y) .
  • Yön d oyuncu şu anda karşı karşıya olduğu (0 = Kuzey, 1 = Doğu, 2 = Güney, 3 = Batı)

Çıktı

30x10 karakterlik bir ASCII sanatı olarak, oynatıcının görüş alanında bulunan duvarların sözde-3D temsili .

Aşağıda, muhtemel harita ve pusula ile birlikte, bunun askıya alınmasına yardımcı olacak birkaç olası çıkış çerçevesi bulunmaktadır (ancak haritayı ve pusulayı çizmek zorluğun bir parçası değildir).

animasyon

Şartname

Görüş alanı

Oyuncu vardır 13 den etiketlenmiş görüş kendi alanında, duvarları bir için M . Aşağıda, oyuncuya göre duvarların konumları (sarı renkte), tüm yönlerde bulunmaktadır.

Görüş alanı

Duvarları çizim

Duvarlar çıkarılabilecek gerekiyordu bir için M önceden çizilmiş herhangi bir bölümü daha yakın duvarlarla yazılabilir olduğunu göz önüne alındığında, tam olarak bu sırada. Elbette, nihai sonuç aynı olduğu sürece farklı şekilde uygulayabilirsiniz.

Bütün çıkış 7 farklı karakterler ile çizilir: " ", "'", ".", "|", "-", "_"ve":" .

Bu zorluğun gövdesindeki duvarların şekillerinin detaylandırılması onu çok uzun hale getireceğinden, bunun yerine aşağıdaki TIO bağlantısında verilmiştir:

Çevrimiçi deneyin!

Belirli bir duvarın parçası olmayan karakterler "?" bu şemalarda . Hiç çizilmemiş olan 'saydam' karakterler olarak değerlendirilmelidirler. Öte yandan, bir duvar içindeki tüm boşluklar 'katıdır' ve daha önce orada çizilmiş olabilecek diğer karakterlerin üzerine yazılmalıdır.

kurallar

Giriş hakkında

  • Sen sürebilir M , x , y ve d herhangi makul bir biçimde.
  • 0 dizinli veya 1 dizinli koordinatları kullanabilirsiniz.
  • Yol tarifleri için seçtiğiniz 4 farklı değer kullanabilirsiniz.
  • Matrisin en az 3x3 olması garanti edilir .
  • Kenarlarda her zaman etrafı saran duvarlar olacağını varsayabilirsiniz.
  • Oyuncunun boş bir kareye yerleştirilmesi garanti edilir.
  • Girişin geçerli olduğu garantilidir.

Çıktı hakkında

  • Duvarlar aynen anlatıldığı gibi çizilmelidir.
  • Bununla birlikte, çıktı formatı da esnektir: tekli dizge, dizge dizisi, karakter matrisi vb.
  • Lider ve takip eden boşluk, tutarlı olduğu sürece kabul edilebilir.

Bu .

Test durumları

Tüm test durumları aşağıdaki matrisi kullanıyor:

[ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
  [ 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 ],
  [ 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 ],
  [ 1, 0, 0, 0, 0, 0, 1, 1, 0, 1 ],
  [ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 ],
  [ 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 ],
  [ 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 ],
  [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ],
  [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ]

(0,0)

x=3, y=3, d=0
x=6, y=4, d=3
x=4, y=4, d=1
x=1, y=5, d=2
x=7, y=7, d=3
x=6, y=6, d=1
x=8, y=1, d=2
x=7, y=6, d=1

Beklenen çıktılar:

------------------------------    ------------------------------
 x=3, y=3, d=0:                    x=6, y=4, d=3:
------------------------------    ------------------------------
__                          __    '.                          .'
  |'.                    .'|        |                        |  
  |   '.--------------.'   |        |----.                   |  
  |    |              |    |        |    | '.--------.       |  
  |    |              |    |        |    |  |        |       |  
  |    |              |    |        |    |  |        |       |  
  |    |              |    |        |    | .'--------'       |  
  |   .'--------------'.   |        |----'                   |  
__|.'                    '.|__      |                        |  
                                  .'                          '.
------------------------------    ------------------------------
 x=4, y=4, d=1:                    x=1, y=5, d=2:
------------------------------    ------------------------------
                            .'    __ ________________________ .'
                           |        |                        |  
-------.              .----|        |                        |  
       | '.--------.' |    |        |                        |  
       |  |        |  |    |        |                        |  
       |  |        |  |    |        |                        |  
       | .'--------'. |    |        |                        |  
-------'              '----|        |                        |  
                           |      __|________________________|  
                            '.                                '.
------------------------------    ------------------------------
 x=7, y=7, d=3:                    x=6, y=6, d=1:
------------------------------    ------------------------------
'.                                '.                            
  |'.                               |'.                         
  |   '.                            |   '.                      
  |    | '.                 .-      |    |--.--------.--------.-
  |    |  |:               :|       |    |  |        |        | 
  |    |  |:               :|       |    |  |        |        | 
  |    | .'                 '-      |    |--'--------'--------'-
  |   .'                            |   .'                      
  |.'                               |.'                         
.'                                .'                            
------------------------------    ------------------------------
 x=8, y=1, d=2:                    x=7, y=6, d=1:
------------------------------    ------------------------------
'.                          __    '.                            
  |'.                    .'|        |                           
  |   '.              .'   |        |----.--------------.-------
  |    | '.        .' |    |        |    |              |       
  |    |  |:      :|  |    |        |    |              |       
  |    |  |:      :|  |    |        |    |              |       
  |    | .'        '. |    |        |    |              |       
  |   .'              '.   |        |----'--------------'-------
  |.'                    '.|__      |                           
.'                                .'                            

İlgili zorluk:

2013'teki bu zorluk yakından ilişkilidir. Ancak, farklı bir kazanma kriterine (kod zorluğu), çıktının daha gevşek bir belirtimine sahiptir ve etkileşimli G / Ç gerektirir.


Elbette blok grafikleri kullanmasına rağmen, bu bana 3D Canavar Labirenti'ni hatırlattı.
Neil

9
Zorlukların çok eğlenceli ve iyi yazılmış!
Oliver,

Minecraft'ta bir çözüm bekliyorum ...

Windows ekran koruyucusunu başka kimse hatırlıyor mu? 5 ya da 6 yaşımdayken çok eğlenceli bir oyun muydu ...
Magic Octopus Urn,

Yanıtlar:


10

Temiz ( Snappy ile ), 800 785 670 644 bayt

460 402 bayt kodu + 360 242 baytlık dize değişmez
(geçerli UTF-8 olmadığı için burada ve TIO'da kaçtı)

Burada değişmezin uzunluğunu doğrulayabilirsiniz .

import StdEnv,Data.List,Data.Maybe,Codec.Compression.Snappy,Text
@a b|b<'~'=b=a
$m x y d=map(@' ')(foldl(\a b=[@u v\\u<-a&v<-b])['~~'..][join['
']k\\Just(Just 1)<-[mapMaybe(\e=e!?(x+[u,v,~u,~v]!!d))(m!?(y+[~v,u,v,~u]!!d))\\u<-[-2,2,-1,1,0,-1,1,0,-1,1,0,-1,1]&v<-[3,3,3,3,3,2,2,2,1,1,1,0,0]]&k<-nub[q\\w<-split"#"(snappy_uncompress"\211\6\44\41\41\41\55\56\40\41\40\174\72\5\4\60\55\47\40\41\41\41\43\41\41\41\176\56\55\r\1\24\56\40\41\176\174\40\r\1\4\174\72\72\r\0\0\47\r\46\35\72\25\1\31\103\0\41\25\24\35\113\176\25\0\31\133\11\224\r\152\20\56\40\40\40\41\21\217\10\40\47\56\31\14\4\40\174\126\14\0\4\56\47\21\74\0\47\1\74\1\340\r\220\25\242\11\1\25\250\25\360\11\1\25\253\376\30\0\21\30\25\333\11\1\24\47\41\41\43\137\137\11\154\20\41\40\40\174\47\r\344\1\157\5\341\1\11\5\336\172\11\0\34\56\47\41\137\137\174\56\47\1\347\20\43\176\176\40\137\132\1\0\4\40\41\75\211\76\1\0\1\356\5\150\116\1\0\376\35\0\376\35\0\126\35\0\132\347\0\20\137\174\41\43\47\101\337\51\74\41\133\122\4\0\10\56\47\40"),q<-let l=[[c\\c<-:rpad s 30'~']\\s<-split"!"w]in[l,map reverse l]]])

Çevrimiçi deneyin!

Hızlı sıkıştırma bu durumda, hız odaklı olmasına rağmen oldukça iyi bir performans sergiliyor, çünkü dizede sıkıştırılan çok sayıda tek karakterli çalışma var.

Sıkıştırılmamış dize ( netlik için #değiştirilir \n):

!!!-. ! |:! |:!-' !!!
!!!~.--------. !~|        |:!~|        |:!~'--------' !!!
!!!~~~~~~~~~~.--------.!~~~~~~~~~~|        |!~~~~~~~~~~|        |!~~~~~~~~~~'--------'!!!
!!-------.   !       | '.!       |  |!       |  |!       | .'!-------'   !!
!!~~~~~~~.--------------.!~~~~~~~|              |!~~~~~~~|              |!~~~~~~~|              |!~~~~~~~|              |!~~~~~~~'--------------'!!
__      !  |'.   !  |   '.!  |    |!  |    |!  |    |!  |    |!  |   .'!__|.'   !
~~ ________________________ !~~|                        |!~~|                        |!~~|                        |!~~|                        |!~~|                        |!~~|                        |!~~|                        |!~~|________________________|!
'. !  |!  |!  |!  |!  |!  |!  |!  |!.' 

Bu, farklı ekran bileşenlerinin sol tarafındaki sürümlerini !yeni satırlar yerine kodlar ve ~bunun yerine ?daha sonra ~30 karaktere kadar sağa dolgulu olarak bulunurlar ve daha sonra kendilerine bir arama listesine eklenirler.

Kodun geri kalanı, yalnızca göz ardı edilen vakalarla göz ardı edilen koordinat aramasını işler.


5

Python 2 , 864 854 848 826 810 bayt

L=[zip(*[iter(w)]*30)for w in zip(*[iter("eJzdllESgyAMRL+5Rf7yRQ7AZbhIDl9BwTqzSVtHrbKffR0Mm13HEM5SFHIoadpNI3snDyaS6NCknhU+JfZOvq8kLoIBU1oEI+RTbiePGzBa3QM0rf78TGl17+CZr5ZrUXBN+ECfY1GvGKEqtDsSI4s6xTn5jgqyqNcTTnUjTQO2FAEqTC0ngCrtpywenX5le6or1SsGi9ZLBKt0HuXtVEeUNGdzG6EsRNmo2EzLxuBbqFH8njmfwnqGcl+VY+s5+5ezSYXVel4dxaRK/6F15SatK1frvm//y4aoT4Ckj6XWfY2cbvz2fLSCPiiVvR+3ZuerzDwPSqeSvgAP9woa".decode('base64').decode('zip'))]*300)]
E=enumerate
def f(m,x,y,d):
 D=eval(`[[' ']*30]*10`);w,h=len(m[0]),len(m);a=[m,zip(*m)[::-1]][d%2];x,y=[x,y,w+~x,h+~y,y,w+~x,h+~y,x][d::4];X=sum([[0]*(x<2)+list(l)[x-2+(x<2):x+3]for l in[l*2for l in[a,[l[::-1]for l in a[::-1]]][d/2]*2][y:y+4]],[])
 for d,w in zip(L,'sropqmklhfgca'):
  for j,l in E(d):
   for i,q in E(l):
    if q*X[ord(w)%32]>=' ':D[j][i]=q
 for l in D:print''.join(l)

Çevrimiçi deneyin!


4

Kömür , 500 332 bayt

F⁴≔⮌E§θ⁰⁺00⭆θ§μλθ≔E✂θ⊖ζ⁺⁶ζ¹✂ι⊖η⁺⁶η¹θFε≔⮌E§θ⁰⭆θ§μλθB³⁰χ F²«‖FΦ⪪⟦“ |0⟧P+N?⟧‹G”³¦⁰”{➙d⊟EX⍘k↧D({Vt⍘gRd◨ⅉ^δ#T;”³¦¹“ ¶↖+9G₂pF^c1e⌈¬;”³χω⁰χ”{➙∧⊟∧◨ηü∧↖z↨⁸\G'λI∧¡∕⪫θJoΣ³⊖I⊟ζ⊙”²¦⁰”{➙∧⊟∧◨ηü∨§·◧﹪d‹⟲ OzºκFⅉRï⎇”²¦⁷ω⁰χ”{➙∧⊟≔⊘⬤|↔3Zθ✂≔÷t⍘ε✂↨≔⧴×ld≕≡⌕m⟧6ψ=Z”⁰¦⁰”}∧80KυgCAêJm⟦↘/§‖Ck⮌C₂¡μ↗W”⁰¦²ω⁰χ”{⊟∨·◧¤∨¶⧴⬤2GL▷⁸ê5Gψ”⁰¦⁰⟧³I§⭆θ⭆³§μ⎇ι⊕ξ⁻⁵ξλ«J⁻⊟κײ⁹¬ι⊟κ⊟κ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Biraz sıkıcı bir yaklaşım, korkarım; Sıkıştırılmış dize değişmezleri çok sayıda yazdırma. Açıklama:

F⁴≔⮌E§θ⁰⁺00⭆θ§μλθ

Diziyi 0her iki tarafta iki ekstra s ile pedleyin.

≔E✂θ⊖ζ⁺⁶ζ¹✂ι⊖η⁺⁶η¹θ

Bir dilim 7x7 dizinin alt bölümüne verilen koordinatlara merkezli.

Fε≔⮌E§θ⁰⭆θ§μλθ

Diziyi verilen yöne uygun şekilde döndürün.

B³⁰χ 

(sondaki boşluğu not alın) Boş bir çizim yapın 30×10 Çıktı her zaman tutarlı bir boyutta olacak şekilde kutu .

F²«‖

Aralarında yansıtarak her yarısını ayrı ayrı çizin.

FΦ⪪⟦...⟧³I§⭆θ⭆³§μ⎇ι⁻⁵ξ⊕ξλ«

Bir dizi duvar tanımlayıcısı alın, topaklara bölün (dize, y koordinatı, x koordinatı), dizinin ilgili yarısında ilgili konumda duvarı olan parçalara filtre uygulayın ve duvarların üzerinden geçirin. Konum, diziden 12 duvar çıkarılarak ve bunları yığın dizinini kullanarak dizine yerleştirerek hesaplanır; bu, duvar öbek dizinini kullanarak doğrudan duvarı bulmaktan daha kolaydır.

J⁻⊟κײ⁹¬ι⊟κ⊟κ

Duvarın koordinatlarına atla ve yazdır. Ortadan X koordinatları yansıtan bu Not [0, 30)için (-30, 0]bir o tuval geçmesi kadar etkili sola 29 karakter kaydırılır.


1
Aslında, simetrinin hiçbir avantajını kullanmıyorum, her iki yarıyı da ayrı ayrı çizerek üçüncü bir kesim yapabilmeliyim.
Neil,

1
168 byte golf vuruşunda +1. Sanırım burada gördüğüm en büyük golf.
ElPedro

2

Ruby , 412 391 385 383 bayt

->a,x,y,d{b=Array.new(97){[" "]*10}
e=[-1,0,1,0]
14.times{|i|m=-i%3-1
w=[31,25,15,9][n=i>2?4-i/3:(m*=2;3)]
(a*3)[y+n*e[d]+m*c=e[d-3]][x+n*c-m*e[d]]&&[p=w*(m*2-1)/2,r=[12,7,4,3][n]*m*m.abs+m/3].min.upto([q=w*(m*2+1)/2,r].max){|j|t=" .'"*9
b[j+15]=(p<j&&j<q ?%w{-%2s- -%4s- _%7s_}[-n]%"":t[k=(j^j>>9)%(36/-~n)]+"   :|  |    |"[k%13]*(k/3*2)+t[-k]).center(10).chars}}
b[0,30].transpose}

Çevrimiçi deneyin!

Girdiyi bir truthy / falsy değerleri dizisi olarak alır (Not 0Ruby'de truthy'dir, ancak nilsahtedir).

Bir karakter dizisi çıkarır.

açıklama

Bloklar önden arkaya çekilerek mesafe nazalır ve yan yana pozisyon sol, sağ, ortada mdolaştırılır -1,1,0. En uzak satırdaki orta blok E aslında iki kere çizilir, çünkü hem A / B hem de C / D bloklarını kontrol etmemiz gerekir. n,mve dizi aramak diçin xve ydeğerleri değiştirmek için kullanılır a. Eğer xkapsama alanı dışında nilaralık hücresinin yetersiz için döndürülür ve hiçbir hata atılır, ama eğery kapsama alanı dışında nilsatır için iade edilecek ve hücrenin aramak çalıştığında Yakut bir tür hata verir. Bundan kaçınmak için dizi, arama yapmadan önce dikey yönde üçe katlanır. Bir truthy değeri bulunursa bir blok çizilir.

Çıktı, çıkışın bsütunlarını temsil eden 10 elemanlı bir dizi dizisine inşa edilir ve fonksiyonun sonunda 10 satıra aktarılır. Tüm blokların tam ön yüzü çizilir (görünüm alanında görünüp görünmemesine bakılmaksızın), aralık dışı hataları önlemek için dizide ek boşluk gerekir. Aralığı jgörünüm değerlerden olduğu -15için +14bir dizi elde diziye kaydederken bu 15 tarafından dengelenir, 0için 29. Çizilen her blok için üç değer hesaplanır: pve qsırasıyla ön duvarın sol ve sağ köşeleri riçin ve yan duvarın arkası için. jsırayla sütunları çizerek bu üç değerin minimumundan maksimumuna kadar yinelenir.

3 tür çizgi vardır: yatay -veya _dikey |veya dikey olarak :ve tekrarlayan " .'"desende çapraz . Burada p < j < qile kapatılmış boşluk içeren kolonlar -ya da _ön yüz oluşturmak için çekilir. jBu aralığın dışında kalan yerlerde , boşluk içeren sütunlar |veya kenarları ve / veya yan yüzü oluşturmak için :sembollerle kapatılmıştır t=" .'". Bu değişken tarafından yönetilmektedir k=jnerede jpozitif veya k=-j-1nerede jnegatiftir. Üst ve alt kapaklar arasındaki karakter sayısı k/3*2. Doğru burada uzak blokların dış kenarlarını işlemek için n=3,k modülo 9 alınması gerekir, ancak bu daha küçük değerler için yapılmamalıdırn. kbu nedenle modulo değerlendirilerek alınır .36/-~n ,-~nn+1

Ungolfed kod

->a,x,y,d{
  b=Array.new(97){[" "]*10}                                        #Set up array for output, allow space for plotting outside viewport
  e=[-1,0,1,0]                                                     #Direction offsets from player position
  14.times{|i|                                                     #Iterate through all blocks including block E twice 
    m=-i%3-1                                                       #Cycle -1,1,0 = left, right, centre
    n=i>2?4-i/3:(m*=2;3)                                           #Distance n=4-i/3. But if i/3==0 n=3 and double m for blocks A,B 
    w=[31,25,15,9][n]                                              #Width of front face of block
    r=[12,7,4,3][n]*m*m.abs+m/3                                    #Value of j for back edge of block. m/3 offsets by -1 when m negative 
    (a*3)[y+n*e[d]+m*c=e[d-3]][x+n*c-m*e[d]]&&(                    #If a block is present at the location then
      [p=w*(m*2-1)/2,r].min.upto([q=w*(m*2+1)/2,r].max){|j|        #Calculate left and right edges of front of block p,q and iterate
        t=" .'"*9                                                  #t=character constant for diagonal lines 
        k=(j^j>>9)%(36/-~n)                                        #k=j for positive j=distance from centre. For negative j, k=-1-j by XOR with j>>9=-1. If n=3 take modulo 9 for correct output of outer side of block. 
        b[j+15]=(p<j&&j<q ?%w{-%2s- -%4s- _%7s_}[-n]%"":           #If j between p&q, draw horizontal lines separated by 2,4 or 7 spaces depending on value of n
        t[k]+"   :|  |    |"[k%13]*(k/3*2)+t[-k]).center(10).chars #else draw space or vertical line capped by diagonal markers
      }
    )
  }
b[0,30].transpose}                                                 #Truncate values outside viewport, transpose, and return value.

Güzel cevap! Diyagonal olanlar da dahil olmak üzere tüm satırların programlı olarak oluşturulmasını seviyorum.
Arnauld,
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.