Последовательность SUDSI ( су м, д ifference, ˙s WAP, я ncrement) представляет собой целое число , любопытная последовательность , которая , как представляется , обладает довольно хаотическим поведением. Это может быть сгенерировано следующим образом:
Пусть S бесконечный список натуральных чисел: 1 2 3 4 5 6 ...
. Пусть S я обозначаю один индексированный я й элемент S . Итак, изначально S 1 равно 1, S 2 равно 2 и т. Д. ( S 0 отсутствует ).
Начиная с S 1 и S 2 ...
- Подсчитайте их сумму:
sum = S1 + S2
- Вычислите их абсолютную разницу (чем больше, тем меньше):
diff = |S1 - S2|
Поменяйте местами два значения в S по индексам суммы и разности:
swap(Ssum, Sdiff)
Увеличьте показатели S, с которыми вы работаете. Поэтому в следующий раз вы будете вычислять сумму и разность S 2 и S 3 , а время после этого будет S 3 и S 4 и т. Д.
- Повторите этот процесс до бесконечности.
Вот первые несколько этапов S, как этот процесс применяется. Квадратные скобки []
окружают два значения, которые будут суммироваться и различаться.
Оригинал S :
[1 2] 3 4 5 6 7 8 9 10 11 12 ...
После того, как S 3 ( 3 = 1 + 2
) и S 1 ( 1 = |1 - 2|
) поменялись местами:
3 [2 1] 4 5 6 7 8 9 10 11 12 ...
После того, как S 3 и S 1 поменялись местами:
1 2 [3 4] 5 6 7 8 9 10 11 12 ...
После того, как S 7 и S 1 поменялись местами:
7 2 3 [4 5] 6 1 8 9 10 11 12 ...
После того, как S 9 и S 1 поменялись местами:
9 2 3 4 [5 6] 1 8 7 10 11 12 ...
После того, как S 11 и S 1 поменялись местами:
11 2 3 4 5 [6 1] 8 7 10 9 12 ...
После того, как S 7 и S 5 поменялись местами:
11 2 3 4 1 6 [5 8] 7 10 9 12 ...
и т.п.
Последовательность SUDSI определяется как последовательность первых элементов в каждом из этих списков. Итак, первые несколько терминов последовательности SUDSI 1 3 1 7 9 11 11
.
Вот первые 200 членов последовательности SUDSI (20 на строку):
1 3 1 7 9 11 11 11 15 15 19 19 19 19 19 19 19 19 19 19
19 19 19 19 19 19 19 19 57 59 59 59 59 59 59 59 59 59 77 79
81 83 85 87 89 91 91 91 91 91 91 91 91 91 91 91 91 91 115 115
121 123 125 127 127 127 127 127 137 139 141 143 145 147 147 147 147 147 147 147
147 147 147 147 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167
167 167 167 167 209 211 211 211 211 211 221 223 223 223 223 223 223 223 223 223
223 223 243 243 243 243 243 243 257 259 261 263 263 263 263 263 263 263 263 263
263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263 263
263 263 325 327 329 331 331 331 331 331 331 331 331 331 349 351 351 351 351 351
361 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363 363
Неясно (по крайней мере мне), как можно предсказать будущие условия. Можно только с уверенностью сказать, что эти термины всегда нечетные, неубывающие (после второго слагаемого) и что некоторые числа повторяются много раз.
Вызов
Напишите программу или функцию, которая принимает положительное целое число n и печатает или возвращает n- й член последовательности SUDSI. Например, если n равно 1, вывод равен 1
, если n равен 2, вывод равен 3
, если n равно 200, вывод равен 363
.
Возьмите ввод любым обычным способом (стандартная строка / командная строка / функция arg).
Самый короткий ответ в байтах побеждает.
(Этот сайт кодирует вещи в UTF-8, но вы можете использовать любую чертову существующую кодировку, какую захотите.)
Бонус Мати: (потенциально имеет право на награду)
- Расскажите мне больше о последовательности SUDSI. Каков базовый шаблон того, какие числа являются его частью и сколько их (и тому подобное)? (Кстати, я не смог найти SUDSI в OEIS .)
источник
Ответы:
Pyth,
45414038 байтЯ заметил (как и Мартин Бюттнер), что максимальное количество влияющих на шаг перестановки
k
равно2k + 1
. Но так как у нас есть толькоn - 1
шаги, нам нужен только список чисел до2n - 1
.Попробуйте онлайн: демонстрация
источник
Mathematica, 88 байт
Это полная программа, считывающая ввод из приглашения. Это очень прямая реализация определения, где я отслеживаю текущую последовательность в
f
(значения которой поf[n]
умолчанию равныn
).Вот немного более читаемая версия:
Некоторый анализ
Я подготовил первые 2000 элементов последовательности (потом это не очень интересно):
Таким образом, последовательность по существу линейна с наклоном 2 и всегда имеет несколько таких шагов. Кажется, что шаги растут сублинейно (если они даже не ограничены), так как они становятся едва заметными, когда вы увеличиваете количество точек, которые вы строите.
Мы можем обосновать линейный рост довольно легко (это немного сложновато, но я думаю, что оно выдержит строгие доказательства по индукции): изначально максимальное затронутое число шага перестановки
n
равноn + (n+1) = 2n + 1
. Также обратите внимание , что эти цифры будут всегда быть перемещены1
, так как|n - (n+1)| = 1
. Поэтому неудивительно, что мы получаем числа, которые находятся приблизительно2n
в последовательности. Тем не менее, мы можем также отметить , что для шагов до п , S п + 1 всегда ограничена п + 1 , что означает , что ни один шаг подкачка не может поменять два номера , которые являются одновременно больше , чем п . Следовательно, числа, которые еще нужно обработать, будут меньше или равны их первоначальному значению. Следовательно, является также оценка для самой последовательности.2n + 1
Я думаю, что найти аргумент в пользу длины шагов будет сложнее.
источник
CJam,
45 4039 байтПросто наивный подход.
Можно играть в гольф дальше.Слишком много отсутствует функция подкачки массива.Как это устроено:
Попробуйте онлайн здесь
источник
Haskell, 95 байт
Пример использования:
p 70
->139
Я не храню последовательность в списке или массиве. Я неоднократно обновляю функцию тождества до функции с заменой двух элементов текущего шага. После
n
шагов вызываю результирующую функцию с параметром1
.источник
J, 63 байта
Использование и тесты:
Попробуйте это онлайн здесь.
источник
Pyth,
555351Может быть, можно играть в гольф дальше.
Возможно, получится очень медленно для большого размера, такn
как мне было лень выяснить, какой размер массива мне понадобится, и просто использовалn^n
один.Спасибо Волатильности и Мартину Бюттнеру за указание, что я могу использовать максимум
3n
.объяснение
источник
2*n
большомуn
, с максимумом3*n
дляn=1
.2n+1
, который , как вы говорите , имеет максимум это в3
течениеn=1
и (в некотором смысле) сходится к2n
. Это не слишком удивительно, так как это максимум для нерегламентированной последовательности, и ни один шаг в процессе не может увеличить число, которое еще впереди. Я мог бы добавить это к своему ответу..a
продолжение на хорошую работу! На пути еще много вкусностей, но Исаак сейчас спит: github.com/isaacg1/pyth/pull/32doc.txt
на GitHub для руководства) и увидел обновление. К счастью, как я мог просто пропустить и написать собственную реализацию ...Python 2,
117106101Используетdict
(карту), чтобы сохранить значения для использования произвольных индексов.g(n)
является функцией, возвращающейn
элемент th Затем просто повторяетinput-1
время и выводит первый элемент.Оказывается, короче, используя методы из моего ответа Pyth.
Спасибо xnor за сохранение 5 байтов.
источник
b,c=a[i:i+2]
. Кроме того,b+c
он достаточно короткий, что сохранение его в переменнуюs
теряет символы по сравнению с записью дважды.Go 150
Не обманутый, ничего хитрого, в основном украденного у @ Pietu1998
http://play.golang.org/p/IWkT0c4Ev5
источник
Ява, 162
объяснение
источник
Округ Колумбия,
134132131 байтИспользуйте
echo $n $code | dc
, где$n
есть п и$code
... код ( задыхаться ). Цитата по вкусу.Изменить: Если вы не приставать ко мне для объяснения, я никогда не буду обойти это.
источник
Perl 5, 131
Наивное решение (то есть прямая реализация определения). Подпрограмма, она принимает входные данные в виде списка
1
s желаемой длины.Визуализируйте его вывод, например
print sub...->(1,1,1,1,1)
.Объяснение:
map$a[$_]=$_,1..3*@_
строит массив@a
, индексируя каждое целое число в 1–3 раза больше размера@_
(входного).($a[$a[$_-1]+$a[$_]],$a[abs($a[$_-1]-$a[$_])])=($a[abs($a[$_-1]-$a[$_])],$a[$a[$_-1]+$a[$_]])for 2..@_
повторяет переключатель многократно (один раз меньше, чем размер@_
), переключение$a[$a[$_-1]+$a[$_]]
с$a[abs($a[$_-1]-$a[$_])]
в$_
диапазоне от 2 до размера@_
.И тогда подпрограмма возвращается
$a[1]
.источник
Perl 5 , 90 + 1 (-p) = 91 байт
Попробуйте онлайн!
источник