Задний план
Так называемый «Протокол мочеиспускания», описывающий порядок, в котором отдельные писсуары отбираются в мужской ванной комнате, обсуждался во многих местах. Одна версия приведена в этом сообщении блога xkcd . Этот вопрос касается небольшого изменения:
Расположение : n писсуаров в ряд.
Протокол : каждый новый человек выбирает один из писсуаров, наиболее удаленных от уже используемых.
Обратите внимание, что это не накладывает никаких ограничений на выбор писсуара первым человеком.
Обновление : последовательность из числа различных способов, которыми n человек могут выбрать n писсуаров, начинается с 1, 2, 4, 8, 20 ... Обратите внимание, что это не то же самое, что OEIS A095236 , который описывает более строгие ограничения, чем в этом вопрос.
задача
Учитывая целое число n от 0 до 10, выведите (в любом порядке) все возможные упорядочения, в которых n человек могут занимать n писсуаров. Каждый порядок должен быть напечатан в качестве окончательного варианта: последовательность цифр, представляющих людей (1-9 для первых 9 человек, 0 для десятого), начиная с самого левого писсуара, с необязательными не алфавитно-цифровыми разделителями между (но не перед или после) цифры. Например, следующие выходные данные являются действительными:
>> 3
132
213
312
231
>> 4
1|3|4|2
1|4|3|2
3|1|4|2
4|1|3|2
2|3|1|4
2|4|1|3
2|3|4|1
2|4|3|1
Вы можете написать программу или функцию, используя ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции. Результаты должны быть напечатаны в STDOUT (или ближайшую альтернативу).
счет
Самый короткий код выигрывает. Применяются стандартные условия.
источник
span
длину 1, где естьspan
доступная длина 2. Мне вдруг удалось запутаться. Похоже, что OP намеренно получен из ссылки, и, следовательно, ссылка должна следовать?Ответы:
Pyth,
5351Это итеративный подход. Учитывая возможные частично заполненные упорядоченные наборы местоположений, мы находим все оптимальные дальнейшие местоположения, затем генерируем соответствующий список местоположений и повторяем.
Результаты генерируются в форме
[<first person's location>, <second person's location> ...]
, затем она преобразуется в нужный формат.MhSm^-dG2H
определяет вспомогательную функцию, которая находит минимальные расстояния от данного киоска до занятого киоска (в квадрате). Забавно, разделитель бесплатный.Пример запуска.
Объяснение:
Во-первых, вспомогательная функция
g
, которая находит минимальное квадратное расстояние между G и любым значением в H.Затем мы находим максимальное расположение писсуаров на минимальном квадрате расстояния между этим писсуаром и любым занятым писсуаром:
(
Q
это вход.)d
в этом случае список занятых писсуаров, в то время какb
итерирует по местоположениям писсуара.Затем мы находим все места для писсуаров, минимальное квадратичное расстояние от ближайшего занятого писсуара равно максимальному значению, указанному выше.
Далее мы сгенерируем списки местоположений писсуаров, добавив найденные выше местоположения писсуаров
d
. Мы сделаем это для каждого предыдущего списка мест расположения писсуаров, тем самым расширив списки от длиныN
доN+1
.G
это список юридических списков занятых мест для писсуаров заданной длины.Далее, мы будем применять вышеупомянутое выражение несколько раз, чтобы сгенерировать полный список списков занятых мест писсуара.
u
Функция Reduce делает это ровно столько раз, сколько элементов содержится во втором аргументе.Преобразование из приведенного выше представления, которое идет
[<1st location>, <2nd location>, ... ]
, в желаемую форму выходного,[<person in slot 1>, <person in slot 2>, ... ]
. Затем форма вывода объединяется в строку вывода и печатается. Печать неявная.источник
kajsdlkas^23asdjkla1lasdkj~JZasSSA
- почти вдвое меньше.Pyth,
757167Рекурсивное комбинаторное решение.
Это довольно прямой перевод из этого решения Python:
источник
C
929878 байтЭто монстр, ребята. Сожалею.
Определяет 3 функции,
f(int*,int)
,P(int*,int,int,int,int)
иL(int)
. ЗвонитеL(n)
, и он выводит на STDOUT.Выход для
n=5
:Обновление: я удалил разделители и исправил код. Старый код не только не работал при n = 7 +, но и вообще ничего не выводил при n = 10 (упс!). Я более тщательно проверил эту связку. Теперь он поддерживает ввод до n = 13 (хотя
"%d"
следует изменить на"%x"
так, чтобы он печатался в шестнадцатеричном формате). Размер ввода зависит,sizeof(long)
и предполагается, что8
на практике.Вот некоторые объяснения того, как это работает, и почему существует такое странное ограничение:
Они часто использовались, поэтому мы определяем их, чтобы сохранить пару байтов:
typedef unsigned long U; typedef unsigned char C;
Вот
f
:f
принимает массив целых чисел размераn
иn
сам. Единственный умный бит здесь - это то, что он возвращает значениеunsigned long
, которое преобразуется вchar[8]
вызывающую функцию. Таким образом, каждому символу в массиве присваивается0xFF
индекс или указатель на действительный писсуар для следующего человека. Дляn<10
, мы никогда не нужно больше , чем 5 байт для хранения каждого действительного писсуара следующего человек может использовать.Вот
P
:P
принимает массивu
размера , вn
котором ровно один элемент установлен на1
, а остальные0
. Затем он находит и печатает каждую возможную перестановку рекурсивно.Вот
L
:L
просто звонитP
n
раз с разными стартовыми позициями каждый раз.Для заинтересованных, это (менее гольф)
f
будет генерировать последовательность в A095236 .источник
14352
средства № 1 выбрал самый левый писсуар. Человек № 2 выбрал самый правый, который затем заставил № 3 в середине. Это не номер писсуара, выбранного следующим, который должен быть выведен.Python 2, 208
Рекурсивный подход.
источник
JavaScript (ES6) 153
160 169Редактировать Используя Math.min, чтобы найти (конечно) максимальное расстояние: оптимизированный код и 16 байтов сохранены.
Рекурсивный поиск может работать с n> 10, просто удалите% 10 (и будьте готовы подождать, пока консоль развернет все свои выходные данные).
Я использую один массив для хранения используемого слота (положительные числа) или текущего расстояния от ближайшего слота (отрицательные числа так
<
и>
меняются местами в коде).Ungolfed
Тест в консоли Firefox / FireBug
источник
Mathematica,
123104источник
n~f~s~Join~{#}
станетJoin[f[n,s],{#}]
.МАТЛАБ, 164
источник
Perl, 174
Не очень коротко, но весело. Я не рассчитываю
use feature 'say';
на общее количество байтов.Де-golfed:
источник
C 248 байт
Этот код использует рекурсивный алгоритм для получения желаемого результата.
Expanded:
источник
Баш,
744674 байтаЭто все еще слишком долго :). Я использую строку для представления ряда писсуаров и алгоритм затопления, чтобы найти самые отдаленные писсуары на каждом этапе рекурсии. Негольфированный код почти не требует пояснений. Количество писсуаров читается с клавиатуры.
Код (игра в гольф):
Использование:
И это разворачивается:
источник