মানগুলির তালিকা থেকে ব্যাপ্তি নির্ধারণ করুন


18

অনন্য, ধনাত্মক পূর্ণসংখ্যার একটি অরসেটেড তালিকা দেওয়া হয়েছে, সিক্যুয়াল পূর্ণ সংখ্যার দীর্ঘতম সম্ভাব্য ব্যাপ্তির সংক্ষিপ্ততম তালিকা আউটপুট দেয়।

ইনপুট

  • অনন্য, ধনাত্মক পূর্ণসংখ্যার তালিকাভুক্ত তালিকা
    • যেমন 9 13 3 11 8 4 10 15
  • ইনপুট নিম্নলিখিত যে কোনও একটি থেকে নেওয়া যেতে পারে:
    • stdin
    • কমান্ড লাইন আর্গুমেন্ট
    • ফাংশন যুক্তি

আউটপুট

  • স্ট্যান্ডআউট বা আপনার ভাষার নিকটতম অনুরূপ আউটপুটে এক লাইনে মুদ্রিত রেঞ্জ বা স্বতন্ত্র মানগুলির একটি আদেশযুক্ত তালিকা।
    • যদি দুটি বা ততোধিক ক্রমিক সংখ্যার (মান অনুসারে ক্রম অনুসারে তালিকায় অবস্থিত নয়) উপস্থিত থাকে তবে সেগুলি অন্তর্ভুক্ত করে অন্তর্ভুক্তকরণ পরিসীমা হিসাবে চিহ্নিত করা হবে - যেমন 8-11
    • অন্যান্য সমস্ত সংখ্যক কেবল অন্য চিহ্ন সহ প্রিন্ট করা হয়
    • একটি একক স্থান আউটপুটটি সীমিত করে দেবে
  • নাম্বার ইনপুট উপস্থিত না আউটপুটে করা উচিত হবে না, যেমন 3 5 6করতে সংক্ষিপ্ত করা যাবে না 3-6কারণ 4উপস্থিত নেই

উদাহরণ

সফলভাবে সম্পন্ন হয়েছে:

 IN> 9 13 3 11 8 4 10 15 6
OUT> 3-4 6 8-11 13 15

 IN> 11 10 6 9 13 8 3 4 15
OUT> 3-4 6 8-11 13 15

 IN> 5 8 3 2 6 4 7 1
OUT> 1-8

 IN> 5 3 7 1 9
OUT> 1 3 5 7 9

ভুল:

 IN> 9 13 3 11 8 4 10 15
OUT> 3-15

রেঞ্জের ইনপুটটিতে নেই মান রয়েছে

 IN> 9 13 3 11 8 4 10 15
OUT> 3 4 8 9 10 11 13 15

সমস্ত ক্রমিক মানগুলি একটি ব্যাপ্তি হিসাবে উপস্থাপন করা উচিত

 IN> 9 13 3 11 8 4 10 15
OUT> 3-4 8-9 10-11 13 15

বিভক্ত পরিসীমা, 8-9এবং 10-11হওয়া উচিত8-11

 IN> 9 13 3 11 8 4 10 15
OUT> 8-9 13 10-11 3-4 15

আউটপুট সঠিকভাবে অর্ডার করা হয়নি

নিয়ম

  • স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়
  • আপনার ভাষার যদি এটি করার কোনও ক্রিয়া থাকে তবে এটি অনুমোদিত নয়
  • আপনি একটি সম্পূর্ণ প্রোগ্রাম, বা একটি ফাংশন লিখতে পারেন
  • শ্বেত স্পেস পেছনে কিছু যায় আসে না

স্কোরিং

  • সর্বনিম্ন বাইট জয়

1
প্রথম বাক্যটি আসলেই বিভ্রান্তিকর। আমি "সিক্যুয়ালিয়াল পূর্ণসংখ্যার দীর্ঘতম সম্ভাব্য ব্যাপ্তির সংক্ষিপ্ত তালিকা আউটপুট" বলার পরামর্শ দেব। অন্যথায়, দুর্দান্ত চ্যালেঞ্জ!
নাথান মেরিল

