Вызов
Если задано целое число n ≥ 4 , выведите перестановку целых чисел [0, n-1] со свойством того, что два последовательных целых числа не стоят рядом друг с другом. Значение перестановки pi
является суммой abs(pi[i] - i)
для всех индексов i
.
Примеры
(1, 3, 0, 2)
имеет значение6
(0, 2, 4, 1, 3)
имеет значение6
(0, 2, 4, 1, 3, 5)
имеет значение6
(0, 2, 4, 1, 5, 3, 6)
имеет значение8
Оценка вашего ответа
Оценка вашего ответа - это сумма значений ваших перестановок n = 4 .. 14
плюс число байтов, которые занимает ваш код. Чем ниже оценка, тем лучше. Ваш код должен давать действительный вывод для всех этих значений n
.
Вы должны быть в состоянии запустить ваше представление до завершения на вашем компьютере.
В случае связей, время последнего редактирования, которое привело к соответствующему счету, будет решающим.
Разве это не тот же вопрос, что и этот ?
Ответы на связанный вопрос не будут конкурентоспособными для этого вопроса, так как они не прилагают никаких усилий для оптимизации значения перестановки. Например, для n=10
перестановки, [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
приведенной в большинстве ответов, приводится значение 30
. Вы можете сделать намного лучше, чем это.
Для перестановочной части вопроса оптимальное значение в целом не более 120
. (Спасибо @Laikoni.) Тогда как ответ Денниса на предыдущий вопрос получил 222 балла . (Спасибо @ user202729.)
источник
[6,6,6,8,10,12,12,12,14,16,18]
для оценки 120. Интересно, что эта схема может быть найдена в A078706 .A078706
сn=17
, который может иметь оценку20
.Ответы:
Желе ,
363433323130 байт, результат: 120Спасибо Деннису за -1 байт! (неявно, исправляя ошибку Jelly, хотя эта функция устарела)
Новая функция: накопленная сумма (
Ä
).Попробуйте онлайн!
Используйте 1-индексацию.
Занимает также линейное время.
Эта программа на C ++ генерирует лексикографически наименьшую перестановку, предполагая, что | i - p i | ≤ ширина (где ширина - это жестко закодированная константа) для всех 0 ≤ i <n , с временной сложностью около O (ширина 2 × 2 2 × ширина × n) (что является просто O (n) для фиксированной ширины ): попробуйте онлайн !
Как?
Соблюдайте шаблон. Отметим, что последовательность всех элементов, кроме 4 последних, является префиксом
Вычисляет инкрементную разницу последовательности.
Обратите внимание на период 5.
Реализация желе:
Для 4 последних элементов
просто перебор всех 24 возможностей. O (1) .(примечание: я больше не перебираю все 24 варианта из 32-байтовой версии)
источник
0 2 4 1 3 5 8 6
, и имеет больший коэффициент ветвления, но не имеет такой простой схемы.CJam (60 байт + 120 = 180 баллов)
Набор онлайн-тестов со встроенной оценкой
Расширение до n = 24
рассечение
источник
Haskell , 146 + 89 баллов + байт
Повторяет шаблон [1,3,0,2], последние
mod i 4
элементы настраиваются вручную.Предыдущий алгоритм (132 + 116):
Bruteforces правильное количество прыжков длиной ± 2 или ± 3. Выбирает последний, который содержит правильные числа, кажется, работает просто отлично и намного дешевле, чем реализация оценки. У Тио просто заканчивается время до последнего счёта - 18.
Попробуйте онлайн!
источник
Japt, 120 + 20 = 140
(Копирование одного из моих решений из другого вызова принесло бы мне 227 баллов)
Попробуйте или используйте эту версию, чтобы проверить результаты. Обе версии могут начать давить на вас около 9.
объяснение
источник
Рубин , 120 баллов +
112 106 9182 байтаПопробуйте онлайн!
Последовательность в основном
(a-2)+(a+2)%5
.Если n mod 5 не равно 0 или 1, последние 3 или 4 элемента отличаются.
Это все еще наполовину закодировано, всегда находит лучшее решение, может быть, это может быть немного больше в гольфе, но у меня закончились идеи.
источник
JavaScript (Node.js) , 148 баллов +
10973 байтаПопробуйте онлайн! Объяснение:
l
отслеживает последнее сгенерированное число иm
отслеживает следующее число, противоположное четностиl
; послеl
превышенияm+2
переменные обмениваются. Корректировка выполняется в начале последовательности, так что последовательности, длина которых не кратна 5, не пропускают никаких чисел, и выполняется другая настройка дляn=4
.источник