রাকুতে সংক্ষিপ্তভাবে গাণিতিক সিরিজ মুদ্রণ করা


9

গাণিতিক সিরিজ, উদাহরণস্বরূপ নিন ধারাবাহিক ক্রম এখানে অ্যারে হিসাবে উপস্থাপন:

my @seq = my $a=0, {++$a} ... *;
for @seq[^10].kv {state $f=0; ($^k < 4 or $^k > 7) ?? say "a$^k =  "  ~ $^v !! (say "..." if $f ne 1; $f=1) };

ছাপে:

a0 =  0
a1 =  1
a2 =  2
...

a8 =  8
a9 =  9

আমার প্রশ্নগুলি: 1- প্রথম উপাদানটি যেমন a0 = 0মুদ্রিত আউটপুট থেকে বাদ দেওয়ার কোনও সহজ উপায় আছে ?

2- এই কোডটি আরও মূর্তিমানিক করা যেতে পারে?

ধন্যবাদ.


@ ড্যানব্রন মন্তব্যের জন্য আপনাকে ধন্যবাদ। আমি আসল পোস্টটি মূল পোস্টে সবিস্তৃত ও বিশদভাবে লিখেছি।
লার্স মলমসটিন

উত্তর:


2

একটি নগ্ন হাড় সমাধান

আসুন একটি সিকোয়েন্সের সংক্ষিপ্তসার মুদ্রণের জন্য খুব সাধারণ সমাধান দিয়ে শুরু করি। আপনি আপনার প্রশ্নের সাথে যুক্ত হওয়া সুনির্দিষ্ট বিষয়গুলির সাথে এটি ব্যবহার করে না তবে এটি একটি ভাল সূচনা পয়েন্ট:

sub seq-range-gist ( @seq ) {
  my @pairs = @seq.pairs;
  join "\n", @pairs.head(3)».gist, '...', @pairs.tail(2)».gist
}

এর বিপরীতে .kv, যা তার আগমনকারীকে ফর্মে রূপান্তর করে key1, value1, key2, value2, key3, value3, ..., অর্থাত্ elements টি উপাদানের যদি তার দাওয়াতটিতে 3 টি উপাদান থাকে, তবে তার নিমন্ত্রককে .pairsফর্মে রূপান্তর করে key1 => value1, key2 => value2, key3 => value3, ...

আমি আংশিক .pairsপরিবর্তে ব্যবহার করেছি .kvকারণ এর অর্থ ছিল আমি কোডটিতে ».gistপরে ব্যবহার করতে পারলাম অনায়াসে key1 => value1প্রতিটি উপাদানটির জন্য একটি সুন্দর প্রদর্শন পেতে get আমরা নীচে এটি সংশোধন করব তবে এটি একটি ভাল পরিচয়সূত্র।

.headএবং .tailকল কথ্য উপায় হল একটি invocant তালিকা থেকে প্রথম ও শেষ এন উপাদানের ছোট তালিকা তৈরি করতে হয় (প্রদত্ত এটা অলস না; যে সম্পর্কে আরো মো মধ্যে)।

এই প্রাথমিক সমাধানটি দেওয়া, say seq-range-gist (0,1 ... Inf)[^10]প্রদর্শনগুলি:

0 => 0
1 => 1
2 => 2
...
8 => 8
9 => 9

এর পরে, আমরা "মুদ্রিত আউটপুট থেকে কেবলমাত্র প্রথম উপাদানটি ফেলে দিতে" সক্ষম হতে চাই। দুর্ভাগ্যজনকভাবে say seq-range-gist (0,1 ... Inf)[1..9]প্রদর্শন:

0 => 1
1 => 2
2 => 3
...
7 => 8
8 => 9

=>আসল ক্রমের সংখ্যাটি বজায় রাখতে আমরা বাম দিকের নম্বরটি চাই । এটি সক্ষম করতে আমরা যে পরিসরটি বের করতে চাই তা থেকে অন্তর্নিহিত ক্রমটি বিভক্ত করি। আমরা একটি দ্বিতীয় পরামিতি / যুক্তি যুক্ত করি @range, এবং [@range]সাব এর দ্বিতীয় লাইনে যুক্ত করি:

sub seq-range-gist ( @seq, @range ) {
  my @pairs = @seq.pairs[@range];

এখন আমরা say seq-range-gist (0,1 ... Inf), 1..9প্রদর্শন করতে লিখতে পারি :

1 => 1
2 => 2
3 => 3
...
8 => 8
9 => 9

আপনার প্রশ্নে আপনি aINDEX = VALUEপরিবর্তে ফর্ম্যাটটি ব্যবহার করেছেন INDEX => VALUE। গিস্টটি অনুকূলিতকরণের জন্য, আমরা একটি তৃতীয় &gistরুটিন প্যারামিটার / যুক্তি যুক্ত করি এবং অনুরোধ করি যে বিল্ট ইন .gistপদ্ধতিটির পরিবর্তে :

sub seq-range-gist ( @seq, @range, :&gist ) {
  my @pairs = @seq.pairs[@range];
  join "\n", @pairs.head(3)».&gist, '...', @pairs.tail(2)».&gist
}

নোট কিভাবে দেহের "পদ্ধতি" আমন্ত্রণ seq-range-gistসাব এখন .&gistনা .gist। সিনট্যাক্স .&fooএকটি বস্তুর পূজা সাব &foo (যা সাধারণত শুধু লিখে প্রার্থনা করা হয় foo), বাম invocant ক্ষণস্থায়ী .হিসেবে $_সাব আর্গুমেন্ট প্রাপ্ত করতে।

এও নোট করুন যে আমি &gistপরামিতিটির সাথে একটি এর আগে একটি নাম তৈরি করেছি :

সুতরাং এখন say seq-range-gist (0,1 ... Inf), 1..9, gist => { "a{.key} = {.value}" }প্রদর্শন:

a1 =  1
a2 =  2
a3 =  3
...
a8 =  8
a9 =  9

পলিশ যোগ করা হচ্ছে

এই উত্তরটির বাকী অংশটি হ'ল পাঠকদের জন্য যারা পলিশ সম্পর্কে যত্নশীল তাদের জন্য বোনাস উপাদান।

say seq-range-gist (0, 1, 2, 3), ^3 প্রদর্শন:

0 => 0
1 => 1
2 => 2
...
1 => 1
2 => 2

উফ। এমনকি যদি মাথা এবং লেজ একত্রিত করার চেয়ে আরও বেশি জোড় থাকে তবে কমপক্ষে আমরা বারবার লাইন পাইনি, এটি head, ..., tailকেবলমাত্র এক বা দুটি উপাদান এলিডের পদ্ধতির সাহায্যে অর্থহীন হতে চাই । আসুন এই সমস্যাগুলি দূর করতে উপ-সংস্থার সর্বশেষ বিবৃতিটি পরিবর্তন করা যাক:

  join "\n",
    @pairs < $head + $tail + 3   # Of course, the 3 is a bit arbitrary
      ?? @pairs».&gist
      !! (@pairs.head($head)».&gist, '...', @pairs.tail($tail)».&gist)

এরপরে, উপস্থাপনাটি কোনও ব্যাপ্তি বা সংক্ষিপ্তসার ছাড়াই ডেকে আনা হলে দরকারী কিছু করায় ভাল লাগবে। আমরা বেশিরভাগটি উপযুক্ত ডিফল্ট @rangeএবং &gistপরামিতিগুলি দিয়ে এটি ঠিক করতে পারি :

sub seq-range-gist (
  @seq,
  @range = @seq.is-lazy ?? ^100 !! ^@seq,
  :&gist = { .gist }
) {

যদি @seqহয় না অলস , তারপর @rangeসম্পূর্ণ পরিসর ডিফল্ট @seq। যদি @seqহয় অসীম (যে ক্ষেত্রে এটি অলস এর), তারপর 100 পর্যন্ত ডিফল্ট জরিমানা। তবে যদি @seqঅলস হয় তবে 100 টির চেয়ে কম সংজ্ঞাযুক্ত মান পাওয়া যায় তবে? এই ক্ষেত্রে আমরা যোগ আবরণ .grep: *.value.definedথেকে @pairsঘোষণা:

  my @pairs = @seq.pairs[@range].grep: *.value.defined;

আর একটি সাধারণ উন্নতি হ'ল headচ্ছিক মাথা এবং লেজ পরামিতি, যা একটি চূড়ান্ত পালিশ সমাধানের দিকে নিয়ে যায়:

sub seq-range-gist (
  @seq,
  @range = @seq.is-lazy ?? ^100 !! ^@seq,
  :$head = 3,
  :$tail = 2,
  :&gist = { .gist }
) {
  my @pairs = @seq.pairs[@range].grep: *.value.defined;
  join "\n",
    @pairs <= $head + $tail + 2
      ?? @pairs».&gist
      !! (@pairs.head($head)».&gist, '...', @pairs.tail($tail)».&gist)
}

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

আপনার প্রতিক্রিয়া জানাতে এবং আমার উত্তরটি লার্সমেলাস্টিন গ্রহণ করার জন্য ধন্যবাদ। এটি বলেছিল, আমি পুরোপুরি আমার উত্তরটি আবার লিখেছি এবং এটি আরও ভাল বলে অনুভব করেছি। আমি 'বিস্তৃত' সমাধানটি ফেলে দিয়েছি - আমি এটি দিয়ে আগাছার মধ্যে অনেক দূরে চলে যাই! - তবে আমি সম্পূর্ণরূপে "সর্বনিম্ন সমাধান" এবং তার সাথে ব্যাখ্যাটি আবারও লিখেছি। আমি বেশিরভাগ পরে অন্যান্য পাঠকদের জন্য এটি করেছি তবে আপনি নতুন উত্তরটি পড়ে কিছুটা মূল্য পেতে পারেন।
রায়ফ

7

আপনি প্রথম এন মান এড়িয়ে যেতে পারেন কোনো Iterable বাSequence সাথেskip :

for (^5).skip(3) {
    .say
}
# 3
# 4

আপনি যদি কোনও সংখ্যা নির্দিষ্ট না করেন তবে এটি কেবল একটি উপাদানকে এড়িয়ে যাবে।


skipমনে হচ্ছে কেবল আউটপুটটি অপসারণ করা হবে অর্থাৎ 0 তম সূচক (a0) সহ উপাদান রয়েছে। আমি চেষ্টা করেছি @seq:deleteএবং এটি কেবল 0 তম উপাদানটির সাথে প্রতিস্থাপন করেছে(Any)
লার্স ম্যালমস্টিন

প্রকৃতপক্ষে. skipঠিক যেমন যদি এড়ানো হয়েছে উপাদানের অস্তিত্ব নেই কাজ করবে। এটি আপনি যা চান তা হতে পারে বা নাও হতে পারে :-)
এলিজাবেথ ম্যাটিজেন

যখন আমি skipএর মধ্যে এমনটি রাখি যাতে এটি পড়ে: for @seq[^10].skip(0).kvএটি আক্ষরিক অর্থে 0 তম উপাদানটি এড়িয়ে যায় না এবং আমি skip1 বা 2 এর পক্ষে যুক্তি হিসাবে দিচ্ছি তা বিবেচ্য নয় , এটি কেবল আরও বাইরে বিকৃত করে। স্থলভাগ থেকে 0 তম উপাদানটি সরানোর জন্য আমার একটি ব্যবহারিক উপায় প্রয়োজন need
লার্স মালমসটিন

1
for @seq[^10].kv.skip(2)আপনি কি খুঁজছেন সম্ভবত ?
এলিজাবেথ ম্যাটিজসেন

হ্যাঁ যে কাজ করে। আসলে আমি skipপরে .kv2 টি বাদ দিয়ে যুক্তি ব্যবহার করার চেষ্টা করেছি , সুতরাং এটি কার্যকর হয়নি। সমাধানের জন্য আপনাকে ধন্যবাদ।
লার্স মালমসটিন

7

এটি কিছুটা মূio় হতে পারে:

my @seq = 0, *+1 ... *;
say @seq[^4], @seq[7..10]

অনুক্রমের মধ্যে আপনাকে একটি লেজিকাল ভেরিয়েবল ব্যবহার করার দরকার নেই; হয় Whateverবা স্থানধারক ভেরিয়েবল নিরাপদে অনুক্রমের মধ্যে ব্যবহার করা যেতে পারে। তারপরে আপনি মুদ্রণ করতে চান এমন ক্রমের উপাদানগুলি কেবল নির্বাচন করতে পারেন। যা ফিরে আসে«(0 1 2 3)(7 8 9 10)␤»


উত্তরের জন্য ধন্যবাদ. whateverঅপারেটর refreshening হয় কিন্তু সিরিজ / ক্রম আউটপুট প্রধান সমস্যাটি ধরে নি। আমি সিরিজটি মুদ্রণ করতে চাই কারণ তারা গণিতের পাঠ্যপুস্তকগুলিতে দেখা যায়, অর্থাত্ ...মাঝখানে স্বরলিপি সহ ।
লার্স ম্যালমস্টিন

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