2
আমি নিশ্চিত যে আমাদের আগে এই চ্যালেঞ্জটি পড়েছিলাম তবে আমি সঠিক অনুসন্ধানের পদটি নিয়ে আসছি না। কারও মনে আছে?
xnor

4
@ কোরিওগবার্ন যাইহোক, আপনাকে পিপিসিজিতে পোস্ট করার জন্য কীভাবে প্ররোচিত করেছিল? আমরা কেন নতুন ব্যবহারকারীদের পুরো গোছা পেয়েছি তা
জানার

2
@ এক্সনর আমি কয়েক মাস ধরে সাইটে নজর রেখেছি। আমি যে ভাষাগুলি ব্যবহার করি সেগুলির কোনওটিই উত্তরগুলির পক্ষে সাধারণত ভাল প্রার্থী হয় না এবং আজ অবধি আমার কাছে পোস্ট করার কোনও প্রশ্নই আসেনি।
কোরি ওগবার্ন

1
@ এক্সনর: এটি মাল্টেসেনের হোম ওয়ার্ক তালিকার মতো তবে একই রকম নয়।
অ্যালেক্স এ

উত্তর:


9

পাইথন 2, 123 120 বাইট

N=sorted(map(int,raw_input().split(' ')));print(''.join((''if n+1in N else'-'+`n`)if n-1in N else' '+`n`for n in N)[1:])

যদি ইনপুটটি কোনও কার্যকারিতা যুক্তি হিসাবে তালিকা হতে পারে তবে (শর্তসাপেক্ষে mbomb007 এবং xnor ধন্যবাদ)

93 90 81 বাইট

def f(N):print''.join((' '+`n`,`-n`*-~-(n+1in N))[n-1in N]for n in sorted(N))[1:]

(Leading 77 বাইট যদি শীর্ষস্থানীয় সাদা স্থান গ্রহণযোগ্য হয় - ফাইনালটি ড্রপ করুন [1:])


আপনি পাইথন ২ এ সরে গেলে কয়েকটি বাইট সংরক্ষণ করতে আপনি পরিবর্তন str(n)করতে `n`পারেন
mbomb007

এছাড়াও আপনি একটি ফাংশন যা ব্যবহারের পরিবর্তে ইনপুট হিসাবে একটি তালিকা লাগে তৈরি করতে পারেন raw_input(), এবং আপনি পরিবর্তন করতে পারেন '-'+`n`থেকে `-n`। এবং যেহেতু আপনি এখন পাইথন 2 ব্যবহার করছেন তাই আপনি এর পরে প্রথম বন্ধনী সরিয়ে ফেলতে পারেন print
mbomb007

টুকরো টুকরো স্ট্রিং টুকরো তৈরি করা চালাক। বাইট সাশ্রয়ের জন্য, তালিকা নির্বাচন বা পাটিগণিত অনুসারে শর্তসাপেক্ষ করা সাধারণতঃ খাটো হয় def f(N):print''.join([' '+`n`,`-n`*(n+1 not in N)][n-1 in N]for n in sorted(N))[1:]( যেমন আরও গল্ফ করা যায়)।
xnor

এর set(N)পরিবর্তে আপনি ব্যবহার করতে সক্ষম হতে পারেন sorted(N); সিপিথন ব্যবহার করার সময় এটি সঠিকভাবে ছোট থেকে সর্বনিম্ন পর্যন্ত পুনরাবৃত্তি হবে তবে সমস্ত বাস্তবায়নের জন্য কাজ করার গ্যারান্টিযুক্ত নয় সুতরাং এটি বৈধ কিনা তা নিয়ে কিছু প্রশ্ন রয়েছে is
কেএসব

6

