Вызов
Вам даны две разные строки битов одинаковой длины. (Например, 000
и 111
.) Ваша цель - найти путь от одного к другому так, чтобы:
- На каждом шаге, вы измените только один бит (вы можете перейти от
000
любой из001
,010
,100
). - Вы не можете посетить одну и ту же битовую строку дважды.
- Путь максимально длинный, с учетом этих ограничений.
Например, переходя от 000
к 111
, мы можем взять путь
000, 001, 011, 010, 110, 100, 101, 111
который посещает все 8-битные строки длиной 3, поэтому он должен быть максимально длинным.
правила
- Применяются стандартные лазейки.
- Вы можете принять входные данные как две строки с нулями и единицами, или как два массива с нулями и единицами, или как два массива логических значений.
- Вы не можете принимать входные данные как два целых числа с правильным двоичным представлением (запись
000
и111
как0
и7
недопустима). - Если вы хотите, вы можете взять длину строки битов в качестве входных данных.
- Ваша программа может выводить путь, печатая строки битов, посещаемые по одной за раз, или возвращая массив посещенных строк битов (каждая в том же формате, что и входные данные).
- Ваш вывод должен включать начало и конец пути (которые являются вашими входными данными).
- Это код-гольф , выигрывает самый короткий код в байтах.
Примеры
0 1 -> 0, 1
10 01 -> 10, 00, 01 or 10, 11, 01
000 111 -> any of the following:
000, 100, 110, 010, 011, 001, 101, 111
000, 100, 101, 001, 011, 010, 110, 111
000, 010, 110, 100, 101, 001, 011, 111
000, 010, 011, 001, 101, 100, 110, 111
000, 001, 101, 100, 110, 010, 011, 111
000, 001, 011, 010, 110, 100, 101, 111
1001 1100 -> 1001, 0001, 0000, 0010, 0011, 0111, 0101, 0100, 0110, 1110, 1010, 1011, 1111, 1101, 1100 (other paths exist)
code-golf
binary
graph-theory
Миша лавров
источник
источник
Ответы:
Шелуха ,
27 2624 байтаГрубая сила, поэтому очень медленно. Попробуйте онлайн!
объяснение
Хаска естественно читает справа налево.
источник
Mathematica, 108 байт
Входные данные:
Выход:
источник
Mathematica, 175 байт
Хороший первый вопрос!
вход
источник
Haskell ,
212207 байтЭто, вероятно, слишком долго, но теперь, наконец, работает. (Спасибо @Lynn за трюк с декартовым произведением !) Спасибо @nimi за -5 байтов!
Попробуйте онлайн!
Объяснение:
источник
x<-mapM id$[1>0,1<0]<$b
[True,False]
? Если[False,True]
также работает, вы можете использовать[0>1..]
.Bool
такоеEnum
, и я забыл, что<$
доступно (сначала попробовал,*>
чего нет в Prelude)!Mathematica
116114 байтовБлагодаря сохранению нескольких байтов Миша Лавров.
Вход (8 измерений)
Выход (длина = 254, через 1,82 секунды)
Tuples[{0,1},{l=Length@#}],{2}]
& генерирует числа 0 ... 8 в виде двоичных списков.Внешний
Tuples...{2}
производит все упорядоченные пары этих двоичных чисел.Plus@@x
суммирует каждую из пар, генерируя триплеты 0, 1.Cases....Count[Plus@@x, 1]==1
возвращает все суммы, содержащие один 1. Они возникают, когда два исходных двоичных числа соединены ребром.Rules
соединяет вершины графа, каждая из которых является двоичным числом.Graph
создает граф, соответствующий указанным вершинам и ребрам.FindPath
находит до 2 ^ n путей, соединяющих вершину a с вершиной b по заданным номерам.Last
занимает самый длинный из этих путей.Для трех измерений график может быть представлен в плоскости, как показано здесь:
Для ввода
{0,0,0}, {1,1,1}
выводится следующее:{{{0, 0, 0}, {0, 0, 1}, {0, 1, 1}, {0, 1, 0}, {1, 1, 0}, {1, 0, 0}, {1, 0, 1}, {1, 1, 1}}}
Этот путь можно найти на приведенном выше графике.
Его также можно представить как следующий путь в трехмерном пространстве, где каждая вершина соответствует точке
{x,y,z}
. {0,0,0} представляет начало координат, а {1,1,1} представляет "противоположную" точку в единичном кубе.Таким образом, путь решения соответствует обходу ребер вдоль единичного куба. В этом случае путь является гамильтоновым: он посещает каждую вершину один раз (т.е. без пересечений и без пропущенных вершин).
источник
2^(l+2)
в вашем коде?Haskell ,
141123 байтаИспользует списки целых чисел. Попробуйте онлайн!
объяснение
Основная функция есть
!
, а вспомогательные функции есть#
иc
. Учитывая список битов,c
дает все возможные способы переключения одного из них, например[0,1,1] -> [[1,1,1],[0,0,1],[0,1,0]]
.Функция
#
принимает список списков («память») и список («начальная цепочка битов»). Он создает все пути гиперкуба, которые начинаются с начального элемента, содержат только отдельные битовые строки и не наступают на строки в памяти.Основная функция
!
связывает все это вместе. Уловка, которую я использую здесьp*>x
(x
повторяетсяlength p
) вместоlength p
. Поскольку более длинные повторенияx
приходят позже при естественном упорядочении списков,maximum
выбирается самый длинный путь в любом случае, так как первые координаты пар сравниваются перед вторыми.источник
Желе ,
2527 байт+2 байта, чтобы исправить ошибку в моем гольфе :( надеюсь, я найду более короткий путь.
Полная программа, принимающая битовые строки с использованием
1
и2
* в качестве списков. Аргументы естьfrom
иto
. Программа печатает список одинаковых списков.*
0
и1
может использоваться вместо этого за счет байта (добавьте’
междуL2ṗ
иŒ!ç€...
уменьшите).Попробуйте онлайн!
Как?
обновление ...
источник
[1,1]
и[2,2]
вывод результатов[[1, 1], [2, 1], [1, 2], [2, 2]]
при попытке попробовать онлайн, который не является допустимым путем.