Треугольное число является числом , которое является суммой n
натуральных чисел от 1 до n
. Например , 1 + 2 + 3 + 4 = 10
так 10
это треугольное число.
Учитывая положительное целое число ( 0 < n <= 10000
) в качестве входных данных (может быть взято как целое число или как строка), вернуть наименьшее возможное треугольное число, которое можно добавить к входу, чтобы создать другое треугольное число.
Например, ввод данных 26
, добавление 10
результатов в 36
, который также является треугольным числом. Нет треугольных чисел, меньших, чем 10
это может быть добавлено, чтобы 26
создать другое треугольное число, поэтому 10
правильный результат в этом случае.
0
является треугольным числом, поэтому, если сам вход является треугольным числом, вывод должен быть 0
Testcases
Случаи приведены в формате input -> output (resulting triangular number)
0 -> 0 (0)
4 -> 6 (10)
5 -> 1 (6)
7 -> 3 (10)
8 -> 28 (36)
10 -> 0 (10)
24 -> 21 (45)
25 -> 3 (28)
26 -> 10 (36)
34 -> 21 (55)
10000 -> 153 (10153)
счет
Это код-гольф, поэтому побеждает меньше байтов на каждом языке !
26 -> 2
?Ответы:
Java 8,
5857 байтНабор онлайн-тестов
Спасибо Деннису за 1-байтовую экономию.
источник
return-~i*i/2;
сохраняет байт.int[]
вместоint
as. Но это значит иметь дело с массивами позже. Это может сработатьx->{int i=0,m=0,n=x[0];while(n!=0)n+=n<0?++i:--m;x[0]=-~i*i/2;}
, но это 63 байта.MATL ,
1312 байт1 байт удален с использованием идеи (установить пересечение) из ответа Эминьи 05AB1E
Попробуйте онлайн!
объяснение
Обозначим
t(n) = 1 + 2 + ··· + n
через 3-еn
треугольное число.Код использует тот факт, что данное
n
решение ограничено сверхуt(n-1)
. Чтобы увидеть это, обратите внимание, что этоt(n-1) + n
равно,t(n)
и поэтому это треугольное число.Рассмотрим ввод
8
в качестве примера.источник
Q
своим аргументом об ограниченности?8
. Когда результат равен границеt(n-1)
, код получает его какt(n)-n
. Такt(n)
надо. В любом случае, спасибо за идею!Java (OpenJDK 8) , 83 байта
Попробуйте онлайн!
кредиты
источник
m
. Так что я идуa
вниз0
. «но вы присваиваете может быть в 100 раз такое же значение ,a*a+a
чтобыm
вb
-loop», да, мне не нужно делать это в 100 раз, но я набираю байты, не нарушаяb
-loop ранее.Mathematica, 46 байтов
источник
Нейм ,
129 байтЭто занимает слишком много времени для вычисления (но работает с учетом бесконечного времени и памяти), поэтому в ссылке я генерирую только первые 143 треугольных числа - использование
£𝕖
, которое достаточно для обработки ввода в 10 000, но недостаточно для тайм-аута.Предупреждение: это может не работать в будущих версиях. Если это так, замените £ на 143
Объяснение:
Попытайся!
источник
9998
ожидаемый результат будет3118753
намного выше 143-го номера треугольника (то есть `10296).This takes too long to compute (but works given infinite time and memory)
£
на большее число, например, 200.PHP , 45 байт
Попробуйте онлайн!
Это более короткий вариант
for(;!$r[$t];$t+=++$i)$r[$argn+$t]=~+$t;echo~$r[$t];
расширенный
PHP , 53 байта
Попробуйте онлайн!
Используйте новый оператор космического корабля в PHP 7
расширенный
PHP , 55 байт
Попробуйте онлайн!
источник
Java 8,
1101021009392 байта-2 байта благодаря @PeterTaylor .
-7 байт благодаря @JollyJoker .
-1 байт благодаря @ceilingcat .
Объяснение:
Попробуйте онлайн.
источник
Брахилог ,
1715 байтПопробуйте онлайн!
объяснение
источник
Python 2 , 59 байт
Попробуйте онлайн!
При этом используется следующая характеристика треугольных чисел, к которой
t
можно добавитьn
треугольное число:Код берет минимум всех таких треугольных чисел.
источник
Желе , 8 байт
Попробуйте онлайн!
Как это работает
источник
Japt ,
24231615 байтПопробуй это
1 байт сохранен благодаря ETH
объяснение
источник
æ!øV
. Кроме того, выглядит великолепно :-)Октава ,
3836 байт2 байта, благодаря @Giuseppe!
Анонимная функция, которая использует почти тот же подход, что и мой ответ на MATL .
Попробуйте онлайн!
источник
05AB1E , 12 байтов
Использует кодировку 05AB1E . Попробуйте онлайн!
источник
Mathematica, 62 байта
источник
Solve[2*#==m(m+1)-n(n+1)
короче (если это работает)?Python 2 ,
787170 байтСемь байт сохранены, спасибо в овсе и theespinosa
Еще один байт, сохраненный благодаря примечанию neil ,
x+9
является достаточным и проверяется на все натуральные числа0 <= n <= 10000
. Кроме того , было проверено дляx+1
аx+9
, она также работает.Попробуйте онлайн!
источник
n*-~n/2
вместоn*(n+1)/2
{n*(n+1)/2for n in range(999)}
вместо явного,set
а также использовать{}
вместоset
третьей строкиJavaScript (ES6),
4342 байтаРедактировать: 1 байт сохранен благодаря @PeterTaylor.
источник
-++s
с--s
, как я сделал в моей самостоятельно производном , но вполне аналогичную версии Java. (Приложение: вам также нужно изменить тест наn>0
).n>s
чек всегда был красной сельдью!node --stack_size=
для увеличения размера стека.Python 3 ,
6044 байтаСпасибо @xnor за предложение, которое сэкономило 16 байт!
Попробуйте онлайн!
Задний план
Пусть n будет неотрицательным целым числом. Если n является k- м треугольным числом, мы имеем
это означает, что будет естественное решение, если и только если 1 + 8n - нечетный, совершенный квадрат. Понятно, что проверка четности 1 + 8n не требуется.
Как это работает
Рекурсивная функция n принимает одно неотрицательное целое число в качестве аргумента. При вызове с одним аргументом k по умолчанию равно 1 .
Во-первых,
(8*n+1)**.5%1
проверяет, является ли n треугольным числом: если (и только если) оно будет,(8*n+1)**.5
получит целое число, поэтому остаток от деления на 1 даст 0 .Если модуль равен 0 ,
and
условие не выполнится, и f вернет 0 . Если это происходит при первоначальном вызове f , обратите внимание, что это правильный вывод, так как n уже треугольный.Если модуль является положительным,
and
условие выполняется иf(n+k,k+1)+k
выполняется. Это снова вызывает f , увеличивая n на k и k на 1 , затем добавляет k к результату.Когда f (n 0 , k 0 ) наконец возвращает 0 , мы возвращаемся из рекурсии. Первый аргумент в первом вызове был n , второй n + 1 , третий аргумент n + 1 + 2 , пока, наконец, n 0 = n + 1 +… k 0 -1 . Обратите внимание, что n 0 - n является треугольным числом.
Аналогично, все эти целые числа будут добавлены к внутреннему возвращаемому значению ( 0 ), поэтому результат начального вызова f (n) будет n 0 - n , как требуется.
источник
n
повторяемость, вы можете писать,n
а не(n+k)
.C # (.NET Core) ,
291281 байтПопробуйте онлайн! Программа, которая принимает строку как ввод и выводит через код выхода.
Сохранено 10 байт благодаря Кевину Круйссену
источник
class p{static int Main(string[]I){string d="0",s=I[0];int c=1,j,k;for(;;){j=k=0;string[]D=d.Split(' '),S=s.Split(' ');for(;j<D.Length;j++)for(;k<S.Length;k++)if(D[j]==S[k])return int.Parse(D[k]);j=int.Parse(D[0])+c++;d=d.Insert(0,$"{j} ");s=s.Insert(0,$"{j+int.Parse(I[0])} ");}}}
for(;;)
для создания бесконечного цикла - это хороший удар, и я постараюсь более тщательно подумать о том, является ли использование var на самом деле более эффективным, чем использование явного типа, но объединение объявлений, и, я думаю, будет более усердным в удалении ненужных скобок. Что касается программы и функции, я начал с лямбды, но не смог заставить ее работать в TIO. Я знаю, что ссылка TIO на самом деле не нужна, но это то, что мне нравится видеть в ответах других людей, поэтому я хотел хотя бы что-то похожее по своему.JavaScript (ES7),
4644 байтаПопытайся
источник
r=x=0
работать?05AB1E , 8 байтов
Попробуйте онлайн! или как тестовый набор
объяснение
источник
Дьялог АПЛ, 19 байт
6 байтов сохранено благодаря @KritixiLithos
Попробуйте онлайн!
Как?
o←0,+\⍳⍵
- назначитьo
первые⍵
треугольные числаo/⍨
- отфильтроватьo
поo∊⍨⍵+o
- треугольные числа, которые суммируются с⍵
производными треугольниками⊃
- и возьми первыйисточник
+\⍳⍵
должен работать вместо того, что вы используете для генерации треугольных чисел.⊃
работает вместо⌊/
Par / GP , 54 байта
Попробуйте онлайн!
источник
Haskell , 56 байт
Попробуйте онлайн!
источник
Добавить ++ , 68 байт
Попробуйте онлайн! или посмотрите набор тестов !
Даже Ява бьет меня. Мне действительно нужно добавить некоторые команды набора в Add ++
Как это работает
источник
R ,
46444341 байтПопробуйте онлайн!
Анонимная функция с одним обязательным аргументом
x
; вычисляет первыеx+1
треугольные числа в качестве необязательного аргумента для вывода нескольких фигурных скобок. Я использовал,choose
прежде чем я увидел Луиса Мендо ответ Октаве .Я сбрил несколько байтов ответа Луиса Мендо, но забыл использовать ту же идею в своем ответе.
источник
Желе , 18 байт
Попробуйте онлайн!
источник
Python 2 ,
8381 байтПопробуйте онлайн!
источник
APL (Dyalog Classic) ,
1614 байтовПопробуйте онлайн!
источник
Clojure, 74 байта
Выберите свой любимый :) Петли могут быть короче ...
источник
Python 2 , 82 байта
Попробуйте онлайн
Это было создано путем изменения этого ответа из соответствующего вопроса.
источник