एक ASCII कला के समापन बिंदुओं की गिनती


14

आपको एक प्रोग्राम या फ़ंक्शन लिखना चाहिए जो इनपुट और आउटपुट के रूप में एक ASCII कला का प्रतिनिधित्व करने वाला एक स्ट्रिंग प्राप्त करता है या इनपुट में समापन बिंदुओं की संख्या देता है।

इनपुट में अक्षर space - | +(क्रमशः 0, 2, 2 और 4 एंडपॉइंट के साथ) और लाइनब्रेक शामिल होंगे। उदाहरण के लिए:

-|++-
  +

दो आसन्न वर्ण जुड़े हुए हैं और इसलिए प्रत्येक निम्न मामलों में 1 समापन बिंदु खो देते हैं:

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

पहला उदाहरण है

2+2+2+2+1+
    3        = 12

अंतिम बिंदु।

इनपुट

  • इनपुट पात्रों अंतरिक्ष, से मिलकर एक स्ट्रिंग होगा -, |, +और न्यू लाइन।
  • इनपुट लंबाई 0 लंबाई हो सकती है और उपरोक्त विवरण से मेल खाने वाला कोई भी इनपुट मान्य है (रेगेक्स इनपुट में [ -+|\n]*)।
  • अनुगामी न्यूलाइन वैकल्पिक है।

उत्पादन

  • एक एकल गैर-नकारात्मक पूर्णांक, समापन बिंदुओं की संख्या।

उदाहरण

आउटपुट उनके इनपुट की अंतिम पंक्ति के बाद हैं।

+
4 

-|++-
  +
12 

+--+
|  |
+--+
8 

  |  |
  +--+-- |||
12 

--++
 |||--
10 

<empty input>
0 


|
|     
2 

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

 ----
30 

यह कोड गोल्फ है इसलिए सबसे छोटी प्रविष्टि जीतती है।

जवाबों:


11

घोंघे , २ ९

A
\+|\-)lr!\-|(\+|\|)n!\|}!\+

मैंने ,,टिप्पणी संस्करण बनाने के लिए लाइन टिप्पणियों को जोड़ा ।

A                    ,, Count all accepting paths
        \+ | \- )    ,, Literal '+' or '-'        
        lr           ,, Set direction to left or right
        !\-          ,, Assert next char is not '-'
    |                ,, Or...
        ( \+ | \| )  ,, Literal '+' or '|'
        n            ,, Turn 90 degrees right or left (from initial direction right)
        !\|          ,, Assert next char is not '|'
}                    ,, Group everything previous
!\+                  ,, Assert next char is not '+'

5

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

टेम्प्लेट स्ट्रिंग्स का उपयोग करते हुए, सभी नए अंक महत्वपूर्ण और गिने जाते हैं।

फ़ायरफ़ॉक्स में नीचे स्निपेट का परीक्षण करें। (क्रोम अभी भी समर्थन नहीं करता है ...)

f=s=>`
${s}
`.split`
`.map((r,y,s,v=c=>c>' '&c!='-',h=c=>c>' '&c<'|')=>[...r].map((c,x)=>t+=(v(c)?2-v(s[y-1][x])-v(s[y+1][x]):0)+(h(c)?2-h(r[x-1])-h(r[x+1]):0)),t=0)&&t

// Less golfed
u=s=>{
  s = ('\n' + s + '\n').split('\n'); // split in rows, adding a blank line at top and one at bottom
  t = 0; // init counter
  v = c => c>' ' & c!='-'; // function to check if a character has vertical end points
  h = c => c>' ' & c<'|'; // function to check if a character has horizontal end points
  s.forEach( (r,y) =>
    [...r].forEach( (c,x) => {
     if (v(c)) // if current character has vertical endpoints, check chars in previous and following row
        t += 2 - v(s[y-1][x]) - v(s[y+1][x]); 
     if (h(c))  // if current character has horizontal endpoints, check previous and following chars in row
        t += 2 - h(r[x-1]) - h(r[x+1]);
    })
  )  
  return t
}

//TEST
out=x=>O.innerHTML+=x+'\n'

;[
 [`+`,4]
,[`-|++-
  +`,12]
,[`+--+
|  |
+--+`,8]
,[`  |  |
  +--+-- |||`,12]
,[`--++
 |||--`,10]
,[``,0]
,[`
|
|`,2]
,[`
--
++--
 ++
   --+
  +++ || 

 ----`,30]
].forEach(t=>{ r=f(t[0]),k=t[1],out('Test '+(r==k?'OK':'Fail')+'\n'+t[0]+'\nResult:'+r+'\nCheck:'+k+'\n') })
<pre id=O></pre>


