হিলবার্টের গ্র্যান্ড হোটেল


23

ভূমিকা

আপনারা কেউ কেউ হিলবার্টের গ্র্যান্ড হোটেলের কথা শুনে থাকতে পারেন । সেখানে থাকা ম্যানেজার তার অতিথিদের কোথায় অবস্থান করছেন তার তালিকাটি হারিয়ে ফেলেছে তবে তারপরেও তারা যাচাই-বাছাই করেছে তার ক্রমটি তার কাছে রয়েছে Each প্রতিটি অতিথির রুমের সাথে তার মানের চেয়ে কম নম্বর নম্বর থাকতে পারে না এবং কোনও অতিথিকে যদি নীচে যুক্ত করা হয় রুম, উচ্চতর কক্ষগুলিতে সমস্ত অতিথিদের মধ্যে খালি জায়গা নেই এবং নতুন অতিথিকে একটি কক্ষে স্থানান্তরিত করা হবে। আপনি কি তাকে খুঁজে পেতে সাহায্য করতে পারেন প্রতিটি অতিথি কোথায় অবস্থান করছেন?

আবশ্যকতা

একটি প্রোগ্রাম লিখুন যা ইনপুট হিসাবে প্রাকৃতিক সংখ্যার একটি আদেশযুক্ত তালিকা পেয়ে থাকে এবং তাদের সূচীতে রাখে। যদি সেই সূচকে ইতিমধ্যে কোনও মান থাকে তবে তা তালিকায় পরবর্তী প্রবেশিকায় স্থানান্তরিত হয়। প্রথম খালি (0 বা অপরিজ্ঞাত) স্থান না পাওয়া পর্যন্ত এই প্রক্রিয়াটি পুনরাবৃত্তি করে। বর্তমান সর্বাধিক সূচক এবং যে কোনও নতুন ইনপুটগুলির মধ্যে যে কোনও অপরিজ্ঞাত স্পেস 0 টি যোগ করে পূরণ করা হবে। যেহেতু এটি হিলবার্টের গ্র্যান্ড হোটেল, বর্তমান সর্বোচ্চ অধিকৃত সূচকের চেয়ে উঁচু কক্ষগুলির অস্তিত্ব নেই।

ইনপুট এবং আউটপুট

ইনপুট প্রাকৃতিক সংখ্যার একটি আদেশযুক্ত তালিকা হবে (যে কোনও ইনপুটের স্বীকৃত ফর্মের মাধ্যমে পড়ার অনুমতি দেওয়া হয়)
ইনপুটটির প্রতিটি সংখ্যা হোটেলটিতে আগত একজন অতিথি হিসাবে বিবেচিত হয় এবং আগমনীর ক্রম অনুসারে

আউটপুট হবে অতিথিদের চূড়ান্ত ব্যবস্থা (সংখ্যা)

উদাহরণ

ইনপুট: 1 3 1
আউটপুট: 1 1 3
ধাপে ধাপ:
1
সূচক 1 তে ঘর তৈরি করুন এবং এটিতে
1 রাখুন 1 0 3
সূচী 3 পর্যন্ত ঘর তৈরি করুন এবং 3 রুমে 3 রাখুন
1 1 3
ঘরের বিষয়বস্তু স্থানান্তরিত করুন 1 একটি কক্ষ এবং কক্ষ 1 এ 1 রাখুন

ইনপুট: 1 4 3 1 2 1
আউটপুট : 1 1 2 1 3 4
ধাপে ধাপ:
1
সূচী 1 এ ঘর তৈরি করুন এবং এতে 1 স্থাপন করুন
1 0 0 4
সূচী 4 পর্যন্ত কক্ষ তৈরি করুন এবং ঘরে 4
1 0 3 রাখুন 4
ঘরে 3 স্থান 3
1 1 3 4
কক্ষের লিখিত সামগ্রী 1 কক্ষের উপরে এবং 1 কক্ষে 1 স্থান 1
1 2 1 3 4
কক্ষের লিখিত সামগ্রী 2 থেকে 4 একটি রুমে শিফট করুন এবং 2 রুমে 2 রাখুন
1 1 2 1 3 রাখুন 4
কক্ষের সামগ্রী 1 থেকে 5 পর্যন্ত এক রুমে শিফট করুন এবং কক্ষ 1 এ 1 রাখুন

ইনপুট: 10
আউটপুট: 0 0 0 0 0 0 0 0 0 0 10
ধাপে ধাপ:
0 0 0 0 0 0 0 0 0 0 10
কক্ষ পর্যন্ত রুম তৈরি করুন এবং ঘরে 10 এ স্থান দিন