জাভাস্ক্রিপ্ট (ES6): 171 154 140 137 বাইট

টিপসটির জন্য ধন্যবাদ edc65 এবং vihan1086! [...n]খুব সুন্দর তবে বহু-সংখ্যা সংখ্যার কারণে এটি এই ক্ষেত্রে কার্যকর হয় না।

f=n=>{s=e=o='';n.split` `.map(Number).sort((a,b)=>a-b).map(v=>{s=s||v;if(e&&v>e+1){o+=`${s<e?s+'-'+e:s} `;s=v}e=v});return o+(s<e?s+'-'+e:e)}

ES5 বৈকল্পিক, 198 184 183 174 বাইট

f=function(n){s=e=o='';n.split(' ').map(Number).sort(function(a,b){return a-b}).map(function(v){s=s||v;if(e&&v>e+1){o+=(s<e?s+'-'+e:s)+' ';s=v}e=v});return o+(s<e?s+'-'+e:e)}


কোন বন্ধনীর সাথে এন.স্প্লিট আমার কাছে সম্পূর্ণ নতুন! তবে [...n]আরও ভাল
edc65

@ edc65 ধন্যবাদ, এর মতো স্ট্রিংটি আনপ্যাক করার কথা কখনও ভাবেনি।
rink.attendant.6


... তবে ... এটি কোনও উদাহরণ দিয়ে কাজ করে? মাল্টিডিজিট সংখ্যা রয়েছে তাই আপনার "" (ফাঁকা স্থান) "" (ফাঁকা স্ট্রিং) না দিয়ে বিভক্ত হওয়া দরকার। আমি সম্ভবত আপনাকে ভুল টিপ
দিয়েছি

@ edc65 আমি ভেবেছিলাম কিছু অন্যরকম দেখাচ্ছে তবে আমি বুঝতে পারি পরীক্ষার কেস ব্যর্থ হয়েছে। এখনও নতুন কিছু শিখতে ভাল
rink.attendant.6

4

রুবি, 86 84 বাইট

s=->*a{puts a.sort.slice_when{|i,j|i+1!=j}.map{|e|e.size<2?e:[e[0],e[-1]]*"-"}*" "}

# demo
s[9, 13, 3, 11, 8, 4, 10, 15, 6]
# => 3-4 6 8-11 13 15

এই জন্য দস্তাবেজে একটি উদাহরণ থেকে সামান্য golfed সংস্করণ slice_when


4

সিজেম, 35 বাইট

