আপনার ইনপুটটিতে এমন অনেকগুলি উপাদান রয়েছে:
say elems <1 1 0 2 0 2 1 2 2 2 4 4 3 3>; # 14
আপনার grep
ব্লক প্রতিবার দুটি উপাদান গ্রাস করে:
{$^a eq $^b}
সুতরাং আপনি যদি কোনও উপাদান যুক্ত বা সরিয়ে ফেলেন তবে আপনি শেষে থাকা একক উপাদানটিতে ব্লকটি চালানোর সময় আপনি যে ত্রুটিটি পেয়ে যাবেন তা পেয়ে যাবেন।
আপনার সমস্যা সমাধানের বিভিন্ন উপায় রয়েছে are
তবে আপনি ওভারল্যাপিংয়ের অনুমতি দেওয়ার বিকল্প সম্পর্কেও জিজ্ঞাসা করেছিলেন, উদাহরণস্বরূপ, (2 2)
ক্রমটি যখন আসে তখন আপনি দুটি উপ-তালিকা পাবেন 2 2 2
। এবং, অনুরূপ শিরাতে, আপনি সম্ভবত দুটি ইনকয়ের মতো শূন্য নয়, ম্যাচ দেখতে চান:
<1 2 2 3 3 4>
সুতরাং আমি সেই সমস্যাগুলিকেও সমাধান করে এমন সমাধানগুলিতে মনোযোগ দেব।
অতিরিক্ত সমস্যাগুলি মোকাবেলা করার জন্য সমাধানের স্থান সংকীর্ণ হওয়া সত্ত্বেও, কার্যক্ষমভাবে সমাধান প্রকাশের অনেক উপায় রয়েছে।
একটি উপায় যা আপনার শেষের দিকে কিছুটা আরও কোড যুক্ত করে:
my @s = <1 1 0 2 0 2 1 2 2 2 4 4 3 3>;
say grep {$^a eq $^b}, @s .rotor( 2 => -1 ) .flat
.rotor
পদ্ধতি উপ-তালিকা, একই দৈর্ঘ্য প্রতিটি একটি তালিকা মধ্যে একটি তালিকা পরিবর্তন করে। উদাহরণস্বরূপ, say <1 2 3 4> .rotor: 2
প্রদর্শন করে ((1 2) (3 4))
। যদি দৈর্ঘ্যের আর্গুমেন্টটি একটি জোড়া হয়, তবে কীটি দৈর্ঘ্য এবং মানটি পরবর্তী জোড়টি শুরু করার জন্য অফসেট। যদি অফসেটটি নেতিবাচক হয় তবে আপনি উপ-তালিকা ওভারল্যাপ পাবেন। এইভাবে say <1 2 3 4> .rotor: 2 => -1
প্রদর্শিত হয় ((1 2) (2 3) (3 4))
।
.flat
পদ্ধতি "চ্যাপ্টা" তার invocant। উদাহরণস্বরূপ, say ((1,2),(2,3),(3,4)) .flat
প্রদর্শন করে (1 2 2 3 3 4)
।
উপরের সমাধানটি লেখার সম্ভবত আরও পঠনযোগ্য উপায় হ'ল flat
ব্যবহার বাদ দেওয়া এবং ব্যবহার .[0]
এবং .[1]
ফিরে আসা সাব-তালিকাগুলি অনুসারে সূচি পাঠানো rotor
:
say @s .rotor( 2 => -1 ) .grep: { .[0] eq .[1] }
যে কোনও উপ-তালিকা আকারের জন্য জেনারেলাইজ করে এমন অন্য পরিবর্তনের জন্য এলিজাবেথ ম্যাটিজসেনের মন্তব্যও দেখুন।
আপনার যদি আরও সাধারণ কোডিং প্যাটার্নের প্রয়োজন হয় তবে আপনি এমন কিছু লিখতে পারেন:
say @s .pairs .map: { .value xx 2 if .key < @s - 1 and [eq] @s[.key,.key+1] }
.pairs
তালিকায় পদ্ধতি প্রতিটি জোড়া তার invocant তালিকায় উপাদানের প্রতিটি সংশ্লিষ্ট জোড়া একটি তালিকা প্রদান করে। .key
প্রতিটি জোড়া এর invocant তালিকায় উপাদান সূচক হয়; .value
উপাদান মান।
.value xx 2
লেখা যেতে পারে .value, .value
। (দেখুন xx
।)
@s - 1
@s
বিয়োগ 1 এ উপাদানগুলির সংখ্যা ।
[eq]
মধ্যে [eq] list
একটি হল হ্রাস ।
আপনার যদি ইনপুট তালিকাটিকে স্ট্রিংয়ে রূপান্তর করতে পারে তার জন্য উপযুক্ত পাঠ্য প্যাটার্ন ম্যাচিংয়ের প্রয়োজন হয় তবে ম্যাচের একটি অ্যাডওয়্যার ব্যবহার করে ম্যাচের একটি তালিকা তৈরি করে তার সাথে মেলে, তারপরে ম্যাচের ফলাফলের তালিকা থেকে আপনার পছন্দসই ম্যাপ করুন ফলাফল. ওভারল্যাপের সাথে মেলে (যেমন ব্যবহারের 2 2 2
ফলাফল :((2 2) (2 2))
:ov
say @s .Str .match( / (.) ' ' $0 /, :ov ) .map: { .[0].Str xx 2 }
2 2 2 2
এটি 3(2 2)
টি প্রিন্ট করে যা প্রত্যাশিত।rotor
আমি প্রথমে প্রথমে যেsquish
পদ্ধতিটি নিয়ে এসেছি সে সম্পর্কে কখনও শুনিনি এবং এটির বৈশিষ্ট্য বা আর্গুমেন্ট রয়েছে কিনা তা যাচাই করা হয়েছে@s.squish(:length 2, :multiple_instances yes)
তবে এর বৈশিষ্ট্যগুলি নেই এবং এটি কাজের উপযুক্ত নয়। সঙ্গে তুলনা করাsquish
,rotor
বেশ ফিট বলে মনে হচ্ছে। আসলে এটি এই ধরণের অপারেশনের জন্য উপযুক্ততমও হতে পারে।