सूचकांक से कुछ वर्णों को निकालें (Raku)


15

सामान्य प्रश्न: Raku में, आप एक स्ट्रिंग से कुछ पात्रों को कैसे हटाते हैं, उनके सूचकांक के आधार पर?

कहते हैं कि मैं 1 से 3 और 8 सूचकांक निकालना चाहता हूं

xxx("0123456789", (1..3, 8).flat);  # 045679

जवाबों:


14

शनीपर्सन उत्तर के वैरिएंट:

my $a='0123456789';
with $a {$_=.comb[(^* ∖ (1..3, 8).flat).keys.sort].join};
say $a;

एक पंक्ति में:

say '0123456789'.comb[(^* ∖ (1..3, 8).flat).keys.sort].join;

या एक समारोह द्वारा बुलाया:

sub remove($str, $a) {
    $str.comb[(^* ∖ $a.flat).keys.sort].join;
}

say '0123456789'.&remove: (1..3, 8);

या Str के वृद्धि के साथ:

use MONKEY-TYPING;
augment class Str {
    method remove($a) {
        $.comb[(^* ∖ $a.flat).keys.sort].join;
    }
};

say '0123456789'.remove: (1..3, 8);

यह समस्या को पूरी तरह से मेरी राय में हल करती है। याद दिलाने के लिए धन्यवाद कि \ _ (-) बराबर हैं। मुझे इंडेक्स के साथ स्लाइस करने के अन्य तरीके नहीं दिख रहे हैं और मैं नहीं चाहता कि मुझे जो इंडेक्स चाहिए।
टीनमारिनो

1
आपको इसका उपयोग करने की आवश्यकता नहीं है MONKET-TYPINGयदि आप इसे केवल निशुल्क फ्लोटिंग विधि बनाते हैं और इसे कॉल करते हैं 'foobar'.&remove: (1..2, 4); (वृद्धि कई बार उपयोग किए जाने पर रचना के साथ समस्या हो सकती है)
user0721090601

