টেক-ব্যাক কাউন্টিং অ্যালগরিদম


14

যেসব বাচ্চারা কীভাবে গণনা করতে শিখছে তারা প্রায়শই সংখ্যক রান জানে তবে এই রানগুলি সঠিকভাবে একসাথে করা যায় বলে মনে হয় না।

উদাহরণস্বরূপ, তারা বলতে পারে:

1,2,3,4,7,8,9,10

কখনও কখনও বাচ্চারা বুঝতে পারবে যে তারা কিছু নম্বর বাদ দিয়েছে এবং ফিরে যাবে:

1,2,3,4,7,8,5,6,7,8,9,10

এটি স্পষ্টতই উচ্চতর প্যাটার্ন। আমাদের সেগুলি সনাক্ত করা দরকার।

এই তালিকাগুলি সনাক্ত করতে:

  1. আমরা তালিকাটির সর্বনিম্ন Mএবং সর্বাধিক চিহ্নিত করিN

  2. আমরা তালিকার মধ্যে দিয়েছি। বর্তমান সংখ্যা যদি তালিকার কোনও সদস্যের চেয়ে ডানদিকে এর চেয়ে বড় বা সমান হয়, তবে আমরা বর্তমান সংখ্যাটি সরিয়ে দেব।

  3. Iff অবশিষ্ট তালিকা থেকে সব সংখ্যার ধারণ Mকরার N, তাহলে আমরা একটি truthy মান ফিরে।

আপনি ধরে নিতে পারেন আপনার ইনপুট তালিকায় কমপক্ষে 1 টি উপাদান থাকবে। আপনি ধরে নিতে পারেন যে সমস্ত পূর্ণসংখ্যা অ-নেতিবাচক হবে।

পরীক্ষার কেস:

Truthy:

0
10
0 0 0 
1 0 1
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 0 1 2 3
0 1 2 3 4 5 5
0 1 1 2 2 3
0 3 6 1 4 7 2 5 8 3 4 5 6 7 8
1 3 5 7 2 3 4 5 6 7
5 6 0 1 2 3 6 7 4 5 6 7
5 6 7 8
5 5 6 7 8
4 6 7 8 3 4 5 6 7 8

Falsy:

1 0
4 3 2 1
1 2 3 7 8 9
0 1 2 3 1 3
0 1 2 3 1 3 4
0 1 2 3 1 3 2 4
0 1 2 3 1 3 2 4 3
1 3 5 7 2 4 6 8
0 1 2 1 3 4 5 6
4 5 6 3 4 5

এটি , সুতরাং আপনার উত্তরগুলি যত তাড়াতাড়ি সংক্ষিপ্ত করুন!


খুব পরিষ্কার নয়: [0,1,2,3,4,5,4,3,2,1] কে সত্য বা মিথ্যা হিসাবে বিবেচনা করা উচিত?
জিবি

1
@ জিবি মিথ্যা আপনি যখন দ্বিতীয় উপাদানটিতে থাকবেন, আপনি এটিকে দ্বিতীয় ধাপে সরিয়ে 1ফেলবেন (কারণ লাইনের পরে আরও কিছু আছে )। আপনি অন্য সমস্ত উপাদানও মুছে ফেলবেন (শেষ 1 বাদে), তাই আপনি শেষ করবেন 0 1, যা নেই0 1 2 3 4 5
নাথান মেরিল

উত্তর:


6

05 এ বি 1 ই , 5 বাইট

আমি এই কাজগুলিতে 100% নিশ্চিত নই, তবে এটি সমস্ত পরীক্ষার কেস কেটে যায় এবং যেখানে এটি ব্যর্থ হয় তার কোনও পরিস্থিতি আমি পাইনি।

Ú¥1QP

এটি অনলাইন চেষ্টা করুন!

Ú¥1QP   Main link. Argument a
Ú       Reverse uniquify a, keeps only last occurence of each element
 ¥      Get all deltas - all 1 if ascending list
  1Q    Compare all deltas to 1
    P   Product of all results

7 বাইট, বাস্তবে
বলেছেন মিনিকা

2
@ এভাল নং, 05 এ বি 1 ই একটি কাস্টম এনকোডিং, 05 এ বি 1 ই ব্যবহার করে।
এরিক দ্য আউটগল্ফার

2

জেলি , 10 9 বাইট

ṀrṂɓṚ«\Q⁼

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

ṀrṂɓṚ«\Q⁼  Main link. Argument: A (array)

Ṁ          Yield the maximum of A.
  Ṃ        Yield the minimum of A.
 r         Yield R := [max(A), ... min(A).
   ɓ       Begin a new chain. Left argument: A. Right argument: R
    Ṛ      Reverse A.
     «\    Take the cumulative minimum.
       Q   Unique; deduplicate the results.
        ⁼  Compare the result with R.

আকর্ষণীয়, ɓএকটি তুলনামূলকভাবে নতুন বৈশিষ্ট্য?
ETH প্রোডাকশনগুলি

হ্যাঁ, এটি জোনাথন অ্যালানের একটি টান অনুরোধ থেকে।
ডেনিস

আহা, 13 দিন আগে। যদিও এটি এখনও ব্যবহার করা দেখেনি (সম্ভবত আপনার বা জোনাথন আছে এবং আমি কেবল এটি মিস করেছি)।
ইটিএইচ প্রোডাকশনগুলি

এখানে আসল আকর্ষণীয় অংশটি «\যদিও আমার মতে।
এরিক আউটগল্ফার



1

পিএইচপি , 148 130 বাইট

-১৮ বাইটস, ধন্যবাদ @ ক্রিসটফ

$a=explode(' ',$argn);$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);

