Вступление
Моя племянница хочет сделать гоночную машину. У нее есть деревянные части, которые соединяются, чтобы сформировать след. Каждая часть имеет квадратную форму и содержит различную форму. Я буду использовать символы рисования трубы, чтобы проиллюстрировать:
│
: дорога, которая идет вертикально─
: дорога, которая идет горизонтально┌
┐
└
┘
: дороги, которые поворачивают в направлении┼
: Мост с подземным переходом
Любопытно, что там нет тройников.
Вот пример возможной трассы гоночного автомобиля:
┌─┐
│ │┌─┐
│ └┼─┘
└──┘
Правила действующего гоночного трека следующие:
- Там не может быть никаких дорог, которые ведут в никуда.
- Он должен образовывать цикл (и все части должны быть частью одного цикла).
- На мостах / подземных переходах вы не можете повернуть (поэтому вы должны пройти прямо через них).
К сожалению, куски гоночной машины у моей племянницы ограничены. Но мы определенно хотим использовать их все в треке. Напишите программу, которая, учитывая список того, что находится в нашем инвентаре, выводит дорожку гоночной машины, которая использует все эти части.
Описание входа
Мы бы хотели, чтобы ввод поступал через STDIN, аргументы командной строки, чтение файла или функцию пользовательского ввода (например, raw_input
или prompt
). Входные данные разделены запятыми положительными целыми числами в форме
│,─,┌,┐,└,┘,┼
где каждый из них представляет количество этой конкретной части, которую мы имеем. Так, например, вход:
1,1,1,1,1,1,1
будет означать, что у нас был один из каждого куска.
Описание выхода
Выведите дорожку гоночной машины, используя символы рисования труб, перечисленные выше. Трасса гоночной машины должна использовать именно то число, которое указано во входных данных - не больше и не меньше. Для каждого входа будет хотя бы одна действующая трасса гоночного автомобиля.
Пример входов и выходов
Входные данные: 3,5,2,2,2,2,1
Возможный вывод:
┌─┐
│ │┌─┐
│ └┼─┘
└──┘
Входные данные: 0,0,1,4,4,1,3
Возможный вывод:
┌┐
└┼┐
└┼┐
└┼┐
└┘
Ответы:
Рубин 664
671 677 687 701(678 байт)Это не самая короткая программа, которую я мог придумать, но я пожертвовал некоторой краткостью ради скорости выполнения.
Вы можете поэкспериментировать с программой здесь . Обратите внимание, что ideone имеет ограничение по времени выполнения, поэтому для входных данных, состоящих более чем из 12 частей, программа, вероятно, истечет время ожидания.
Есть также набор тестов для программы. Обратите внимание, что последние два теста отключены на ideone из-за ограничения по времени, указанного выше. Чтобы включить эти тесты, удалите
x_
префикс из их имен.Программа находит решение, используя поиск в глубину; он расставляет фигуры по одному и отслеживает свободные концы. Поиск прекращается, когда больше нет свободных (не связанных) концов, и все фрагменты размещены.
Это негольфированная программа:
источник