l~${__0=f-ee::=0+0#/((oW>Wf*S+oe_}h

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

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

l~$     e# Read a line from STDIN, evaluate it and sort the result.
{       e# Do:
  _     e#   Push a copy of the array.
  _0=f- e#   Subtract the first element from all array elements.
  ee    e#   Enumerate the differences: [0 1 4] -> [[0 0] [1 1] [2 4]]
  ::=   e#   Vectorized quality: [i j] -> (i == j)
  0+    e#   Append a zero.
  0#    e#   Push the first index of 0.
  /     e#   Split the array into chunks of that size.
  (     e#   Shift out the first chunk.
  (o    e#   Print its first element.
  W>    e#   Discard all remaining elements (if any) except the last.
  Wf*   e#   Multiply all elements of the remainder by -1.
  S+o   e#   Append a space and print.
  e_    e#   Flatten the rest of the array.
}h      e# Repeat while the array is non-empty.

4

রুবি, 70 বাইট

এই জাতীয় সমস্যাগুলি আমাকে উপযুক্ত পদ্ধতির জন্য রুবি এপিআই পরীক্ষা করতে বাধ্য করে এবং আজ আমি একটি নতুন আবিষ্কার করেছি Array#slice_when:, রুবি ভি ২.২ এ নতুনভাবে পরিচয় হয়েছে এবং আপাতদৃষ্টিতে এই সঠিক পরিস্থিতির জন্য উদ্দিষ্ট হয়েছে :)

f=->a{puts a.sort.slice_when{|i,j|j-i>1}.map{|x|x.minmax.uniq*?-}*' '}

অ্যারে বাছাই এবং যথাযথভাবে টুকরো টুকরো করার পরে, এটি প্রতিটি উপ-অ্যারে নেয় এবং সর্বাধিক এবং নিম্নতম এলিমেন্টের একটি স্ট্রিং তৈরি করে এবং তারপরে এই পুরো অ্যারেটিকে একটি স্ট্রিংয়ের সাথে যুক্ত করে।

উদাহরণ:

f.call [9,13,3,11,8,4,10,15,6] কপি করে প্রিন্ট 3-4 6 8-11 13 15


4

এসডাব্লুআই-প্রোলগ, 165 162 159 বাইট

b(Z,C,[D|E]):-Z=[A|B],(A=:=D+1,(B=[],put(45),print(A);b(B,C,[A,D|E]));(E=[],tab(1),print(A);writef('-%t %t',[D,A])),b(B,A,[A]));!.
a(A):-sort(A,B),b(B,_,[-1]).

খুব খারাপ তবে আবার প্রোলোগ হ'ল ভয়ঙ্কর গল্ফ করার ভাষা

উদাহরণ: a([9,13,3,11,8,4,10,15,6]).আউটপুটস3-4 6 8-11 13 15


3

সিজেম, 38 33 বাইট

@ ডেনিস প্রস্তাবিত আইডিয়া এবং কোড টুকরা ব্যবহার করে নতুন সংস্করণ:

l~$_,,.-e`{~T+\_T+:T;(_2$+W*Q?S}/

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

ইনপুট ফর্ম্যাটটি বর্গাকার বন্ধনীগুলির মধ্যে একটি সিজেএম অ্যারে।

এখানে মূল ধারণাটি হ'ল আমি প্রথমে বাছাই করা ইনপুট ক্রম থেকে একরোটিক অনুক্রমকে বিয়োগ করি:

3  4  8  9 10 11 13 15
0  1  2  3  4  5  6  7  (-)
----------------------
3  3  6  6  6  6  7  8

এই পার্থক্যে, একই ব্যবধানের অংশ যে মানগুলি একই মান হয়। এই পার্থক্যে সিজেএম আরএলই অপারেটর প্রয়োগ করা সরাসরি অন্তরগুলি গণনা করে।

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

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

ব্যাখ্যা:

l~    Get input.
$     Sort it.
_,,   Create monotonic sequence of same length.
.-    Calculate vector difference between the two.
e`    Calculate RLE of difference vector.
{     Loop over entries in RLE.
  ~     Unpack the RLE entry, now have length/value on stack.
  T+    Add position to get original value for start of interval.
  \     Bring length of interval to top of stack.
  _T+:T;  Add length of interval to variable T, which tracks position.
  (     Decrement interval length.
  _     Copy it, we need it once for calculating end value, once for ternary if condition.
  2$    Copy interval start value to top...
  +     ... and add interval length - 1 to get end value.
  W*    Negate end value.
  Q?    Output end value if interval length was > 1, empty string otherwise.
  S     Add a space.
}%    End loop.

এটি আরএলই এর একটি চতুর ব্যবহার! আমার উত্তর থেকে রেঞ্জ হ্যান্ডলিং এবং ইনপুট ফর্ম্যাট ধার করে আপনি 34 বাইটে নামতে পারেন:l~$_,,.-e`{~T+\_T+:T;,f+(\W>Wf*S}/
ডেনিস

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

যথেষ্ট ফর্সা। কেমন হয় l~$_,,.-e{~ টি + _T + +: টি; (: _ 2 $ + + ডব্লিউ * প্রশ্নঃ এস?} / `যদিও যে অনেক আপনার নিজের কোডে আরো অনুরূপ এবং ওজন মাত্র 33 বাইট।
ডেনিস

@ ডেনিস ওকে, আপনি যদি জেদ করেন। :) প্রকৃতপক্ষে, অন্তর শেষের জন্য একটি নেতিবাচক মান উত্পন্ন করার মূল ধারণাটি গ্রহণ করা, এটি এটি বাস্তবায়নের যুক্তিসঙ্গত সোজা উপায় বলে মনে হচ্ছে। ধন্যবাদ।
রেটো কোরাদি

2

কফিস্ক্রিপ্ট, 178 161 বাইট

ঠিক আমার জাভাস্ক্রিপ্ট উত্তর মত। আমার বুঝতে হবে যে যদি বোঝাগুলি ব্যবহারের ফলে সংক্ষিপ্ত কোড আসে in

f=(n)->s=e=o='';n.split(' ').map(Number).sort((a,b)->a-b).map((v)->s=s||v;(o+=s+(if s<e then'-'+e else'')+' ';s=v)if(e&&v>e+1);e=v);o+(if s<e then s+'-'else'')+e

মূল:

f=(n)->o='';s=e=0;n.split(' ').map(Number).sort((a,b)->a-b).forEach((v,i)->if!i then s=v else(o+=s+(if s<e then'-'+e else'')+' ';s=v)if(v!=e+1);e=v);o+(if s<e then s+'-'else'')+e

1

পাইথন 2, 126 122 121 বাইট

আমি জানি এটি আরও খাটো হয়ে উঠতে পারে, ঠিক কোথায় জানি না .. আকারে ইনপুট প্রয়োজন [#, #, #, #, ..., #]

l=sorted(input());s=`l[0]`;c=0;x=1
while x<len(l):y,z=l[x],l[x-1];s+=(('-'+`z`)*c+' '+`y`)*(y-z>1);c=(y-z<2);x+=1
print s

আপনি execপ্রায়শই সমাধান সন্ধান করেন বলে মনে হয় ।
mbomb007

@ mbomb007 আপনি xnor এর কথা ভাবতে পারেন :) এবং আমি মনে করি এই পরিস্থিতিতে লুপিং একই দৈর্ঘ্য এমনকি ছোটও হতে পারে (এটি এখনও যথেষ্ট পরিমাণে খেলেনি)।
কেড

1
কয়েকটি বাইট সংরক্ষণ করার জন্য আপনার while x<len(l)সাথে প্রতিস্থাপন করতে সক্ষম হওয়া উচিত while l[x:]
ম্যাথমান্ডন

1

জাভা, 191 বাইট

void f(int[]a){java.util.Arrays.sort(a);for(int b=a.length,c=b-1,i=0,j=a[0],l=j;++i<b;){if(a[i]!=++j||i==c){System.out.print((l+1==j?l+(i==c?" "+a[c]:""):l+"-"+(i==c?j:j-1))+" ");l=j=a[i];}}}

ব্যাপ্তিগুলির জন্য পরীক্ষা করুন এবং সে অনুযায়ী তাদের মুদ্রণ করুন। দুর্ভাগ্যক্রমে অ্যারেতে সর্বশেষ উপাদানটির জন্য আমাকে একটি বিশেষ কেস তৈরি করতে হয়েছিল কারণ প্রোগ্রামটি শেষ নম্বর বা ব্যাপ্তিটি প্রিন্ট না করেই শেষ হবে।


1

জাভা, 171 162 বাইট

String s(int[] n){Arrays.sort(n);int p=0,b=0;String r="",d="";for(int c:n){if(c==++p)b=1;else{if(b==1){r+="-"+--p+d+c;p=c;b=0;}else{r+=d+c;p=c;}d=" ";}}return r;}

কোনও ইনট অ্যারে হিসাবে ইনপুট নেয়, স্থান-বিভাজিত স্ট্রিং তালিকা হিসাবে আউটপুট দেয়

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