स्थलाकृतिक स्ट्रिंग्स


23

यहाँ कुछ उदाहरण इनपुट है, इसलिए मैं समझा सकता हूं कि समस्या क्या है:

((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))

पाठ की इस पंक्ति को कुछ पहाड़ों के स्थलाकृतिक मानचित्र के रूप में सोचें। कोष्ठक का प्रत्येक सेट ऊंचाई की एक इकाई को दर्शाता है।

यदि हम इसे किनारे से "देखते" हैं, ताकि हम पहाड़ों को लंबवत देखें, तो हम देखेंगे:

          4 5                cherries    woohoo  
  1 2  3       moo       lik          e
                      i

इन स्थलाकृतिक मानचित्रों में से एक को देखते हुए, मानचित्र का उत्पादन करते हैं, लेकिन ऊपर के आउटपुट की तरह, ऊर्ध्वाधर स्तर पर। नक्शे में अलग-अलग वस्तुओं को वर्णों की संख्या के साथ अगले आइटम पर ले जाएं। उदाहरण के लिए, आउटपुट के बीच 4 रिक्त स्थान हैं mooऔर i। इसी तरह, इनपुट के बीच 4 अक्षर हैं mooऔर i

कोड जो कम से कम वर्णों में ऐसा करता है वह जीत जाता है।


क्या यह मान लेना सुरक्षित है कि ऊंचाइयां हमेशा सकारात्मक रहेंगी? उदाहरण के लिए, ((1 2))))))))))3नकारात्मक हाइट निषिद्ध होने पर इनपुट अमान्य होना चाहिए।
क्रिस्चियन लुपस्कू

@ w0lf: हाँ, कोष्ठक हमेशा मेल खाते हैं।
भालू ५०५

जवाबों:


10

जम्मू, 87 79 72 70 67 57 56 वर्ण

