पार्सन्स कोड की परिकल्पना करें


22

परिचय

पार्सन्स कोड का वर्णन करने के लिए सिर्फ एक सरल तरीका है पिच रूपों , संगीत का एक टुकड़ा में एक नोट में अधिक है कि क्या है या पिछले बजट से कम।

यहां तक ​​कि अगर आप याद रखने वाली धुनों को चूसते हैं, तब भी आप बहुत याद रख सकते हैं कि क्या कोई नोट ऊपर या नीचे जाता है, इस प्रकार पार्सन्स कोड आपको एक खोज इंजन का उपयोग करके संगीत की पहचान करने में मदद कर सकता है।


विवरण

प्रत्येक भिन्नता को एक एकल वर्ण द्वारा दर्शाया जाता है, जो निम्नलिखित में से एक है:

  • Rयदि नोट पिछले एक से समान है ( " आर एपेट" के लिए खड़ा है )
  • Uयदि नोट पिछले एक से अधिक है ( " यू पी" के लिए खड़ा है )
  • Dयदि नोट पिछले एक से कम है ( " डी खुद के लिए खड़ा है " )

प्रारंभिक नोट के रूप में लिखा है *


उदाहरण

यहाँ पार्सन्स कोड ( "ओड टू जॉय" की शुरुआत ) का एक उदाहरण है :

*RUURDDDDRUURDR

आप वास्तव में इसकी कल्पना कर सकते हैं , जैसे:

      *-*                    
     /   \                   
    *     *                  
   /       \                 
*-*         *         *-*    
             \       /   \   
              *     *     *-*
               \   /         
                *-*          

हम अब से एक समोच्च कॉल करेंगे ।

ऐसे उदाहरणों को चित्रित करने के नियमों को उपरोक्त उदाहरण द्वारा स्व-समझाया गया है।



चुनौती

अब आती है असली चुनौती।

एक प्रोग्राम लिखें, जो इनपुट के रूप में एक समोच्च दिया जाता है, अपने संबंधित पार्सन्स कोड को आउटपुट करता है।

आपको समोच्च खींचने के लिए नहीं कहा जाता है, लेकिन वास्तव में विपरीत है।
समोच्च से, मूल पार्सन्स कोड ढूंढें।


नियम

  • कोड गोल्फिंग के लिए सामान्य नियम लागू होते हैं
  • बाइट्स जीत की संख्या में सबसे छोटा कार्यक्रम
  • इनपुट एक समोच्च है, और आउटपुट एक वैध पार्सन्स कोड होगा
  • इनपुट के लिए अतिरिक्त व्हाट्सएप के बारे में विवरण अप्रासंगिक हैं, आपके लिए सबसे अच्छा काम करता है
  • आपको पिछले नियम के अनुसार हार्डकोड, एक तरह से या किसी अन्य, आउटपुट के हिस्सों और / या प्रोग्राम का उपयोग करने की अनुमति नहीं है।

टिप्पणियाँ



तो यह शुरू करना चाहिए *जो कुछ भी नहीं करता है?
निकेल

क्या मतलब? इनपुट कब है *? नहीं। यह *मुझे लगता है मुद्रित करना चाहिए । मैं इस कोने के मामले को जोड़ दूंगा।
हेल ​​वॉन कोच

1
@nicael हाँ, इसके साथ शुरू होना चाहिए* । हमेशा।
हेल्ज वॉन कोच

जवाबों:


4

पायथ - 28 25 27 25 बाइट्स

@Jakube की बदौलत 2 बाय बच गए।

s+\*@L"RDU"-VFtBxR\*%2C.z

इसे यहाँ ऑनलाइन आज़माएँ


1
यह *इनपुट के रूप में काम नहीं करता है । आउटपुट है *0जबकि यह सिर्फ होना चाहिए *। एक दुष्ट जंगली अनुगामी शून्य दिखाई दिया।
हेल ​​वॉन कोच

@ हेल्गेवोनकॉच तय
माल्टीसेन

@ जाकुब धन्यवाद!
माल्टसेन

आपने अदला U- बदली Dकी है। अन्यथा, अच्छी तरह से किया।
हेलज वॉन कोच

@ हेल्गेवोनकॉच उफ़
मैलेसेन

24

सीजेएम, 21 बाइट्स

