ASCII labirenti oluşturma


18

bak! Bu bir ASCII labirenti! Soo coolzors, amazeballs ve diğer şeyler.

+-+-----+---+
| |     |   |
| |  ++   | |
| |  ++ +-+ |
|       |   |
+-------+ | |
|         | |
+---------+-+

Ama, ama, ama ... ... labirentin tüm bölümlerinin hangi yöne gittiđini bulmak acý. Sadece düzeni çizmek istiyorum ve labirent zaman dolmadan kendini sooper kul yapıyor.

Ya bunu çizebilirsem ...

#############
# #     #   #
# #  ##   # #
# #  ## ### #
#       #   #
######### # #
#         # #
#############

Bu çok tatlı olurdu!


Kurallar (Çünkü kurallar soğur):

  • Bir dizeyi bir ascii labirentine dönüştürmek ve sonucu çıkarmak için kod yazın.
  • Boşluk olmayan herhangi bir karakter duvar olarak okunur.
  • Her bir duvar, hangi karakterin komşularına dayanacağına karar verecektir (sadece Kuzey, Güney, Doğu ve Batı yönlerinde).
    • Bir karakterde boşluk olmayan komşular yoksa artı işareti (+) olur.
    • Bir karakterin hem dikey (Kuzey-Güney) hem de yatay (Doğu-Batı) yönlerde komşuları varsa, artı işareti (+) olacaktır.
    • Bir karakterin yalnızca dikey (Kuzey-Güney) yönde komşuları varsa, bir boru sembolü (|) olacaktır.
    • Bir karakterin sadece yatay (Doğu-Batı) yönde komşuları varsa, eksi işareti (-) olacaktır.
  • Girdi tek bir dize olabilir (satırlar yeni satır karakterleriyle ayrılmış olabilir veya bir dizgi dizisi).
  • Tüm giriş karakterleri yazdırılabilir ASCII karakterleri olacaktır, genişletilmiş karakter kümeleriyle uğraşmanıza gerek yoktur.
  • İstediğiniz eski dilleri kullanın.
  • Bir satırdan önce beyaz boşluk varsa, her satırda aynı miktarda olmalıdır. Her çıktı satırından sonraki beyaz boşluklar iyi.
  • En az sayıda bayt ile çözmeye çalışın.

Test senaryoları:

1: Çerçeve

Giriş:

##########
#        #
#        #
#        #
##########

Çıktı:

+--------+
|        |
|        |
|        |
+--------+

2: Klasik labirent

Giriş:

#################
        #       #
# ##### # ##### #
#   # # #     # #
# # # # ##### # #
#   # #       # # 
### # ####### # #
#   # #    #  # # 
# ### # ## # ##
#     # ##    #  
#################

Çıktı:

--------+-------+
        |       |
| --+-+ | ----+ |
|   | | |     | |
| + | | +---- | |
|   | |       | | 
+-- | +----+- | |
|   | |    |  | | 
| --+ | ++ | -+
|     | ++    |  
+-----+-++----+--

3: Yeşil yumurta, adamım.

Giriş:

I do not like green eggs and ham.
I do not like them, sam I am.
Would you like them here or there?
I would not like them anywhere!

Çıktı:

| ++ +++ ++++ +++++ +++- -++ ----
| ++ +++ ++++ +++++ +++ + +++
+-+++ +++ ++++ ++++ ++++ ++ +++---
| +++-+ +++ ++++ ++-+ +++++++++

4: Buz sarkıtları

Giriş:

Word Icicle!
Word Icicle 
Word  cicle 
 ord  cicle 
 ord   icle 
 ord   i le 
 or    i le 
 or    i l  
 or      l  
 or         
  r         

Çıktı:

++++ ++++++-
++++ ++++++ 
++++  +++++ 
 +++  +++++ 
 +++   ++++ 
 +++   | ++ 
 ++    | ++ 
 ++    | |  
 ++      |  
 ++         
  |         

1
Yeşil yumurta ve jambonun üçüncü satırı bitmemeli ---mi?
LiefdeWen

1
Karışık komşuların sonuçları hala belirsiz; buz sarkıtlarının neden herhangi bir -s'ye sahip olacağından veya klasik labirentin +alt satırda neden dört s olmadığından emin değilim .
Neil

1
girdiyi boşluklarla dolu bir kare (örneğin matris) olarak almamıza izin verilir mi? Çıktının çevresinde fazladan boşluk olmasına izin veriliyor mu? Ayrıca, smallest number of charactersbayt değil, gerçekten mi demek istiyorsun ?
dzaima

