Hilbert's Büyük Otel


23

Giriş

Bazılarınız Hilbert'in Grand Otelini duymuş olabilir . Oradaki yönetici, misafirlerin nerede kaldığını gösteren bir listesini kaybetti, ancak yine de check-in işlemlerinin sırasını aldı. oda, daha yüksek odalarda bulunan tüm misafirler ile aralarında boş yer olmayan yeni misafirler bir odaya kaydırılır. Her misafirin nerede kalacağını bulmasına yardım eder misin?

Gereksinimler

Girdi olarak sıralanan doğal sayılar listesini alan ve dizinlerine yerleştiren bir program yazın. Bu dizinde zaten bir değer varsa, listedeki bir sonraki girişe kaydırılır. Bu işlem, ilk boş (0 veya tanımsız) boşluk bulunana kadar tekrar eder. Geçerli en yüksek dizin ile herhangi bir yeni girdi arasındaki tanımsız boşluklar, 0s eklenerek doldurulacaktır. Bu Hilbert's Grand Hotel olduğundan, mevcut en yüksek işgal edilen endeksten daha yüksek olan odalar mevcut değildir.

Giriş ve çıkış

Giriş, doğal numaraların sıralı bir listesi olacaktır (kabul edilen herhangi bir giriş formundan okunmasına izin verilir) Girilen
her sayı otele gelen bir konuk olarak kabul edilir ve varış sırasına göre sıralanır.

Çıktı konukların son düzenlemesi olacak (sayılar)

Örnekler

Giriş: 1 3 1
Çıkış: 1 1 3
Adım adım:
1
Dizin 1'de oda oluşturun ve içine 1 yerleştirin
1 0 3
Dizin 3'e kadar oda oluşturun ve 3'ü odaya yerleştirin 3
1 1 3
Oda 1'in içeriğini kaydırın bir oda ve yer 1 oda 1

Girdi: 1 4 3 1 2 1
Çıktı : 1 1 2 1 3 4
Adım adım:
1
Dizin 1'de oda oluşturun ve içine 1 koyun
1 0 0 4
Dizin 4'e kadar odalar oluşturun ve 4 numaralı odaya yerleştirin 4
1 0 3 4
Odaya 3 oda 3
1 1 3 4
Oda 1'in bir odaya kaydırılması ve 1 odaya 1 odasının yerleştirilmesi 1
1 2 1 3 4
Oda 2 ila 4'in bir odaya kaydırılması ve oda 2'nin 2 yerleştirilmesi 2
1 1 2 1 3 4
Oda 1'den 5'e kadar oda içeriği bir odaya 1 ve oda 1'e 1 yerleştirin

Giriş: 10
Çıkış: 0 0 0 0 0 0 0 0 0 0 0 10
Adım adım:
0 0 0 0 0 0 0 0 0 10
Oda 10'a kadar oda oluşturun ve 10 odaya 10 yerleştirin

Notlar:
0 dizinli olarak çalışmak iyidir ve bu durumda çıktının önüne 0 ekleyebilirsiniz.

Standart boşluklar yasak, baytlarda en kısa kod kazanır

Yanıtlar:



5

PHP 93 bayt

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

0 dizin oluşturuldu. 0 (veya geçerli son odanın ötesine geçen boş bir form) aldıktan sonra bir sonraki konuyu arayan 2'si 1 arada döngü kullanır. Gibi kullanın:

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 );

Hahaha, neredeyse perl olabilir gibi görünüyor!
Zachary Craig,


2

JavaScript (ES6), 144 120 bayt

Arnauld sayesinde 20B, Neil sayesinde 11B kaydedildi

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)

kullanım

Fonksiyonu değişkene atayabilirsiniz fve listeye bir dizi verilmelidir. Örnek:

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])

Çıktı

Çıktı da bir dizidedir. Javascript sıfır dizinli çalıştığı için, fazladan bir ön 0 var.

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

Bunu gerçekten test etmedim, ama (c+'').split`,`.map(Number)işi yapabilir mi?
Arnauld

Zekice bir numara ve evet, işe yarıyor. Teşekkürler.
Luke

Hata! Testcase 2'yi test etmeyi unuttum ve fonksiyonumun dizinin önüne bir şeyler eklemeyi desteklemediği ortaya çıktı ...
Luke

Senin c.map(n=>n|0)yerine yapabileceğine inanıyorum (c+'').split`,`.map(Number).
ETHProductions

@ETHproductions Sorun, map()dizideki tanımsız değerlerde hiç yineleme yapmamasıdır. (Dediğim gibi, önerdiğimden daha kısa bir yol olduğuna eminim.)
Arnauld

1

JavaScript (ES6), 86 bayt

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)

JavaScript 0 dizinli olduğundan sonuçta sıfıra gidiyor.


1

Mathematica, 98 bayt

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

Adsız işlev, pozitif tamsayıların listesini alarak ve 0 indeksli bir tamsayıların listesini döndürür. Bütün Iffonksiyon kısmen tamamlanmış bir liste ve argüman olarak eklemek için bir sonraki tamsayı alır. Bir sonraki tamsayı kısmi listenin uzunluğunu aşarsa PadRight@##~Append~#2, kısmi listeyi buna göre arttırır; Aksi takdirde, bir Join[Take@##,{#2},Drop@##/.{a___,0,b__}->{a,b}]]sonraki tamsayı konumunu ekler, 0sonra ondan ilk bulunanı atar . Fold[...,{0},#]bu işlevi, boş otelden başlayarak orijinal listeye tekrar tekrar uygular {0}ve son otel listesini çıkarır.


1

JavaScript (ES6), 81

0 dizin oluşturmayı kullanma

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)

Daha az golf oynadı

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
}

Ölçek

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

R, 133 bayt

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))]

Kötü indekslemeyle ilgili problemleri önlemek için, bazı sıfırlarla doldururum ve sonra bunları soyun. Bu belki de en iyi çözüm değil, ama işe yarıyor.


0

Python, 134 125 116 bayt

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

Hem Python 2.7.13 hem de 3.6.0 için geçerlidir. Bu kod, tutulan değerin, tutulan değer 0 olana kadar her dizinde bulunan değerle değiştirilmesiyle çalışır. Henüz dizide bulunmayan bir dizine ulaşırsa, dizinin sonuna kadar dizinin sonuna sıfır ekler. indeks. Buğday Sihirbazı ve her biri 9 byte golf oynamak için xnor sayesinde


1
Tüm girintileriniz için boşluk kullanmak yerine, birinci seviye girintiler için bir boşluk, ikinci seviye için bir sekme ve ardından üçüncü seviye için bir boşluk kullanabilirsiniz.
Buğday Sihirbazı

Sekmeyi 4 boşluk XP'ye dönüştüren aptal bir editör ile çalışıyordum
fəˈnɛt17k

1
Ebeveynler için şartlar whileve ifihtiyaç yok. Sonraki ifadelerde kontrol akışı olmadıkça , tek bir satırdaki ;gibi birden çok ifadeyi birbiriyle ayırabilirsiniz if(i<d):r.extend([0]*(d-i));i=d.
xnor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.