এটি অনলাইন চেষ্টা করুন!


ঠিক আছে এখানে মন্তব্য করার জন্য: $argnসর্বদা একটি স্ট্রিং foreachএটিতে কাজ করে না। আপনি $argvইনপুট হিসাবে অ্যারে পেতে ব্যবহার করতে পারেন তবে সাবধান থাকুন যে এটিতে সর্বদা প্রথম উপাদান হিসাবে ফাইলের নাম থাকে। আপনি এই ব্যবহার $mএবং $nতাই শুধুমাত্র একবার আপনি তৈরি বাইটের অনেক সঞ্চয় করতে পারেন $bতার আগে: $b=range(min($a),max($a));। Cast (bool)ালাই সম্পূর্ণ অপ্রয়োজনীয়। if($k>=$a[$s])$a[$i]=null;to $k<$a[$s]?:$a[$i]=-1;। : রেফারেন্স আমরা এটা করতে পারেন ব্যবহার foreach($a as$i=>&$k)(+1 টি বাইট) এবং $a[$i]করতে $k(-4 বাইট)। তবুও এটি আমাদের ড্রপ করতে দেয় $s=$iকারণ আমরা $iএখনই সরাসরি পুনরাবৃত্তি করতে পারি ।
ক্রিস্টোফ

ফলাফলটি $a=$argn;$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);(117 বাইট) এর মতো দেখাচ্ছে । তবে এটি এখনও $argnভুল উপায়ে ব্যবহার করে। $a=explode(' ',$argn);13 টি অতিরিক্ত বাইটের জন্য এটি ঠিক করবে।
ক্রিস্টোফ

1
সমস্যা নেই ! একটি নতুন পিএইচপি গল্ফার খুঁজে পেতে সর্বদা খুশি আমি আপনাকে আরও দেখতে আশা করি :) নয়তো তিতাস, জর্জ বা আমি সর্বদা সাহায্যের জন্য রয়েছি!
ক্রিস্টোফ

1
@ ক্রিসটফ $_GETইনপুট অ্যারে হিসাবে ব্যবহার করছেন না কেন ? এই ক্ষেত্রে ভেরিয়েবলটি explodeব্যবহার করার জন্য অ্যাডিটোনাল -6 বাইট ব্যবহার করার দরকার নেই$b
Jörg Hülsermann

1
@ ক্রিসটফ ঠিক আছে এক্ষেত্রে আমাদের 7.১ এর চেয়ে কম সংস্করণ প্রয়োজন এবং আমরা ~ এটি অনলাইনে চেষ্টা না করে
জার্গ হালসারম্যান

1

জাভা 8, 264 262 বাইট

import java.util.*;l->{int m=Collections.max(l),n=Collections.min(l),i=0,q;for(;i<(q=l.size());i++)if(l.subList(i+1,q).size()>0&&l.get(i)>=Collections.min(l.subList(i+1,q)))l.remove(i--);for(i=0;n<=m;)if(i<l.size()&&l.get(i++)==n)n++;else return 0>1;return 1>0;}

ব্যাখ্যা:

এখানে চেষ্টা করুন।

import java.util.*;                 // Import for Collections

l->{                                // Method with integer-ArrayList parameter and boolean return-type
  int m=Collections.max(l),         //  Max of the list
      n=Collections.min(l),         //  Min of the list
      i=0,q;                        //  Two temp integers
  for(;i<(q=l.size());i++)          //  Loop (1) over the list
    if(l.subList(i+1,q).size()>0    //   If the sublist right of the current item is not empty
    &&l.get(i)>=Collections.min(l.subList(i+1,q))) 
                                    //   and if the current item is larger or equal to the lowest value of this sublist
      l.remove(i--);                //    Remove the current item from the main list
                                    //  End of loop (1) (implicit / single-line body)
  for(i=0;n<=m;)                    //  Loop (2) from min to max
    if(i<l.size()                   //   If the current item doesn't exceed the list's size
    &&l.get(i++)==n)                //   and the items are in order so far
      n++;                          //    Go to the next item
    else                            //   Else:
      return 0>1;//false            //    Return false
                                    //  End of loop (2) (implicit / single-line body)
  return 1>0;//true                 //  Return true
}                                   // End of method

1

আর, 88 85 বাইট

y=NULL;for(i in x<-scan())if(all(i<x[-(1:(F<-F+1))]))y=c(y,i);all(min(x):max(x)%in%y)

