Вступление
Я определил класс перестановок муравьев в более раннем испытании . Напомним, что перестановка p чисел от 0 до r-1 является сложной, если для каждой записи p [i], кроме первой, существует более ранняя запись p [ik] такая, что p [i] == p [ ик] ± 1 . В качестве забавного факта я также заявил, что для r ≥ 1 существует ровно 2 r-1 перестановки antsy длины r . Это означает, что существует взаимно-однозначное соответствие между перестановками antsy длины r и двоичными векторами длины r-1., В этой задаче ваша задача - реализовать такую переписку.
Задание
Ваша задача - написать программу или функцию, которая принимает двоичный вектор длиной 1 ≤ n ≤ 99 и выводит перестановку antsy длины n + 1 . Перестановка может быть либо на основе 0, либо на основе 1 (но это должно быть согласовано), а вход и выход могут быть в любом приемлемом формате. Кроме того, разные входы всегда должны давать разные выходы; кроме этого, вы можете возвращать любую перестановку, которую хотите.
Побеждает самое низкое число байтов.
пример
Перестановки (основанные на 0) длиной 4
0 1 2 3
1 0 2 3
1 2 0 3
1 2 3 0
2 1 0 3
2 1 3 0
2 3 1 0
3 2 1 0
и ваша программа должна вернуть один из них для каждого из восьми битовых векторов длины 3:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
источник
0 1
и0 0 1
должен давать выходы разной длины.Ответы:
Желе ,
121110 байтПопробуйте онлайн! или генерировать все перестановки длины 4 .
Как это устроено
источник
Python 2,
6260 байтСпасибо @xnor за 2 байта!
Проверьте это на Ideone .
источник
x=0,
?0,
это кортеж Без запятой отображение по x не выполнится.n
чтобы сделать[n*len(x)]
и изменить карту в список комп.Python, 54 байта
Использует следующую процедуру:
Например,
l=[1,0,1,0]
даетf(l) == [2,1,3,0,4]
Добавление 0 также даст тот же результат. Это
enumerate
неуклюжий, я посмотрю, может ли это сделать лучше рекурсивно.источник
sum
синтаксиса.JavaScript (ES6),
484745 байтЭто оказалось похоже на метод @ETHproductions, за исключением того, что я начал с прямого вычисления первого элемента, а затем использовал двоичный вектор, чтобы определить, является ли каждая цифра новым максимумом или новым минимумом. Редактировать: 1 байт сохранен благодаря @ETHproductions. Сохранено 2 байта, начиная с нуля и корректируя впоследствии. Мой предыдущий метод оказался похожим на метод @ Dennis, но занял 54 байта:
источник
Perl, 33 байта
Включает +1 для
-p
Задать вектор как строку без пробелов в STDIN:
antsy.pl
:источник
JavaScript (ES6), 52 байта
Проверьте это:
объяснение
Это использует тот факт, что при перестановке перестановок каждый элемент либо на 1 больше, чем максимум предыдущих низких записей, либо на 1 меньше, чем минимум предыдущих высоких записей. Обозначая более высокий элемент как a
0
и более низкий элемент как a1
, мы можем создать точное взаимно-однозначное соответствие между перестановками antsy длины n и двоичными векторами длины n - 1 .Лучшее, что я мог сделать с техникой Денниса, это
5751 байт:Решение xnor - 56 (сохранено 1 байт благодаря @Neil):
источник
i-i*x
может бытьi*!x
.Haskell, 40 байт
Решение Python Денниса прекрасно в Haskell с
map
иfold
. Это короче, чем мои попытки портировать мою прямую входную конструкцию:источник
Пакет, 127 байт
Принимает ввод в качестве параметров командной строки, вывод разделяется строкой. (Можно вводить через STDIN как разделенные пробелами без дополнительных затрат.)
источник