1
Bence 1) klasik labirent +1. sıranın ortasında a olmalı 2) !buz sarkıtları a ile değiştirilmelidir -. Bunları tekrar kontrol edebilir misiniz?
Arnauld

1
By whitespace, sadece sadece uzay demek? Sekmeleri desteklemek zorunda değilim ve muhtemelen yeni satırları dönüştürmemi de istemiyorsunuz
Jo King

Yanıtlar:


11

APL (Dyalog Unicode) , 57 35 bayt SBCS

–22 ngn'in yeni çözümü sayesinde .

Karakter matrisini argüman olarak alan anonim taktik fonksiyonu.

{⊃'+-|+'↓⍨25 4 2⊃¨⊂⍱∘⌽⍨' '≠,⍵}⌺3 3

Çevrimiçi deneyin!

{}⌺3 3 Her 3'e 3 mahallede aşağıdaki işlevi uygulayın:

,⍵ ravel (düzleştir)

' '≠ Boşluk olmayan Boolean

⍱∘⌽⍨ NOR terstir (ne üst NOR alt, ne sol NOR sağ dahil)

5 4 2⊃¨⊂5 almak th , 4 th ve 2 nd o bütün listeden eleman
  boş öz yani hiçbir dikey, hiçbir yatay

2⊥ baz-2'de (ikili) değerlendirme,
  yani ≥4: boş benlik; 3: komşu yok; 2: yatay komşu yok; 1: dikey değil; 0: her ikisine de sahiptir

'+-|+'↓⍨ bu dize birçok öğeyi bırakın
  yani boş self :; yalnız +:; yalnızca dikey komşu (lar) |+:; yatay -|+:; her ikisi de:+-|+

 ilk elemanı seçin (eğer mevcut değilse boşluklu ped)
  yani boş benlik :; yalnız +:; yalnızca dikey komşu (lar) |:; yatay -:; her ikisi de:+


Eski çözüm

Karakter matrisini argüman olarak alan anonim taktik fonksiyonu.

{' +-|+'⊃⍨1⍳⍨(' '=5⊃,⍵),(∧/,⊢)∨/2 21' '≠(90 1)/,⍵}⌺3 3

Çevrimiçi deneyin!

{}⌺3 3 Her 3'e 3 mahallede aşağıdaki işlevi uygulayın:

,⍵ ravel (düzleştir)

()/ Aşağıdaki maskeyi kullanarak filtreleyin:

  9⍴0 1[0,1]uzunluk 9'a göre  periyodik olarak yeniden şekillendirin (N, W, E, S'yi seçer)

' '≠ Boşluk olmayan Boolean

1⌽ bir adım sola döndürün; [W,E,S,N]

2 2⍴ 2'ye 2 matrisine yeniden şekillendirme; [[W,E],[S,N]]

∨/ satır bazında VEYA azaltma: [horizontal,vertical]

() Aşağıdaki tacit fonksiyonunu uygulayın:

   kimlik; [horizontal,vertical]

  ∧/, öncesinde VE azaltması; [both,horizontal,vertical]

(), Aşağıdakilerin başına:

  ,⍵ mahalleyi yağmalamak

  5⊃5. elemanı  seç (kendisi)

  ' '= Boşluk varsa Boole (boş)

 Şimdi elimizde [empty,both,horizontal,vertical]

1⍳⍨ en soldaki 1 endeksi (hiç komşu yoksa 5 verir)

' +-|+'⊃⍨ bunu sembol seçmek için kullan

   


6

JavaScript (ES6), 110 bayt

I / O formatı: karakter dizisi.

a=>a.map((s,y)=>s.replace(/\S/g,(_,x)=>'+|-+'[[-1,p=0,1,2].map(c=>p|=(a[y+c%2]||0)[x+~-c%2]>' '?c&1||2:0)|p]))

Çevrimiçi deneyin!

Veya bunun yerine bir karakter matrisi kullanarak 108 bayt .


6

Python 2 , 181168 bayt

-13 bayt için Leaky Nun'e teşekkürler

m=input()
f=lambda x,y:(['']+m+[''])[y+1][x:x+1]>' '
print[[(c<'!')*' 'or'+-|+'[f(x+1,y)|f(x-1,y)|2*f(x,y+1)|2*f(x,y-1)]for x,c in enumerate(r)]for y,r in enumerate(m)]

Çevrimiçi deneyin!


5

MATLAB, 113 110 101 bayt