নোটস:
0 টি সূচকের সাথে কাজ করা ভাল এবং এই ক্ষেত্রে আপনি আউটপুটটির সামনের দিকে 0 টি প্রবেশ করান

স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ, বাইট জেতে সংক্ষিপ্ততম কোড

উত্তর:



5

পিএইচপি 93 বাইট

for(;$r=$g?$r+1:$g=$argv[++$i];[$g,$h[$r]]=[$h[$r],$g])$h=array_pad($h?:[],$g,0);print_r($h);

0 সূচকযুক্ত। একটি 2 ইন 1 লুপ ব্যবহার করে যা একটি 0 (বা বর্তমান নূতন কক্ষ পেরিয়ে একটি নাল ফর্ম) পাওয়ার পরে পরবর্তী অতিথিকে দেখায়। ব্যবহার করুন:

php -r "for(;$r=$g?$r+1:$g=$argv[++$i];[$g,$h[$r]]=[$h[$r],$g])$h=array_pad($h?:[],$g,0);print_r($h);" 1 4 3 1 2 1

Ungolfed:

for( $hotel = []; $room = $guest = $argv[ ++$i ]; )
{
    for( $hotel = array_pad( $hotel, $guest, 0 ); $guest; $room++ )
    {
        $last = $hotel[ $room ];
        $hotel[ $room ] = $guest;
        $guest = $last;
    }
}
print_r( $hotel );

হাহাহা, দেখে মনে হচ্ছে এটি পার্ল হতে পারে!
জাচারি ক্রেগ


2

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

আরনাউল্ডকে 20 বি এবং নীলকে 11B ধন্যবাদ সংরক্ষণ করা হয়েছে

a=>a.map((d,c)=>b[d]?(b.splice(d,0,d),b.splice([...b,0].find‌​Index((e,g)=>g&&!e),‌​1)):b[d]=d,b=[])&&[...b].map(c=>c|0)

ব্যবহার

আপনি ভেরিয়েবলটি ফাংশনটি বরাদ্দ করতে পারেন fএবং তালিকাটি অ্যারে হিসাবে দেওয়া উচিত। উদাহরণ:

f=a=>a.map((d,c)=>b[d]?(b.splice(d,0,d),b.splice([...b,0].find‌​Index((e,g)=>g&&!e),‌​1)):b[d]=d,b=[])&&[...b].map(c=>c|0)
f([1,4,3,1,2,1])

আউটপুট

আউটপুট পাশাপাশি একটি অ্যারে হয়। যেহেতু জাভাস্ক্রিপ্ট শূন্য-সূচকযুক্ত কাজ করে, সেখানে অতিরিক্ত 0 টি সামনে রয়েছে।

[0, 1, 1, 2, 1, 3, 4]

আমি সত্যিই এটি পরীক্ষা করিনি, তবে (c+'').split`,`.map(Number)কাজটি করতে পারব?
আর্নল্ড

চতুর কৌশল, এবং হ্যাঁ, এটি কাজ করে। ধন্যবাদ।
লুক

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

আমি বিশ্বাস করি আপনি c.map(n=>n|0)বরং এটি করতে পারেন (c+'').split`,`.map(Number)
ETH প্রোডাকশনস

@ ইথ প্রডাকশনগুলি সমস্যাটি হ'ল অ্যারেতে অপরিজ্ঞাত মানগুলিতে map()মোটেও পুনরাবৃত্তি হয় না। (এটি বলেছিল, আমি দৃ sure়ভাবে নিশ্চিত যে আমার প্রস্তাবের চেয়ে আরও ছোট একটি উপায় আছে))
আর্নাউল্ড

1

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

f=([n,...a],r=[],p=n,m=r[p],_=r[p]=n)=>n?m?f([m,...a],r,p+1):f(a,r):[...r].map(n=>n|0)

ফলটিতে শূন্যের শীর্ষস্থানীয় কারণ জাভাস্ক্রিপ্ট 0-সূচিযুক্ত।


1

গণিত, 98 বাইট

