Khách sạn lớn của Hilbert


23

Giới thiệu

Một số bạn có thể đã nghe nói về Hilbert's Grand Hotel . Người quản lý ở đó đã mất danh sách nơi khách đang ở nhưng anh ta vẫn có thứ tự họ đã đăng ký. Mỗi khách không thể ở trong phòng có số phòng nhỏ hơn giá trị của họ và nếu khách được thêm vào thấp hơn phòng, tất cả khách ở phòng cao hơn không có khoảng trống giữa họ và khách mới được chuyển lên một phòng. Bạn có thể giúp anh ta tìm nơi mỗi khách đang ở?

Yêu cầu

Viết chương trình nhận danh sách các số tự nhiên theo thứ tự làm đầu vào và đặt chúng vào chỉ mục của chúng. Nếu đã có một giá trị trong chỉ mục đó, nó sẽ được chuyển sang mục tiếp theo trong danh sách. Quá trình này lặp lại cho đến khi không gian trống đầu tiên (0 hoặc không xác định) được tìm thấy. Bất kỳ khoảng trắng không xác định nào giữa chỉ mục cao nhất hiện tại và bất kỳ đầu vào mới nào cũng sẽ được lấp đầy bằng cách thêm 0s. Vì đây là Grand Hotel của Hilbert, các phòng cao hơn chỉ số chiếm cao nhất hiện tại không tồn tại.

Đầu vào và đầu ra

Đầu vào sẽ là một danh sách các số tự nhiên được sắp xếp (được phép đọc qua bất kỳ hình thức nhập nào được chấp nhận)
Mỗi số trong đầu vào được coi là một khách đến khách sạn và theo thứ tự đến

Đầu ra sẽ là sự sắp xếp cuối cùng của khách (số)

Ví dụ

Đầu vào: 1 3 1
Đầu ra: 1 1 3
Từng bước:
1
Tạo phòng ở chỉ số 1 và đặt 1 trong đó
1 0 3
Tạo phòng theo chỉ số 3 và đặt 3 trong phòng 3
1 1 3
Chuyển nội dung của phòng 1 lên một phòng và đặt 1 trong phòng 1

Đầu vào: 1 4 3 1 2 1
Đầu ra : 1 1 2 1 3 4
Từng bước:
1
Tạo phòng ở chỉ số 1 và đặt 1 trong đó
1 0 0 4
Tạo phòng theo chỉ số 4 và đặt 4 trong phòng 4
1 0 3 4
Đặt 3 trong phòng 3
1 1 3 4
Nội dung ca của phòng 1 lên một phòng và đặt 1 trong phòng 1
1 2 1 3 4
Nội dung thay đổi của phòng 2 đến 4 lên một phòng và đặt 2 trong phòng 2
1 1 2 1 3 4
Nội dung thay đổi của phòng 1 đến 5 lên một phòng và đặt 1 trong phòng 1

Đầu vào: 10
Kết quả: 0 0 0 0 0 0 0 0 0 0 10
Từng bước:
0 0 0 0 0 0 0 0 0 10
Tạo phòng lên đến phòng 10 và đặt 10 trong phòng 10

Lưu ý:
Làm việc với 0 được lập chỉ mục là tốt và bạn có thể chèn 0 ở phía trước đầu ra trong trường hợp đó

Các lỗ hổng tiêu chuẩn bị cấm, mã ngắn nhất tính bằng byte thắng

Câu trả lời:



5

PHP 93 byte

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

0 được lập chỉ mục. Sử dụng vòng lặp 2 trong 1 để tìm kiếm khách tiếp theo sau khi nó nhận được 0 (hoặc dạng rỗng vượt ra khỏi phòng cuối cùng hiện tại). Sử dụng như:

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

Ung dung:

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, có vẻ như nó có thể là perl!
Zachary Craig


2

JavaScript (ES6), 144 120 byte

