Вопрос
Мы захвачены армией роботов на их космической станции. Наш пилот космического корабля находится в тюрьме, которая находится на уровне 1. Есть только один способ, как сбежать, и это спасает вашего пилота космического корабля. Это означает переход с уровня N на уровень 1. Однако, поскольку это очень рискованно, вам нужно попасть в тюрьму за наименьшее количество шагов.
условия
Есть 4 способа как двигаться:
- Переход с уровня N на уровень N - 1
e.g. from 12 to 11
- Перейти с уровня N на уровень N + 1
e.g. from 12 to 13
- Используйте телепорт с уровня 2k до уровня k
e.g. from 12 to 6
- Используйте телепорт с уровня 3k до уровня k
e.g. from 12 to 4
- Переход с уровня N на уровень N - 1
Телепорты только односторонние (вы можете получить от 12 до 4, но невозможно получить от 4 до 12)
- Каждое действие занимает один шаг
вход
Ввод следует читать из STDIN или ближайшей альтернативы на вашем языке программирования. Вход состоит из целого числа, n
где 1 <= n <= 10^8
.
Выход
Выходными данными должно быть минимальное количество шагов, необходимых для перехода n
на уровень 1.
Примеры
Level Minimum number of steps
1 0
8 3
10 3
267 7
100,000,000 25
Попробуйте закодировать программу, которая поможет нам в кратчайшие сроки спасти нашего пилота космического корабля из тюрьмы и вернуться домой!
Самый короткий код выиграет!
Ответы:
Pyth, 32 байта
Попробуйте онлайн: демонстрация или тестовый набор
Объяснение:
Я немного трансформировал проблему. Я определяю 4 новые операции, которые заменяют 4 операции вопроса.
level / 2
(считается(level % 2) + 1
шагом, потому что вам может понадобиться сначала переместить уровень вниз, чтобы телепортироваться)(level + 1) / 2
(считается(level % 2) + 1
шагом)level / 3
(считается(level % 3) + 1
шагом)(level + 1) / 3
(считается(-level % 3) + 1
шагом)По своей конструкции эти операции могут быть применены к каждому номеру, если номер
0 mod 2
,1 mod 2
,0 mod 3
,1 mod 3
или2 mod 3
.Вы можете легко подумать, почему это работает. Основная идея заключается в том, что существует хотя бы одно оптимальное решение, в котором нет двух (двигаться вниз) или двух (двигаться вверх) движений подряд. Доказательство: если у вас есть решение, в котором есть два таких движения подряд, вы можете заменить их и сделать решение меньшим или равным по длине. Например, вы можете заменить (двигаться вверх, двигаться вверх, телепортироваться с 2k на k) на (телепортироваться с 2k на k, двигаться вверх) и подобное во всех других случаях.
Функция
y
использует неявное запоминание, и поэтому среда выполнения не взрывается.источник
Python, 176 байт
Грубая сила всю дорогу; список всех чисел
1 to 100,000,000
на 64-битном компьютере составляет ~ 800 МБ памяти.Индекс списка представляет числа, значения представляют расстояние от 1 в разрешенных шагах спасения.
1
)0,2,2,3
)Время выполнения чуть более 10 минут. * * Гм.
Комментарии к коду
Другой
источник
Python 2 ... 1050
плохо написано, негольфировано, неоптимально.
Читает начальный уровень в stdin, печатает минимальное количество шагов в stdout.
источник
32-битный машинный код x86, 59 байт
В шестнадцатеричном виде:
Машинный язык сам по себе не имеет понятия стандартного ввода. Поскольку задача чисто вычислительная, я решил написать функцию, принимающую входной параметр
EAX
и возвращающую результатAL
.Математика, лежащая в основе кода, хорошо объясняется @Jakube: поиск проводится только среди путей, телепорты которых перемежаются не более чем одним одноуровневым ходом. Производительность составляет около 12000 тестовых случаев в секунду в нижнем конце входного диапазона и 50 случаев в секунду в верхнем конце. Потребление памяти составляет 12 байт стекового пространства на уровень рекурсии.
источник