এটি সম্ভবত আরও গল্ফ করা যেতে পারে। এর উপাদানগুলির উপর লুপ করে x, সমস্ত আসন্ন মানগুলি বড় হয় কিনা তা পরীক্ষা করে এবং তারপরেই সেই উপাদানটি রাখা হয়। লুপ পর তা থেকে একটি ক্রম তৈরি করে min(x)করার max(x), এবং চেক %in%সমস্ত মূল্যবোধের ছেঁটে সংস্করণে অন্তর্ভুক্ত করা হয় যদি x


ডেনিসের উত্তরটি বন্দর দিয়ে আমরা 53 বাইটে নামতে পারি। function(n)all(unique(cummin(rev(n)))==max(n):min(n))
জিউসেপ

1

জাভাস্ক্রিপ্ট (ES6), 60 বাইট

s=>(o={},s.reverse().every((n,i)=>!i|o[n+1]|o[n]&&(o[n]=1)))

Ungolfed:

s=>(
  o={},
  s.reverse().every((n,i)=>
    !i|o[n+1]|o[n]&&(o[n]=1)
  )
)

এটি একটি সহজ অ্যালগরিদম:

বিপরীতে অ্যারেটি পরিবেশন করুন এবং নিশ্চিত করুন যে প্রতিটি সংখ্যা (প্রথমটি ব্যতীত) ইতিমধ্যে দেখা একটি সংখ্যার চেয়ে কম বা সমান।

স্নিপেট:


1

হাস্কেল, 62 বাইট

g(a:b)=[a|all(a<)b]++g b
g a=a
f x=g x==[minimum x..maximum x]

এটি অনলাইন চেষ্টা করুন!

সংজ্ঞাটির প্রত্যক্ষ বাস্তবায়ন যেখানে gউপাদানগুলি তার ডানদিকে থাকা উপাদানের তুলনায়> = থাকলে তা সরান।


1

সি #, 69 বাইট

s=>s.Where((e,i)=>s.Skip(i+1).All(r=>e<r)).Count()==s.Max()-s.Min()+1

সংক্ষেপে:
s = ইনপুট (গুলি) ইক্যুয়েন্সটি
এস উপাদান থেকে গ্রহণ করে যেখানে এই আইটেমের পরে সমস্ত আইটেম (এড়িয়ে যাওয়া (I) ndex + 1 আইটেম), বর্তমান মান বেশি
এগুলি গণনা করা হয়, এবং দেখুন যে পরিমাণটি বাম পরিমাণ প্রত্যাশিত পরিমাণের সমান কিনা ((সর্বাধিক) ইমাম মান বিয়োগ (মিনিট) ইমাম) সংখ্যার পরিমাণ

এটি অনলাইন চেষ্টা করুন!


@ এমডিএক্সএফ আপনি কি তাকে স্বাগত জানাতে চান?
স্টান স্ট্রাম

@ স্ট্যানস্ট্রাম আমি কি নিয়মকে ভুল বুঝেছি? আমার ইংরেজি কি খুব অগোছালো? i -am- প্রথমবারের মতো পোস্টিং ...
বড়োদাস

না না! পিপিসিজিতে একজন নতুন আগতকে স্বাগত জানাই এটি আমার পক্ষে একটি বিশেষ সুযোগ, এবং আমি তাকে জিজ্ঞাসা করছিলাম যে তিনি আপনাকে হাই বলতে চান কিনা
স্টান স্ট্রাম

দেখে মনে হচ্ছে এই অধিকার আপনার উভয়েরই জন্য। ধন্যবাদ, লোকেরা ^^
বারোডাস

এটি একটি দুর্দান্ত প্রথম উত্তর, আশা করি আপনার পিপিসিজির ভবিষ্যতে মজা পাবেন!
স্টান স্ট্রাম

0

জাভাস্ক্রিপ্ট (ES6), 82 73 72 70 বাইট

একটি বুলিয়ান ফেরত দেয়।

a=>a.filter((x,i)=>k-=a.every(y=>~i--<0|y>x,m=x>m?x:m),m=k=0)[0]+~m==k

কিভাবে?

আমরা প্রতিটি উপাদান বারবার এক্স ইনপুট অ্যারের একটি , সর্বোচ্চ সম্মুখীন মান সম্পর্কে অবগত থাকার মি এবং নম্বর -k মান যে তার চেয়ে অনেক বেশী হয় না বা তাদের ডানদিকে কোনো সদস্য সমান। সংজ্ঞা অনুসারে, বৈধ মানগুলি কঠোরভাবে আরোহণের ক্রমে উপস্থিত হয়।

এর filter()পরিবর্তে আমরা ব্যবহার করি map(), যাতে কে নেতিবাচক না হওয়া পর্যন্ত সমস্ত উপাদান ফিল্টার হয়ে যায়। এটি আমাদের প্রথম বৈধ উপাদানকে আলাদা করতে দেয়, যা অ্যারের সর্বনিম্ন মান হওয়ার নিশ্চয়তাও দেয়।

পরিশেষে, আমরা পরীক্ষা করি কিনা minimum - (maximum + 1) == -number_of_valid_elements:

a.filter(...)[0] + ~m == k

পরীক্ষার মামলা

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