Ваша задача довольно проста, рассчитайте n-й элемент A190810 .
Элементы A190810 рассчитываются по следующим правилам:
- Первый элемент 1
- Последовательность увеличивается
- Если
x
происходит в последовательности, а затем2x+1
и3x-1
сделать
Вы можете использовать индексацию на основе 1 или 0, но если вы используете индексацию на основе 0, скажите это в ответе.
Контрольные примеры
a(1) = 1
a(2) = 2
a(3) = 3
a(4) = 5
a(5) = 7
a(10) = 17
a(20) = 50
a(30) = 95
a(55) = 255
Поскольку это код-гольф, выигрывает самый короткий ответ в байтах!
x ϵ A → (2*x) + 1 ϵ A
иx ϵ A → (3*x)-1 ϵ A
, гдеϵ
означает «является членом» и→
может пониматься как «подразумевает».Ответы:
Желе , 16 байт
Очень неэффективно. Попробуйте онлайн!
Как это работает
источник
Python 2,
888372 байтаВы можете прочитать программы в этом ответе в обратном порядке ...
Еще медленнее и короче, благодаря Деннису:
Попробуйте онлайн
Это не так быстро, но короче ( 83 байта ). Сортируя и удаляя дубликаты на каждой итерации, а также удаляя первый элемент, я убираю потребность в индексе в списке. Результатом является просто первый элемент после
n
итераций.Возможно, я переиграл Денниса. : D
Попробуйте онлайн
Эта версия ниже ( 88 байт ) работает очень быстро, находя 500000-й элемент примерно за две секунды.
Это довольно просто. Вычислять элементы списка до тех пор, пока элементов не будет в три раза больше
n
, поскольку каждый добавленный элемент может добавить не более 2 уникальных элементов. Затем удалите дубликаты, отсортируйте и напечатайтеn
элемент th (с нулевым индексом.)Попробуйте онлайн
источник
Python 2, 59 байт
Основано на ответе Python @ mbomb007 . Проверьте это на Ideone .
источник
min
это O (п) , а список индексации O (1) , так что это решение, по крайней мере O (n²) ...Haskell,
767369 байтИспользует индекс на основе 0. Пример использования:
(filter t[1..]!!) 54
->255
.Вместо того, чтобы строить список путем многократной вставки
2x+1
и,3x-1
как видно из большинства других ответов, я просматриваю все целые числа и проверяю, можно ли их уменьшить до1
повторного применения(x-1) / 2
или(x+1) / 3
деления.источник
f=filter t[1..]!!
), потому что я не думаю, что это правильно.Haskell,
7774 байтаЭто обеспечивает функцию
a
для n-й записи. Это нулевой индекс. Как вариант,a=nub$f[1]
создаст весь список (лениво).Это вариант списка
Set
кода Рейнхарда Цумкеллера .источник
y
вместо того,xs
чтобы сохранить два байта? Кроме того, я полагаю, что вы можете сократить последнюю строку до чего-то вроде(!!)$nub.f[1]
(x:xs)
, совсем забыл об этом, спасибо.Python 2,
8884 байтаПроверьте это на Ideone .
источник
Pyth,
2019 байтовПопробуйте онлайн. Тестирование.
Используется индексирование с нуля.
источник
1
и это, очевидно, не сработало.Брахилог , 45 байт
Вычисляет
N = 1000
около 6 секунд на моей машине.Это 1-индексированный, например,
объяснение
Основной предикат:
Предикат 1:
Вы можете заметить, что мы не передаем входные данные предикату 1 при вызове
y - Yield
. Из-за распространения ограничений он найдет правильный ввод, как только достигнет1.
предложения, который будет распространять правильные входные значения.источник
MATL,
19, 1817 байтЭто крайне неэффективный алгоритм. Онлайн-интерпретатору не хватает памяти для входов больше 13.
Один байт сохранен, благодаря Луису Мендо!
Попробуйте онлайн!
Эта версия длиннее, но эффективнее (21 байт)
Попробуйте онлайн
Объяснение:
Логический способ сделать это - добавить элементы в массив, пока он не станет достаточно длинным, чтобы захватить i-й элемент. Вот как работает эффективный. Golfy (и неэффективный) способ сделать это, чтобы просто увеличить размер массива я раз.
Таким образом , во- первых, мы определяем массив запуска:
1
. Затем мы меняем два верхних элемента, так что ввод идет сверху.w
, Теперь мы перебираем ввод с помощью:"
. Итак, я раз:Теперь у нас есть гигантский массив последовательности. (Намного больше, чем необходимо для вычисления). Итак, мы прекращаем цикл
]
и извлекаем i-е число из этого массива с помощьюG)
(1-indexed)источник
1`tEQy3*qvuStnG<]G)
. Условие циклаtnG<
(выход, когда массив уже имеет требуемый размер)for
версии -loop вы можете взять ввод в унарном виде в виде строки и удалить:
JavaScript (ES6), 63 байта
Вероятно, быстро сдается из-за рекурсии.
источник
Сетчатка, 57
Попробуйте онлайн!
0 индексированные. Следует часто используемому алгоритму: удалить минимальное значение из текущего набора, вызвать его
x
, добавить2x+1
и3x-1
к набору число раз, равное входному , тогда в качестве результата следует начальное число. «Набор» в Retina - это просто список, который многократно сортируется и состоит только из уникальных элементов. В алгоритм игры в гольф добавлены некоторые хитрые кусочки, которые я объясню, как только у меня будет больше времени.Огромное спасибо Мартину за то, что он занял около 20 байтов
источник
Clojure,
114108 байтЯ не был бы удивлен, если бы это могло быть уменьшено / значительно уменьшено, но то,
set
что я не поддерживаю, действительно повредило бы мои мысли.Попробуйте онлайн
Версия с пробелами:
источник
05AB1E,
1817 байтИспользует кодировку CP-1252 .
объяснение
Попробуйте онлайн для небольших номеров
Очень медленно.
Использует индексирование на основе 0.
источник
C ++, 102 байта
Эта лямбда-функция требует
#include <map>
иusing std::map
.map
Здесь это просто набор ключей; их значения игнорируются. Я используюmap
для того, чтобы извлечь выгоду из краткого кода для вставки:Благодаря отсортированному порядку
map
, самый маленький элемент извлекается с помощьюk.begin()->first
.источник
set
и инициализатор списков:[](int i){int t;set<int>k{1};for(;i--;k.erase(t))t=*k.begin(),k.insert({t*2+1,t*3-1});return t;};
.На самом деле, 27 байтов
Попробуйте онлайн!
Эта программа использует индексирование на основе 0. Подход очень грубый, поэтому не ожидайте, что он будет работать в онлайн-переводчике для больших входов.
Объяснение:
источник
CJam (25 байт)
Демо онлайн . Обратите внимание, что здесь используется индексация с нуля.
Это использует аналогичный подход для большинства: применить время преобразования,
n
а затем отсортировать и извлечь этотn
элемент. В качестве указания на эффективность дедупликация применяется внутри цикла, а сортировка применяется вне цикла.источник
1ari{(_2*)\3*(@||$}*0=
(Также намного более эффективный.)Сетчатка , 48 байт
Попробуйте онлайн!
Вдохновленный ответом Ними я подумал, что попробую другой подход к Retina, используя обратное отслеживание движка regex, чтобы выяснить, есть ли какое-либо заданное (унарное) число в последовательности или нет. Оказывается, это можно определить с помощью 27-байтового регулярного выражения, но его использование стоит несколько дороже, но все же в конечном итоге оказывается короче, чем генеративный подход.
Вот альтернативное 48-байтовое решение:
И используя унарный ввод / вывод, мы можем сделать 42 байта, но я пытаюсь избежать этого, и другой ответ Retina также использует десятичную дробь:
источник
Рубин, 70 байт
объяснение
источник
*1
трюкJ, 31 байт
Используется индексирование с нуля. Очень мало памяти.
объяснение
источник
Октава, 68 байт
источник
;end
Perl,
173132 байта +1 для -n = 133Ungolfed:
Возможно, я мог бы добиться большего, если бы больше думал об этом, но это то, что я придумал через несколько минут. Я впервые играл в гольф, так что это было довольно весело!
Благодаря @Dada и @ TùxCräftîñg (и куче незначительных оптимизаций байтов) для -40 байтов
источник
my
s, thereturn
иprint
(не могу проверить, у меня нет perl)return
. Тоprint
можно заменить собойsay
. Большинство изmy
них не нужны (вам нужен только предыдущий$a
в функции, я думаю. Не инициализируйте и не объявляйте@b
. Вероятно, вы можете отбросить инициализацию,$i
если делаете это$i++
в начале while, а не в конце.pop
Is короче, чемshift
. Имейте в виду, что Perl-гольф намного больше, чем просто удаление пробелов и новых строк ...JavaScript (ES6), 58
Меньше гольфа
Тест
О времени и памяти: элемент 500000 в ~ 20 секунд и 300 МБ, используемый 64-битной альфа-версией FireFox
источник