Утримуйте / скидайте / збільшуйте послідовність


20

Ось послідовність, про яку я говорю:

{1, 4, 5, 9, 10, 11, 16, 17, 18, 19, 25, 26, 27...}

Починаючи з 1, тримайте 1, скидайте наступні 2, зберігайте наступні 2, краплі 3, тримайте 3 і так далі. Так, це теж на OEIS (A064801) !

Змагання

Задавши ціле число n>0, знайдіть n-й член наведеної вище послідовності

Випробування

Input -> Output       
1->1  
22->49  
333->683
4444->8908
12345->24747

Це кодовий гольф, тому найкоротша відповідь у байтах виграє! Удачі!



3
Чи можемо ми вибрати між індексуванням 0 та 1?
Містер Xcoder

1
@ Mr.Xcoder Боюся, що ні. Це лише 1-індексований

Чи можемо ми повернути список у порядку, що містить усі елементи?
Пшеничний майстер

@WheatWizard це абсолютно неприпустимо. вибачте

Відповіді:


12

Java (OpenJDK 8) , 45 44 байти

n->{int i=0;for(;++i<n;n-=i);return~-n+i*i;}

Спробуйте в Інтернеті!

-1 байт завдяки @Nevay

Поглянувши на це деякий час, я помітив візерунок. Щоразу, коли ми відкидаємо nчисла, наступне число в послідовності - це ідеальний квадрат. Побачивши це, я подумки розбив послідовність на зручні шматки: [[1],[4,5],[9,10,11],...]В основному, цей iфрагмент починається зi*i , і він повторює iелементи вгору для елементів.

Щоб знайти nть число в цій послідовності, ми хочемо спочатку знайти, в якому фрагменті знаходиться число, а потім, яке місце в шматку він займає. Ми віднімаємо наше збільшення коефіцієнта iвід, nпоки nце не менше i(що дає нам наш відрізок), а потім просто додаємо n-1до, i*iщоб отримати правильний positionфрагмент.

Приклад:

n = 8
n > 1? Yes, n = n - 1 = 7
n > 2? Yes, n = n - 2 = 5
n > 3? Yes, n = n - 3 = 2
n > 4? No, result is 4 * 4 + 2 - 1 = 17

1
Ви можете використовувати return~-n+i*i;для збереження 1 байт.
Невай

7

Haskell, 48 43 41 байт

