हिल्बर्ट ग्रांड होटल


23

परिचय

आप में से कुछ लोगों ने हिल्बर्ट के ग्रांड होटल के बारे में सुना होगा । वहां के प्रबंधक ने अपनी सूची खो दी है जहां मेहमान रह रहे हैं लेकिन उसके पास अभी भी वह क्रम है जिसमें उन्होंने चेक किया था। प्रत्येक अतिथि अपने मूल्य से कम के कमरे की संख्या के साथ एक कमरे में नहीं रह सकता है और यदि अतिथि को कम में जोड़ा जाता है कमरा, उच्च कमरे वाले सभी मेहमान जिनके बीच कोई खाली जगह नहीं है और नए मेहमान को एक कमरे में स्थानांतरित किया जाता है। क्या आप उसे ढूंढने में मदद कर सकते हैं जहां प्रत्येक अतिथि रह रहा है?

आवश्यकताएँ

एक प्रोग्राम लिखें जो इनपुट के रूप में प्राकृतिक संख्याओं की एक आदेशित सूची प्राप्त करता है और उन्हें अपने सूचकांक में रखता है। यदि उस सूचकांक में पहले से ही एक मूल्य है, तो इसे सूची में अगली प्रविष्टि तक स्थानांतरित कर दिया जाता है। पहली खाली (0 या अपरिभाषित) जगह मिलने तक यह प्रक्रिया दोहराती है। वर्तमान उच्चतम सूचकांक और किसी भी नए इनपुट के बीच कोई अपरिभाषित स्थान 0 जोड़कर भरा जाएगा। चूंकि यह हिल्बर्ट ग्रांड होटल है, वर्तमान उच्चतम कब्जे वाले सूचकांक से अधिक कमरे मौजूद नहीं हैं।

इनपुट और आउटपुट

इनपुट प्राकृतिक संख्याओं की एक क्रमबद्ध सूची होगी (इनपुट के किसी भी स्वीकृत फ़ॉर्म के माध्यम से पढ़ने की अनुमति दी जाती है) इनपुट में
प्रत्येक संख्या को एक अतिथि माना जाता है जो होटल में पहुंच रहा है और आगमन के क्रम में है

आउटपुट मेहमानों की अंतिम व्यवस्था होगी (संख्या)

उदाहरण

इनपुट: १ ३ १
आउटपुट: १ १
स्टेप बाय स्टेप:

इंडेक्स १ में रूम बनाएँ और १ में जगह दें
१ ० ३
इंडेक्स ३ तक कमरे बनाएँ और रूम ३ में जगह ३
१ १
कमरे के कंटेंट को १ शिफ्ट करें। एक कमरा और जगह 1 कमरे में 1

इनपुट: १ ४ ३ १ २ २ १
आउटपुट : १ १ २ २ ३ ४
कदम से कदम:

सूचकांक १ पर कमरा बनाएँ और १ इसमें जगह दें
१ ० ० ४ ४
कमरे तक के कमरे बनाएँ ४ और कमरे के ४ में जगह ४
१ ० ३ 4
कमरे में 3 जगह 3
1 1 3 4
एक कमरे में 1 की शिफ्ट सामग्री और कमरे में 1 जगह 1
1 2 1 3 3
कमरे की सामग्री 2 से 4 एक कमरे में जगह और 2 कमरे 2
1 1 2 3 में जगह 4
कमरों की सामग्री को 1 से 5 तक एक कमरे में रखें और 1 को कमरे में रखें

इनपुट: 10
आउटपुट: 0 0 0 0 0 0 0 0 0 0 0 10
कदम से कदम:
0 0 0 0 0 0 0 0 0 0 0 10
कमरे के लिए 10 कमरे बनाएँ और 10 को कमरे में रखें 10

नोट्स:
0 अनुक्रमित के साथ काम करना ठीक है और आप उस स्थिति में आउटपुट के सामने एक 0 डाल सकते हैं

मानक कमियां निषिद्ध हैं, बाइट्स जीत में सबसे छोटा कोड है

जवाबों:



5

PHP 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

जावास्क्रिप्ट (ईएस 6), 144 120 बाइट्स

अरनौलद को 20 बी धन्यवाद और नील को 11 बी धन्यवाद दिया

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)काम कर सकता है?
अरनौलद

चतुर चाल, और हाँ, यह काम करता है। धन्यवाद।
ल्यूक

ओह, मैं टेस्टकेस 2 का परीक्षण करना भूल गया, और यह पता चला कि मेरा कार्य सरणी के सामने चीजों को जोड़ने का समर्थन नहीं करता है ...
ल्यूक

मेरा मानना ​​है कि आप इसके c.map(n=>n|0)बजाय कर सकते थे (c+'').split`,`.map(Number)
ETHproductions

@ETHproductions समस्या यह है कि map()सरणी में अपरिभाषित मूल्यों पर बिल्कुल भी पुनरावृति नहीं होती है। (उस ने कहा, मुझे पूरा यकीन है कि मेरे द्वारा सुझाए गए तरीके से एक छोटा तरीका है।)
अरनौल

1

जावास्क्रिप्ट (ईएस 6), 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

जावास्क्रिप्ट (ईएस 6), 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 के लिए मान्य। प्रत्येक कोड पर मूल्य के साथ आयोजित मूल्य को स्वैप करने के माध्यम से यह कोड कार्य करता है जब तक कि आयोजित मूल्य 0. नहीं है। अगर यह सरणी में अभी तक नहीं सूचकांक तक पहुंचता है, तो यह सरणी के अंत तक शून्य जोड़ता है जब तक कि सरणी में शामिल नहीं होता है सूचकांक। 9 बाइट्स बंद करने के लिए गेहूं के जादूगर और xnor को धन्यवाद


1
अपने सभी इंडेंट के लिए स्पेस का उपयोग करने के बजाय आप लेवल एक इंडेंट्स के लिए स्पेस का उपयोग कर सकते हैं, लेवल दो के लिए एक टैब और लेवल तीन के लिए स्पेस के बाद एक टैब।
गेहूं जादूगर

मैं एक बेवकूफ संपादक के साथ काम कर रहा था जिसने टैब को 4 स्थानों में बदल दिया XP
fɛnɪt Jank

1
के लिए शर्तों whileऔर ifparens की जरूरत नहीं है। आप एक लाइन से अलग पर कई बयान रख सकते हैं ;की तरह if(i<d):r.extend([0]*(d-i));i=dजब तक कि वहाँ बाद में बयान में नियंत्रण प्रवाह है।
xnor
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.