Гранд-готель Hilbert's


23

Вступ

Хтось із вас, можливо, чув про Grand Hotel Hilbert . Менеджер там втратив свій список, де гості перебувають, але він все ще має порядок, в якому вони заїхали. Кожен гість не може перебувати в номері, номер якого менше їхньої вартості, і якщо гостя додано до нижчого кімната, всі гості у вищих кімнатах без порожнього місця між ними та новим гостем переміщуються на одну кімнату. Чи можете ви допомогти йому знайти місце перебування кожного з гостей?

Вимоги

Напишіть програму, яка отримує впорядкований список натуральних чисел у якості вхідних даних та розміщує їх у своєму індексі. Якщо в цьому індексі вже є значення, воно переміщується до наступного запису у списку. Цей процес повторюється, поки не буде знайдено перший порожній (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 в кімнаті 4
1 0 3 4
Помістіть 3 у кімнаті 3
1 1 3 4
Змістіть вміст кімнати 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 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

Безголівки:

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

JavaScript (ES6), 144 120 байт

Збережено 20B завдяки Arnauld та 11B завдяки 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)

Використання

Ви можете призначити функцію змінної, 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])

Вихід

Вихід також є в масиві. Оскільки Javascript працює з нульовим індексом, є додаткові 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

JavaScript (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)

Провідний нуль у результаті, оскільки JavaScript індексується 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

JavaScript (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

R, 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

Дійсно для Python 2.7.13 та 3.6.0. Цей код функціонує за допомогою заміщення утримуваного значення на значення, що міститься в кожному індексі, поки утримуване значення не дорівнює 0. Якщо він досягає індексу ще не в масиві, він додає нулі до кінця масиву, поки масив не містить, що покажчик. Завдяки Wheat Wizard та xnor за те, що вони займаються по 9 байтів


1
Замість використання пробілів для всіх відступів можна використовувати пробіл для відступів першого рівня, вкладку для другого рівня та вкладку, а потім пробіл для рівня 3.
Пшеничний чарівник

Я працював з дурним редактором, який перетворив вкладку на 4 пробіли XP
fəˈnɛtɪk

1
Умови whileі ifне потребують паролів. Ви можете розмістити декілька висловлювань на одному рядку, розділених ;схожим, if(i<d):r.extend([0]*(d-i));i=dякщо тільки в наступних операторах немає потоку управління
xnor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.