CUSRS - पूरी तरह से बेकार स्ट्रिंग रीफैक्टरिंग सिस्टम!


11

परिचय

मैं SBU (शॉर्ट लेकिन यूनिक) चुनौतियों का एक बहुत बड़ा प्रशंसक हूं जो हर समय PPCG पर फसल करता है। CUSRS एक प्रणाली है जिसे रिफ्लेक्टर स्ट्रिंग्स के लिए डिज़ाइन किया गया है, एक CUSRS फ़ंक्शन 2 पैरामीटर और आउटपुट 1 स्ट्रिंग लेता है।

चुनौती

निम्नलिखित करने के लिए एक प्रोग्राम, फ़ंक्शन, लैम्ब्डा या स्वीकार्य विकल्प का निर्माण करें:

यह देखते हुए String inputऔर String refactor(उदाहरण के रूप में), refactor inputका उपयोग कर refactorके रूप में इस प्रकार है:

refactorस्ट्रिंग के प्रारूप में होगा ((\+|\-)\w* *)+(regex), उदाहरण के लिए:

+Code -Golf -lf +al

प्रत्येक अनुभाग पर प्रदर्शन करने के लिए एक ताज़ा कार्रवाई है input। प्रत्येक प्रोग्राम में एक पॉइंटर भी होता है।

+ स्ट्रिंग में पॉइंटर्स वर्तमान स्थान पर यह (प्लस के बिना) प्रत्यय लगाएगा और फिर पॉइंटर को 0 पर रीसेट कर देगा।

प्रत्येक ऑपरेशन को inputस्ट्रिंग पर लागू किया जाना चाहिए और परिणाम वापस किया जाना चाहिए।

उदाहरण:

input:
Golf +Code //pointer location: 0

output:
CodeGolf //pointer location: 0

-जब तक यह प्रत्यय नहीं मिलता तब तक स्ट्रिंग के माध्यम से सूचक को बढ़ाएगा। प्रत्यय को स्ट्रिंग से हटा दिया जाएगा और सूचक को हटाए गए पाठ के बाईं ओर छोड़ दिया जाएगा। यदि कोई प्रत्यय नहीं मिला है, तो सूचक स्ट्रिंग के अंत में प्रगति करेगा और वहां छोड़ दिया जाएगा।

input:
Golf -lf //pointer location 0

output:
Go //pointer location 2

उदाहरण

input:
"Simple" "-impl +nip -e +er"

output:
"Sniper"

input:
"Function" "-F +Conj"

output:
"Conjunction"

input:
"Goal" "+Code -al +lf"

output:
"CodeGolf"

input:
"Chocolate" "Chocolate"

output:
"Chocolate" //Nothing happens...

input:
"Hello" "-lo+p        +Please" //Spaces are irrelevant

output:
"PleaseHelp"

input:
"Mississippi" "-s-s-i-ppi+ng" //Operations can be in any order

output:
"Missing"

input:
"abcb" "-c -b +d"

output:
"abd"

input:
"1+1=2" "-1+22-=2+=23"

outut:
"22+1=23"

उदाहरण कोड

उदाहरण जावा है, यह बिल्कुल भी गोल्फ नहीं है।

public static String refactor(String input, String swap) {
    int pointer = 0;
    String[] commands = swap.replace(" ", "").split("(?=[-+])");

    for (String s : commands) {
        if (s.startsWith("+")) {
            input = input.substring(0, pointer) + s.substring(1) + input.substring(pointer, input.length());
            pointer = 0;
        } else {
            if (s.startsWith("-")) {
                String remove = s.substring(1);
                for (int i = pointer; i < input.length(); i++) {
                    if (input.substring(i, i + remove.length() > input.length() ? input.length() : i + remove.length()).equals(remove)) {
                        pointer = i;
                        input = input.substring(0, i) + input.substring(i + remove.length(), input.length());
                        break;
                    }
                }
            }
        }
    }

    return input;
}

नियम

  • स्टैंडर्ड लोफॉल्स लागू होते हैं
  • सबसे छोटा कोड, बाइट्स में, जीतता है


के लिए आउटपुट क्या होना चाहिए aaa -a?
16

|aaपाइप पॉइंटर होने के साथ।
शॉन वाइल्ड

@Emigna प्रश्न में प्रश्न को देखते हुए, मेरा मानना ​​है कि मेरा कार्यान्वयन बहुत अलग होगा।
शॉन वाइल्ड

-यदि प्रत्यय नहीं मिला है तो क्या होगा ?
जर्बर्ग

जवाबों:


1

एपीएल, 91 90 बाइट्स

{s l←⍵0⋄s⊣{g←1↓⍵⋄'+'=⊃⍵:+s∘←(l↑s),g,l↓s⋄l∘←¯1+1⍳⍨g⍷s⋄+s∘←(l↑s),s↓⍨l+⍴g}¨{1↓¨⍵⊂⍨⍵=⊃⍵}' ',⍺}

