обзор
В этой задаче ваша задача состоит в том, чтобы случайным образом генерировать монотонную математическую функцию между двумя наборами.
вход
Ваши входные данные представляют собой два натуральных числа s
и n
.
После получения этих входных данных ваша программа должна сгенерировать случайную математическую функцию f
из набора в . Другими словами, это «правило», которое принимает кортеж целых чисел между и и возвращает одно такое целое число. Дополнительно должен быть монотонным в следующем смысле. Если и два- кортежи такие, что выполняется для каждой координаты , то .{0,1,...,s-1}n
{0,1,...,s-1}
f
n
0
s-1
f
A
B
n
A[i] ≥ B[i]
i
f(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%, если ваше решение всегда гарантированно завершит работу через определенное время (в зависимости от входных данных и при условии, что идеальный ГСЧ работает в постоянном времени) ,
источник
Ответы:
Pyth, 35 байт (38 - 15% = 31,45 дальше вниз)
демонстрация
Ввод в формате:
Вывод в формате:
Просто генерирует случайные возможности и проверяет их.
Альтернативная 37-байтовая версия, которая, как я полагаю, претендует на бонус:
демонстрация
Это начинается с генерации всех возможных монотонных функций, а затем выводит одну наугад. Это намного медленнее и достигает максимума
2,2
.источник
3, 2
. К сожалению, я даже не получил ответ на3, 3
онлайн-исполнителя Pyth. Есть ли бесконечная петля для этой комбинации ?!2, 4
, но не намного больше.CJam, 40 байтов - 15% = 34 байта
Этот подход генерирует все действительные функции, а затем выбирает случайным образом. Время выполнения составляет не менее O (s 2s n ) , но постоянно для данного входа.
Я сомневаюсь, что именно это имел в виду ОП, но он гарантированно завершится через определенное время (в зависимости от входных данных [...]) и, следовательно, имеет право на бонус.
Попробуйте онлайн в интерпретаторе CJam .
источник
Юлия, 64 байта (-15% = 54,4)
Ungolfed:
Это будет выполняться быстро, единственно возможная проблема с памятью для достаточно больших s и n (g (10,10) должен создать массив 10 ^ 10, поэтому очевидно, что он исчерпает память - даже если каждое число один байт, это 10 гигабайт данных).
Выходные данные основаны на индексировании 1, поэтому, чтобы определить результат для заданного ввода, вам нужно добавить один к каждому входному значению. Например, чтобы найти f (1,2,6,0,3), вам нужно изучить
K[2,3,7,1,4]
.источник