Последовательность магия представляет собой последовательность неотрицательных целых чисел , x[0..n-1]
таких , что существует ровно x[i]
экземплярыi
Например, 6,2,1,0,0,0,1,0,0,0 - это магическая последовательность, поскольку есть 6 0, 2 1 и т. Д.
Напишите функцию, которая при задании n выводит все магические последовательности длины n
Программа, которая может произвести правильный вывод для наибольшего значения n в течение 10 секунд, побеждает. (Все программы приветствуются)
Например, программа Алисы может обрабатывать до n = 15 в течение 10 секунд, в то время как Боб может обрабатывать до n = 20 в течение того же времени. Боб выигрывает.
Платформа: Linux 2,7 ГГц @ 4 процессора
number
fastest-code
sequence
Агнишом Чаттопадхяй
источник
источник
n>5
с решением не в форме[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
? Я посмотрел вверхn=20
и не нашел, и мне интересно, если я делаю ошибку.Ответы:
Python, n≈10 8
Это использует тот факт, который я докажу, что единственные магические последовательности длины
n
:[1, 2, 1, 0]
и[2, 0, 2, 0]
дляn=4
[2, 1, 2, 0, 0]
заn=5
[n-4, 2, 1, 0, 0, ..., 0, 0, 1, 0, 0, 0]
заn>=7
Так что,
n>=7
нужно только вернуть огромный кортеж. Я могу сделать это примерноn=10^8
на моем ноутбуке, который, вероятно, ограничен памятью; больше и он замерзает. (Спасибо trichoplax за идею использования кортежей, а не списков.) Или, если вместо этого можно напечатать словарь ненулевых записей,{0:n-4, 1:2, 2:1, (n-4):1}
можно сделать это для большого количестваn
.Я доказываю уникальность для
n>=7
; другие могут быть проверены грубой силой или делом.Сумма записей
l
- это общее количество всех номеров списка, которое является его длинойn
. В списке естьl[0]
нули и, следовательно,n-l[0]
ненулевые записи. Но по определениюl[0]
должно быть ненулевым, иначе мы получим противоречие, и каждая из других ненулевых записей равна по крайней мере 1. Это уже составляет суммуl[0] + (n-l[0]-1)*1 = n-1
из общей суммыn
. Таким образом, не считаяl[0]
, может быть не более одного 2 и нет записи больше 2.Но это означает, что единственными ненулевыми записями являются
l[0], l[1], l[2], and l[l[0]]
значения, значения которых не больше,l[0]
и перестановка1,1,2
, что дает максимальную суммуl[0]+4
. Поскольку эта сумма естьn
, а это как минимум 7, у нас естьl[0]>=3
и такl[l[0]]=1
. Так вот, есть по крайней мере одно1
, что означаетl[1]>=1
, но еслиl[1]==1
это другое1
, значитl[1]>=2
,l[1]
это одиночество2
. Это даетl[2]=1
, и все остальные записи0
, так чтоl[0]=n-4
, что завершает решение.источник
Python 3, n≈40
Выполняет поиск возможных списков в ширину, заполняя записи справа налево, останавливая поиск с суффиксом, если это невозможно, что может произойти, если:
n
(сумма для всего списка должна бытьn
)i*l[i]
в суффиксе превышаетn
(сумма для всего списка должна бытьn
)У меня были оригинальные проверенные префиксы слева направо, но это происходило медленнее.
Выходы до
n=30
:За исключением первых трех списков
[1, 2, 1, 0], [2, 0, 2, 0], [2, 1, 2, 0, 0]
, существует ровно один список каждой длиныn>6
, и он имеет форму[n-4, 2, 1, ..., 0, 0, 1, 0, 0, 0]
. Эта модель сохраняется по крайней мере доn=50
. Я подозреваю, что это действует вечно, и в этом случае тривиально вывести огромное количество из них. Даже если нет, математическое понимание возможных решений значительно ускорит поиск.источник
n=0
. Я пропустил, что мы возвращаем результат за один разn
, не считаяn
. Это меня заводитn=40
.Pyth - 15 байт
Использует грубую силу всеми возможными последовательностями len
n
и затем фильтрует.Полное объяснение скоро.
Попробуйте здесь онлайн .
источник
К, 26 байт
Как подход Малтисена, грубая сила. Сердцем программы является предикат, который проверяет, является ли данный вектор «магическим»:
Постройте йота-вектор до входного вектора (
!#x
), посчитайте вхождения каждой цифры ((+/x=)'
) и сравните результат с входным вектором (x~
). Если есть совпадение, у вас есть волшебная последовательность.К сожалению, этот первый удар кажется довольно медленным. Тестирование с использованием Kona на моем ноутбуке занимает около 12 секунд для обработки n = 7. Мне нужно больше об этом подумать.
источник