Последовательность целых чисел является одной последовательностью, если разница между любыми двумя последовательными числами в этой последовательности равна -1 или 1, а ее первый элемент равен 0.
Точнее: a1, a2, ..., an является однопоследовательностью, если:
For any k (1 ≤ k < n): |a[k] - a[k+1]|=1,
a[1]=0
вход
n
- количество элементов в последовательностиs
- сумма элементов в последовательности
Выход
- набор из одной последовательности / list / array / etc длины
n
с суммой элементовs
, если это возможно - пустой набор / список / массив / и т.д., если это невозможно
Примеры
Для ввода 8 4
, вывода может быть [0 1 2 1 0 -1 0 1]
или [0 -1 0 1 0 1 2 1]
. Могут быть и другие возможности.
Для ввода 3 5
вывод пустой []
, так как это невозможно сделать.
правила
Это код гольфа, самый короткий ответ в байтах выигрывает. Материалы должны быть программой или функцией. Ввод / вывод может быть дан любым из стандартных способов .
(l-1)*l/2
и-(l-1)*l/2
имеют ту же четность, что и(l-1)*l/2
.Ответы:
CJam,
56 47 4434 байтаЗдесь много возможностей для улучшения, но здесь идет первая попытка:
Кредиты Деннису за эффективный способ выполнения роли
{ ... }%
.Печатает представление массива, если это возможно, в противном случае
""
Попробуйте онлайн здесь
источник
{}%
часть вашего кода не похожа на мою (это просто код @ PeterTaylor, заменяющий точки подчеркиванием). Если я добавлю что-нибудь в твой код, это{}=
оператор ..._{_W=)+}%\{_W=(+}%+
что сначала делали две копии, добавив 1 к первой, вычитая 1 из других. Ваш пример заставил меня понять, как сделать это в одном{ ... }%
блоке. Что касается{ ... }=
, я уже уменьшил это так сильно в моих экспериментах, хотя еще не опубликовал.3 5
вывод должен быть,[]
а не""
[]p
в CJam просто выводится""
. Так что, как язык представляет пустые массивы.JavaScript (E6) 79
82Не нужно грубой силы или перечисления всех кортежей.
Посмотрите последовательность длины n как n -1 шагов, каждый шаг - увеличение или уменьшение.
Обратите внимание, что вы можете поменять местами только приращение, сумма изменяется на 2, поэтому для любой заданной длины сумма всегда четная или всегда нечетная.
При всех приращениях последовательность равна 0, 1, 2, 3, ..., n-1, и мы знаем, что сумма равна (n-1) * n / 2. При
изменении последнего шага сумма изменяется на 2, поэтому последний шаг весит 2. При
переходе от последнего к последнему шагу сумма меняется на 4, поэтому последний шаг весит 4. Это потому, что последовательный шаг до сих пор основывается на частичной сумме.
При изменении предыдущего шага сумма изменяется на 6, поэтому последний шаг весит 6 (не 8, это не двоичные числа).
...
Изменение веса первой ступени (n-1) * 2
Алгоритм
Код без правил
Тест в консоли Firefox / FireBug
Выход
источник
GolfScript (
4139 байт)Онлайн демо
Спасибо Деннису за 41-> 39.
источник
,0=
до?
. Прямой порт в CJam будет на 5 байт короче:L1,al~:S;({{_W=(+_)))+}%}*{:+S=}=p
{ ... }%
блоке. В моем коде у меня было два, я пытался уменьшить его до 1. Как и в случае с настоящим алгоритмом, я думаю, что и Питер, и я выложили один и тот же алгоритм почти в одно и то же время.Mathematica, 73 байта
Простое решение грубой силы.
Я генерирую все варианты шагов. Затем я превращаю их в накопленные списки, чтобы получить однопоследовательность. И тогда я ищу первый, чья сумма равна второму параметру. Если есть не, значение по умолчанию
{}
.источник
Haskell, 56 байт
Объяснение:
1,-1
и длиной n-1:replicateM n-1[-1,1]
Пример:
replicateM 2 [-1,1]
==[[-1,-1],[-1,1],[1,-1],[1,1]]
scanl
имеет низкую производительность, но он делает правильную работу здесь.n
где суммаs
источник
Control.Monad
только для использования,replicateM
который уже слишком длинный. какую другую монадическую функцию вы можете использовать для симуляцииreplicateM
?head$
к своему решению.head
не возвращается[]
за[] :: [[a]]
- и я ненавижу ошибки.mapM(\x->[1,-1])[2..n]
вместоsequence
иreplicate
.Питон, 138
источник
CJam,
655854 байтаЧуть короче, чем у моего решения Mathematica, но в основном я виноват в том, что все еще неправильно использую CJam:
Это в буквальном смысле тот же алгоритм: получить все
n-1
наборы{1, -1}
. Найдите первого, чье накопление такое же, какs
, добавьте a0
. Выведите пустой массив, если ничего не найдено.источник
CJam, 40
Еще один подход в CJam.
источник
Рубин (136)
источник
J, 47 символов
Проверяет каждую последовательность, как и многие другие ответы. Постараюсь сделать более короткое решение O (n).
источник
APL 38
Пример:
Этот, как и многие другие, просто перебирает каждую комбинацию, чтобы найти ту, которая соответствует, если не найдена, ничего не возвращает. На самом деле он пытается несколько комбинаций более одного раза, чтобы сделать код короче.
источник