Книги «Выбери свое приключение» - это форма интерактивной литературы, в которой читатель должен принимать решения, которые влияют на исход истории. В определенные моменты истории читатель может выбрать несколько опций, каждый из которых отправляет читателя на отдельную страницу в книге.
Например, в фантастической обстановке на странице 14 может потребоваться решить, отправиться ли в таинственную пещеру, «прыгнув» на страницу 22, или исследовать близлежащий лес, перейдя на страницу 8. Эти «прыжки» можно выразить. как пары номеров страниц, вот так:
14 22
14 8
В большинстве случаев в истории есть много концовок, но только несколько хороших. Цель состоит в том, чтобы провести историю, чтобы достичь хорошего конца.
Задача:
Учитывая список «прыжков» для данной книги, ваша задача - определить маршрут, который приведет к определенному окончанию. Поскольку это довольно просто, истинная задача состоит в том, чтобы сделать это как можно меньше символов.
Это код гольф .
Пример ввода (где 1 - начало, а 100 - цель):
1 10
10 5
10 13
5 12
5 19
13 15
12 20
15 100
Образец вывода:
1 10 13 15 100
Пример ввода:
15 2
1 4
2 12
1 9
3 1
1 15
9 3
12 64
4 10
2 6
80 100
5 10
6 24
12 80
6 150
120 9
150 120
Образец вывода:
1 15 2 12 80 100
Примечания:
- Список переходов будет введен пользователем из файла или стандартного ввода. Вы можете выбрать тот, который наиболее удобен.
- Ввод будет содержать 1 переход на строку с началом и назначением, разделенными одним пробелом.
- Строки на входе не обязательно должны быть в определенном порядке.
- Успешный путь начинается со страницы 1 и заканчивается на странице 100.
- Вы можете предположить, что есть хотя бы 1 путь к цели. Вам не нужно находить все пути, и при этом вам не нужно искать самый короткий. Просто найди хотя бы одну.
- Наименьший номер страницы будет 1. Нет ограничений на максимальный номер страницы. (Вы можете предположить, что он будет соответствовать диапазону int.)
- Петли могут существовать. Например, в списке могут быть переходы со страниц 5 на 10, с 10 на 19 и с 19 на 5.
- Там могут быть тупики. То есть странице назначения может некуда перейти.
- И наоборот, могут быть недоступные страницы. То есть исходная страница не может быть пунктом назначения каких-либо переходов.
- Не все номера страниц от 1 до 100 гарантированно будут использоваться.
- Ваш вывод должен состоять из действительного маршрута номеров страниц, начиная с 1 и заканчивая на 100, разделенных пробелами.
Помните, это кодовый гольф, поэтому выигрывает самое короткое решение!
РЕДАКТИРОВАТЬ: Добавлен еще один образец для тестирования.
источник
Ответы:
Golfscript,
5857 символовПредупреждение : это супер-неэффективно. Это работает путем многократного возведения в квадрат матрицы смежности и затем поиска маршрута; если
E
в графе есть ребра, то он найдет каждый путь длиной до 2 E (а более короткие - много раз). Он должен дать вам результат для первого тестового примера за разумное время, но если вы хотите попробовать второй тест, убедитесь, что у вас есть несколько свободных гигабайт памяти и отправляйтесь на длинную прогулку.Если вы хотите достаточно эффективное решение, я предлагаю за 67 символов:
источник
cat input | ruby1.9 golfscript.rb peter.gs
и все, что случилось, было, что мой MacBook стал действительно горячим. Как мне его запустить?Python,
232213157143135132 символа (кратчайший путь)Эта реализация может обрабатывать все описанные крайние случаи (циклы, тупики, потерянные страницы и т. Д.) И гарантирует, что найдет кратчайший путь к окончанию. Он основан на алгоритме кратчайшего пути Джикстры.
источник
Javascript: 189 символов
Это рекурсивное решение, которое находит кратчайший путь через приключение.
Код-Golfed:
Для проверки ( ВНИМАНИЕ: бесконечный цикл при неправильном вводе! ):
Скопируйте одну из следующих строк ввода (или используйте аналогичный формат, чтобы выбрать свой собственный, выберите свое собственное приключение):
1 10\n10 5\n10 13\n5 12\n5 19\n13 15\n12 20\n15 100
15 2\n1 4\n2 12\n1 9\n3 1\n1 15\n9 3\n12 64\n4 10\n2 6\n80 100\n5 10\n6 24\n12 80\n6 150\n120 9\n150 120
Вставьте это в подсказку тестовой скрипки .
Отформатированный и закомментированный код:
Для проверки ( ВНИМАНИЕ: бесконечный цикл при неправильном вводе! ):
Скопируйте одну из следующих строк ввода (или используйте аналогичный формат, чтобы выбрать свой собственный, выберите свое собственное приключение):
1 10\n10 5\n10 13\n5 12\n5 19\n13 15\n12 20\n15 100
15 2\n1 4\n2 12\n1 9\n3 1\n1 15\n9 3\n12 64\n4 10\n2 6\n80 100\n5 10\n6 24\n12 80\n6 150\n120 9\n150 120
Вставьте это в подсказку тестовой скрипки .
источник
var
ключевого слова имеют глобальную область видимости :)Руби 1.9, 98
Ungolfed:
источник
Perl, 88 символов
в основном перлизованная версия записи Clueless; до матчей и после матчей весело :)
источник
Python -
239237236к сожалению, это хвостово-рекурсивное решение уязвимо для циклов в «истории» ...
Использование : cat ./test0 | ./sol.py Вывод для тестового примера 1:
Выход для тестового примера 2:
источник
Scala 2.9,
260256254252248247241239234227225212205 символовUngolfed:
Использование:
Скомпилируйте
scalac filename
и запуститеscala C
. Ввод осуществляется черезSTDIN
.Для запуска на ideone.com перейдите
object C extends App
наobject Main extends Application
Scala 2.8.источник
PHP,
166146138 символовUngolfed:
Использование :
источник
STDIN
а не в качестве аргументов.Я бы поместил их все в двумерный массив и провел поиск по всем элементам с многократным циклом; если они могут достичь последнего элемента, я бы собрал связанные элементы по порядку в другой массив результатов, и из результатов я бы выбрал массив, размер которого меньше ,
РЕДАКТИРОВАТЬ => JAVA: я также использовал рекурсивную функцию, полный код ниже;
источник