У моей дочери было следующее задание по математике. Представьте себе шестерых друзей, живущих на линии с именами E, F, G, H, J и K. Их позиции на линии такие, как указано (не в масштабе) ниже:
Таким образом, F живет в пяти единицах от E и двух единицах от G и так далее.
Ваше задание: создайте программу, которая идентифицирует путь, который посещает каждого друга ровно один раз, с общей длиной n единиц, принимая местоположение друзей и n в качестве входных данных. Он должен сообщить путь, если он его найдет (например, для длины 17 он может сообщить «E, F, G, H, J, K»), и он должен выйти изящно, если решения не существует. Для чего он стоит, я выполнил решение без математики в Mathematica в 271 байт. Я подозреваю, что это возможно гораздо более кратко, чем это.
источник
[0, 5, 7, 13, 16, 17]
и62
), чтобы вы могли убедиться, что она не имеет особой жесткости в этом случае."[0, 5, 7, 13, 16, 17], 62"
и выход в"(7, 16, 0, 17, 5, 13)"
порядке?Ответы:
J 54 байта
Выводит один правильный маршрут. Если маршрут не существует, он ничего не выводит.
52-байтовый код, который выводит все маршруты (по одному на строку):
38-байтовый код, который выводит позиции вместо букв:
источник
Mathematica, 55 или 90 байт
Mathematica вы сказали? ;)
Это анонимная функция, которая сначала занимает позиции друзей (в любом порядке), а затем целевую длину. Возвращается
Missing[NotFound]
, если такого пути не существует.Я могу сохранить четыре байта, если разрешен возврат всех допустимых путей (
FirstCase
->Cases
).Возвращать массив строк немного сложнее:
источник
Z
будет продолжать со следующими символами ASCII (не то, что вы все равно хотите запустить мой код для n> 20: D).Python 2,
154148 байт(или 118 байт для общего решения)
Эта программа принимает строку со списком и целым числом типа '[0, 5, 7, 13, 16, 17], n' в stdin и печатает путь на выходе длины n или ничего, если это невозможно.
Сложно писать небольшие программы на Python, которые требуют перестановок. Этот импорт и использование очень дорого.
Источник для требования OP перед minifier:
Общее решение (не минимизированное):
Из-за простого алгоритма и большого количества комбинаций выполнение более 20 начальных позиций будет очень медленным.
источник
from itertools import*
. Кроме того, Python 3 может быть короче,input()
и*a,c=map(...)
если он может работать с остальной частью вашей программы.chr(a.index(n)+69)
?J (48 или 65)
Я предполагаю, что это может быть чертовски много. Не стесняйтесь использовать это как отправную точку для игры в гольф дальше
Или с буквами:
Что оно делает:
(Я надеюсь, что этот формат ввода / вывода в порядке ...)
Как оно это делает:
Генерирует все перестановки ввода
Рассчитывает расстояние
Видит, что результаты совпадают с входными данными, и заново генерирует эти перестановки (я подозреваю, что некоторые символы могут быть выбриты здесь)
С буквами:
Создайте список из первых n букв, где n - длина списка ввода
делает то же самое, что и выше
источник
Октава, 73
На самом деле этого нет, поэтому позвольте мне объяснить ... изнутри наружу, мы переставляем все расстояния, затем для каждой перестановки мы берем различия между домами, принимаем абсолютное значение как расстояние, добавляем их вверх, найдите индекс первой перестановки с нужным расстоянием, переставьте буквы и найдите эту конкретную перестановку букв.
13-0-16-5-17-7 => 13 + 16 + 11 + 12 + 10 = 62.
(пусто для невозможных вводов)
источник
perms()
в Octave 3.6.2 на ideone.com возникают проблемы с вектором строк.Матлаб (86)
Пример, в котором существует решение:
Пример, в котором решение не существует:
Матлаб (62)
Если выходной формат может быть ослаблен путем создания позиций вместо букв и создания пустой матрицы, если решения не существует:
Пример, в котором существует решение:
Пример, в котором решение не существует:
Матлаб (54)
Если для программы допустимо указывать все допустимые пути :
Пример, в котором существует решение:
источник
Haskell, 109 байт
Пример использования:
17 # [0, 5, 7, 13, 16, 17]
который выводит все допустимые пути, то есть["EFGHIJ","JIHGFE"]
. Если нет допустимого пути, пустой список[]
возвращается .Список писем включает в себя
I
(надеюсь, что все в порядке).Как это работает: составьте список
(name, position)
пар, переставьте и возьмите те, у которых длина пути равна,n
и удалите часть позиции.источник