मुझे जो करने की आवश्यकता है वह पंक्तियों में विभाजित है, फिर शीर्ष पर एक खाली पंक्ति और नीचे एक खाली पंक्ति जोड़ें। आपका कोड बिल्कुल भी विभाजित नहीं है। आप ऐसा कर सकते हैं ["",...s.split("\n"),""]कि अब @ETHproductions
edc65

आह, ठीक है, उसके बारे में क्षमा करें।
ETHproductions

3

अजगर 2, 123

l=[]
i=p=t=0
for c in input():
 l+=0,;h=c in'-+';t+=h>p;p=h;v=c in'|+';t+=v>l[i];l[i]=v;i+=1
 if' '>c:l=l[:i];i=0
print t*2

एक पास की विधि। इनपुट के रूप में एक स्ट्रिंग के साथ लाइनब्रेक लेता है।

क्षैतिज के लिए, विचार क्षैतिज खंडों की संख्या की गणना करना है, जिनमें से प्रत्येक में दो समापन बिंदु हैं। जब भी कोई पात्र +-(बूलियन h) में से एक खंड शुरू होता है, लेकिन पिछले एक (बूलियन p) नहीं है।

ऊर्ध्वाधर के लिए, हम ट्रांसपोज़्ड इनपुट पर एक ही काम करना चाहते हैं, के रन को देखते हुए +|। दुर्भाग्य से, पायथन का प्रत्यारोपण वास्तव में क्लूनी है। इसके map(None,*s.split('\n'))साथ रिक्त स्थान को भरने के लिए कुछ की आवश्यकता होती है None, जिससे निपटने के लिए वे स्वयं भी होते हैं।

इसके बजाय, हम क्षैतिज रूप से पुनरावृत्ति करते हुए ऊर्ध्वाधर गणना करते हैं। हम इस बात की सूची रखते हैं lकि कौन से कॉलम इंडेक्स अभी भी "चल रहे हैं", यानी जहां उस कॉलम में पिछला चरित्र नीचे जोड़ता है। फिर, हम उसी तरह करते हैं जैसे क्षैतिज के साथ, नए शुरुआती ऊर्ध्वाधर खंडों की गिनती। जब हम एक नई लाइन मारते हैं, तो हम उस सूची को काटते हैं जहां हम हैं, चूंकि सभी खंड दाईं ओर टूट गए थे, और वर्तमान सूचकांक को रीसेट कर दिया 0


3

CJam, 66 62 61 बाइट्स

q_N/_z,S*f.e|zN*"-|++"2$fe=1b"|-"{'++:R:a@+2ew{aR2m*&},,-}/2*

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

विचार

हम एंडपॉइंट्स की गणना निम्नानुसार कर सकते हैं:

  1. इनपुट में -s, |s और +s की संख्या की गणना करें ।
  2. पिछले एक को 2 से गुणा करें और परिणाम जोड़ें।
  3. पंक्तियों में --s, -+s, +-s और ++s की संख्या गिनें ।
  4. ||एस की संख्या गिनें । कॉलम में |+एस, +|एस और ++एस।
  5. 2 से परिणाम से 3 और 4 से परिणाम घटाना।
  6. परिणाम को 5 से 2 से गुणा करें।

कोड

q        e# Read all input from STDIN.
_N/      e# Push a copy and split it at linefeeds.
_z,      e# Count the number of rows of the transposed array.
         e# This pushes the length of the longest row.
S*       e# Push a string of that many spaces.
f.e|     e# Perform vectorized logical OR with the rows.
         e# This pads all rows to the same length.
zN*      e# Transpose and join, separating by linefeeds.
"-|++"   e# Push that string.
2$       e# Copy the original input.
fe=      e# Count the occurrences of '-', '|', '+' and '+' in the input.
1b       e# Add the results.
"|-"{    e# For '|' and '-':
  '++    e#   Concatenate the char with '+'.
  :R     e#   Save the resulting string in R.
  :a     e#   Convert it into an array of singleton strings.
  @      e#   Rotate one of the two bottom-most strings on top of the stack.
         e#   This gets the transposed input for '|' and the original input for '-'.
  +      e#   Concatenate both arrays.
         e#   This pads the input with nonsense to a length of at least 2.
  2ew    e#   Push a overlapping slices of length 2.
  {      e#   Filter the slices; for each:
    a    e#     Wrap it in an array.
    R2m* e#     Push the second Cartesian power of R.
         e#     For '|', this pushes ["||" "|+" "+|" "++"].
    &    e#     Intersect.
  },     e#   If the intersection was non-empty, keep the slice.
  ,      e#   Count the kept slices.
  -      e#   Subtract the amount from the integer on the stack.
}/       e#
2*       e# Multiply the result by 2.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.