qN/:.e>(o2%:i"DRXU"f=

एक चरित्र-वार अधिकतम ऑपरेशन :द्वारा वेक्टरिंग ( .) लाइनों को मोड़ो e>। चूंकि प्रत्येक कॉलम में केवल एक गैर-स्थान वर्ण होता है, इसलिए यह एक परिणाम होगा, क्योंकि अंतरिक्ष में सभी मुद्रण योग्य गैर-अंतरिक्ष वर्णों की तुलना में एक छोटा ASCII कोड होता है।

पहले तारांकन को प्रिंट करें और प्रिंट करें (o, फिर मॉड्यूलर अनुक्रमण का उपयोग 2%करने के लिए हर दूसरे ( ) शेष चार्ट को मैप करें UDR

पुराना घोल (29 बाइट)

'*qN/z2%'*f#0+2ew);::-"RDU"f=

qN/इनपुट लाइनें मिलती हैं। zइस चरित्र मैट्रिक्स को स्थानांतरित करता है। 2%हर विषम पंक्ति को गिराता है। '*f#प्रत्येक पंक्ति में तारांकन चिह्न को ढूँढता है। 0+2ew);सूचकांकों के सभी क्रमिक जोड़े प्राप्त करता है। ::-अपने मतभेदों गणना करता है, और "RDU"f=पत्र के लिए उन्हें नक्शे (मॉड्यूलर अनुक्रमण द्वारा: 0 → R, 2 → U, -2 ≡ 1 → D)। प्रमुख '*तारांकन पूर्व निर्धारित करता है।

संपादित करें : मैं सीजेएम के आसपास काम 2ewकरने के 0+2ew);लिए बदल गया, ewजो कि बहुत कम हैं सूचियों पर नहीं (लगातार स्लाइस) संभालना । यह इनपुट स्ट्रिंग के लिए कोड का काम करता है *

इसे यहां आज़माएं , या इसे कार्रवाई में देखें:

              

7
यह वास्तव में देखने के लिए बहुत बढ़िया है।
जिल शाह

2
मैं सहमत हूँ! कोड के लिए +1, काश मैं GIF के लिए +10 कर सकता।
ETHproductions

BTW, मुझे कोड लंबाई 17 में स्माइली पसंद है:-p
ETHproductions

1
मैं सहमत हूं, यह देखने के लिए बहुत बढ़िया है। हालांकि यह *इनपुट के रूप में काम नहीं करता है । मुझे RuntimeExceptionइसके बदले अच्छा मिलता है ।
हेल ​​वॉन कोच

ऊ, मैं समझता हूं कि सीजेएम बग: [X]2ewको []बाहर करने के बजाय वापस लौटना चाहिए । मैं एक वैकल्पिक हल जोड़ूंगा, हालांकि।
लिन

4

पायथन 3, 129 108 98 86 बाइट्स

संभवतः इसे गोल्फ करने के कई तरीके हैं, लेकिन मुझे पसंद है कि मुझे यह सब एक लाइन में मिला।

संपादित करें: अब उपयोग कर रहा है''.translate()

संपादित करें: wnnmaw के लिए बहुत धन्यवाद के साथ ।

संपादित करें: मैंने बाइट्स को बचाने के लिए इनपुट फॉर्मेट को एक नई लाइन से अलग स्ट्रिंग के बजाय स्ट्रिंग्स की एक सरणी में बदल दिया। इसके अलावा, अंतिम संपादन में, मैं मिलाया Uऔर R, इसलिए मैंने तय किया।

lambda a:'*'+"".join(('UR'[j<'/']+'D')[j>'/']for l in zip(*a)for j in l if j in'-/\\')

इनपुट स्ट्रिंग्स की एक सरणी होनी चाहिए। ऊपर के उदाहरण के लिए, यह कुछ इस तरह दिखता है:

["      *-*                    ","     /   \                   ","    *     *                  ","   /       \                 ","*-*         *         *-*    ","             \       /   \   ","              *     *     *-*","               \   /         ","                *-*          "]

Ungolfed:

def f(a):
    s = ''
    for c in zip(*a):           # transpose
        for d in c:             # for each letter in column c
            if e in "-/\\":     # if that letter is either -,/,\
                if e < '/':     # if < '/' (same as if == '-')
                    s += "R"
                elif e > '/':   # if > '/' (same as if == '\')
                    s += "D"
                else:           # if == '/'
                    s += "U"
        return "*" + s          # in the code we ''.join() it all together
                                # in this ungolfing, we add to an empty string

मैं एक नया जवाब नहीं देना चाहता क्योंकि मैंने आपसे बहुत उधार लिया था, लेकिन lambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')105 बाइट्स में घड़ियाँ। मुख्य अंतर
wnnmaw

धन्यवाद @wnnmaw! मुझे लगता है कि मैं और भी नीचे गोल्फ कर सकता हूं!
शर्लक

फ्रंट में सशर्त पर अच्छा गोल्फ, वह सुपर चालाक है!
wnnmaw

आह शक्स। टिप के लिए धन्यवाद @wnnmaw
शर्लक

3

रूबी, 87 बाइट्स

इनपुट में अनुगामी रिक्त स्थान की आवश्यकता होती है ताकि सभी लाइनें समान लंबाई की हों।

$><<?*+$<.readlines.map(&:chars).transpose.join.gsub(/./,{?-=>:R,?/=>:U,?\\=>:D}).strip

4
निश्चित रूप से यह दुर्भावनापूर्ण कोड है, क्योंकि इसमें सम्‍मिलित है >:D
एलेक्स ए।

3

जाप, 38 बाइट्स 40 41 45 46 48

सहेजे गए 2 बाइट्स @ETHproductions के लिए धन्यवाद

'*+U·y £Yu ?"RUD"g1+(XrS c -47 g):P} q

यदि एक ट्रिम कमांड था, तो यह केवल 38 बाइट्स होगा; -; जब मैं गोल्फ कर रहा हूँ तो स्पष्टीकरण जोड़ दूंगा। यह :Pप्रोग्राम मजाकिया होने की कोशिश नहीं कर रहा है, यह वास्तव में उन पात्रों की अनदेखी करने वाला कार्यक्रम है जो महत्वपूर्ण नहीं हैं।

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


जब मैंने देखा कि एक चुनौती के लिए व्यावहारिक रूप से एक सरणी स्थानांतरण की आवश्यकता थी, और यह कि Do answered ने इसका उत्तर दिया, मुझे पता था कि यह Japt होना था।
ETHproductions

Btw, मैं पर एक ट्रिम समारोह में जोड़ देंगे xऔर स्थानांतरित और कम से घुमाने के कार्यों yऔरz
जोड़ूँगा और ट्रांसफ़र

आप इस तरह से दो बाइट्स बचा सकते हैं:Yu ?"RUD"g1+(XrS c -47 g):P
ETHproductions

@ETHproductions धन्यवाद, 40 बाइट्स के नीचे!
डाउनगेट

3

हास्केल, 89 बाइट्स

import Data.List
m '/'="U"
m '-'="R"
m '\\'="D"
m _=""
('*':).(>>=(>>=m)).transpose.lines

उपयोग उदाहरण:

*Main> ('*':).(>>=(>>=m)).transpose.lines $ "      *-*                    \n     /   \\                   \n    *     *                  \n   /       \\                 \n*-*         *         *-*    \n             \\       /   \\   \n              *     *     *-*\n               \\   /         \n                *-*          "
"*RUURDDDDRUURDR"

*Main> ('*':).(>>=(>>=m)).transpose.lines $ "*"
"*"

इनपुट को स्थानांतरित करें और अक्षर // -/ \को सिंगलटन स्ट्रिंग्स "U"/ "R"/ से बदलें "D"। अन्य सभी वर्णों को खाली तारों से बदल दिया जाता है "", जो बाद में सब कुछ समेट कर गायब हो जाते हैं। अंत में, तारांकन चिह्न को रोकें *


2

गणितज्ञ, 103 बाइट्स

"*"<>(Differences@Position[Thread@Characters@StringSplit[#,"
"],"*"][[;;,2]]/.{-2->"U",0->"R",2->"D"})&

बहुत कम, यह देखते हुए कि यह एक स्ट्रिंग-प्रसंस्करण चुनौती है।


2

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

एक अनाम फ़ंक्शन। यह इनपुट स्ट्रिंग चार को चार द्वारा स्कैन करता है, जिससे वर्तमान लाइन में स्थिति का पता लगाया जा सकता है। ऐसा करने से, यह एक उत्पादन सरणी subsituting बनाता है U D Rके लिए / \ -सही जगह पर

c=>[...c].map(c=>c>'*'?t[i++]=c>'/'?'D':c<'/'?'R':'U':c<' '?i=0:++i,t=['*'],i=0)&&t.join``

2

मतलाब, 62 बाइट्स

r=@(s)[85-(s<14)*3-(s>59)*17,''];@(p)r(sum(p(:,2:2:end)-32))

इसके लिए इनपुट आयताकार होना चाहिए (प्रत्येक पंक्ति में समान वर्ण)। उदाहरण के लिए

    ['      *-*                    ';    '     /   \                   ';    '    *     *                  ';    '   /       \                 ';    '*-*         *         *-*    ';    '             \       /   \   ';    '              *     *     *-*';    '               \   /         ';    '                *-*          '];

व्याख्या

sum(p(:,2:2:end)-32)        % exctract every second column, substract 32 (spaces->zeros) 
                            % and sum column wise (results in a vector of 3 different values)
[85-(s<14)*3-(s>59)*17,'']  % map each of the values to the corresponding value of the letter and convert back to characters
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.