जवाबों:
शनीपर्सन उत्तर के वैरिएंट:
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);
MONKET-TYPING
यदि आप इसे केवल निशुल्क फ्लोटिंग विधि बनाते हैं और इसे कॉल करते हैं 'foobar'.&remove: (1..2, 4);
(वृद्धि कई बार उपयोग किए जाने पर रचना के साथ समस्या हो सकती है)
.&remove
कि दूर करने के लिए एक तरीका है।
ऑपरेशन के लिए मेरा नवीनतम विचार (मैं नीचे कार्यान्वयन लागू करूँगा):
उपयोग:
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 के समाधान के खिलाफ बेंचमार्क नहीं किया है, लेकिन अगर यह तेज़ है तो इसके बजाय इसे स्वैप किया जा सकता है। * [संपादित करें: स्पष्ट रूप से इसके बजाय स्ट्रिंग संस्करण के लिए ब्रैड का समाधान होना चाहिए ।] *
अभी तक एक और संस्करण:
print $_[1] if $_[0] !(elem) (1,2,3,8) for ^Inf Z 0..9;
.print for ((0..9) (-) (1,2,3,8)).keys;
हर कोई या तो स्ट्रिंग को सूची में बदल रहा है या 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 के लिए लंबा है, यह निश्चित रूप से कुछ लोगों को मदद मिलेगी, कम से कम मुझे :-) पर
.comb
करते हैं तो उनमें से कई वस्तुओं को बनाना पड़ता है, और उन्हें वापस एक साथ जोड़ते हैं। इसके साथ substr
संभव के रूप में उन वस्तुओं में से कुछ के रूप में बनाता है।