Давайте посчитаем...
Считайте до 2 и обратно до 1
Считайте до 4 и обратно до 1
Считайте до 6 и обратно до 1
... хорошо, вы поняли ...
собрать все это вместе, и вы получите следующую последовательность
{1,2,1,2,3,4,3,2,1,2,3,4,5,6,5,4,3,2,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,2,3...}
Задача
Учитывая целое число n>0
для 1-индексированного (или n>=0
для 0-индексированного), выведите n-й член этой последовательности
Контрольные примеры
Input->Output
1->1
68->6
668->20
6667->63
10000->84
правила
Ваша программа должна быть в состоянии вычислить решения до n = 10000 в течение минуты
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
Ответы:
JavaScript (ES7),
59 ... 4443 байтаСохранено 1 байт благодаря Титу
Ожидаемый ввод: 1-индексированный.
Изначально вдохновлен формулой A004738 , которая представляет собой похожую последовательность. Но в итоге я переписал его полностью.
Контрольные примеры
Показать фрагмент кода
Как?
Последовательность может быть организована в виде треугольника с левой частью в порядке возрастания и правой частью в порядке убывания.
Ниже приведены первые 4 строки, содержащие первые 32 условия:
Теперь давайте введем некоторые переменные:
Мы начинаем с 2 элементов в верхней части и добавляем 4 элемента в каждой новой строке. Следовательно, количество элементов в 0-индексированной строке r может быть выражено как:
1-индексированная начальная позиция x строки r задается суммой всех предыдущих членов в этом арифметическом ряду плюс один, что приводит к:
Взаимно, учитывая 1-индексированную позицию n в последовательности, соответствующая строка может быть найдена с помощью:
или как код JS:
Как только мы знаем r (n) , мы вычитаем начальную позицию x (r) минус один из n :
Мы сравниваем n с a (r) / 2 + 1 = 2r + 2, чтобы выяснить, находимся ли мы в восходящей части или в нисходящей части:
Если это выражение истинно, мы возвращаем n . В противном случае мы возвращаем 4 (r + 1) - n . Но так как r был уже увеличен в последнем утверждении, это упрощается как:
источник
Haskell , 37 байт
Попробуйте онлайн!
Zero-индексироваться. Создает список и индексирует его. Спасибо Эрджану Йохансену за сохранение 2 байта!
Haskell , 38 байт
Попробуйте онлайн!
Zero-индексироваться. Создает список и индексирует его.
Haskell , 39 байт
Попробуйте онлайн!
Zero-индексироваться. Рекурсивный метод.
источник
Python , 46 байт
Попробуйте онлайн!
Ноль индексируется.
источник
Шелуха , 8 байт
1-индексироваться. Попробуйте онлайн!
объяснение
источник
Perl 6 , 29 байт
Попробуйте онлайн
0 на основе
Expanded:
Внутренняя последовательность
1...$+=2...2
производитЧтобы получить его на основе 1, добавьте
0,
перед вторым{
или добавьте-1
после$_
источник
R, 64 байта
Функция, которая принимает аргумент
n
. Он создает вектор2:n
с шагом 2. Для каждого из них создается вектор1:(x-1)
иx:2
. Это в общей сложности будет дольше, чемn
. Мыunlist
это, чтобы получить вектор и взятьn
вторую запись.источник
1:n*2
вместоseq(2,n,2)
? Это будет больше, чем нужно, но это должно быть хорошо! Кроме того, я не думаю, что это работалоseq(2,n,2)
вn=1
любом случае!Python 2 , 56 байт
Попробуйте онлайн!
Это 0-индексированный.
-1 байт благодаря @JustinMariner
Как это работает
Отметим, что 1-индексированная
n
-th-группа (1, 2, ... 2n ..., 2, 1
) происходит из элементов, пронумерованных от 02(n-1)^2
до2n^2
.Чтобы найти элемент по индексу
x
, мы можем найти номер группы, вn
которой онx
находится. Из этого мы вычисляем расстояние от центра группы, котораяx
находится. (Это расстояние естьabs(2*n**2+2*n+2-x)
).Однако, поскольку элементы уменьшаются дальше от центра группы, мы вычитаем расстояние от максимального значения группы.
источник
print 2*n-abs(2*n*n+2*n+1-x)+2
-2*n*n+2*n
может быть2*n*-~n
и+2+2*n
может быть превращен-~n*2
, что позволяет нам переместить его в начало, что экономит байты ( 53 байта )05AB1E , 8 байтов
Код:
Использует кодировку 05AB1E . Попробуйте онлайн!
Объяснение:
источник
€1
странно ...JavaScript, 39 байт
источник
Желе ,
10, 9 байтПопробуйте онлайн!
Также 1 индексируется и заканчивается довольно быстро.
Один байт сохранен благодаря @ErikTheOutgolfer!
Объяснение:
Гипотетически, скажем, input (
a
) равен 3.источник
Ḥ€ŒḄ€Ṗ€Fị@
, так что вы можете использоватьµ€
для -1 (три или более монады с€
в начале):ḤŒḄṖµ€Fị@
ḤŒḄṖ
<newline>½ĊÇ€Fị@
для 12, чтобы соответствовать требованию 10000 (запуск 9-байтового кода локально занимает около 2:20 на моем i7 и использует 7 ГБ)MATL , 15 байт
1 на основе.
Попробуйте онлайн!
Это время для самых больших тестовых случаев в TIO, но заканчивается на моем настольном компьютере (компилятор работает на MATLAB R2017a). Чтобы отобразить прошедшее время, добавьте
Z`
в конце кода.объяснение
Код генерирует гораздо больше терминов, чем необходимо. В частности, он вычисляет
n
«кусочки» последовательности, где каждый кусочек является счетчиком до 1.источник
Шелуха ,
1210 байтПопробуйте онлайн!
1-индексированный, работает довольно быстро
объяснение
источник
…
Mathematica, 90 байт
Попробуйте онлайн!
источник
Сетчатка , 62 байта
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Ввод 1-индексирован. Первый этап - просто десятичное в унарное преобразование. Второй этап находит наибольшее квадратное число
s
строго меньше, чем половинаn
;$1
естьs²
, пока$2
есть2s-1
. Он вычисляет два значения, во-первых, число чисел в текущем прогоне вверх / вниз4(s+1) = 4s+4 = 2$2+6
, и, во-вторых, положение в этом прогоне, то естьn-2s² = n-(2$1+1)+1 = n-$&+1
, которое просто требует1
компенсировать значение,1
используемое для обеспечения строгого неравенства. Затем на последнем этапе отсчитывается от этой позиции до начала и конца цикла, берется младший результат и преобразуется в десятичное число.источник
Mathematica, 67 байт
Попробуйте онлайн!
источник
Perl 5 , 43 + 1 (-p) = 44 байта
Попробуйте онлайн!
Я работал над формулой для прямого вычисления n-го элемента. Затем я увидел, что @ fireflame241 выполнил эту работу, и отправил ее в Perl.
# Perl 5 , 50 + 1 (-n) = 51 байтПопробуйте онлайн!
Результаты 0 проиндексированы.
источник
Haskell ,
11581 байтПопробуйте онлайн!
Здесь происходит какое-то волшебство. Возможно, может быть короче, если бы я использовал нормальный подход, хотя.
объяснение
Сначала мы определимся
%
.%
это функция, которая принимает две переменныеx
, иy
. Он создает списокscanl(+)y[y+1,y+3..]
и находит первый элемент этого списка больше, чемx
.scanl(+)
просто выполняет итерационные суммы, чтобы получить треугольные числа, которые мы сделали быscanl(+)0[1..]
, чтобы получить квадратные числа, которые мы сделали быscanl(+)0[1,3..]
. Два списка , в частности , мы будем строить являютсяscanl(+)2[3,5..]
иscanl(+)1[2,4..]
эти точки перегиба узора.Теперь мы определяем основную функцию,
g
которая принимаетx
. Еслиx
это один, мы возвращаемся,1
потому что это первое значение. В противном случае мы проверяем следующие две точки перегиба, если перегиб вниз больше,1%x>2x
мы возвращаем преемника,g$x-1
иначе мы возвращаем предшественникаg$x-1
.Хорошо, но почему это работает?
Прежде всего «Что с тем, как мы находим вершины?». Важно отметить расстояние между последовательными вершинами одного типа. Вы заметите, что различия увеличиваются на 2 каждый раз. Это имеет смысл, потому что основания треугольников расширяются на 2 каждый раз. Мы можем сделать константу разницы списков с помощью литерала списка, например, так,
[2,4..]
и мы используем,scanl(+)
чтобы превратить эти списки в наши списки вершин, основываясь на расположении первой вершины и первой разности.Теперь, когда у нас есть способ поиска вершин вверх и вниз, мы можем использовать эту информацию для получения значений. Мы говорим, что первое значение в
1
противном случае мы должны принять либо преемник или предшественник. Если следующая вершина является восходящей, мы хотим взять предшественника, в противном случае мы выбираем преемника.Хаскелл ,
565146 байтВот мое лучшее решение с меньшим количеством математики и меньшим количеством байтов.
Попробуйте онлайн!
источник
Пайк , 14 байт
Попробуй это здесь!
источник
C # (.NET Core) , 120 байт
Объяснение: довольно просто, первый вложенный цикл поднимается до нашего максимума, второй возвращается обратно до 2. Повтор для каждого кратного 2.
Попробуйте онлайн!
источник
Рубин ,
7875 байтСохранено 1 байт благодаря Step Hen
Сохранено 1 байт благодаря Mr. Xcoder
Попробуйте онлайн!
Надеюсь, я смогу получить несколько советов о том, как потратить побитный счет. Я пытался принять простой подход.
источник
c=1 if
можно сыграть в гольфc=1if
->n{a=0;b=2;c=1;n.times{if a==b then c=0;b+=2;end;c=1if a==1;a+=c<1?-1:1};a}
Java (OpenJDK 8) , 53 байта
Попробуйте онлайн!
-2 байта благодаря Nevay.
1-индексироваться.
TL; DR Мы разбиваем последовательность на удобные порции, находим порцию
n
, затем находимnth
позицию в порции.Здесь мы можем разделить последовательность как
[[1,2],[1,2,3,4,3,2],[1,2,3,4,5,6,5,4,3,2],...]
, что дает нам размеры фрагмента4i-2
. Начиная сi=2
, мы вычитаемi
изn
, по существу , движется вверх кусок в то время. Как только мы удовлетворяемn<=i
, мы знаем,n
что теперь позиция правильного значения в текущем чанке.Затем мы получаем значение, сравнивая
n
сi
размером фрагмента. Средняя точка каждого куска равнаi/2+1
; еслиn
меньше, мы просто возвращаемсяn
. Еслиn
больше, мы вернемсяi-n+2
.пример
источник
+1
,return n>i/2?i-n+2:n
достаточно.Python 2 , 5! байт (120 байт: P)
Попробуйте онлайн!
Прямо, делает список, а затем принимает элемент input'th
источник
Python 3 ,
184156 байтПопробуйте онлайн!
игра в гольф с генератором Python для «ленивой» оценки
источник
QBIC , 47 байт
объяснение
источник
Röda , 54 байта
Попробуйте онлайн!
Звоните с:
try f(n)
Эта функция быстро возвращает ответ, но после этого выполняет некоторые ненужные вычисления и в конечном итоге исчерпывает память.
Поскольку функция действительно возвращает фактический ответ вскоре после его вызова (явно меньше минуты), я думаю, что этот ответ действителен.
(В Röda функции могут возвращать значения до их выхода из-за параллелизма.)
источник
C # (.NET Core) ,
99 9586 байтПопробуйте онлайн!
Лямбда-функция, которая принимает и возвращает целое число. Единый цикл, который обрабатывает счет вверх и вниз.
источник
PHP, 65 + 1 байт
Запустите как трубу с
-R
или попробуйте онлайн (или раскомментируйте одну из других версий).Порт рекурсивного JavaScript tsh занимает 66 байтов:
Порт решения Арнаулда занимает 62 + 1:
Гольф-порт Java на Ксандерхолле имеет самый короткий код (55 + 1 байт):
источник
Pyth ,
1918 байтПопробуй это здесь!
источник