Генерация монотонной функции

12

обзор

В этой задаче ваша задача состоит в том, чтобы случайным образом генерировать монотонную математическую функцию между двумя наборами.

вход

Ваши входные данные представляют собой два натуральных числа sи n.

После получения этих входных данных ваша программа должна сгенерировать случайную математическую функцию fиз набора в . Другими словами, это «правило», которое принимает кортеж целых чисел между и и возвращает одно такое целое число. Дополнительно должен быть монотонным в следующем смысле. Если и два- кортежи такие, что выполняется для каждой координаты , то .{0,1,...,s-1}n{0,1,...,s-1}fn0s-1fABnA[i] ≥ B[i]if(A) ≥ f(B)

Точное распределение монотонных функций fне имеет значения, если каждая такая функция имеет положительную вероятность генерации (при условии идеального ГСЧ).

Выход

Ваш вывод должен быть перечислением входов и выходов 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%, если ваше решение всегда гарантированно завершит работу через определенное время (в зависимости от входных данных и при условии, что идеальный ГСЧ работает в постоянном времени) ,

Zgarb
источник
Это может помочь, если вы полностью перечислите все возможные функции для крошечного случая, такого как s = 2 n = 2. Мне пришлось прочитать описание несколько раз, чтобы понять, как случайность вступит в игру.
Спарр
@Sparr Хорошая идея; изм.
Згарб
ограниченное время выполнения является требованием? Я обдумываю решение, которое производит случайные функции, пока оно не найдет монотонное.
Спарр
@Sparr Думаю, я добавлю бонус за ограниченное время выполнения, поэтому такое решение не будет дисквалифицировано.
Згарб
@ Zgarb - возможно, вы должны сделать большой бонус за решения, которые ограничены и могут закончиться в течение часа.
Глен O

Ответы:

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.

isaacg
источник
Хороший пример с вводом 3, 2. К сожалению, я даже не получил ответ на 3, 3онлайн-исполнителя Pyth. Есть ли бесконечная петля для этой комбинации ?!
Боббель
@bobbel У интернет-исполнителя есть тайм-аут, я думаю. Я пробую это локально.
Исаак
@bobbel Это не так, что петля infitie имеет очень медленный цикл. Это также работает 2, 4, но не намного больше.
Исаак
@bobbel Я добавил что-то еще медленнее.
Исаак
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)

Ungolfed:

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

Глен О
источник