Учитывая целое число n
(где n < 10001
) в качестве входных данных, напишите программу, которая будет выводить первые n
числа Улама . Число Улама определяется следующим образом:
- U 1 =
1
, U 2 =2
. - Ибо
n > 2
, U n - это наименьшее целое число, которое больше, чем U n-1, которое является суммой двух различных более ранних членов ровно одним способом.
Например, U 3 - это 3
(2 + 1), U 4 - 4
(3 + 1) (обратите внимание, что (2 + 2) не учитывается, поскольку термины не различаются), а U 5 - 6
(U 5 не равно 5 потому что 5 может быть представлен как 2 + 3 или 4 + 1). Вот первые несколько чисел Улама:
1, 2, 3, 4, 6, 8, 11, 13, 16, 18, 26, 28, 36, 38, 47, 48, 53, 57, 62, 69, 72, 77, 82, 87, 97, 99
Это код гольф, поэтому выигрывает самый короткий вход.
code-golf
number
number-theory
sequence
абсент
источник
источник
n
мы должны обрабатывать?Ответы:
CJam,
474137 байтПопробуйте онлайн.
Пример запуска
Как это устроено
Эта основная идея заключается в следующем:
Начните с массива
A := [ 0 U₁ U₂ ... Uₖ ]
.Вычислить
S
, массив всех сумм,x + y
таких, чтоx,y ∊ A
иx < y
.Отменить все неуникальные суммы от
S
. Поскольку каждое число Улама, большее 2, является как суммой двух меньших, так и суммой нуля и самого себя, это отбрасывает числа УламаU₃, U₄, ... Uₖ
.Оставшийся массив таков
[ U₁ U₂ Uₖ₊₁ ... ]
, что следующий номер Улама является третьим наименьшим элементом. Добавьте егоA
и вернитесь к шагу 1.источник
100
уже занимает несколько секунд. Я предполагаю, что вычисление максимального входа 1e5 заняло бы возрасты?J - 46 символов
Функция принимает в
n
качестве аргумента.Объяснил взрывом:
источник
+_*
...T-SQL,
301300288287Я совершил небольшое легкое злоупотребление SQL.
Попробуйте это в SQL Server 2008 здесь .
@N содержит входное целое число. Измените пример "100" на то, что должно быть. «10000», вероятно, в конце концов закончится, но я не дал этому закончиться. Счет символов этой записи предназначен для однозначного ввода. Вывод в форме запроса.
источник
Хаскель,
7067 персонажейиспользование:
источник
GolfScript (
4137 байт)Онлайн демо
Декартовы произведения в GolfScript довольно длинные, поэтому здесь используется другой подход. Долгосрочный рост чисел Улама заключается в том, что
n
число Улама примерно равно13.5n
, но в первых 10000 терминах наибольшее соотношение междуn
числом Улама иn
чуть меньше13.3
. Поэтому, учитывая, чтоn
мы можем отфильтровать первые14n
числа, чтобы найти те, которые принадлежат последовательности.Благодаря Денису за 41-> 37.
источник
n = 1000
занимает меньше минуты с GolfScript; порт в CJam завершаетсяn = 1000
за 8 секунд иn = 10000
за 1 час 20 метров. - Вы можете сохранить четыре байта, объединив свой подход с моим, а именно включив 0 в массив и отбросив его впоследствии. Это позволяет использовать set union вместо блока и устраняет необходимость в переменной:~.14*,4,\{1$.{2$1$-.@<*}%&,2=*|}/1><`
14
.14
это простоE
. Но вам нужно прочитать из STDIN, преобразовать целое число в одиночный перед выполнением объединения множеств (я2$
опишу отчет об ошибке) и не будет работать во внутреннем цикле, так как CJam изменяет стек после каждой итерации ... I Я пробовал несколько разных трюков, но самый короткий был ровно 37 байтов:li4,1$E*{__{I1$-_@<*}%&,2=I*a|}fI1><`
JavaScript ES6,
100 ... 9390 символовЗапустите это в Web Console или Scratchpad последней версии Firefox (Nightly или выпуск).
РЕДАКТИРОВАТЬ 8 Гольф много !!! и сделал это до
94 символов9390 символов (благодаря @openorclose). (Мой первый саб 100)Вот моя версия, которая намного быстрее,
но на 3 символа длиннее (107 символов)и имеет то же количество символов, что и выше,и намного меньше, чем метод грубой силы ниже !, (благодаря edc65):Я буду продолжать пытаться играть в гольф дальше. Но мы выдавливаем это из сферы JS: P
Вот некоторые цифры, когда я запускаю это внутри тега скрипта на веб-странице:
Это мое первое представление, которое вдохновлено ответом @ rink.attendant.6 в JavaScript.
Я знаю, что это может быть в гольфе еще дальше. Я также опубликую решение без грубого обращения, которое может быть еще короче.
РЕДАКТИРОВАТЬ 1 : Гольф немного больше и исправлено для n = 1
Я должен сказать, что я завидую Хаскелу и Дж. За такие супер удобные ярлыки для всех видов требований -_-
источник
u=n=>{for(s=[,1,1],r=[i=1,l=2];c=l<n;!c?s[r[l++]=i]=1:0,i++)for(j of r)c-=j<i/2&s[i-j];return n>1?r:[1]}
и, может быть, даже большеreturn
. 100:u=n=>(s=>{for(r=[i=1,l=2];c=l<n;i+=!c?s[r[l++]=i]=1:1)for(j of r)c-=j<i/2&s[i-j]})([,1,1])|n>1?r:[1]
u=n=>(s=>{for(r=[i=l=1];c=l<n;i+=c&&i-2?1:s[r[l++]=i]=1)for(j of r)c-=j<i/2&s[i-j]})([,1])||r
u=n=>(s=>{for(r=[i=l=1];c=l<n;i+=c&&i-2?1:s[r[l++]=i]=1)r.map(j=>c-=j<i/2&s[i-j])})([])||r
если [, 1] не нужно где-тоPerl - 71 байт
Попробуйте онлайн!
Считая Шебанг как один.
Использование второго массива для хранения сумм кажется значительно быстрее, чем хеш. Использование памяти также меньше, чего я бы не ожидал.
Пример использования:
Образец вывода:
Примерное время выполнения:
источник
n == 1e4
. Удивительный! Вывод дляn == 1
неверен, хотя; он должен напечатать одно число.Ява, 259
Грубая сила хорошо работает для этого.
источник
1
должен быть одним числом.APL (Dyalog Extended) ,
3635 байт-1 байт от Adám
Попробуйте онлайн!
* (В ngn / APL константа может завершить поезд без использования
⍨
. Но ngn / APL не имеет отсчета, поэтому нам нужно ⍨ где-нибудь.)источник
{(2 3∊⍨⍵⍧⍵)/⍵}
→(∊⊢⊆⍨⍧⍨∊2 3⍨)
PHP 5.4+, 164
Тот же подход, что и мои ответы:
источник
Желе , 20 байт
Попробуйте онлайн!
источник
CoffeeScript,
119114В последнее время я практиковал CoffeeScript, чтобы улучшить JavaScript в гольфе, поэтому вот мой ответ на JavaScript, скомпилированный в CoffeeScript:
Я не очень хорошо понимаю циклы и понимания в CoffeeScript, так что, возможно, это может быть продолжено, но это то, что я имею сейчас. Новые строки считаются одним символом (стиль Unix).
источник
JavaScript,
147154150 (136)Сильно вдохновленный разработанным @ Ypnypn решением для грубой силы Java, опубликованным ранее:
Спасибо за @Dennis для бритья от 4 до 18 байт моей оригинальной версии
Опасная версия (с использованием
for..in
петель)Я бы не рекомендовал запускать это, потому что зацикливание на объекте, использующем цикл, может привести к тому, что ваша машина загорится и / или превратится в злую машину для убийства, но вот она:
instanceof
Array
for..in
Ungolfed
источник
z=0
внутри петли, вам это нужно только один раз. 2.for(j in l)for(k in l)z+=l[j]<l[k]&l[j]+l[k]==i;
намного короче, чемl.forEach
подход.Mathematica,
10791 байтЭто очень прямая реализация спецификации.
Я также применяю хитрость Денниса в том, чтобы включать суммы с
0
, но суть в том, что это делает третий элемент списка0
перед возобновлением, как и следовало ожидать, поэтому мне нужно удалить этот элемент из списка.Он обрабатывает ввод
1000
в течение нескольких секунд, но я сомневаюсь, что вы получите результат за 10 тыс. За разумное количество времени. Но я не думаю, что кто-то другой тоже хорошо с этим справляется.источник
OCaml - 254 персонажа
Код использует хеш-таблицу для хранения суммы текущих элементов списка и обновления ее каждый раз, когда вычисляется новый элемент.
Использование:
В переводчике OCaml:
Ungolfed
источник
Python,
137128126 символов.Это мой первый гольф, и я снизил его с ~ 250 персонажей, я очень счастлив, но хотел бы посоветовать, как его улучшить!
источник
for b in U:t[a+b]+=a!=b
и строки 8 и 9 вwhile t[i]-2:i+=1
for
U,i=[1,2],2
кU,i=[1],2
иinput()-2
кinput()-1
иt=_*3*i
кt=_*3*i;U+=[i]
и удалить;U+=[i]
в конце дляC #, 257
Метод грубой силы с использованием LINQ:
Ungolfed, с испытательной оснасткой
источник
Pyth,
2725 байтПопробуйте это онлайн здесь .
Изменить: гольф 2 байта, выполняя суммирование перед группировкой. Предыдущая версия:
<uaGh-mssdfq1lT.gsk.cG2GQS2
источник
C, 478 байт
В Tio сейчас за 9 секунд он найдет 10000 значений (и там напечатает первые 100 значений). Хитрость заключается не в линейном поиске во внутреннем цикле, а в бинарном поиске ... Ниже приведены функции с хорошим отступом и полностью читаемые (наконец-то для меня):
источник
APL (NARS), 278 символов, 556 байтов
это был бы перевод в APL C, который я отправил. Кажется, я не понимаю, когда использовать place вместо possible ... возможный ∇∇ используется, когда один аргумент является одной функцией (а не одним другим типом). «u bs x, a, b» - это поиск в массиве «u» для значения «x» в диапазоне a..b; он вернул бы 1, indexWhereFind или 0, indexWhereEndOfsearch. С аргументом 200 p возьмите + - минуту здесь ...
источник
∇∇
в dop относится к самому оператору, а∇
относится к производной функции, состоящей из оператора с его операндом (-ами). Таким образом, в монадическом операторе∇
то же самое, что в(⍺⍺∇∇)
то время как в диадическом операторе это означает(⍺⍺∇∇⍵⍵)
.