брифинг
Вы - бот в двумерной сетке, которая простирается бесконечно во всех четырех направлениях: север, юг, восток и запад. Когда вам дают номер, вы должны двигать бота так, чтобы вы достигли целевого номера.
Вот как работает сетка:
Вы можете двигаться в 4 направлениях: север, юг, восток или запад. Как только вы покидаете ячейку, вам больше не разрешается возвращаться в эту ячейку (настолько эффективно, что она была стерта с карты).
Существует «счетчик», который идет 1234567890
(так оно идет от 1
к 2
... всем путям 9
, чтобы потом 0
, а затем обратно 1
снова), который меняется каждый раз при перемещении.
У вас также есть «значение», которое начинается с 0.
Когда вы двигаетесь в любом направлении, происходит математическая операция, в зависимости от того, в каком направлении вы двигаетесь:
- Север: ваше значение увеличивается на счетчик (
value += counter
). - Восток: ваше значение уменьшается на counter (
value -= counter
). - Юг: ваше значение умножается на counter (
value *= counter
). - Запад: Ваша ценность делится на счетчик (
value /= counter
).- Деление является целочисленным делением, поэтому
5/2 -> 2
. - Вы не можете делить на
0
.
- Деление является целочисленным делением, поэтому
Пример:
Если бот движется на север 3 раза:
- Первое «северное» движение увеличивает счетчик
1
и добавляет его к значению (которое сейчас1
). - Второе движение «на север» увеличивает счетчик
2
и добавляет его к значению (которое сейчас3
). - Третье движение «на север» увеличивает счетчик
3
и добавляет его к значению (которое сейчас6
).
Конечное значение 6
.
Двигайтесь на север, затем снова на юг:
- Первое «северное» движение увеличивает счетчик
1
и добавляет его к значению (которое сейчас1
). - Вторая ошибка перемещения на юг, потому что ячейка, по которой пытается двигаться бот, удаляется (с первого хода).
Нет окончательного значения, потому что бот ошибся.
Вызов
Ваша задача состоит в том, чтобы написать программу, когда при заданном числе выведите подходящие указания для бота, чтобы конечное значение бота было равно этому числу.
Так что, если число есть 6
, правильное решение для этого будет:
nnn
(Бот движется на север 3 раза подряд).
Ваши тестовые значения:
49445094, 71259604, 78284689, 163586986, 171769219, 211267178, 222235492, 249062828, 252588742, 263068669, 265657839, 328787447, 344081398, 363100288, 363644732, 372642304, 374776630, 377945535, 407245889, 467229432, 480714605, 491955034, 522126455, 532351066, 542740616, 560336635, 563636122, 606291383, 621761054, 648274119, 738259135, 738287367, 748624287, 753996071, 788868538, 801184363, 807723631, 824127368, 824182796, 833123975, 849666906, 854952292, 879834610, 890418072, 917604533, 932425141, 956158605, 957816726, 981534928, 987717553
(Это 50 случайных чисел от 1 до 1 млрд.)
Ваша оценка - это общее количество ходов, сделанных для всех 50 чисел: чем меньше ходов, тем лучше. В случае ничьей побеждает тот, кто предоставил свой код раньше.
Спекуляции
- Вы гарантированно получите положительное целое число для ввода.
- Ваша
value
переменная не должна быть выше2^31-1
или ниже-2^31
в любой точке для ваших сгенерированных путей. - Ваша окончательная программа должна соответствовать ответу (так,
< 30,000
байты). - Вы можете указать только 10 номеров.
- Ваша программа должна работать в течение 5 минут на приемлемом ноутбуке для любого теста.
- Результаты ДОЛЖНЫ быть одинаковыми при каждом запуске программы для каждого числа.
источник
value
, да? По крайней мере, для меня это звучит как ограничение, накладываемое на реализацию, а не на фактический алгоритм.Ответы:
C ++: оценка = 453 324 048
Ладно, понадобилось время, чтобы переделать это, но вот как я решил это.
Изучив пространство решений, я решил, что моя стратегия будет такой:
Вот мой результат: общий балл 453324048
И пути:
Я уверен, что есть способ улучшить это, сделав несколько умных ходов «юг / запад» (деление на 4 и умножение на 5; например); но запрограммировать его и убедиться, что вы не за коленями и не попали в ловушку, сложно.
Другой путь решения может состоять в том, чтобы попытаться вернуться назад от цели к «разумному» числу, а затем просто найти путь к этому меньшему числу; но вам нужно будет «целиться» правильно, чтобы номер шага совпадал. хитрый, но может быть лучший способ решить это.
Во всяком случае, вот мой код:
источник
Python, оценка = 56068747912
Просто печатает
nenenenenenenen...
для каждого номера.Позже добавлю объяснение.
источник
nen
2 годаРуст , оценка = 1758 (оптимально среди путей без запада)
Запускается примерно за 7 секунд для 50 номеров, используя двунаправленного поиска .
Попробуйте онлайн!
Выход
источник
ns
,sn
,ew
иwe
сразу же незаконно в дополнении к любым петлям в путиw
,ns
иsn
, который оставляет только легальные пути за счет игнорирования легальных путей сw
.PHP, Score = 1391462099
Быстрая попытка - никогда не идти на запад, чтобы упростить проверку пути, и у нее мало правил для определения направления на каждом этапе.
источник