Codegolf — Суммы Последовательных Целых Чисел

  • Автор темы Dimmonn
  • Обновлено
  • 20, Oct 2024
  • #1

Прежде чем кто-нибудь что-нибудь скажет, похожий и похожий. Но это не обман.


Некоторые положительные целые числа можно записать как сумму как минимум двух последовательных положительных целых чисел. Например,

 Input:   9
Output:  2,3,4

Input:   8
Output:  8

Input:   25
Output:  [3,4,5,6,7]
 
. Write a function that takes a positive integer as its input and prints as its output the самый длинный последовательность возрастающих последовательных положительных целых чисел, которые в сумме дают ее (любой формат приемлем, но -5 байт, если выходные данные представляют собой возрастающую последовательность, разделенную + as shown above. If there exists no such sequence, then the number itself should be printed.

Это кодекс гольфа. Применяются стандартные правила. Выигрывает самый короткий код в байтах.


Образцы (обратите внимание, что форматирование может различаться)

9=2+3+4=4+5

#код-гольф #математика #число #последовательность #целочисленные разделы

Dimmonn


Рег
02 Sep, 2007

Тем
72

Постов
215

Баллов
595
  • 26, Oct 2024
  • #2

Питон, 67 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48+49+50+51+52+53

На удивление простая стратегия: найти интервал R с правильной суммой.

  • Если сумма слишком мала, сдвиньте правый конец интервала вверх.
  • один путем добавления следующего по величине числа.
  • Если сумма слишком велика, сдвиньте левую конечную точку вверх, удалив самый маленький элемент.

Если сумма верна, выведите R.

Поскольку нижний конец интервала только увеличивается, более длинные интервалы обнаруживаются раньше более коротких.

 

Geo57avs


Рег
18 Feb, 2012

Тем
92

Постов
195

Баллов
675
  • 26, Oct 2024
  • #3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 for(i in (n=scan()):1)for(j in n:i)if(sum(i:j)==n)x=i:j;x
 

Пиф, 12 10 байт Код 15 байт длинный и подходит для -5 байт бонус. Попробуйте онлайн в.

Компилятор Python

Спасибо @Jakube за то, что он сэкономил 2 байта!

õ ã f@¶XxÃÌq+ ||answer||

Как это работает

õ ã f@¶Xx ||answer||

Математика, 73 68 65 56 43 байта

-h ||answer||

Хаскель, 49 48 байт

MATLAB, 87 79 байт

Sub a(n) For i=1To n s=0 For j=i To n s=s+j If s=n Then:For k=i To j-1:r=r &k &"+":Next:[A1]=r &j:End Next Next End Sub

Я знаю, что уже есть ответ MATLAB, но этот подход существенно отличается. Это также работает наОктава . Ты можешьпопробуйте онлайн здесь [A1] in the linked workspace, so just enter n . Я уже добавил код в

в командной строке, затем введите значение (например, 25). Sub for which q Я все еще работаю над его уменьшением (возможно, немного корректируя используемое уравнение), но в основном он находит наибольшее значение p numbers starting with argument==(p+q)*(q-p+1)/2 .

является целым числом, затем отображается первое

p

Так почему же это работает? Ну, по сути, существует математическое уравнение, управляющее всеми этими числами. Если учесть, что все они последовательные и начинаются с какой-то точки, то в принципе можно сказать: -nR triangle numbers (including the 0'th), added to while(fmod($q=sqrt(2*$argn+(++$p-.5)**2)-.5,1));print_r(range($p,$q)); Теперь из этого становится очевидным, что эта последовательность, по сути, является лишь первой. LŒʒOQ}é¤'+ý Argument: n LŒ Sublists of range 1 to n ʒOQ} Filter by total sum equals n é¤ Get longest element '+ý Join on '+' . Now if we let LŒʒOQ}é¤'+ý много

ẆS⁼¥Ðf⁸Ṫj”+

, мы можем сказать:


На самом деле это вполне решаемо. Я все еще ищу самый короткий способ сделать это, у меня есть несколько идей, как попытаться сократить приведенный выше код.

ẆS⁼¥Ðf⁸Ṫ ||answer||

Для ввода 25 выход будет:Виксал

t[:1]

, 11 - 5 = 6 байт

Как и большинство других ответов на языках, посвященных гольфу.

Попробуйте онлайн!

t ||answer||

Объяснение:

t[0]

Питон 2, 94 байта

Ввод берется со стандартного ввода. Это решение подходит для очень больших входов. Это перебирает возможные длины решения,р , имеяг ≤ √(2n) и явно проверяет наличие решения. Чтобы решение существовало, если р странно, п мод р должно быть равно нулю, и если р даже, п мод р должно быть.


р/2

k

Пример использования

Я намеренно выбрал примеры с относительно небольшими результатами.

 

Lionts


Рег
26 Aug, 2005

Тем
84

Постов
219

Баллов
669
  • 26, Oct 2024
  • #4

Октава, 89 байт

def x(n): r=[n] for i in range(2,n): t=[] if i%2*(n%i<1):t=[j+n//i-i//2for j in range(i)] elif i%2<1and n%i==i//2:t=[j+n//i-i//2+1for j in range(i)] if t[:1]>[0]*(sum(t)==n):r+=t, return r[-1]

Это лучшее, что я мог сделать в Octave. Алгоритм тот же, что и у xnor.

n=>{for(l=u=1;n;)n>0?n-=u++:n+=l++;return[...Array(u).keys()].slice(l);}

В MATLAB это будет 95 байт: + and 1 second for input '+j .

В MATLAB это выполняется примерно за 0,1 секунды для ввода.

 

Zux


Рег
20 Apr, 2008

Тем
80

Постов
194

Баллов
624
  • 26, Oct 2024
  • #5
0@E

ок, 51 байт

Код составляет 56 байт, минус 5 байт на выходной формат. Для создания этого формата мне пришлось использовать 4 дополнительных байта, поэтому я фактически сэкономил 1 байт. Ура! ;)

На самом деле он выполняет тяжелую работу по суммированию, начиная с 1, пока сумма не станет больше входных данных. Затем он начинает вычитать числа, начиная с 1, пока число не станет меньше входного. Таким образом он продолжает изменять начальный и конечный номера, пока не найдет результат, который затем печатает.

p@X

Пример использования

;░

Вывод примера n and it gave the correct result ( enumerate Я пробовал это для ввода

) почти сразу. Хотя печать, конечно, заняла некоторое время...

 

Offerocedesic


Рег
01 Feb, 2007

Тем
76

Постов
179

Баллов
589
  • 26, Oct 2024
  • #6
Шелуха M

, 12 - 5 = 7 байт

Попробуйте онлайн!

Если удалить первые 5 байтов для присоединения, результат останется прежним.

||answer||

ОбъяснениеЖеле (вилка)

n

, 5 байт Попробуйте онлайн!

(вернее, нет) За дополнительную плату 3 байта

(опять же не работает на TIO), можем получить 3 балла

n ||answer||

Как это работаетЯпт

, 33 байта Это используетТехника Денниса Пита

[[1],[2,2],[3,3,3],[4,4,4,4],...]

, хотя это значительно дольше... Попробуйте онлайн! Предупреждение:

Для больших входных данных (<= 20) требуется некоторое время, и ваш браузер зависает до тех пор, пока это не произойдет.

n

Ungolfed и объяснение

k ||answer||

Версия для получения бонуса: (38 байт - 5 = 33)

2c3b3b3bbc603b75406ec728443b29606e2858586b60697540754 0783be4be3d5b5d29496960bb60a4bd4d604d3bb0704058272b6a

Юля, 92 байта ,;;;╝`;u@n╟(D;)`n(XXk`iu@u@x;Σ╛=[])Ii`╗`ñ╜M`M;░p@X'+j .

Это анонимная функция, которая принимает целое число и возвращает массив. Чтобы вызвать его, дайте ему имя, например.

->n{([*1..n].permutation(2).map{|i,j|[*i..j]if(i..j).reduce(:+)==n}-[p]).max_by{|k|k.size}||n}[25] => [3, 4, 5, 6, 7] ||answer||

Не в гольфе:

-> n { ([*1..n].permutation(2).map { |i,j| # Finds all the possible sets of size 2 [*i..j] if(i..j).reduce(:+) == n # Adds a set to an array if sum of the set is n. }-[p] # Removes nil from the array ).max_by { |k| # Finds the longest sequence k.size } || n # Returns n if no sequence found. }

Рубин, 94 байта

->n{([*1..n].permutation(2).map{|i,j|[*i..j]if(i..j).reduce(:+)==n}-[p]).max_by{|k|k.size}||n}

Не в гольфе:

function f(x::Integer) # Get all arrays of integers that sum to x p = partitions(x) # Filter these down to only consecutive runs by checking whether # all differences are 1 t = filter(i -> all(j -> j == 1, diff(sort(i))), p) # Find the index of the longest element of t i = indmax(map(length, t)) return collect(t)[i] end ||answer||

Использование:

f=x->...

Серьезно, 53 – 5 = 48 байт.

x->(t=filter(i->all(j->j==1,diff(sort(i))),partitions(x));collect(t)[indmax(map(length,t))])

Шестнадцатеричная свалка

Попробуйте онлайн!

Это подход грубой силы, похожий на метод Денниса Пита. 1oU à2 £W=Xg o1+Xg1¹x ¥U©W} rª ªU² q'+ just reads input 1oU à2 £ W=Xg o1+Xg1¹ x ¥ U© W} rª ª U 1oU à2 mXYZ{W=Xg o1+Xg1) x ==U&&W} r|| ||U // Implicit: U = input integer 1oU à2 // Generate a range from 1 to U, and take all combinations of length 2. mXYZ{ // Map each item X in this range to: W=Xg o // Set variable W to the range of integers starting at the first item in X, 1+Xg1) // and ending at 1 + the second item in X. x ==U&&W // If the sum of this range equals U, return W; otherwise, return false. r|| // Reduce the result with the || operator, returning the first non-false value. ||U // If this is still false, there are no consecutive ranges that sum to U, // so resort to U itself. // Implicit: output last expression Всё вплоть до 1oU à2 £W=Xg o1+Xg1¹x ¥U©W} rª ªU up to ẆSƘ¹Ṫ - Main link. Takes N on the left Ẇ - Cast N to range and get all contiguous, non-empty sublists Ƙ¹ - Keep those for which the following is equal to N: S - Sum Ṫ - Take the last (and longest) one ẆSƘ¹Ṫ 's.

в регистр 1, а затем создает список J'+msḟo=¹ΣQḣ ḣ range from 1..n Q all possible sublists ḟ get the first value which satisfies: =¹Σ sum = input. ms convert each number to string J'+ join on '+' is a function stored in register 0 that takes a pair, increments both elements, converts them to a range, finds the sum of the range, and checks whether that sum is the value in register 1. If it is, it returns the corresponding range, and if it's not, it returns an empty list.

Следующий бит до J'+msḟo=¹ΣQḣ maps a function over the fancy list of lists described above, doing 464562+...+1488562 Часть до последнего вхождения 1e12 .

echo 303 | awk '{while($0!=s+=s<$0?++j:-++i);while(++i-j)r=r i"+"}$0=r j' removes the empty lists. {while($0!=s+=s<$0?++j:-++i);while(++i-j)r=r i"+"}$0=r j в каждом списке, а затем сопоставить с ним сохраненную функцию. Когда это будет сделано, у нас будет список списков, каждый из которых пуст, или диапазон, сумма которого равна 1000002 would also work). 2000000 берет первый оставшийся список ( x=input('');k=1;i=1;while x;s=sum(k:i);if s<x;i=i+1;elseif s>x;k=k+1;else x=0;end;end;disp(k:i) between each number as it converts the list to a string for the bonus.

ставит

 

Unlankbaina


Рег
27 Dec, 2008

Тем
67

Постов
202

Баллов
557
  • 26, Oct 2024
  • #7
x=input('');k=i=1;while x;s=sum(k:i);if s<x;i++;elseif s>x;k++;else;x=0;end;end;disp(k:1)

ES6, 72 байта

Прямой порт awk-решения @ Cabbie407, но без бонуса форматирования, поскольку здесь это штраф.

 

Vi_kon


Рег
08 Apr, 2006

Тем
78

Постов
195

Баллов
585
  • 26, Oct 2024
  • #8

Python 3, 239 236 215 203 байта

$ echo 8192 | python sum-con-int.py [8192] $ echo 1000002 | python sum-con-int.py [83328, 83329, 83330, 83331, 83332, 83333, 83334, 83335, 83336, 83337, 83338, 83339] $ echo 1000000006 | python sum-con-int.py [250000000, 250000001, 250000002, 250000003]

Это немного громоздко. Мне придется поиграть в гольф позже. n=input() r=int((2*n)**.5) while r: if~r%2*r/2==n%r:print range(n/r-~-r/2,n/r-~r/2);r=1 r-=1 is because if you check ɾ # Range from 1 to n ÞS # All sublists ≬ # Three element lambda ∑ # Sum = # Equals ? # The input c # First truthy item under function application j # Join by: \+ # "+" ɾÞS≬∑?=c\+j , Python makes rude noises at you. Again, this is in need of golfing. Thanks to 3 4 5 6 7 на пустом месте

, никаких больше грубых звуков! Вам просто нужно проверить другой массив.

 

Guexpemeams63


Рег
14 Apr, 2011

Тем
85

Постов
178

Баллов
653
  • 26, Oct 2024
  • #9
Желе m*(n+(m-1)/2)==x

, 8 байт (неконкурирующие)

Попробуйте онлайн!

m=p+1 ||answer||

Если я правильно понимаю, это может быть (11-5=6)-байтовая версия:05AB1E

, 11 – 5 = 6 байт (неконкурирующие)

n

Принимая этот бонус, конечно :)

p+1 ||answer||

Попробуйте онлайн!

p

PHP, 70 байт n+(n+1)+(n+2)+(n+3)+...+(n+p)=x or Запустить как трубу с.

попробуй онлайн n until it finds an integer solution for m ,
приращения m to n .

затем печатает диапазон от

 

Stpa


Рег
04 Mar, 2004

Тем
84

Постов
173

Баллов
623
  • 26, Oct 2024
  • #10

consecutiveSum routine that takes input consecutiveSum.m Excel VBA, 119–5 = 114 байт x=input('');m=1:x;n=.5-m/2+x./m;l=max(find(~mod(n(n>0),1)));disp(m(1:l)+n(l)-1)

f n=[[a..b]|a<-[1..n],b<-[a..n],sum[a..b]==n]!!0 ||answer||

целочисленного типа ожидаемого типа и выводит самую длинную последовательность последовательных чисел, которые суммируются с ней в ячейку Cases[Range~Array~{#,#},i_/;Tr@i==#,{2},1]& , 9 Япт

j\+hfqsTQ}M^SQ2 (implicit) Store evaluated input in Q. S Compute [1, ..., Q]. ^ 2 Get all pairs of elements of [1, ..., Q]. }M Reduce each pair by inclusive range. Maps [a, b] to [a, ..., b]. f Filter; for each pair T: sT Add the integers in T. q Q Check if the sum equals Q. Keep the pair if it does. h Retrieve the first match. Since the ranges [a, ..., b] are sorted by the value of a, the first will be the longest, in ascending order. j\+ Join, using '+' as separator.

байты

Попробуйте это, 13-5 = 8 Япт

j\+hfqsTQ}M^SQ2

байты

Попробуйте это

 

Cristobalm5


Рег
23 Jun, 2012

Тем
57

Постов
175

Баллов
490
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно