एक ASCII भूलभुलैया रेंडर करें


18

देखो! यह एक ASCII भूलभुलैया है! सू कूलज़ोर्स, अमेजबॉल और सामान।

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

लेकिन, लेकिन, लेकिन ... यह एक दर्द है कि किस दिशा में भूलभुलैया के सभी हिस्से जा रहे हैं। मैं सिर्फ लेआउट खींचना चाहता हूं और भूलभुलैया समय के भार के बिना खुद को कोपर बना लेता हूं।

क्या होगा अगर मैं बस में यह आकर्षित कर सकता है ...

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

यह तो मीठा होगा!


नियम (क्योंकि नियम ठंडा है):

  • एक स्ट्रिंग को आस्की भूलभुलैया में बदलने और परिणाम को आउटपुट करने के लिए कोड लिखें।
  • किसी भी गैर-व्हाट्सएप चरित्र को दीवार के रूप में पढ़ा जाएगा।
  • दीवार का प्रत्येक चार्ट यह तय करेगा कि यह किस चरित्र पर आधारित है (केवल उत्तर, दक्षिण, पूर्व और पश्चिम दिशाओं में) पड़ोसी।
    • यदि किसी चार के पास कोई गैर-व्हाट्सएप पड़ोसी नहीं है, तो यह एक प्लस चिन्ह (+) होगा।
    • यदि एक चर के दोनों ऊर्ध्वाधर (उत्तर-दक्षिण) और क्षैतिज (पूर्व-पश्चिम) दिशाओं में पड़ोसी हैं, तो यह एक प्लस चिन्ह (+) होगा।
    • यदि एक चर के पास केवल एक ऊर्ध्वाधर (उत्तर-दक्षिण) दिशा में पड़ोसी हैं, तो यह एक पाइप प्रतीक (|) होगा।
    • यदि एक चर के पास केवल एक क्षैतिज (पूर्व-पश्चिम) दिशा में पड़ोसी हैं, तो यह एक ऋण चिह्न (-) होगा।
  • इनपुट एक स्ट्रिंग हो सकता है (न्यूलाइन वर्णों द्वारा अलग की गई लाइनों, या स्ट्रिंग्स की एक सरणी के साथ)।
  • सभी इनपुट वर्ण मुद्रण योग्य ASCII वर्ण होंगे, आपको विस्तारित चार्ट से निपटने की आवश्यकता नहीं है।
  • कृपया किसी भी पुरानी भाषा का प्रयोग करें।
  • यदि एक पंक्ति से पहले सफेद स्थान है, तो प्रत्येक पंक्ति पर समान राशि होनी चाहिए। आउटपुट की प्रत्येक पंक्ति के बाद कोई भी सफेद स्थान ठीक है।
  • इसे कम से कम बाइट्स के साथ हल करने का प्रयास करें।

परीक्षण के मामलों:

1: फ़्रेम

इनपुट:

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

आउटपुट:

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

2: क्लासिक भूलभुलैया

इनपुट:

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

आउटपुट:

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

3: हरे अंडे, आदमी।

इनपुट:

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!

आउटपुट:

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

4: प्रतीक

इनपुट:

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

आउटपुट:

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

1
ग्रीन अंडे और हैम की तीसरी पंक्ति के साथ समाप्त नहीं होना चाहिए ---?
LiefdeWen

1
मिश्रित पड़ोसियों के लिए परिणाम अभी भी अस्पष्ट हैं; यह सुनिश्चित नहीं है कि क्यों icicles किसी भी -s होगा या क्यों क्लासिक भूलभुलैया +नीचे पंक्ति पर चार s नहीं है ।
नील

1
क्या हमें रिक्त स्थान (यानी मैट्रिक्स) के साथ एक वर्ग गद्देदार के रूप में इनपुट लेने की अनुमति है? क्या आउटपुट को इसके आसपास अतिरिक्त व्हाट्सएप की अनुमति है? इसके अलावा, क्या आपको वास्तव में मतलब है smallest number of characters, बाइट्स नहीं?
द्विजिमा

1
मुझे लगता है कि 1) क्लासिक भूलभुलैया +में 1 पंक्ति के बीच में 2 !होना चाहिए ) आइकल्स की जगह को ए के साथ बदल दिया जाना चाहिए -। क्या आप कृपया इन लोगों की दोबारा जाँच कर सकते हैं?
अरनौलड

1
द्वारा whitespace, तुम सिर्फ अंतरिक्ष मतलब है? मुझे टैब का समर्थन नहीं करना है और आप शायद मुझे नईलाइन्स बदलना नहीं चाहते हैं
जो किंग

जवाबों:


11

एपीएल (डायलॉग यूनिकोड) , 57 35 बाइट्स एसबीसीएस

-22 ngn द्वारा एक उपन्यास समाधान के लिए धन्यवाद ।

अनाम टेसिट फ़ंक्शन तर्क के रूप में एक वर्ण मैट्रिक्स ले रहा है।

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

इसे ऑनलाइन आज़माएं!

{... }⌺3 3 प्रत्येक 3-बाय -3 पड़ोस पर, निम्नलिखित फ़ंक्शन लागू करें:

,⍵ उठाव (चपटा)

' '≠ बूलियन जहां गैर-स्थान

⍱∘⌽⍨ NOR यह उलटा है (incl। न तो शीर्ष NOR नीचे, और न ही NOR दाएँ)

5 4 2⊃¨⊂उस संपूर्ण सूची से 5 वें , 4 वें और 2 nd तत्व को चुनें
  अर्थात खाली स्व, कोई ऊर्ध्वाधर, कोई क्षैतिज नहीं

2⊥ बेस -2 (बाइनरी) में मूल्यांकन
  अर्थात base4: खाली स्व; 3: कोई पड़ोसी नहीं; 2: कोई क्षैतिज पड़ोसी नहीं; 1: कोई ऊर्ध्वाधर नहीं; 0: दोनों है

'+-|+'↓⍨ इस स्ट्रिंग से कई तत्वों को छोड़ दें
  अर्थात खाली स्व :; अकेले: +; ऊर्ध्वाधर पड़ोसी (ओं) को केवल |+:; क्षैतिज -|+:; दोनों:+-|+

 पहला तत्व चुनें (यदि उपलब्ध न हो तो अंतरिक्ष के साथ पैड)
  अर्थात खाली स्व :; अकेले: +; ऊर्ध्वाधर पड़ोसी (ओं) को केवल |:; क्षैतिज -:; दोनों:+


पुराना हल

अनाम टेसिट फ़ंक्शन तर्क के रूप में एक वर्ण मैट्रिक्स ले रहा है।

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

इसे ऑनलाइन आज़माएं!

{... }⌺3 3 प्रत्येक 3-बाय -3 पड़ोस पर, निम्नलिखित फ़ंक्शन लागू करें:

,⍵ उठाव (चपटा)

()/ निम्नलिखित मास्क का उपयोग करके फ़िल्टर करें:

  9⍴0 1 चक्रीय रूप [0,1]से 9 की लंबाई तक का चयन (एन, डब्ल्यू, ई, एस का चयन करता है)

' '≠ बूलियन जहां गैर-स्थान

1⌽ एक कदम छोड़ दिया; [W,E,S,N]

2 2⍴ 2-बाय -2 मैट्रिक्स के लिए नया आकार; [[W,E],[S,N]]

∨/ पंक्ति-वार या कमी: [horizontal,vertical]

() निम्नलिखित टैसिट फ़ंक्शन लागू करें:

   पहचान; [horizontal,vertical]

  ∧/, इसकी कमी और कमी से पहले; [both,horizontal,vertical]

(), निम्नलिखित को प्रस्तुत करें:

  ,⍵ ravel (समतल) पड़ोस

  5⊃ 5 वें तत्व को चुनें (स्वयं)

  ' '= यदि स्थान खाली है (तो बूलियन)

 अब हमारे पास है [empty,both,horizontal,vertical]

1⍳⍨ सबसे बाएं 1 का सूचकांक (5 देता है यदि कोई पड़ोसी बिल्कुल नहीं)

' +-|+'⊃⍨ प्रतीक लेने के लिए इसका उपयोग करें

   


6

जावास्क्रिप्ट (ईएस 6), 110 बाइट्स

I / O स्वरूप: स्ट्रिंग की सरणी।

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

इसे ऑनलाइन आज़माएं!

या इसके बजाय वर्णों के एक मैट्रिक्स का उपयोग करके 108 बाइट्स



5

MATLAB, 113 110 101 बाइट्स

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)

इनपुट को तार्किक में परिवर्तित करता है, क्षैतिज और ऊर्ध्वाधर में कनवल्शन लागू करता है और आउटपुट को संबंधित वर्ण बनाता है।

मुझे बताने के लिए @ एड्रियन द्वारा 3 बाइट्स बचाए गए कि आप पीपीसीजी: पी में आउटपुट रोक सकते हैं

9 बाइट कई @flawr टिप्पणियों के लिए धन्यवाद बचा लिया!



2

रेटिना 0.8.2 , 92 बाइट्स

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

इसे ऑनलाइन आज़माएं! आयताकार इनपुट की आवश्यकता है। लिंक में परीक्षण के मामले शामिल हैं। स्पष्टीकरण:

\S
0

सभी गैर-रिक्त स्थान को परिवर्तित करें 0

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

0एक 0ही कॉलम में तुरंत ऊपर या नीचे एक और के साथ सभी को देखें और उन्हें 1 में बदल दें। 1एस अब ऊर्ध्वाधर पड़ोसियों के साथ जगह हैं, जबकि 0एस में कोई ऊर्ध्वाधर पड़ोसी नहीं है।

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

बिना क्षैतिज पड़ोसियों वाले सभी अंकों के लिए देखें। 0रों, या तो कोई खड़ी पड़ोसियों होता है अतः वे बन +रों है, जबकि 1, रों खड़ी पड़ोसियों होता है अतः वे बन |रों।

T`d`-+

शेष अंकों में क्षैतिज पड़ोसी हैं। 1भी खड़ी पड़ोसियों है रहा है, तो वे बन +, रों जबकि 0एस केवल क्षैतिज पड़ोसियों है, तो वे बन -रों।


1

पायथन 3 , 336 बाइट्स

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)

इसे ऑनलाइन आज़माएं!

एज केस एरर से निपटने के लिए मुझे बहुत सारे कोड का इस्तेमाल करना पड़ा।


1

सी (जीसीसी) , 143 बाइट्स

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);}}

इसे ऑनलाइन आज़माएं!

फ़ंक्शन f, इन-स्ट्रिंग्स की जगह को व्यवस्थित करता है। सरणी के आसपास का क्षेत्र रिक्त स्थान (थोड़ा विवश) के साथ गद्देदार होना चाहिए। भले ही यह उन आवश्यकताओं को पूरा नहीं करता है जो अधिकांश समाधान उपयोग कर रहे हैं, यह नियमों के अनुरूप है यदि हम कहते हैं कि हम दो स्थानों के साथ एक नई रेखा का प्रतिनिधित्व करते हैं (और नए सिरे से समाप्त होने वाले तारों की सरणी लेते हैं)।

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 = '+';
                }
            }
        }
    }
}

यह सूचक अंकगणित की एक मजेदार चुनौती थी। सी-शैली सूचक पुनरावृत्ति का उपयोग करना क्षैतिज पड़ोसियों को प्राप्त करना आसान है, लेकिन ऊर्ध्वाधर वाले कठिन थे। सौभाग्य से y पॉइंटर अभी भी आस-पास है (जो कि z के प्रारंभिक मूल्य की ओर इशारा करता है) इसलिए मैं अपने सूचकांक को इससे निकाल सकता हूं और उसी तत्व को एक अलग पंक्ति में एक्सेस करने के लिए उपयोग कर सकता हूं। यह बहुत गलत लेखन लगा y[-1][z-*y]क्योंकि यह किसी भी उचित शैली के चेहरे पर उड़ता है!


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.