यह स्ट्रिंग को इसके सही तर्क के रूप में लेता है, और कमांडों को इसके बाएं तर्क के रूप में, जैसे:

      '+Code -al +lf' {s l←⍵0⋄s⊣{g←1↓⍵⋄'+'=⊃⍵:+s∘←(l↑s),g,l↓s⋄l∘←¯1+1⍳⍨g⍷s⋄+s∘←(l↑s),s↓⍨l+⍴g}¨{1↓¨⍵⊂⍨⍵=⊃⍵}' ',⍺} 'Goal'
CodeGolf

1

गोल्फस्क्रिप्ट, 97 बाइट्स

" "%(:s;0:p;{("-"0=={.s p>\?.-1={;;s,:p;}{:p;,:l;s p<s p l+>+:s;}if}{s p<\+s p>+:s;0:p;}if}/"\n"s

टेस्ट: golfscript.tryitonline.net


PPCG में आपका स्वागत है! आप कोशिश कर सकते हैं पर दुभाषिया का उपयोग ऑनलाइन , जो इनपुट का समर्थन करता है।
मार्टिन एंडर

1

पायथन 3 ( 164 194 186 181 168 165 बाइट्स)

p=0
w,*x=input().split()
for i in x:
 if '-'>i:w,p=w[:p]+i[1:]+w[p:],0
 else:
  try:p=w.index(i[1:],p)
  except:p=len(w)
  w=w[:p]+w[p:].replace(i[1:],'',1)
print(w)

उदाहरण सूचक को अंत तक ले जाते हुए प्रदर्शित करता है यदि वह एक सबस्ट्रिंग नहीं ढूंढता है:

Input: HelloThere -x +Friend
Output: HelloThereFriend

मुझे 13 बाइट्स बचाने के लिए विशेष धन्यवाद।

के begपैरामीटर के माध्यम से मुझे एक और 3 बाइट्स बचाने के लिए एक और धन्यवाद index

पुराना उत्तर:

p=0
x=input().split()
w=x[0]
for i in x[1:]:
 if i[0]=='+':
  w=w[:p]+i[1:]+w[p:]
  p=0
 else:
  p=w[p:].index(i[1:])+p
  w=w[:p]+w[p:].replace(i[1:],'',1)
print(w)

पॉइंटर कार्यों का प्रदर्शन करने वाला उदाहरण (क्यू में सभी उदाहरण काम करते हैं, भले ही आप पॉइंटर में फैक्टर न रखते हों और केवल प्रथम स्थान पर हों):

Input: HelloThereCowboy -r -e -y +ySays +Oh
Output: OhHelloTheCowboySays

संपादित करें: 2 मिनट पहले से मेरा उत्तर अब पूछने वाले की टिप्पणी के अनुसार अमान्य है।

आ-बी + बी का परिणाम आआब के साथ होगा क्योंकि सूचक अंत तक सभी तरह से चलेगा।

एडिट 2: फिक्स्ड।


1
w,*x=input().split(), और if'-'>i:के बजाय if i[0]=='+':और 2 रिक्त स्थान की बजाय 2 इंडेंट कुछ बाइट्स की बचत होगी के लिए टैब वर्ण
Artyer

अगर मुझे मिलने वाले टैब और स्पेस को मिलाने की कोशिश की जाए TabError: inconsistent use of tabs and spaces in indentation। सुझावों के लिए धन्यवाद, मैं उन विशेषताओं के बारे में नहीं जानता था! मैं उन्हें तुरंत जोड़ना शुरू करूँगा।
redstarcoder

@redstartcoder मुझे लगता है कि टैब ट्रिक केवल पायथन में काम करती है 2. मेरा बुरा
आर्टी

मैं यहां बिल्कुल गलत हो सकता हूं, लेकिन मुझे लगता है कि स्ट्रिंग्स में एक findविधि है जो कि -1अगर यह सबस्ट्रिंग नहीं पा सकती है तो वापस आ जाएगी । स्ट्रिंग के पीछे से -1 अंक के बाद से, आपको केवल एक pलंबाई के मापांक को लेना होगा , wजिसका मतलब है कि आपको एक प्रयास-अपवाद की आवश्यकता नहीं है।
काडे

1
आप -1%len(str)स्ट्रिंग के अंत में सूचकांक प्राप्त करने के लिए करेंगे । str.indexऔर str.findएक startपैरामीटर भी लेते हैं , इसलिए मुझे लगता है कि आप के w[p:].index(i[1:])साथ बदल सकते हैं w.index(i[1:],p)। कुल मिलाकर, यह होगा else:p=(w.find(i[1:],p)+p)%len(p);w=w[:p]+w[p:].replace(i[1:],'',1)
अरेटियर

0

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

(s,r,t='')=>r.match(/\S\w*/g).map(r=>(q=r.slice(1),r<'-'?(s=t+q+s.t=''):([b,...a]=s.split(q),t+=b,s=a.join(q))))&&t+s

स्पष्टीकरण: एक बोझिल सूचक का उपयोग करने के बजाय, मैं स्ट्रिंग के बाएं आधे हिस्से को tऔर दाएं आधे को अंदर रखता हूं s। इसके अतिरिक्त, splitऔर joinनिष्कासन करने का एक सुविधाजनक तरीका है।

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