Квадратные числа - это те, которые принимают форму n^2
целого числа n. Их также называют идеальными квадратами, потому что когда вы берете их квадратный корень, вы получаете целое число.
Первые 10 квадратных чисел: ( OEIS )
0, 1, 4, 9, 16, 25, 36, 49, 64, 81
Треугольные числа - это числа, которые могут образовывать равносторонний треугольник. Номер n-го треугольника равен сумме всех натуральных чисел от 1 до n.
Первые 10 треугольных чисел: ( OEIS )
0, 1, 3, 6, 10, 15, 21, 28, 36, 45
Квадратные треугольные числа являются числами, которые являются и квадратными и треугольными.
Первые 10 квадратных треугольных чисел: ( OEIS )
0, 1, 36, 1225, 41616, 1413721, 48024900, 1631432881, 55420693056, 1882672131025, 63955431761796
Существует бесконечное количество квадратных чисел, треугольных чисел и квадратных треугольных чисел.
Напишите программу или именованную функцию, которая задает входной (параметр или стандартный номер) номер n
, вычисляет n
квадратное треугольное число th и выводит / возвращает его, где n - положительное ненулевое число. (Для n = 1 вернуть 0)
Чтобы программа / функция была действительной отправкой, она должна иметь возможность возвращать как минимум все квадратные треугольные числа, меньшие 2 ^ 31-1.
бонус
-4 байта для возможности вывести все квадратные треугольные числа менее 2 ^ 63-1
-4 байта для теоретической возможности вывести квадратные треугольные числа любого размера.
Штраф + 8 байт за решения, которые занимают неполиномиальное время.
Стек бонусов.
Это вызов кода-гольфа, поэтому выигрывает ответ с наименьшим количеством байтов.
n
шаги, и на каждом шаге арифметика занимает линейное время, потому что число цифр растет линейноn
. Я не думаю, что линейное время возможно. Разве вы не говорите, что арифметические операции являются постоянным временем?Ответы:
CJam,
128 байтИспользует рекуррентное отношение из статьи Википедии.
Код длиной 16 байт соответствует обоим бонусам.
Попробуйте онлайн в интерпретаторе CJam .
Как это работает
Мой код оказался идентичным кснуру во всех аспектах, за исключением того, что я использую стек CJam вместо переменных.
источник
Python 2, 45 - 4 - 4 = 37
Итерации с использованием рекурсии
Теоретически, это поддерживает числа любого размера, но работает в экспоненциальном времени, поэтому оно не должно претендовать на бонусы. Должно работать на номера любого размера. Например, за 100, дает
В рекурсивном решении используется 41 символ, но он не должен соответствовать требованиям, поскольку он занимает экспоненциальное время.
источник
exec
решением. Если вам разрешено изменять предел рекурсии, он также может рассчитать число квадратного треугольника любого размера, квалифицируя его как №2. Тем не менее, я не уверен, имеет ли это право (@Rodolvertice).Pyth, 16 - 4 - 4 = 8 байт
Использует рекурсивную формулу из статьи OEIS.
Он использует команду post-assign, которая довольно нова и выглядит действительно крутой. Использование сокращает
n-1
время итерации из-за индексации на основе 1.Кажется, полиномиальный, потому что он повторяется n раз и выполняет математику и присваивание каждой итерации, но я не ученый. Заканчивается n = 10000 практически мгновенно.
Попробуйте здесь онлайн .
источник
b
.Оазис , 7 - 4 - 4 = -1 (неконкурирующий)
Попробуйте онлайн!
Пользы
a(0) = 0, a(1) = 1; for n >= 2, a(n) = 34 * a(n-1) - a(n-2) + 2
Oasis поддерживает произвольные целочисленные значения точности, поэтому он должен иметь возможность доходить до любого числа, если не происходит переполнение стека. Дайте мне знать, если это не считается бонусом из-за переполнения стека. Также возможно, что этот конкретный алгоритм является неполиномиальным, и дайте мне знать, если это так.
Не конкурирует, потому что языковые постдаты бросают вызов.
Объяснение:
Альтернативное решение:
Вместо этого использует
a(n) = 35*(a(n-1)-a(n-2)) + a(n-3)
источник
For n=1 return 0
, но это возвращает 1. Это можно исправить, добавив опцию -O .JavaScript (ES6), 29-4 = 25 байт
Сохранено 5 байт благодаря @IsmaelMiguel !
Мне пришлось жестко кодировать 0, 1 и негативы, чтобы избежать бесконечной рекурсии.
Консоль, я назвал функцию
f
:РЕДАКТИРОВАТЬ : Оказывается, JavaScript округляет числа до 16 (15) цифр (Spec), потому что эти числа слишком велики, вызывая переполнение. Поместите 714341252076979033 в консоль JavaScript и убедитесь сами. Это скорее ограничение JavaScript
источник
f(15)
должен вернуться85170343853180456676
, а не85170343853180450000
.n=>n?n<2?0:34*f(n-1)-f(n-2)+2:1
(31 байт). Я тестировал до 5 числа.n=>n>1?34*f(n-1)-f(n-2)+2:!!n
. Он возвращаетсяfalse
на0
,true
на1
и36
на2
. Если вы хотите, чтобы он вернул число, вы можете заменить!!n
на+!!n
.n=>n>1?34*f(n-1)-f(n-2)+2:n|0
(тот же счетчик байтов, теперь всегда возвращает числа)Excel VBA - 90 байт
Используя рекуррентное отношение со страницы Википедии:
При выполнении вам будет предложено ввести n, затем последовательность до n включительно выводится в столбец A:
Его можно запустить до n = 202 включительно, прежде чем он выдаст ошибку переполнения.
источник
[Не конкурирует] Pyth (14 - 4 - 4 = 6 байт)
Использовали первое повторение из OEIS , что после 0,1,36 можно найти A n = (A n-1 -1) 2 / A n-2 . A Не конкурирует, потому что это решение начинается с 36, если вы идете ниже, вы делитесь на ноль (поэтому ввод 0 дает 36). Также пришлось жестко закодировать 36.
Попробуй здесь
источник
Java, 53 - 4 = 49 байт
Это еще одна простая рекурсия, но я не часто публикую Java с оценкой <50, так что ...
Теперь, для чего - то не -recursive, он получает совсем немного дольше. Этот и более длинный (112-4 = 108), и медленнее, поэтому я не уверен, почему я публикую его, за исключением того, что нужно что-то итеративное:
источник
Юля, 51 байт - 4 - 4 = 43
При этом используется первое отношение повторения, указанное на странице Википедии для квадратных треугольных чисел. Он вычисляет n = 1000 за 0,006 секунды и n = 100000 за 6,93 секунды. Это на несколько байтов длиннее рекурсивного решения, но это намного быстрее.
Ungolfed + объяснение:
Примеры:
источник
PHP,
6559,56-4 = 52 байтаповторять до тех пор, пока корень квадратный из
$s
is ∈ℤ: прибавить$f
к сумме$s
, увеличить$f
;повторить
$argv[1]
раз.выходная сумма.
источник
Пролог,
7074 - 4 - 4 = 66Запуск
n(100,R)
выходов:Требуется около 1 секунды для запуска
n(10000,X)
на моем компьютере.Изменить : версия 66 является хвостовой рекурсии. Предыдущая нерекурсивная версия выглядит следующим образом:
Они имеют одинаковую длину в байтах, но нерекурсивный генерирует переполнение стека после определенной точки (на моем компьютере около 20500).
источник
Javascript ES6,
777571 символовТест:
источник
C 68 байтов
Это было забавное испытание с C
main(o,k){o==1?k=0:0;k<9e9&&k>=0&&main(34*o-k+2,o,printf("%d,",k));}
Смотреть его можно здесь: https://ideone.com/0ulGmM
источник
Желе , 13 - 8 = 5 байт
Это соответствует обоим бонусам.
Попробуйте онлайн!
Совершено рядом с пирамидой в чате .
объяснение
источник
Perl 6 , 25 - 8 = 17 байт
Попробуйте онлайн!
источник
05AB1E , 10 - 8 = 2 байта
Попробуйте онлайн!
источник
APL (NARS), 67 символов, 134 байта
тест:
f будет искать в квадратичной последовательности элементы, которые тоже имеют номер треугольника, поэтому они должны следовать формуле проверки треугольника в APL: 0 = 1∣√1 + 8 × m с номером m для проверки.
источник