Код гольф лучшая перестановка


14

Вызов

Если задано целое число 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.)


4
@JoKing каждый ответ может быть перенесен без каких-либо изменений, но в этом вызове будет очень плохо. Публикация этого кода в этом вызове эквивалентна публикации кода из обзора кода в вызове кода-гольфа.
Стьюи Гриффин,

2
Смешивание разных количеств в баллах действительно может быть проблематичным. Ответ с лучшим алгоритмом обычно может быть перенесен на любой язык, и в этом случае выигрыш сводится к нормальному коду.
Angs

4
Оптимальные значения [6,6,6,8,10,12,12,12,14,16,18]для оценки 120. Интересно, что эта схема может быть найдена в A078706 .
Лайкони

3
Хорошо, это начинает отличаться от A078706с n=17, который может иметь оценку 20.
Лайкони

4
Я могу понять проблему ясно и однозначно. Если вы не согласны и проголосуете за закрытие, оставьте комментарий здесь.
user202729

Ответы:


7

Желе , 36 34 33 32 31 30 байт, результат: 120

Спасибо Деннису за -1 байт! (неявно, исправляя ошибку Jelly, хотя эта функция устарела)

ðRḟISị“Ƥ¿‘Ʋœ?$;@µ2x5~4¦ṁ_4$Ä’

Новая функция: накопленная сумма ( Ä).

Попробуйте онлайн!

Используйте 1-индексацию.

Занимает также линейное время.


Эта программа на C ++ генерирует лексикографически наименьшую перестановку, предполагая, что | i - p i | ≤ ширина (где ширина - это жестко закодированная константа) для всех 0 ≤ i <n , с временной сложностью около O (ширина 2 × 2 2 × ширина × n) (что является просто O (n) для фиксированной ширины ): попробуйте онлайн !


Как?

  1. Напишите программу на C ++, которая пытается оптимально решить проблему.
  2. Соблюдайте шаблон. Отметим, что последовательность всех элементов, кроме 4 последних, является префиксом

    0 2 4 1 3 5 7 9 6 8 10 12 14 11 13 15 17 19 16 18 20 22 24 21 23 25 ...
    
  3. Вычисляет инкрементную разницу последовательности.

    2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2
    

    Обратите внимание на период 5.

  4. Реализация желе:

    • n-4 первых элемента взяты из последовательности выше. О (п) .
    • Для 4 последних элементов просто перебор всех 24 возможностей . O (1) .

      (примечание: я больше не перебираю все 24 варианта из 32-байтовой версии)


Ах, вы пошли с другим префиксом для меня. Моя начинается 0 2 4 1 3 5 8 6, и имеет больший коэффициент ветвления, но не имеет такой простой схемы.
Питер Тейлор

7

CJam (60 байт + 120 = 180 баллов)

{_5/4*8e!961=7_)er<:A\,^e!{A\+}%{2ew::-:z1&!},{_$.-:z1b}$0=}

Набор онлайн-тестов со встроенной оценкой

Расширение до n = 24

рассечение

{
  _5/4*        e# Work out how much of the hard-coded prefix to use
  8e!961=7_)er e# Prefix [0 2 4 1 3 5 8 6]
               e# I identified this by brute forcing up to n=10 and looking for patterns
               e# I then used the identified prefix [0 2 4 1] to brute-force further
  <:A          e# Take the desired prefix of the hard-coded array, and store a copy in A
  \,^e!        e# Generate all permutations of the values in [0 .. n-1] which aren't in A
  {A\+}%       e# Prepend A to each of them
  {            e# Filter...
    2ew::-     e#   Take each difference of two consecutive elements
    :z         e#   Find their absolute values
    1&         e#   Test whether 1 is among those absolute values
    !          e#   Reject if it is
  },
  {            e# Sort by...
    _$.-       e#   Take pairwise differences of permutation with the identity
    :z         e#   Absolute values
    1b         e#   Add them (by interpreting in base 1)
  }$
  0=           e# Take the first
}

Очень впечатляюще! Я с нетерпением жду, чтобы узнать, как вы это сделали.
Ануш

Оптимально ли он до 24?
Ануш

@ Ануш Согласно моей программе, скорее всего.
user202729

@ Ладно, я еще не доказал это, но я верю в это.
Питер Тейлор

Я еще больше заинтригован вашим алгоритмом!
Ануш

6

Haskell , 146 + 89 баллов + байт

f i|k<-mod i 4=scanl(+)1$take(i-2-k)(cycle[2,-3,2,3])++[[2],[2,2],[5,-3,2],[5,-3,2,2]]!!k

Повторяет шаблон [1,3,0,2], последние mod i 4элементы настраиваются вручную.

Предыдущий алгоритм (132 + 116):

f i=last$filter(\a->all(`elem`a)[0..i-1]).(!!(i-1)).iterate((\l->map((:l).(+head l))[-3,2,-2,3])=<<)$pure<$>[i-3..i]

Bruteforces правильное количество прыжков длиной ± 2 или ± 3. Выбирает последний, который содержит правильные числа, кажется, работает просто отлично и намного дешевле, чем реализация оценки. У Тио просто заканчивается время до последнего счёта - 18.

Попробуйте онлайн!


2

Japt, 120 + 20 = 140

(Копирование одного из моих решений из другого вызова принесло бы мне 227 баллов)

o á k_äa d¥1ÃñxÈaYÃg

Попробуйте или используйте эту версию, чтобы проверить результаты. Обе версии могут начать давить на вас около 9.


объяснение

o                        :Range [0,input)
  á                      :All permutations
    k_      Ã            :Remove sub-arrays that return true
      äa                 :  Get the consecutive absolute differnces
         d¥1             :  Do any equal 1?
               È  Ã      :Pass the integers in each remaining sub-array through a function
                aY       :  Get the absolute difference with the integer's index
              x          :Reduce by addition
             ñ           :Sort the main array by those values
                   ñ     :Return the first sub-array

9
« Вы должны быть в состоянии запустить свое представление до завершения на своей машине. » Вам удалось обработать 87E9 перестановок 14 элементов за два часа с момента публикации вопроса?
Питер Тейлор,

3
Кроме того, учтите, что Japt основан на Javascript, может ли он действительно обрабатывать перестановки 87E9? Этот вопрос говорит о том, что массив Javascript может иметь длину не более ~ 4E9. У Japt есть функция генерации или что-то ... \
user202729

2

Рубин , 120 баллов + 112 106 91 82 байта

->n{(0...n).map{|a|a+(a+2)%5-([[],[],[0,4,3],[-1,4,4,4],[1,1,6,1]][n%5][a-n]||2)}}

Попробуйте онлайн!

Последовательность в основном (a-2)+(a+2)%5.

Если n mod 5 не равно 0 или 1, последние 3 или 4 элемента отличаются.

Это все еще наполовину закодировано, всегда находит лучшее решение, может быть, это может быть немного больше в гольфе, но у меня закончились идеи.


1

JavaScript (Node.js) , 148 баллов + 109 73 байта

n=>[...Array(n)].map(_=>l=!m|l>n%5+2&&l>m+2?[+m,m=l+2][0]:l+2,m=n>4,l=~m)

Попробуйте онлайн! Объяснение: lотслеживает последнее сгенерированное число и mотслеживает следующее число, противоположное четности l; после lпревышения m+2переменные обмениваются. Корректировка выполняется в начале последовательности, так что последовательности, длина которых не кратна 5, не пропускают никаких чисел, и выполняется другая настройка дляn=4 .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.