Несмотря на то, что были заданы соответствующие проблемы , этот вопрос отличается от собственного вопроса.
Вызов
Если задано положительное целое число, верните самую длинную последовательность последовательных положительных нечетных целых чисел, сумма которых равна заданному целому числу. Если такой последовательности не существует, вы можете сообщить об ошибке любым способом, который имеет смысл для вашего языка, включая возврат ложного значения или выдачу исключения.
Тестовые случаи
1 -> [1] 2 -> [] 3 -> [3] 4 -> [1, 3] 5 -> [5] 6 -> [] 9 -> [1, 3, 5] (обратите внимание, что [9] не является правильным ответом) 15 -> [3, 5, 7] 104 -> [23, 25, 27, 29] (обратите внимание, что [51, 53] не является правильным ответом)
счет
Это код-гольф , поэтому выигрывает самый короткий ответ на каждом языке.
Ответы:
Haskell,
6765636258 байтСохранено 4 байта благодаря Julian Wolf
Попробуйте онлайн!
Я проверяю , если число может быть выражено как он разность двух квадратов:
m^2-n^2
. Затем я могу построить список последовательных нечетных чисел:[2n+1,2n+3...2m-1]
. Обратите внимание, что посколькуn
выбран минимум, будет выведен самый длинный списокисточник
x
обоих,n
иm
Python 2 ,
6662 байтаВыход с RuntimeError (превышена максимальная глубина рекурсии), если нет решения.
Попробуйте онлайн!
источник
Желе ,
1110 байт-1 байт благодаря Деннису (используйте неявное построение диапазона
Ẇ
- заменитеRm2Ẇ
наẆḤ’
)Монадическая ссылка, возвращающая список слагаемых, если возможно, или
0
если нет.Попробуйте онлайн!
Как?
источник
ẆḤ’
сохраняет байт.JavaScript (ES7),
87868581 байтВозвращает разделенный запятыми список целых чисел, или
0
если решения не существует.Как?
Сначала мы ищем наименьший идеальный квадрат s , так что x = n + s - еще один идеальный квадрат.
Если s существует, n является разностью x - s 2 совершенных квадратов, которая может быть записана как разность 2 последовательностей последовательных нечетных чисел. Затем мы строим полученный список.
Пример:
Для n = 104 :
Мы находим s = 11² = 121, который удовлетворяет x = n + s = 225 = 15²
Затем:
15² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21 + 23 + 25 + 27 + 29
11² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21
104 = 15² - 11² = 23 + 25 + 27 + 29
Показать фрагмент кода
источник
n^2
всегда равна сумме первыхn
нечетных чисел?05AB1E ,
98 байт-1 байт благодаря Emigna
Объяснение:
При неверном вводе ничего не выводится.
Попробуйте онлайн!
источник
ʒOQ}
вместо того, чтобыDO¹QÏ
сохранить байт.Haskell ,
6160 байтСпасибо @maple_shaft за сбривание 1 байта
Попробуйте онлайн!
Используется тот факт, что самым длинным пробегом всегда будет запуск, начинающийся с наименьшего числа.
Я хотел сделать что-то с арифметикой вместо грубого принуждения
k
, но,fromInteger
похоже, убил это.источник
[1,3..n]
на[1,3..]
r?n=[r,r+2..n]
. Попробуйте онлайн!Python , 67 байт
Попробуйте онлайн!
Я скопировал мой ответ от предыдущей последовательной вызов суммы и изменил
+1
к+2
. Кто знал, что гольф-код может быть таким модульным?Странно простая стратегия: ищите интервал
R
с желаемой суммой.R
.Поскольку нижний конец интервала только увеличивается, более длинные интервалы находятся перед более короткими. Если возможный интервал не может быть найден, завершается с помощью IndexError.
источник
JavaScript (ES6),
6564 байтаВозвращает массив, если есть решение, или 0, если нет решения.
Это очень неэффективный, но гольф решение проблемы.
Он ищет первое решение, используя
a-i
иi=1
, даже если не работает рекурсивный стек. Если это решение не начинается сi+2
, то мы рекурсивно ищем первое решение, используяa
иi+2
.Ungolfed
Тестовые случаи:
Показать фрагмент кода
Чтобы понять, насколько это неэффективно, решение
f(104)
требует 69 535 рекурсивных вызовов. Глубина стека никогда не превышает 51 уровня, поэтому проблем с переполнением стека нет.Решение
f(200)
требует 8,6 миллионов рекурсивных вызовов со стеком в 99 уровней. (Его решение есть[11,13,15,17,19,21,23,25,27,29]
.)Вот визуальное представление работающей программы:
Показать фрагмент кода
источник
Python 2.7,
10910897 байт11 байтов вниз, благодаря Эрику Outgolfer.
Это мой первый кодовый гольф!
Как это работает
Я использовал хорошо известную личность, которая
1 + 3 + 5 + ... + (2n - 1) = n²
Возьмите случай
15
В общем, если есть х терминов , начиная с
2n + 1
, какРавно
2nx + x²
Если
N
входное целое число, проблема сводится к тому, чтобы найти максимумx
таким, чтобыЭто квадратное уравнение с решением
Самая длинная последовательность - самая длинная
x
. Программа выполняет итерациюn
от0
доN
и, когда она находитx
это целое число, она создает список(2n + 1) + (2n + 3) + (2n + 5) ... (2n + (2x-1))
и возвращает его.источник
Python 3,
19081 байтБлагодаря @ovs и @ musicman523
источник
print
отсутствуют скобкиl.append(i)
, просто используяl+[i]
в рекурсивном вызове. Вы можете удалитьl.pop(0)
с помощьюl[1:]
рекурсивного вызова. Вы можете удалить вызовc
в самом низу, используя вместо этого ключевые аргументы. Вы можете удалить>0
в строке 2. Наконец, вы можете изменить свои выраженияif
иelse
в выражения, используя троичную форму, которая сокращает до 92 байтов в качестве лямбда-выражения. Попробуйте онлайн!i
их до 81 байта .sum(l)>q else
чтобыq<sum(l)else
спасти 1 байт.QBIC , 47 байт
Это пытается посчитать все нечетные числа от одного до его суммы
n
. Если оно прошлоn
, сбросьте цикл, увеличьте 1 до 3 и попробуйте снова. Выйти, печатая 0, если в начале цикла наш номер> n
.объяснение
источник
R , 90 байт
Попробуйте онлайн!
Использует рекурсивную функцию, которая тестирует последовательность накопленной суммы y: x, преобразованную в последовательность нечетных чисел. y увеличивается на каждую рекурсию, пока не превысит x. Первая последовательность, которая суммируется с целью, будет возвращена.
источник
Python 2 , 89 байт
Безымянная функция принимает положительное целое число
n
и возвращает результат, если он существует, и возвращает значениеIndexError
иначе.Попробуйте онлайн!
Создает список всех соответствующих нечетных чисел, с
r(1,n+1,2)
которыми естьrange(start=1, stop=n+1, step=2)
; создает все соответствующие субсрезы (плюс несколько пустых), нарезая их отi
включающих доj
исключающих с[i:j]
поперекi
в [0, n), используяr(n)
иj
в [0, n] используяr(n+1)
(пустые, когдаi>=j
илиi
выходит за пределы); фильтры для тех с правильной суммой сif sum(v)==n
; возвращает первый (и, следовательно, самый длинный) такой срез, используя[0]
.источник
Python 2 ,
9190 байт-1 байт благодаря @CMcAvoy
Попробуйте онлайн!
источник
Pyth, 11 байт
Попробуй это здесь.
источник
PHP , 73 байта
нет решения бесконечный цикл
Попробуйте онлайн!
PHP , 83 байта
ничего не печатает без решения
каждый мод ввода 4 == 2 не имеет решения
Попробуйте онлайн!
источник
Python 2 ,
122121119115 байтов-1 байт благодаря musicman523. -4 байта благодаря Step Hen. ха - ха
Попробуйте онлайн!
источник
range
, попробуйте онлайн!Python 3 , 93 байта
Попробуйте онлайн!
Единственное особенное, что я сделал, было отметить, что
(s+e)*(2+e-s)==4*n
это эквивалентноsum(range(s,e+1,2))==n
, и хотя они имеют одинаковый размер, тогдаr=range
как первое можно поместить ближе кif
утверждению.источник
Python 3 , 185 байт
Попробуйте онлайн!
Что касается того, как это работает, я попытался найти более элегантное решение, чем простой перебор. Я переставил формулу для суммы арифметической последовательности и применил квадратную формулу, чтобы получить выражение
(1-a+((a-1)**2+4*s)**(.5))/2
, которое появляется в коде. Что вычисляет выражение, учитывая желаемую суммуs
и первый член для арифметической последовательностиa
, длине последовательности. Эти длины хранятся в словаре как значения для первых терминов в качестве ключей.Затем все нецелочисленные значения удаляются из словаря, поскольку они представляют недопустимые последовательности. Оттуда наибольшее значение идентифицируется
max(d.keys(), key=(lambda k: d[k]))
и последовательность нечетных чисел в этой позиции и на этой длине делается сlist(range(int(m),int(m+2*d[m]),2))
.Я ищу помощь в игре в гольф, если вы видите что-нибудь. Меня больше интересовало, насколько хорошо я могу справиться с нетривиальным алгоритмом; мой ответ почти вдвое длиннее, чем лучшее решение Python.
источник
Mathematica, 56 байт
Function
с первым аргументом#
.Table[n,{n,1,#,2}]
вычисляет список положительных нечетных чисел, меньших или равных#
.Subsequences
возвращает все подпоследовательности этого списка, упорядоченные по возрастанию длины. Затем мы берем те,Cases
которые соответствуютx_/;Tr@x==#
, то есть последовательностиx
, так что их суммаTr@x
равна входу#
. Затем мы возьмемLast
такую последовательность.источник
JavaScript (ES6), 72 байта
Возвращает разделенную пробелами строку нечетных чисел или выбрасывает неверный ввод. 84-байтовая версия, которая возвращает (пустой при необходимости) массив:
Объяснение: Свободно основано на awk-решении @ Cabbie407 для сумм последовательных целых чисел, за исключением того, что мне удалось сэкономить несколько байтов с помощью рекурсии.
источник
PHP, 78 байт
бесконечный цикл, если нет решения. вставка
?$b>$argn+2?$n=[]:1:0
после,$s-$argn
чтобы напечатать пустой массив вместо.Запустите
-nR
или попробуйте онлайн .источник
C # (.NET Core) , 129 байт
Выводит числа в строку, разделенные пробелом (любой другой символ просто потребует изменения
" "
). Ввод без решения возвращает пустую строку (хотя если вечный запуск без ошибок является допустимым способом указать отсутствие решения, то 17 байтов можно сохранить, удаливif(b==e)return"";
).Алгоритм это:
источник
(i)=>
какi=>
C ++, 157 -> 147 байт
-10 байт благодаря DJMcMayhem
вернет 0, если нет ответа, 1 в противном случае
последняя строка, которую он печатает, является ответом
ungolfed:
это мой первый код гольф ^^
источник
int v=0;
вместоint v;....v=0;
и, если вы сделали вывод Newline с разделителями, вы могли бы сделать,std::cout<<k<<"\n";
а затем вообще удалить второйКотлин, 152 байта
Попробуйте онлайн (подождите 4-5 секунд, компилятор работает медленно)
Ungolfed
источник
Excel VBA, 139 байт
Sub
подпрограмма, которая принимает входные данныеn
ожидаемого целого числа и сообщает в ячейку самую длинную последовательность последовательных нечетных чисел[A1]
источник