সূচি অনুসারে একটি স্ট্রিং থেকে কিছু অক্ষর সরান (রাকু)


15

এফএকিউ: রাকুতে, আপনি কীভাবে কিছু অক্ষরকে তার সূচকগুলির উপর ভিত্তি করে স্ট্রিং থেকে সরান?

বলুন আমি 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);

বা স্ট্রির বৃদ্ধির সাথে:

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

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

এটি আমার মতে সমস্যার সম্পূর্ণ সমাধান করে ves Remind এবং (-) সমতুল্য মনে করিয়ে দেওয়ার জন্য ধন্যবাদ। আমি চাই না এমন সূচকগুলি দিয়ে টুকরো টুকরো করার অন্যান্য উপায় দেখতে পাচ্ছি না, যা চাই না সূচকগুলি।
টিনমারিনো

1
আপনি MONKET-TYPINGযদি এটিকে কেবল বিনামূল্যে ভাসমান পদ্ধতি তৈরি করেন এবং এটিকে কল করেন তবে এটি ব্যবহার করতে হবে 'foobar'.&remove: (1..2, 4); না (বেশ কয়েকবার ব্যবহার করা থাকলে রচনাটির ক্ষেত্রে বাড়াতে সমস্যা হতে পারে)
user0721090601

(যা .&remove
বৃদ্ধিকে

আপনার পরামর্শ অনুসারে আমি অ-অগমেন্টেশন বৈকল্পিক যুক্ত করেছি। ধন্যবাদ.
সেবাস্তিয়ান

1
বিভ্রান্তিকর এবং ব্যাকস্ল্যাশ চরিত্রের মতো মনে হচ্ছে।
শনিপারসন


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 ]পরিচিত পরিচিতিটি ব্যবহার [...]করে তবে বামদিকে একটি স্ট্রিং এবং খোলার পরে অতিরিক্ত বিয়োগের[ সাহায্যে সাবস্ক্রিপ্টের বিষয়বস্তু সূচকগুলির পরিবর্তে এক্সডিসির একটি তালিকা বলে বোঝায়

[সম্পাদনা: আমি আমার আসল বাস্তবায়ন ব্র্যাডের সাথে প্রতিস্থাপন করেছি। এটি সম্ভবত ভুল-মাথাভিত্তিক কারণ ব্র্যাড নোট হিসাবে তাঁর সমাধান "ধরে নিয়েছে যে [বাহ্যিকগুলি] নীচ থেকে সর্বোচ্চের দিকে চলেছে এবং কোনও ওভারল্যাপ নেই।", এবং অন্যথায় প্রতিশ্রুতি না দিলে ব্যবহার [- ... ]করা ভয়াবহভাবে নিকটে রয়েছে। তাই করছেন. সুতরাং যদি এই সিনট্যাক্স চিনিটি কারও দ্বারা ব্যবহৃত হয় তবে তাদের সম্ভবত ব্র্যাডের সমাধান ব্যবহার করা উচিত নয়। ব্র্যাডের ধারণাটি দূর করার সম্ভবত একটি উপায় রয়েছে।]

আমি এই বাক্য গঠনটি পছন্দ করি তবে আমি সচেতন যে ল্যারি ইচ্ছাকৃতভাবে সূচক স্ট্রিংগুলির ব্যবহার করতে পারেনি[...] তাই সম্ভবত আমার এখানে বাক্য গঠনটি ব্যাপকভাবে গ্রহণের জন্য অনুপযুক্ত। কিছু ভাল বন্ধনী অক্ষর ব্যবহার করা হলে এটি আরও ভাল হবে। তবে আমি মনে করি একটি সাধারণ পোস্টকার্কফ্যামিক্স সিনট্যাক্স ব্যবহার দুর্দান্ত।

(আমি [ ... ]স্ট্রিংকে ঠিক একই পদ্ধতিতে সূচি প্রয়োগের জন্য একটি সরল বৈকল্পিক প্রয়োগ করার চেষ্টা করেছি Positionalকিন্তু আজ রাতে আমার চেয়ে বেশি কারণেই এটি কাজ করতে ব্যর্থ [+ ... ]হয়েছি We অদ্ভুতভাবে এক্সডিসিগুলি করতে কাজ করবে তবে সূচকগুলি করতে পারবে না; যা তোলে আমার কাছে মোটেই বুদ্ধি নেই! যাইহোক, আমি আমার যা পোস্ট করব এবং এই উত্তরটি সম্পূর্ণ বিবেচনা করব consider)


[সম্পাদনা করুন: উপরের সমাধানটির দুটি দিক রয়েছে যা আলাদা হিসাবে দেখা উচিত। প্রথমত, একজন ব্যবহারকারী-সংজ্ঞায়িত অপারেটর, সিনট্যাকটিক চিনি 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 এর সমাধানের বিপরীতে আমি এটি বেঞ্চমার্ক করি নি তবে যদি এটি দ্রুত হয় তবে পরিবর্তে এটি বদলে নেওয়া যেতে পারে। * [সম্পাদনা করুন: স্পষ্টতই এটি স্ট্রিং ভেরিয়েন্টের পরিবর্তে ব্র্যাডের সমাধান হওয়া উচিত ]]


"আমি মনে করি একটি সাধারণ পোস্টকার্কফ্যামিক্স সিনট্যাক্স ব্যবহার দুর্দান্ত"। স্পষ্টভাবে ! আমি এই সমাধানটি ভালবাসি: পড়তে খুব পরিষ্কার।
তিনমিনিনো ২

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সূচকগুলির একটি ফ্ল্যাট তালিকা ব্যবহার করে বা স্ট্রিংকে তালিকায় পরিণত করে ।

Those জিনিসগুলির কোনওটিই করার কোনও কারণ নেই

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
@ তিনমারিনো এটি কারণ মোআরভিএম সাধারণত স্ট্রিংগুলি অনুলিপি করে না, পরিবর্তে এটি স্ট্রিংিং অবজেক্ট তৈরি করে যা মূল স্ট্রিংয়ের দিকে নির্দেশ করে। আপনি যখন .combএটি ব্যবহার করবেন তখন সেগুলি অনেকগুলি তৈরি করতে হবে এবং তাদের আবার একত্রিত করতে হবে। সঙ্গে substrএটা সম্ভব হিসাবে যারা বস্তুর কয়েক যেমন সৃষ্টি করে।
ব্র্যাড গিলবার্ট

"মূল স্ট্রিংয়ের দিকে নির্দেশ করে এমন বস্তুগুলিকে বিস্তৃত করে": এই কারণেই কেন সেন্ট্রালকে অপরিবর্তনীয় হিসাবে প্রয়োগ করার সিদ্ধান্ত নেওয়া হয়েছিল? চিত্তাকর্ষক অপ্টিমাইজেশন যাইহোক।
টিনমারিনো ২৮:১৯

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.