Введение
Вы - друг куратора художественного музея, который недавно получил удовольствие от получения современного искусства от четырех художников ( некоторые из которых могут дать куратору ноль произведений искусства, молодые негодяи ). Поскольку это современное искусство, все произведения художника выглядят одинаково. Ваш друг хочет использовать компьютер, чтобы решить, в каком порядке разместить эти кусочки.
Требования к программе
Ваша программа должна иметь пять целых чисел (переданных в функцию или введенных через stdin (или как-то еще)). Первые четыре - это количество картин, предоставленных каждым из четырех художников. Последнее значение - это индекс перестановки i
(считая от 1, а не от 0). Куратор желает увидеть i
перестановку по лексикографическому порядку картин.
Ваша программа должна выводить эту перестановку в любом приемлемом формате: например, abbccd
или [0 1 1 2 2 3]
. Время выполнения для ввода менее десяти картин должно занимать менее часа (надеюсь, это не должно быть проблемой).
Вам не разрешается использовать любые встроенные функции для выработки перестановок
Примеры
Вход: 0 1 2 0 2
Учитывая, что у нас есть одна картина художника B и две картины художника C (и все они выглядят одинаково), перестановки в лексикографическом порядке:
['bcc', ' cbc ', 'ccb']
Выделенная перестановка будет правильным выводом, поскольку она является второй в лексикографическом порядке.
Вход: 1 2 0 1 5
['abbd', 'abdb', 'adbb', 'babd', ' badb ', 'bbad', 'bbda', 'bdab', 'bdba', 'dabb', 'dbab', 'dbba']
тестирование
Вот некоторые тесты, которые должны быть правильными.
1 2 4 1 5 - ABBDCCCC
2 2 3 1 86 - ABBCACDC
4 1 2 0 24 - AACACBA
1 4 3 2 65 - ABBCBBDCDC
Небольшой фрагмент кода в Python3, который должен случайным образом генерировать входные и выходные данные, доступен здесь (недопустимо для ввода, здесь используется импорт перестановок Python):
from itertools import permutations
from random import randint
a,b,c,d,n = randint(1,2),randint(1,2),randint(1,3),randint(1,3),randint(1,15)
print(str(a) + " " + str(b) + " " + str(c) + " " + str(d) + " " + str(n) + " - " + str(sorted(set([''.join(p) for p in permutations(a * "a" + b * "b" + c * "c" + d * "d")]))[n-1]))
Табло
Optimizer - CJam - 39 - Confirmed - Bruteforce
EDC65 - JavaScript - 120 - Confirmed - Bruteforce
Jakube - Python2 - 175 - Confirmed - Algorithmic
источник
{:A.a.{~97+[:I.}:
она действительна и работает, но используетA.
большую часть работы, поэтому она не действительна. Если бы вы могли написать функцию, которая заменяетA.
и заменяет ее в этой функции, у вас будет правильный ответ.{:A.[:I.}:
... Дело в том, что, но я все еще не думаю,A.
что будет действительным: jsoftware.com/help/dictionary/dacapdot.htmОтветы:
Python 2:
175163 символаЭто не серьезный гольф-ответ. С другим алгоритмом я достиг 138 байт. Просто хотел опубликовать это здесь, потому что он не использует грубую силу. Сложность Тета (#pictures).
Применение:
редактировать:
Тот же алгоритм, только немного игры в гольф: не импортируйте метод факториала и небольшие изменения в порядке вычислений.
Перевод Pyth: 61 символов
Ничего особенного, точный перевод моего кода на Python. Слишком долго, хотя. Я тоже использовал несколько уродливых (длинных) вещей. Только первые 9 букв - это определение факториала.
Также такие вещи
Q[j]-=1
слишком длинны:XQNt@QN
(на 1 символ больше, чем в Python !!!)Применение:
Попробуйте это здесь: Pyth Compiler / Executor . Отключить режим отладки и использовать в
[2, 2, 3, 1, 86]
качестве ввода.источник
from math import*
за пределы функции. Добавляю вас в таблицу лидеров!CJam,
50 4339 байтЭто может быть много в гольфе.
Принимает ввод из STDIN в следующем формате:
Выводит картину. Например, для ввода выше:
Попробуйте онлайн здесь
Обратите внимание, что онлайн-компилятор отказывается от больших размеров рисования. Вам придется попробовать более крупные входные данные в версии Java
источник
JavaScript (ES6) 120
138 147Как функция с необходимыми пятью параметрами, вывод через консоль.
Использование символов 0,1,2,3. Я вычисляю общее количество символов, затем строю и проверяю каждое основание 4, имеющее требуемое количество цифр. Числа с неправильным номером любой цифры отбрасываются.
Примечание: с 32-битным целым числом JavaScript это работает до 15 картин.
Изменить короче (избегать .toString) и намного быстрее (изменено условие выхода). Время для каждого теста ниже 1 сек.
Edit2 без изменения алгоритма, больше в гольфе (для удобства чтения добавлены отступы)
Ungolfed И не требуется FireFox
Тест в консоли FireBug / FireFox
Вывод
источник
Пиф , 20
Попробуй это здесь.
Ввод в форме списка Python, например,
[1, 2, 4, 1, 5]
Вывод также в форме списка Python, например,
[0, 1, 1, 3, 2, 2, 2, 2]
для ввода выше.Решение - грубая сила, и на моем компьютере это занимает около 10 секунд, в худшем случае.
Как это работает:
источник