(कहने के लिए नहीं है जो बढ़ाने बुरा है, सिर्फ इतना है कि .&removeकि दूर करने के लिए एक तरीका है।
user0721090601

मैंने आपके सुझाव के अनुसार गैर-वृद्धि संस्करण को जोड़ा। धन्यवाद।
सेबेस्टियन

1
Seems भ्रामक और एक बैकस्लैश चरित्र की तरह लगता है।
शनीपर्सन


9

ऑपरेशन के लिए मेरा नवीनतम विचार (मैं नीचे कार्यान्वयन लागू करूँगा):

उपयोग:

say '0123456789'[- 1..3, 8 ]; # 045679

कार्यान्वयन, रैपिंग (ब्रैड के समाधान का एक प्रकार):

multi postcircumfix:<[- ]> (|args) { remove |args }

sub remove( Str:D $str is copy, +@exdices){
    for @exdices.reverse {
        when Int   { $str.substr-rw($_,1) = '' }
        when Range { $str.substr-rw($_  ) = '' }
    }
    $str
}

say '0123456789'[- 1..3, 8 ]; # 045679

मैंने जो संचालक घोषित किया है उसका उपयोग करने के लिए सिंटैक्स है string[- list-of-indices-to-be-subtracted ], अर्थात परिचित [...]संकेतन का उपयोग करना , लेकिन बाईं ओर एक स्ट्रिंग और उद्घाटन के बाद एक अतिरिक्त माइनस के साथ यह [इंगित करने के लिए कि सबस्क्रिप्ट सामग्री सूचकांकों के बजाय एग्जिट की सूची है ।

[संपादित करें: मैंने ब्रैड के साथ अपने मूल कार्यान्वयन को बदल दिया है। यह शायद गलत है, क्योंकि ब्रैड नोट के रूप में, उनका समाधान "मानता है कि [exdices] सबसे कम से उच्चतम तक क्रम में हैं, और कोई ओवरलैप नहीं है।", और जबकि उसका वादा अन्यथा नहीं करता है, का उपयोग [- ... ]करना भयानक रूप से करीब है। ऐसा करने से। इसलिए अगर इस सिंटेक्स चीनी का उपयोग किसी के द्वारा किया जाना था, तो उन्हें शायद ब्रैड के समाधान का उपयोग नहीं करना चाहिए। शायद ब्रैड के बनाये गए अनुमान को खत्म करने का एक तरीका है।]

मुझे यह सिंटैक्स पसंद है लेकिन मुझे पता है कि लैरी ने जानबूझकर इंडेक्स स्ट्रिंग्स के उपयोग में निर्माण नहीं किया था ,[...] इसलिए शायद यहां मेरा सिंटैक्स व्यापक रूप से अपनाने के लिए अनुपयुक्त है। शायद यह बेहतर होगा कि कुछ अलग-अलग ब्रैकेटिंग पात्रों का उपयोग किया जाए। लेकिन मुझे लगता है कि एक सरल postcircumfix वाक्यविन्यास का उपयोग अच्छा है।

(मैंने भी एस के [ ... ]लिए स्ट्रिंग्स को अनुक्रमित करने के लिए एक सीधे संस्करण को लागू करने की कोशिश की है, जैसे कि Positionalएस के लिए लेकिन आज रात से परे कारणों के लिए इसे प्राप्त करने में विफल रहा है। अजीब तरह [+ ... ]से एक्सडाइस करने के लिए काम करेंगे, लेकिन सूचकांकों को करने के लिए नहीं; किसी भी तरह से मेरे लिए कोई मतलब नहीं है! मैं पोस्ट करूँगा कि मेरे पास क्या है और इस जवाब को पूरा मानें।)


[संपादित करें: उपरोक्त समाधान के दो पहलू हैं जिन्हें अलग-अलग रूप में देखा जाना चाहिए। सबसे पहले, एक उपयोगकर्ता-परिभाषित ऑपरेटर, सिंटैक्टिक चीनी द्वारा प्रदान की गई postcircumfix:<[- ]> (Str ..., घोषणा। दूसरा, उस घोषणा का निकाय। ऊपर मैंने ब्रैड के समाधान का (एक प्रकार) उपयोग किया है। मेरा मूल उत्तर नीचे है]


चूँकि आपका प्रश्न कुछ सूचकांकों को हटाने के लिए उबलता है .comb, और joinपरिणाम को पुनः प्राप्त करता है, इसलिए आपका प्रश्न अनिवार्य रूप से डुप्लिकेट है ... [संपादित करें: गलत है, ब्रैड के उत्तर के अनुसार।]

सरणी या सूची तत्वों को हटाने का एक त्वरित तरीका क्या है? .comb ... .joinयहाँ [ ] जवाब के लिए अभी तक और अधिक समाधान जोड़ता है।


दो मल्टीस के रूप में लागू किया गया है, इसलिए एक ही वाक्यविन्यास का उपयोग Positionalएस के साथ किया जा सकता है :

multi postcircumfix:<[- ]> (Str $_, *@exdex) { .comb[- @exdex ].join }

multi postcircumfix:<[- ]> (@pos,   *@exdex) { sort keys ^@pos (-) @exdex } 

say '0123456789'[- 1..3, 8 ]; # 045679

say (0..9)[- 1..3, 8 ];       # (0 4 5 6 7 9)

sort keys ^@pos (-) @exdicesकार्यान्वयन सिर्फ @ सेबेस्टियन के जवाब का एक थोड़ा सरलीकृत संस्करण है। मैंने इसे पहले से जुड़े उत्तर से jnthn के समाधान के खिलाफ बेंचमार्क नहीं किया है, लेकिन अगर यह तेज़ है तो इसके बजाय इसे स्वैप किया जा सकता है। * [संपादित करें: स्पष्ट रूप से इसके बजाय स्ट्रिंग संस्करण के लिए ब्रैड का समाधान होना चाहिए ।] *


"मुझे लगता है कि एक सरल postcircumfix वाक्यविन्यास का उपयोग अच्छा है"। निश्चित रूप से! मुझे यह समाधान पसंद है: पढ़ने के लिए सुपर स्पष्ट।
तिनमारिनो

8

अभी तक एक और संस्करण:

print $_[1] if $_[0] !(elem) (1,2,3,8) for ^Inf Z 0..9;

.print for ((0..9) (-) (1,2,3,8)).keys;

8

यह सादगी और संक्षिप्तता के मामले में मुझे सबसे करीब मिला है।

say '0123456789'.comb[ |(3..6), |(8..*) ].join

7

हर कोई या तो स्ट्रिंग को सूची में बदल रहा है या combसूचकांकों की एक फ्लैट सूची का उपयोग कर रहा है।

उन चीजों में से कोई भी करने का कोई कारण नहीं है

sub remove( Str:D $str is copy, +@indices ){
    for @indices.reverse {
        when Int   { $str.substr-rw($_,1) = '' }
        when Range { $str.substr-rw($_  ) = '' }
    }
}

remove("0123456789",  1..3, 8 );  # 045679
remove("0123456789", [1..3, 8]);  # 045679

उपरोक्त मानता है कि सूचकांक निम्नतम से उच्चतम तक क्रम में हैं, और कोई ओवरलैप नहीं है।


यह मेरी मशीन ( my $s = "0123456789" x 1000; my $l = (1..3, 8, 40, 100, 1001, 4000..4100).flat) के साथ 150 के कारक का सबसे तेज़ उत्तर है । कंघी लंबे तार धन्यवाद @BradGilbert के लिए लंबा है, यह निश्चित रूप से कुछ लोगों को मदद मिलेगी, कम से कम मुझे :-) पर
Tinmarino

1
@Tinmarino ऐसा इसलिए है क्योंकि MoarVM आमतौर पर स्ट्रिंग की नकल नहीं करता है, इसके बजाय यह मूल स्ट्रिंग में इंगित करने वाली ऑब्जेक्ट को प्रतिस्थापित करता है। जब आप इसका उपयोग .combकरते हैं तो उनमें से कई वस्तुओं को बनाना पड़ता है, और उन्हें वापस एक साथ जोड़ते हैं। इसके साथ substrसंभव के रूप में उन वस्तुओं में से कुछ के रूप में बनाता है।
ब्रैड गिलबर्ट

"उन वस्तुओं को प्रतिस्थापित करना जो मूल स्ट्रिंग में इंगित करते हैं": यही कारण है कि Str को अपरिवर्तनीय के रूप में लागू करने का निर्णय लिया गया था? प्रभावशाली अनुकूलन वैसे भी।
तिनमारिनो

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