Утворіть монотонну функцію


12

Огляд

У цьому завданні ваше завдання полягає в випадковому генеруванні монотонної математичної функції між двома множинами.

Вхідні дані

Ваші входи - це два натуральних числа sта n.

Отримавши ці входи, ваша програма генерує випадкову математичну функцію fз набору на . Іншими словами, це "правило", яке приймає в собі цілу кількість цілих чисел між і і повертає одне таке ціле число. Крім того, має бути монотонним у наступному сенсі. Якщо і є два парних таких, що мають місце для кожної координати , то .{0,1,...,s-1}n{0,1,...,s-1}fn0s-1fABnA[i] ≥ B[i]if(A) ≥ f(B)

Точний розподіл монотонних функцій fне має значення, до тих пір, поки кожна така функція має позитивну ймовірність виникнення (якщо вважати досконалий RNG).

Вихідні дані

Ваш результат повинен бути перерахуванням входів та результатів f. Він повинен містити всі- nмножини цілих чисел між 0і s-1в певному порядку, за кожним з яких слідує відповідний вихід f. Точний вихідний формат є гнучким (в межах причини).

Приклади

Вхідні дані s = 3і n = 2можуть давати вихід

(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 0
(1, 1) 1
(1, 2) 2
(2, 0) 1
(2, 1) 1
(2, 2) 2

Він містить усі пари над безліччю {0, 1, 2}рівно один раз, і кожна з них супроводжується своїм fзначенням. Умова одноманітності також виконується. Кортежі наведені тут у лексикографічному порядку, але це не обов'язково.

Як інший приклад, s = 2і це n = 4може призвести

(0, 0, 0, 0) 0
(0, 0, 0, 1) 0
(0, 0, 1, 0) 0
(0, 0, 1, 1) 0
(0, 1, 0, 0) 1
(0, 1, 0, 1) 1
(0, 1, 1, 0) 1
(0, 1, 1, 1) 1
(1, 0, 0, 0) 0
(1, 0, 0, 1) 1
(1, 0, 1, 0) 0
(1, 0, 1, 1) 1
(1, 1, 0, 0) 1
(1, 1, 0, 1) 1
(1, 1, 1, 0) 1
(1, 1, 1, 1) 1

Нижче наведено всі можливі виходи для s = 2та n = 2(до упорядкування кортежів); ваша програма повинна випадковим чином вивести одне з них:

(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 0
-------
(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 0
(1,0) 1
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 1
(1,1) 1
-------
(0,0) 1
(0,1) 1
(1,0) 1
(1,1) 1

Правила та підрахунок балів

Ви можете написати повну програму або функцію. Виграє найменший байт, а стандартні лазівки заборонені. Код з поясненням є кращим.

Немає обмежень у часовій складності, але я дам бонус у розмірі -15%, якщо ваше рішення завжди гарантовано закінчиться за певний час (залежно від вкладених даних та припускаючи досконалий RNG, який працює в постійний час) .


Це може допомогти, якщо ви повністю перерахуєте всі можливі функції для крихітного випадку, такого як s = 2 n = 2. Мені довелося прочитати опис кілька разів, щоб зрозуміти, як випадковість увійде в гру.
Спарр

@Sparr Хороша ідея; відредаговано.
Zgarb

чи обмежена тривалість виконання вимогою? Я розглядаю рішення, яке виробляє випадкові функції, поки не знайде монотонну.
Спарр

@Sparr Я думаю, що я додам бонус за обмежений час виконання, тому таке рішення не буде дискваліфіковано.
Згарб

@ Zgarb - можливо, ви повинні зробити великий бонус за рішення, які є обмеженими і, ймовірно, закінчуються протягом години.
Глен О

Відповіді:


4

Pyth, 35 байт (38 - 15% = 31,45 далі)

#I!sm><FhMds<MCeMd^JC,mOQK^UQvzK2JB

Демонстрація

Введення у форматі:

n
s

Вихід у форматі:

[[value, tuple], [value, tuple], ...]

Просто генерує випадкові можливості та тестує їх.


Альтернативна версія 37 байт, яка, на мою думку, кваліфікується до бонусу:

Of!sm><FhMds<MCeMd^T2mC,d^UQvz^UQ^Qvz

Демонстрація

Це починається з генерації всіх можливих монотонних функцій, потім виводиться одна навмання. Це набагато повільніше, і на вершині 2,2.


Гарний приклад із введенням 3, 2. На жаль, я навіть не отримав відповіді 3, 3в Інтернет-виконавця піта. Чи існує нескінченна петля для цієї комбінації ?!
боббел

@bobbel У інтернет-виконавця є час очікування, я думаю. Я пробую це локально.
isaacg

@bobbel Це не так вже й багато повільного циклу. Це також працює 2, 4, але не багато іншого.
isaacg

@bobbel Я додав щось ще повільніше.
isaacg

1

CJam, 40 байт - 15% = 34 байти

q~1$\m*\1$,m*{W$\.+2m*{:.<2b}%1&!},mR]zp

Цей підхід генерує всі дійсні функції, а потім вибирає їх навмання. Час виконання не менше O (s 2s n ) , але постійний для даного входу.

Я сумніваюсь, що це було на увазі ОП, але це гарантовано закінчиться за певний час (залежно від вкладень [...]) і, отже, може претендувати на бонус.

Спробуйте його в Інтернеті в інтерпретаторі CJam .


1

Джулія, 64 байти (-15% = 54,4)

g(s,n)=(K=rand(0:s-1,ntuple(n,i->s));for i=1:n K=sort(K,i)end;K)

Безголівки:

function g(s,n)
  # Generates a random n-dimensional array with s per dimension
  # and all values being integers between 0 and s-1
  K=rand(0:s-1,ntuple(n,i->s))
  # Loop over the various dimensions
  for i=1:n
    # Sort in the current dimension
    K=sort(K,i)
  end
  return K
end

Це запуститься швидко, єдиною можливою проблемою є пам'ять для достатньо великих s і n (g (10,10) має створити масив 10 ^ 10, тому, очевидно, пам’яті не вистачить - навіть якщо кожне число один байт, це 10 гігабайт даних).

Вихід - це індексація на основі 1, тому для визначення результату для заданого вводу потрібно додати по одному вхідне значення. Наприклад, щоб знайти f (1,2,6,0,3), потрібно вивчити K[2,3,7,1,4].

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.