Hilbert's Grand Hotel
PHP 93 bytes
for(;$r=$g?$r+1:$g=$argv[++$i];[$g,$h[$r]]=[$h[$r],$g])$h=array_pad($h?:[],$g,0);print_r($h);
0 indexed. Uses a 2 in 1 loop that looks up the next guest after it gets a 0 (or a null form going beyond the current final room). Use like:
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 );
Haskell, 107 bytes
h=foldl(\h n->let{(b,a)=splitAt n h;(c,d)=span(>0)a;e=0:e;f=take n$b++e;g(0:m)=m;g m=m}in f++[n]++c++g d)[]
Try it online!
Jelly, 28 bytes
ṫœṡ0F
’⁹ḣ;⁸;ç@ð0ẋ;@
0;ç@/œr0
Try it online!