Fold[If[Length@#<#2,PadRight@##~Append~#2,Join[Take@##,{#2},Drop@##/.{a___,0,b__}->{a,b}]]&,{0},#]&

নামী ফাংশন ইতিবাচক পূর্ণসংখ্যার একটি তালিকা গ্রহণ করে এবং পূর্ণসংখ্যার 0-সূচিযুক্ত তালিকা প্রদান করে। পুরো Ifফাংশনটি আংশিকভাবে সম্পন্ন তালিকা এবং যুক্তি হিসাবে সন্নিবেশ করতে পরবর্তী পূর্ণসংখ্যার গ্রহণ করে। যদি পরবর্তী পূর্ণসংখ্যার আংশিক তালিকার দৈর্ঘ্য অতিক্রম করে, PadRight@##~Append~#2সে অনুযায়ী আংশিক তালিকাকে বাড়িয়ে দেয়; অন্যথায়, Join[Take@##,{#2},Drop@##/.{a___,0,b__}->{a,b}]]পরবর্তী পূর্ণসংখ্যাটিকে তার অবস্থানে সন্নিবেশ করে, তারপরে 0পাওয়া প্রথমটিকে এটি ফেলে দেয় । Fold[...,{0},#]খালি হোটেল থেকে শুরু করে মূল তালিকাটিতে এই ফাংশনটি বারবার প্রয়োগ করে {0}এবং চূড়ান্ত হোটেল তালিকার আউটপুট দেয়।


1

জাভাস্ক্রিপ্ট (ES6), 81

0 ইনডেক্সিং ব্যবহার করা হচ্ছে

l=>l.map(v=>(s=(p,v,w=r[p])=>(w&&s(p+1,w),r[p]=v))(v,v),r=[])&&[...r].map(x=>~~x)

কম গল্ফড

l => {
  s = ( // recursively insert a value, shifting present values up until it finds an empty spot
       p, // insert position
       v, // value to insert
       w = r[p] // value a current position
      ) => ( 
         w && s(p+1,w), // if there is a value, put it in the next position
         r[p] = v // now the current place is empty
      );
  r = []; // initialize the result array   
  l.map( // execute the following for each value in input
     v => s(v,v) // insert value
  );
  return [...r].map(x=>~~x) // fill the missing places with 0
}

পরীক্ষা

F=
l=>l.map(v=>(s=(p,v,w=r[p])=>(w&&s(p+1,w),r[p]=v))(v,v),r=[])&&[...r].map(x=>~~x)

out=x=>O.textContent+=x+'\n'

out([1,3,1]+' -> '+F([1,3,1]))
out([10]+' -> '+F([10]))

function go() {
   var v = I.value.match(/\d+/g).map(x=>+x)
   out(v +' -> ' + F(v))
}
go()
<input id=I value='1 4 3 1 2 1'><button onclick='go()'>go</button>
<pre id=O></pre>


1

আর, 133 বাইট

a=scan()
z=rep(0,max(a))
for(i in a){b=match(0,z[-1:-i])+i
if(z[i])z[i:b]=c(i,z[i:(b-1)])else(z[i]=i)
z=c(z,0)}
z[1:max(which(z!=0))]

খারাপ ইনডেক্সিংয়ের সমস্যা এড়াতে, আমি কয়েকটি শূন্য দিয়ে প্যাড করি এবং তারপরে সেগুলি শেষ করে ফেলি। এটি সম্ভবত সেরা সমাধান নয়, তবে এটি কার্যকর হয়।


0

পাইথন, 134 125 116 বাইট

def a(b):
 r=[]
 i=0
 for n in b:
    d=n
    while n:
     if i<d:r.extend([0]*(d-i));i=d
     n,r[d-1]=r[d-1],n;d+=1
 return r

পাইথন 2.7.13 এবং 3.6.0 উভয়ের জন্যই বৈধ Val এই কোডটি ধরে রাখার মান 0 না হওয়া পর্যন্ত প্রতিটি সূচকে থাকা মানের সাথে ধরে রাখা মানটি অদলবদলের মাধ্যমে ফাংশন করে যদি এটি কোনও সূচীতে এখনও অ্যারেতে পৌঁছায় না, এটি অ্যারের শেষে জিরো যুক্ত করে থাকে যতক্ষণ না অ্যারে থাকে সূচি। গম উইজার্ড এবং xnor কে প্রত্যেককে 9 টি বাইটে গল্ফ দেওয়ার জন্য ধন্যবাদ


1
আপনার সমস্ত ইনডেন্টের জন্য স্পেস ব্যবহার না করে আপনি স্তর এক ইন্ডেন্টের জন্য একটি স্পেস ব্যবহার করতে পারেন, স্তর দুইটির জন্য একটি ট্যাব এবং তারপরে তিনটি স্তরের জন্য একটি ট্যাব।
গম উইজার্ড

আমি একটি মূঢ় সম্পাদক যা 4 শূণ্যস্থান এক্সপি ট্যাব রূপান্তরিত সঙ্গে কাজ ছিল
fənɛtɪk

1
জন্য শর্ত whileএবং ifপ্রয়োজন না বাম বন্ধনী। পরবর্তী বিবৃতিতে নিয়ন্ত্রণ প্রবাহ না থাকলে আপনি এক লাইনে একাধিক স্টেটমেন্ট রেখে ;দিতে পারেন like if(i<d):r.extend([0]*(d-i));i=d
xnor
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.