n#l=[l..l+n]++(n+1)#(l+2*n+3)
((0:0#1)!!)

4 додаткові байти для індексації на основі 1, а не на основі 0. Непотрібне обмеження, ІМХО.

Спробуйте в Інтернеті!

n#l             -- n is one less than the number of element to keep/drop and
                -- l the next number where the keep starts
   [l..l+n]     -- keep (n+1) numbers starting at l
   ++           -- and append a recursive call
   (n+1)#       -- where n is incremented by 1 and
      (l+2*n+3) -- l skips the elements to keep & drop

0#1             -- start with n=1 and l=0 and
 0:             -- prepend a dummy value to shift from 0 to 1-based index
    !!          -- pick the i-th element from the list 

6

Python 3 , 47 46 байт

1 байт дякую містеру Xcoder.

def f(n):a=round((2*n)**.5);return~-n+a*-~a//2

Спробуйте в Інтернеті!

ДУЖЕ швидко для більшої кількості


46 байт: def f(n):a=round((2*n)**.5);return~-n+a*-~a//2. Не впевнений, хоча ... Розумний підхід!
Містер Xcoder

Ах, подвійні лямбда - це один зайвий байт, я сподівався, що врятує байт ...
Стівен

Чому хтось спротив це? Чи є якась проблема з підходом, який ми не помітили?
Містер Xcoder

@ Mr.Xcoder, можливо, через прискіпливе зауваження.
Leaky Nun

a*(a+1)є навіть для кожного цілого числа. Чи скаржиться Python на поплавковий поділ на цілі числа? Чи скаржиться він на побитові операції на поплавках? Якщо немає (2*n)**.5+.5|0.
Тит


3

Haskell , 33 байти

Анонімна функція. Використовувати як((!!)$0:do n<-[1..];[n^2..n^2+n-1]) 1

(!!)$0:do n<-[1..];[n^2..n^2+n-1]

Спробуйте в Інтернеті!

  • Побудовує послідовність як нескінченний список, а потім індексує її з !! . Елемент 0:манекена, щоб регулювати від 0 до 1 індексацію.
  • Діапазон [n^2..n^2+n-1]будує підряд без пропусків, починаючи з квадрата nі міститьn числа.
  • doПозначення зчіплюють побудовані діапазони для всіх n>=1.


2

Perl 6 , 43 байти

{(1..*).rotor({++$=>++$+1}...*).flat[$_-1]}

Перевірте це

Розширено:

{  # bare block lambda with implicit parameter 「$_」

  ( 1 .. * )                  # range starting from 1

  .rotor(                     # break it into chunks

    { ++$  =>  ++$ + 1} ... * # infinite Seq of increasing pairs
    #   1  =>    1 + 1    ==>   1 => 2 ( grab 1 skip 2 )
    #   2  =>    2 + 1    ==>   2 => 3
    #   3  =>    3 + 1    ==>   3 => 4
    # ...  =>  ... + 1

  ).flat\                     # reduce the sequence of lists to a flat sequence
  [ $_ - 1 ]                  # index into the sequence
                              # (adjusting to 0-based index)
}

(1..*).rotor({++$=>++$+1}...*) виробляє:

(
 (1,),
 (4, 5),
 (9, 10, 11),
 (16, 17, 18, 19),
 (25, 26, 27, 28, 29),
 ...
).Seq

2

TeX, 166 байт

\newcommand{\f}[1]{\count0=0\count1=0\loop\advance\count0 by\the\count1\advance\count1 by1\ifnum\count0<#1\repeat\advance\count0 by#1\advance\count0 by-1
\the\count0}

Використання

\documentclass[12pt,a4paper]{article}
\begin{document}
\newcommand{\f}[1]{\count0=0\count1=0\loop\advance\count0 by\the\count1\advance\count1 by1\ifnum\count0<#1\repeat\advance\count0 by#1\advance\count0 by-1
\the\count0}

\f{1}

\f{22}

\f{333}

\f{4444}

\f{12345}
\end{document}

enter image description here


2

Javascript, 43 38 байт

n=>eval("for(r=1;n>r;)n-=r++;r*r+n-1")

Спробуйте в Інтернеті!

Я використовую той факт, що для кожного трикутного числа плюс одне, результат є квадратним числом.

Як приклад: трикутні числа дорівнюють 0, 1, 3, 6, 10 ... тому для 1, 2, 4, 7, 11 ... ми спостерігаємо 1, 4, 9, 16, 25 ... у нашій послідовності .

Якщо індекс знаходиться десь між цими відомими числами, елементи нашої послідовності просуваються лише на одиницю. Наприклад, для обчислення результату на 10 беремо 7 (як трикутне число плюс одне), беремо результат (16) і додаємо 10-7 = 3. Таким чином, 16 + 3 = 19.






1

Математика, 37 байт

Flatten[Range@#+#^2-1&~Array~#][[#]]&

Пояснення

Range@#+#^2-1&

Functionяке приймає додатне ціле число #і повертає пробіг #послідовних чисел у послідовності.

...~Array~#

Створює список усіх таких прогонів до введення #

Flatten[...][[#]]

Flattensотриманий список і повертає #th елемент.



1

Тампіо , 310 308 байт

n:n uni on n unena 1:lle
a unena k:lle on a vuona k:lla vähennettynä a:sta ja k
a vuona nollalla ja k on a
a vuona k:lla vähennettynä nollasta ja k on a
a vuona b:n seuraajalla ja k on yhteenlaskun kutsuttuna k:n kerrottuna 2:lla arvolla ja k:n vähennettynä a:sta arvolla unena k:n seuraajalle seuraaja

Використання: 4:n uniоцінює до9 .

Пояснення:

n:n uni on n unena 1:lle
uni(n)  =  n `uni` 1

a unena k:lle on  a vuona  k:lla vähennettynä a:sta ja k
a `uni` k     =  (a `vuo` (k     `vähennetty` a)    )  k

 a vuona nollalla ja k on a
(a `vuo` 0        )  k =  a

 a vuona  k:lla vähennettynä nollasta ja k on a
(a `vuo` (k     `vähennetty` 0)       )  k =  a

 a vuona  b:n seuraajalla ja k on
(a `vuo` (b   + 1)        )  k =

 yhteenlaskun kutsuttuna k:n kerrottuna 2:lla arvolla
(yhteenlasku            (k   *          2     )

 ja k:n vähennettynä a:sta arvolla unena  k:n seuraajalle seuraaja
((  k   `vähennetty` a     )       `uni` (k   + 1)   )  ) + 1

Зі стандартної бібліотеки:

a `vähennetty` b = b - a
yhteenlasku a b  = a + b



0

Математика, 82 байти

Complement[Range[3#],Array[#+⌊((r=Sqrt[1+8#])-1)/2⌋⌊(r+1)/2⌋/2&,3#]][[#]]&


0

Javascript (ES6) 100 98 байт

var k=n=>{var s=[],i=1,c=1,j;while(s.length<n){for(j=i;j<i+c;j++){s.push(j)}i+=c*2+1;c++}return s}

Вигляд зробив це швидко, тому, маю на думці, є багато місця для вдосконалення, просто основні петлі та лічильники.


0

Сітківка , 27 байт

.+
$*
((^1|1\2)+)1
$1$2$&
1

Спробуйте в Інтернеті! Порт відповіді Python @ LeakyNun. Перший і останній етапи є просто нудним десятковим ⇔ унарним перетворенням. Другий етап працює так: ((^1|1\2)+)це збір трикутного числа; $1- відповідне трикутне число, а $2його індекс. Короткий 1засіб означає, що він відповідає найбільшому трикутному числу суворо менше вхідного, що призводить до рівно на меншу кількість ітерацій, ніж цикл Python, що означає, що $1еквівалентно a-iі $2до, i-1а їх сума дорівнює a-1або, ~-aяк потрібно. ( щоб відповідати і в цьому випадку.$& просто запобігає видаленню матчу з результату.) Зауважте, що для введення 1не відповідає збіг, а вихід просто такий же, як і вхід. Якщо ви були збоченими, ви могли б використати^((^1|1\2)*)1


0

MATL , 12 байт

:"@U@:q+]vG)

Спробуйте в Інтернеті!

Пояснення

:        % Push range [1 2 ... n], where n is implicit input
"        % For each k in that range
  @U     %   Push k^2
  @:     %   Push range [1 2 ... k]
  q      %   Subtract 1: gives [0 1 ... k-1]
  +      %   Add: gives [k^2 k^2+1 ... k^2+k-1]
]        % End
v        % Concatenate all numbers into a column vector
G)       % Get n-th entry. Implicitly display


0

PHP, 48 42 37 + 1 байт

портіровани з Дірявий Nun's відповіді

while($argn>$a+=$i++);echo$a+~-$argn;

Запустіть як трубу -Fабо спробуйте в Інтернеті .

прямий підхід, 42 + 1 байт (перенесено з іншої відповіді Лікі Нун )

<?=($a=(2*$argn)**.5+.5|0)*-~$a/2+~-$argn;

Виконуйте як трубу з -nRабо невмістившись у вище TiO.

старше ітераційне рішення, 48 + 1 байт

for(;$argn--;$n++)$c++>$z&&$n+=++$z+$c=1;echo$n;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.