Учитывая последовательность чисел, найдите минимальное количество прыжков, чтобы пройти от начальной позиции до конца и снова вернуться в исходную позицию.
Каждый элемент последовательности обозначает максимальное количество ходов, которое можно переместить из этой позиции.
В любой позиции вы можете совершить скачок при максимальных k ходах, где k - это значение, сохраненное в этой позиции. Достигнув конца, вы можете использовать только те позиции для прыжков, которые ранее не использовались для прыжков.
Ввод будет дан как последовательность чисел, разделенных пробелами. Выходными данными должно быть одно число, которое является минимальным количеством используемых прыжков. Если невозможно дойти до конца и вернуться в исходное положение, выведите -1
Входные данные:
2 4 2 2 3 4 2 2
Выход:
6 (3 до конца и 3 до возвращения)
вход
1 0
Выход
-1
Заметка
- Предположим, что все числа последовательности неотрицательны
РЕДАКТИРОВАТЬ 1
Строка «Таким образом, должно быть понятно, что всегда можно прыгнуть с последней позиции». может быть запутанным, поэтому я убрал его из вопроса. Это не повлияет на вопрос.
Критерии победы:
Победителем станет тот, у кого самый короткий код.
источник
Thus, it should be clear that one can always jump from the last position.
- не1 0
контрпример?Ответы:
АПЛ (Дьялог), 116
Контрольные примеры
Подходить
Подход - это перебор с использованием рекурсивной функции.
Начиная с позиции 1, установите значение в текущей позиции равным 0 и сгенерируйте массив позиций, к которым можно перейти с текущей позиции. Передайте новую позицию и измененный массив себе. Базовые случаи - это когда значение в текущей позиции равно 0 (невозможно прыгать) или достигает конца.
Затем для каждого сгенерированного массива поверните его и выполните поиск снова. Поскольку прыжковые позиции установлены в 0, мы не можем прыгать оттуда снова.
Для тех массивов, которые мы достигли конца, найдите те, которые имеют минимальное количество 0. Вычитая из него количество нулей в исходном массиве, получаем фактическое количество выполненных прыжков.
источник
Mathematica,
197193 символаГрубая сила.
источник
Mathematica 351
[Примечание: это еще не полностью игра в гольф; Кроме того, ввод должен быть скорректирован в соответствии с требуемым форматом. И должно быть реализовано правило «не прыгать на той же позиции дважды». Есть также некоторые проблемы с форматированием кода, которые необходимо устранить. Но это начало.]
Граф строится с узлами, соответствующими каждой позиции, то есть каждой входной цифре, представляющей скачок.
DirectedEdge[node1, node2]
означает, что можно перейти с узла 1 на узел 2. Кратчайшие пути находятся от начала до конца, а затем от конца к началу.использование
источник
Python 304
Я думаю, что этот новый подход решает (я надеюсь!) Все проблемы, касающиеся случая [2,0] и подобных:
В этой версии входная последовательность обходит (если возможно) до конца, а затем мы снова запускаем процесс с обратной последовательностью. Теперь мы можем гарантировать, что для каждого правильного решения один из прыжков приземлится на последний элемент.
Это версии для гольфа:
И несколько примеров:
источник
R - 195
Моделирование:
Де-golfed:
источник
Python 271
это мое решение:
Примеры:
И это (частично уже) версии для гольфа:
Несколько примеров:
источник
Рубин - 246
Моделирование:
источник
Рубин - около 700 в гольф. Я запустил гольф-версию с односимвольными именами для переменных и методов, но через некоторое время я стал больше интересоваться алгоритмом, чем гольфом, поэтому перестал пытаться оптимизировать длину кода. Я также не беспокоился о получении входной строки. Мои усилия ниже.
Чтобы помочь вам понять, как это работает, я включил комментарии, которые показывают, как обрабатывается определенная строка (u = "2 1 4 3 0 3 4 4 3 5 0 3"). Я перечисляю комбинации "камней в потоке", на которые можно прыгать. Они представлены в виде двоичной строки. Я даю пример 0b0101101010 в комментариях и показываю, как он будет использоваться. 1 соответствуют позициям камней, доступных для начальной поездки; 0 для обратной поездки. Для каждого такого распределения я использую динамическое программирование, чтобы определить минимальное количество прыжков, необходимое в каждом направлении. Я также выполняю несколько простых оптимизаций, чтобы устранить некоторые комбинации на ранних этапах.
Я запустил его со строками, приведенными в других ответах, и получил те же результаты. Вот некоторые другие результаты, которые я получил:
Мне было бы интересно услышать, получают ли другие те же результаты для этих строк. Производительность достаточно хорошая. Например, решение этой строки заняло менее минуты:
"3 4 3 0 4 3 4 4 5 3 5 3 0 4 3 3 0 3 4 5 3 2 0 3 4 1 6 3 2 0 4 5 3 2 0 3 4 1 6 3 0 4 3 4 4 5 0 1"
Код следует.
источник
Хаскелл,
173166 байт, 159 байт в GHCiВот нормальная версия:
импортировать Data.List
Вот ответ GHCi (поставить строку по одному):
Просто грубая сила. Генерация возможного ответа. (т.е. перестановка [0..n-1] с нулем и последующим пропущенным элементом. Затем проверьте, верен ли ответ. Получите минимальную длину и прибавьте единицу. (Поскольку передний и конечный нули удаляются).
Как использовать:
j[3,4,0,0,6]
->3
источник
Data.List.permutations
не работает в GHC, а только в GHCi. Согласно нашему Руководству по правилам игры в гольф на Haskell , вы должны либо добавить импорт, либо пометить свой ответ как «Haskell GHCi». На этом сайте гольфисты Haskell предпочитают первый вариант.a<-permutations[0..t l-1],let f=takeWhile(/=0)a
, вы можете написатьf<-map(takeWhile(/=0))(permutations[0..t l-1])
, что снова можно играть в гольфf<-fst.span(>0)<$>permutations[0..t l-1]
. Благодаря этому вы вернетесь к 166 байтам, даже добавив импорт: попробуйте онлайн!