function F(A)
B=A>32
c=[1 1 1]
f=@(c)conv2(B,c,'s')>1
h=f(c)
v=f(c')
char((13*h+92*v-94*(h&v)).*B+32)

Girdiyi mantıklı hale getirir, yatay ve dikeyde evrişim uygular ve ilgili karakterleri yapmak için çıktıları birleştirir.

@Adriaan tarafından PPCG'de çıktıyı tıkayabileceğinizi söylediği için 3 bayt: P

Çok sayıda @flawr yorumu sayesinde 9 bayt kurtarıldı!



2

Retina 0.8.2 , 92 bayt

\S
0
(?<=(.)*)0(?=(?>.*\n(?<-1>.)*)0)|0(?=(.)*)(?<=0(?>(?<-2>.)*\n.*))
1
T`d`+|`\b.\b
T`d`-+

Çevrimiçi deneyin! Dikdörtgen giriş gerektirir. Bağlantı, test senaryolarını içerir. Açıklama:

\S
0

Tüm boşluk olmayan alanları 0s olarak değiştirin.

(?<=(.)*)0(?=(?>.*\n(?<-1>.)*)0)|0(?=(.)*)(?<=0(?>(?<-2>.)*\n.*))
1

Aynı sütunda hemen üstünde veya altında bir 0başkası olan tüm harfleri arayın 0ve 1 olarak değiştirin. 1S artık dikey komşuları olan yerler, 0s ise dikey komşuları yok.

T`d`+|`\b.\b

Yatay komşuları olmayan tüm basamakları arayın. 0Onlar haline böylece ler, ya hiçbir dikey komşularımız var +ler ise, 1s dikey komşularımız var onlar haline yüzden, |s.

T`d`-+

Kalan basamakların yatay komşuları vardır. 1Onlar haline yüzden de, dikey komşularımız var s +ler ise, 0sadece s yatay komşularımız var onlar haline yüzden, -s.


1

Python 3 , 336 bayt

def g(s):
 h,j,s=' +|-+','',s.splitlines()
 s+=['']
 for n in range(len(s)):
  s[n]+=' '
  for i in range(len(s[n])-1):
   l,r,k=s[n][i-1],s[n][i+1],0
   try:u=s[n-1][i]
   except:u=' '
   try:d=s[n+1][i]
   except:d=' '
   if not s[n][i]==' ':
    k+=1
    if not u==d==' ':k+=1
    if not l==r==' ':k+=2
   j+=h[k]
  j+='\n'
 print(j)

Çevrimiçi deneyin!

Kenar vaka hataları ile başa çıkmak için kod bir sürü kullanmak zorunda kaldı.


1

C (gcc) , 143 bayt

char**y,*z,h,v;f(char**x){for(y=x;*y;++y)for(z=*y;*z;++z)if(*z-32){h=z[1]-32|z[-1]-32;v=y[1][z-*y]-32|y[-1][z-*y]-32;*z=h?v?43:45:(v?'|':43);}}

Çevrimiçi deneyin!

F işlevi yerinde bir dizi dizgiyi değiştirir. Dizinin etrafındaki alan boşluklarla doldurulmalıdır (biraz kısıtlı). Bu, çoğu çözümün kullandığı gereksinimleri tam olarak karşılamasa da, iki boşluklu yeni bir satır temsil ettiğimizi (ve yeni satırlarla biten dizeler dizisini aldığımızı) söylersek kurallara uymaktadır.

Ungolfed

f(char**x){
    char **y;
    for (y = x; *y; ++y) {
        char *z;
        for (z = *y; *z; ++z) {
            if (*z != ' ') {
                if (z[1] != ' ' || z[-1] != ' ') {
                    // Horizontal exists
                    if (y[1][z-*y] != ' ' || y[-1][z-*y] != ' ')
                        // Vertical exists
                        *z = '+';
                    else
                        *z = '-';
                } else {
                    // Horizontal doesn't exist
                    if (y[1][z-*y] != ' ' || y[-1][z-*y] != ' ')
                        // Vertical exists
                        *z = '|';
                    else
                        *z = '+';
                }
            }
        }
    }
}

Bu işaretçi aritmetiğinin eğlenceli bir mücadelesiydi. C tarzı işaretçi yinelemesini kullanarak yatay komşuları elde etmek kolaydır, ancak dikey olanlar daha zordur. Neyse ki y işaretçisi hala (ki ilk z değerini gösterir) bu yüzden benim dizin ondan çıkarmak ve farklı bir satırda aynı öğeye erişmek için kullanabilirsiniz. y[-1][z-*y]Herhangi bir makul stil karşısında uçar gibi yazma çok yanlış hissettim !


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.