Tiết kiệm 20B nhờ Arnauld và 11B nhờ Neil

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)

Sử dụng

Bạn có thể gán hàm cho biến fvà danh sách sẽ được cung cấp dưới dạng một mảng. Thí dụ:

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

Đầu ra

Đầu ra là trong một mảng là tốt. Vì Javascript hoạt động không có chỉ mục, nên có thêm 0 ở phía trước.

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

Tôi đã không thực sự kiểm tra điều đó, nhưng có thể (c+'').split`,`.map(Number)thực hiện công việc?
Arnauld

Thông minh lừa, và vâng, nó làm việc. Cảm ơn.
Lu-ca

Rất tiếc, tôi đã quên kiểm tra testcase 2 và hóa ra chức năng của tôi không hỗ trợ thêm mọi thứ vào phía trước của mảng ...
Luke

Tôi tin rằng bạn có thể làm c.map(n=>n|0)hơn là (c+'').split`,`.map(Number).
Sản phẩm ETH

@ETHproductions Vấn đề là map()không lặp lại tất cả các giá trị không xác định trong mảng. (Điều đó nói rằng, tôi khá chắc chắn rằng có một cách ngắn hơn so với cách tôi đã đề xuất.)
Arnauld

1

JavaScript (ES6), 86 byte

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)

Không dẫn đầu trong kết quả vì JavaScript được lập chỉ mục 0.


1

Toán học, 98 byte

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

Hàm không tên lấy danh sách các số nguyên dương và trả về danh sách các số nguyên có chỉ số 0. Toàn bộ Ifhàm lấy một danh sách hoàn thành một phần và số nguyên tiếp theo để chèn làm đối số. Nếu số nguyên tiếp theo vượt quá độ dài của danh sách một phần, hãy PadRight@##~Append~#2tăng danh sách một phần tương ứng; mặt khác, Join[Take@##,{#2},Drop@##/.{a___,0,b__}->{a,b}]]chèn số nguyên tiếp theo vào vị trí của nó, sau đó ném đi số nguyên đầu tiên 0được tìm thấy sau nó. Fold[...,{0},#]áp dụng chức năng này nhiều lần cho danh sách ban đầu, bắt đầu với khách sạn trống {0}và đưa ra danh sách khách sạn cuối cùng.


1

JavaScript (ES6), 81

Sử dụng lập chỉ mục 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)

Ít chơi gôn

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
}

Kiểm tra

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 byte

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

Để tránh các vấn đề với việc lập chỉ mục xấu, tôi đệm với một số không, và sau đó tước chúng ở cuối. Đây có thể không phải là giải pháp tốt nhất, nhưng nó hoạt động.


0

Python, 134 125 116 byte

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

Hợp lệ cho cả Python 2.7.13 và 3.6.0. Mã này hoạt động bằng cách hoán đổi giá trị giữ với giá trị được chứa ở mỗi chỉ số cho đến khi giá trị được giữ là 0. Nếu nó đạt đến một chỉ mục chưa có trong mảng, nó thêm các số 0 vào cuối mảng cho đến khi mảng chứa mục lục. Cảm ơn Wheat Wizard và xnor vì đã chơi golf 9 byte mỗi


1
Thay vì sử dụng khoảng trắng cho tất cả các điểm thụt lề của bạn, bạn có thể sử dụng khoảng trắng cho các mức thụt cấp một, một tab cho cấp hai và một tab theo sau là khoảng trắng cho cấp ba.
Thuật sĩ lúa mì

Tôi đã làm việc với một trình soạn thảo ngu ngốc đã chuyển đổi tab thành 4 không gian XP
fnɛtɪk

1
Các điều kiện cho whileifkhông cần parens. Bạn có thể đặt nhiều câu lệnh trên cùng một dòng cách nhau bởi ;như if(i<d):r.extend([0]*(d-i));i=dtrừ khi có dòng điều khiển trong các báo cáo sau.
xnor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.