'( ) 'charsub|.|:(+/\@('('&=-')'&=)(],~' '$~[)"0])1!:1[1

कीबोर्ड से इनपुट लेता है। उदाहरण:

   '( ) 'charsub|.|:(+/\@('('&=-')'&=)(],~' '$~[)"0])1!:1[1
((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))
          4 5                cherries    woohoo
  1 2  3       moo       lik          e
                      i

स्पष्टीकरण:

यह स्पष्टीकरण मेरे कार्यक्रम के पहले संस्करण पर आधारित है:

|.|:('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1

x=.1!:1[1कीबोर्ड से इनपुट लें और इसे xबाद के लिए डालें

(('('&([:+/=)-')'&([:+/=))\,.i.@#)स्ट्रिंग में सभी इंडोल की सूची बनाता है ( i.@#) और टाँके ( ,.) (('('&([:+/=)-')'&([:+/=))\क्रिया के परिणाम के साथ मिलकर ।

(('('&([:+/=)-')'&([:+/=))\इस क्रिया सभी स्ट्रिंग के उपसर्ग के लिए लागू किया जाता है (क्योंकि इनपुट पर helloयह लागू होगा करने के लिए h, he, hel, hell, और hello। यह एक है कांटा , जो खुला कोष्ठक की संख्या की गणना ('('&([:+/=)और उसके बाद करीब कोष्ठक की संख्या घटा देती है ')'&([:+/=)। यह मैं सूची प्रदान करती है स्ट्रिंग में इण्डोल और उस इंडेक्स के कैरेक्टर को आउटपुट में होना चाहिए। सिंपल इनपुट पर। यह मुझे निम्नलिखित जानकारी देता है।

   (('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
(one(two(three)))
1  0
1  1
1  2
1  3
2  4
2  5
2  6
2  7
3  8
3  9
3 10
3 11
3 12
3 13
2 14
1 15
0 16

((' '$~{.@]),[{~{:@])"1यह एक क्रिया है जो सूची मैं उत्पन्न करता है और इसका आउटपुट भी लेता है ('( ) 'charsub x)(जो सभी ब्रैकेट को स्थान के साथ बदलने के लिए एक स्ट्रिंग प्रतिस्थापन करता है x)। यह सूची के प्रत्येक आइटम की पूंछ लेता है {:@]और इसे चरित्र प्राप्त करने के लिए एक इंडेक्स के रूप में स्ट्रिंग में उपयोग करता है [{~{:@]। फिर यह ,सूची में प्रत्येक आइटम के प्रमुख द्वारा इंगित स्थानों की संख्या के साथ इसे उपसर्ग करता है (' '$~{.@])। पिछले उदाहरण पर यह मुझे देता है:

   ('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
(one(two(three)))

 o
 n
 e

  t
  w
  o

   t
   h
   r
   e
   e

मैं फिर सरणी को स्थानांतरित करता हूं |:और |.वांछित आउटपुट प्राप्त करने के लिए इसे उल्टा करता हूं ।


6

GolfScript 69

0:§;{.'()'?))3%(.§+:§' ':s*\@s\if\n}%n/.{,}%$)\;:μ;{.,μ\-s*\+}%zip n*

ऑनलाइन डेमो यहाँ

स्पष्टीकरण:

0:§;                # declare the variable §, representing the 
                    # current vertical level and initialize it at 0

{                   # iterate for each char in the string:

    .'()'?))3% (    # add on the stack the amount by which
                    # the current vertical level should be 
                    # adjusted:
                    #   * +1 if the character is '('
                    #   * -1 if the character is ')'
                    #   * 0 otherwise

    .§+:§           # adjust the value of §

    ' ':s*          # add as many spaces as § tells us
                    # and save the space in variable s

    \@s\if\         # return current char, if it's printable,
                    # or a space if it's '(' or ')'

    n               # add a newline char

}%

n/                  # split by newline char; now we have 
                    # an array of strings on the stack.
                    # Each string is a vertical line of the
                    # final output.

.{,}%$)\;:μ;        # Iterate through the strings and find the
                    # maximum length

{
    .,μ\-s*\+       # Add spaces at the end to make all the strings 
                    # the same length
}%

zip                 # Transpose the strings

n*                  # Join the transposed strings by newline characters

@ गैरेथ हां, हम दोनों करते हैं :)
क्रिस्टियन लुपस्कु

यह कैसे काम करता है एक स्पष्टीकरण जोड़ने के लिए परवाह है?
टिमवी

@ टिमिवी ने अपने उत्तर को संपादित करने के लिए एक स्पष्टीकरण शामिल किया है
क्रिस्टियान लुपस्कु

5

एपीएल (59)

⊖↑{⊃,/T\¨⍨⍵×P=0}¨R∘=¨(⍴T)∘⍴¨⍳⌈/R←1++\P←+/¨1 ¯1∘ר'()'∘=¨T←⍞

मैंने यह मान लिया है कि 'आधार' को प्रयोग करने योग्य बनाने की आवश्यकता है। (अर्थात(a(b))c(d) मान्य है)। यदि यह आवश्यक नहीं है तो दो पात्रों को बचाया जा सकता है।

स्पष्टीकरण:

  • T←⍞: T में इनपुट की एक लाइन स्टोर करें
  • '()'∘=¨T: टी में प्रत्येक चरित्र के लिए, देखें कि क्या यह उद्घाटन या समापन कोष्ठक है। यह बूलियन्स की सूची की एक सूची देता है।
  • 1 ¯1∘ר: इन सूचियों में से प्रत्येक में दूसरे तत्व को 1 से गुणा करें (इसलिए एक प्रारंभिक कोष्ठक 1 है, एक समापन 1 है और कोई अन्य वर्ण 0 है)।
  • +/¨: प्रत्येक आंतरिक सूची का योग लें। अब हमारे पास प्रत्येक वर्ण के लिए ∆y मान है।
  • P←: पी में स्टोर करें।
  • R←1++\P: प्रत्येक चरित्र के लिए ऊँचाई देते हुए, P का एक रनिंग टोटल लें। प्रत्येक वर्ण में एक जोड़ें ताकि कोष्ठक के बाहर वर्ण पहली पंक्ति में हों।
  • (⍴T)∘⍴¨⍳⌈/R: प्रत्येक संभावित y- मूल्य के लिए, T को तब तक एक सूची बनाते हैं, जब तक कि केवल उस मान से युक्त न हो। (यानी 1111 ..., 2222 ...., आदि)
  • R∘=¨: इस सूची के प्रत्येक तत्व के लिए, यह देखें कि क्या यह R के बराबर है (प्रत्येक स्तर के लिए, अब हमारे पास शून्य की सूची है और जो कि उस स्तर पर एक वर्ण दिखाई देनी चाहिए या नहीं)।
  • ⍵×P=0: इनमें से प्रत्येक सूची के लिए, इसे शून्य पर सेट करें यदि P उस स्थान पर शून्य नहीं है। यह गैर-शून्य डेल्टा-वाई के साथ वर्णों से छुटकारा पाता है, जिससे कोष्ठक से छुटकारा मिल जाता है।
  • ⊃,/T\¨⍨: प्रत्येक गहराई के लिए, टी वर्णों में से चुनें जो दिखाई देने चाहिए।
  • ⊖↑: एक मैट्रिक्स बनाएं और इसे राइट-साइड-अप करें।

आप किस एपीएल कार्यान्वयन का उपयोग कर रहे हैं? क्या ये मुफ्त में है?
फ़ूजएक्सएक्सएक्स

@FUZxxl मैं Dyalog APL का उपयोग कर रहा हूं, विंडोज संस्करण को मुफ्त में डाउनलोड किया जा सकता है।
मारिनस

5

Tcl, 50

puts \33\[9A[string map {( \33\[A ) \33\[B} $argv]

तरह का धोखा, लेकिन अच्छी तरह से ..

मैं लाइन अंतर प्राप्त करने के लिए एएससीआई एस्केप सीक्वेंस का उपयोग करता हूं, ^[[Aइसका मतलब है कि क्यूरर 1 लाइन को ऊपर ^[[Bले जाएं , मूव 1 लाइन को नीचे ले जाएं।


5

एपीएल, 41 चार्ट / बाइट्स *

{⊖⍉⊃(↑∘''¨-⌿+/¨p∘.=,\⍵),¨⍵/⍨1-2×⍵∊p←'()'}

एक ⎕IO←1और ⎕ML←3पर्यावरण के साथ, Dyalog पर परीक्षण किया गया । यह एक फ़ंक्शन है जो आवश्यक इनपुट लेता है और आउटपुट देता है। प्रश्न के शब्दों को देखते हुए, मेरा मानना ​​है कि यह स्वीकार्य है। यदि ऐसा नहीं है, तो यहां एक संस्करण है जो स्टड से पढ़ता है और स्टडआउट को लिखता है, 4 चार्ट के लिए और अधिक:

⍞←⊖⍉⊃(↑∘''¨-⌿+/¨'()'∘.=,\a),¨a/⍨1-2×'()'∊⍨a←⍞

स्पष्टीकरण :

{                                 p←'()'}  p is the string made of two parentheses
                                ⍵∊ ______  check which characters from ⍵ are parens
                            1-2× ________  -1 for every par., 1 for every other char
                         ⍵/⍨ ____________  replace () with spaces in the orig. string
    (                 ),¨ _______________  append every char to the following items
                   ,\⍵ _____________________  for every prefix of the original string
               p∘.= ________________________  check which chars are '(' and which ')'
            +/¨ ____________________________  sum: compute the number of '(' and ')'
          -⌿ _______________________________  subtract the no. of ')' from that of '('
     ↑∘''¨ _________________________________  generate as many spaces as that number
 ⊖⍉⊃ ____________________________________  make it into a table, transpose and flip

उदाहरण:

topo '((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))'
          4 5                cherries    woohoo   
  1 2  3       moo       lik          e           
                      i                           

 

topo 'a  (  b ( c(d)e ) f  )  g'
            d            
          c   e          
      b           f      
a                       g

* - APL को विरासत में कई तरह के सिंगल-बाइट चार्ट्स में सेव किया जा सकता है जो APL प्रतीकों को ऊपरी 128 बाइट्स में मैप करते हैं। इसलिए, गोल्फिंग के उद्देश्य के लिए, केवल ASCII वर्णों और APL प्रतीकों का उपयोग करने वाले प्रोग्राम को chars = बाइट्स के रूप में स्कोर किया जा सकता है।


मैं एपीएल चरित्र को यहां सेट कर रहा हूं और मुझे प्रतीक नहीं मिल रहा । यह ¨और ~पात्रों के संयोजन की तरह दिखता है ?
गारेथ

हाय @ गैरेथ नहीं, यह आईबीएम एपीएल 2 में नहीं था। आप इसे Dyalog (कमर्शियल, लेकिन उनकी वेबसाइट में दफनाने वाला एक nagware संस्करण पा सकते हैं , और यह गोल्फ के लिए अच्छा है; IMHO आज उपलब्ध सबसे अच्छा APL), Nars2000 (सबसे अच्छा ओपन सोर्स APL), GNU APL , और ngn's APL , के बीच अन्य शामिल हैं।
टोबिया

@ गैरेथ ग्राफ़िकल रूप से इसका संयोजन है ~और ¨, हालाँकि यह दोनों का एक अलग चरित्र है। यह एक ऑपरेटर है जिसे कम्यूट कहा जाता है । इसके dyadic रूप में यह dyadic समारोह यह पर लागू की गई के तर्कों flips: (5-2)=(2-⍨5)। एक मौद्रिक संचालक के रूप में यह एक विडंबनापूर्ण कार्य को विडंबना में बदल देता है, सही तर्क की नकल करता है (2*2)=(*⍨2):। यह ज्यादातर बड़े आकार के चारों ओर कोष्ठक लगाने और उनके चारों ओर अपनी आँखें कूदने के बिना, दाएं से बाएं से कार्यों की एक निर्बाध धारा लिखने के लिए उपयोग किया जाता है। गोल्फ में यह उपयोगी है क्योंकि 3*⍨1-2एक चार से कम है (1-2)*3:-)
टोबिया

2
तो यह ~J में बराबर है ।
गारेथ

3

जे, 56 वर्ण

'( ) 'charsub|.|:((,~#&' ')"0[:+/\1 _1 0{~'()'&i.)1!:1]1

एक और 56-वर्ण जे समाधान ... मैं (by1, )1 में अनुवाद करके और अन्य सभी वर्णों को 0 में गहराई से गिनता हूं , और फिर इस का रनिंग योग ले रहा हूं [: +/\ 1 _1 0 {~ '()'&i.:। बाकी काफी हद तक @ गैरेथ के समाधान के समान है।


2

अजगर, 161 वर्ण

S=raw_input()
R=range(len(S))
H=[S[:i].count('(')-S[:i].count(')')for i in R]+[0]
for h in range(max(H),0,-1):print''.join((' '+S[i])[H[i]==H[i+1]==h]for i in R)

2

अजगर, 130

a=[""]*9
l=8
i=0
for c in raw_input():o=l;l+=c==')';l-=c=='(';a[l]=a[l].ljust(i)+c*(o==l);i+=1
print"\n".join(filter(str.strip,a))

2

रूबी 1.9 (129)

स्टड से पढ़ता है।

l=0
$><<gets.split('').map{|c|x=[?(]*99;x[l+=c==?(?-1:c==?)?1:0]=c;x}.transpose.map(&:join).*(?\n).tr('()',' ').gsub(/^\s+\n/,'')

3
अच्छा! आपने रूबी हाइलाइटर में एक बग की खोज की :)
क्रिस्टियन लुपस्कु

मैंने परीक्षण किया है और SQL हाइलाइटिंग आपके प्रोग्राम के लिए बेहतर काम करता है।
क्रिस्टियन लुपस्कू

@ w0lf हा, आप सही कह रहे हैं। मैं बदल //करने के लिए ''जो चरित्र एक ही गिनती रखता है और हाइलाइटर में बग बचा जाता है।
पॉल प्रेस्टिज

2

सी, 132 पात्र

char*p,b[999];n;
main(m){for(p=gets(memset(b,32,999));*p;++p)*p-41?*p-40?p[n*99]=*p:++n>m?m=n:0:--n;
for(;m;puts(b+m--*99))p[m*99]=0;}

यह वर्णन निर्दिष्ट करने में विफल रहा कि प्रस्तुत करने के लिए कितना इनपुट स्वीकार करना पड़ता है, इसलिए मैं अपनी गोल्फ की जरूरतों के साथ सबसे अधिक संगत सीमा पर था (जबकि अभी भी दिए गए उदाहरण इनपुट के साथ काम कर रहा हूं)। मुझे लोगों को यह याद दिलाने के लिए यह अवसर लेने की अनुमति दें कि आपके चुनौती विवरणों में न्यूनतम अधिकतम निर्दिष्ट करने के लिए अक्सर एक अच्छा विचार है।

कोड में दो मुख्य लूप हैं। पहला लूप सभी गैर-कोष्ठक वर्णों को आउटपुट की उपयुक्त पंक्ति तक पहुँचाता है, और दूसरा लूप प्रत्येक पंक्ति को प्रिंट करता है।


1

सी, 149 चार्ट

#define S for(i=0;c=v[1][i++];)h+=a=c-'('?c-')'?0:-1:1,
c,i,h=0,m=0;main(int a,char**v){S m=h>m?h:m;for(;m;m--){S putchar(a||h-m?32:c);putchar(10);}}

उद्धृत arg, egaout के साथ चलाएं "((1 2) (3 (4 5) moo)) (i (इसी तरह (चेरी)) e (woohoo)))"



0

सी #, 229 बाइट्स

यदि ऊर्ध्वाधर ऊर्ध्वाधर स्थान पर कोई प्रतिबंध नहीं है, तो आप इसका उपयोग कर सकते हैं (स्पष्टता के लिए इंडेंट) ( छपाई से पहले पाए जाने वाले , फिर कर्सर को ऊपर और नीचे ले जाएं क्योंकि कोष्ठक पढ़े जाते हैं।

using C=System.Console;
class P{
    static void Main(string[]a){
        int l=a[0].Length,i=l;
        while(i>0)
            if(a[0][--i]=='(')C.CursorTop++;
        while(++i<l){
            char c=a[0][i];
            if(c=='('){
                c=' ';
                C.CursorTop--;
            }
            if(c==')'){
                c=' ';
                C.CursorTop++;
            }
            C.Write(c);
        }
    }
}

0

पॉवरशेल , 120 119 बाइट्स

(($h=($c=$args|% t*y)|%{($l+=(1,-1)[$_-40])})|sort)[-1]..0|%{$x=0;$y=$_
-join($c|%{"$_ "[$h[$x++]-ne$y-or$_-in40,41]})}

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

साइड इफेक्ट्स: चार्ट &और 'परिवर्तन के रूप में ऊंचाई (और) , लेकिन प्रदर्शित करता है। इसके परिणामों की तुलना करें:

&$f "((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))"
&$f "&&1 2'&3 &4 5' moo'' &i &lik&cherries'e &woohoo'''"

कम गोल्फ वाला:

$chars=$args|% toCharArray

$heights=$chars|%{
    $level+=(1,-1)[$_-40]       # 40 is ASCII for '(', 41 is ASCII for ')'
    $level
}

$maxHeight=($heights|sort)[-1]

$maxHeight..0|%{
    $x=0;$y=$_
    $line=$chars|%{
        "$_ "[$heights[$x++]-ne$y -or $_-in40,41]
    }
    -join($line)
}

-1

VB.net (एस एंड जी के लिए)

कोड का सबसे सुंदर नहीं है।

Module Q
 Sub Main(a As String())
  Dim t = a(0)
  Dim h = 0
  For Each m In (From G In (t.Select(Function(c)
                                     h += If(c = "(", 1, If(c = ")", -1, 0))
                                     Return h
                                   End Function).Select(Function(y, i) New With {.y = y, .i = i}))
             Group By G.y Into Group
             Order By   y Descending
            Select Group.ToDictionary(Function(x) x.i)
               ).Select(Function(d) New String(
                          t.Select(Function(c,i)If(d.ContainsKey(i),If(c="("c Or c=")"c," "c,c)," "c)).ToArray))
   Console.WriteLine(m)
  Next
 End Sub
End Module
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.