Ромбова послідовність


11

Уявіть, щоб перерахувати елементи ромбів, які ростуть [1],[1,3,1],[1,3,5,3,1],…(лише непарні числа такі, що вони добре вирівнюються). Це виглядатиме так, зауважте, що ви завжди починаєте з перерахування 1:

                   01
       1        02 03 04
 1   2 3 4   05 06 07 08 09          …
       5        10 11 12
                   13
(1) (1,3,1)    (1,3,5,3,1)    (1,3,5,7,5,3,1)   …

Тепер, якщо ви почнете підсумовувати стовпці ( [1],[2],[1,3,5],[4],[5],[2,6,10],…), ви отримаєте послідовність ромбів . Це перші 100 елементів зазначеної послідовності:

1,2,9,4,5,18,35,24,9,10,33,60,91,70,45,16,17,54,95,140,189,154,115,72,25,26,81,140,203,270,341,288,231,170,105,36,37,114,195,280,369,462,559,484,405,322,235,144,49,50,153,260,371,486,605,728,855,754,649,540,427,310,189,64,65,198,335,476,621,770,923,1080,1241,1110,975,836,693,546,395,240,81,82,249,420,595,774,957,1144,1335,1530,1729,1564,1395,1222,1045,864,679,490,297,100

IO

Ви можете вибрати один із цих трьох методів введення / виводу (вам не потрібно буде обробляти недійсні введення):

  • З урахуванням цілого n виводу n- го елемента в цій послідовності (0- або 1-індексований на ваш вибір)
  • Дано ціле n виведення перших n елементів цієї послідовності
  • Роздрукуйте / поверніть послідовність нескінченно

Тестові шафи

Будь ласка, зверніться до перших 100 термінів вище, ось кілька великих прикладів (1-індексований):

101 -> 101
443 -> 1329
1000 -> 49000    
1984 -> 164672
2017 -> 34289
2018 -> 30270
3000 -> 153000

Відповіді:


3

Сніговик , 72 байти

((}1vn2nD#`nPnCdU!*2nM1`nR:#nSNaB#`nS2nMNdE;aM|#NdE2nP+#`nSNdE`|aA#nM*))

Це підпрограма, яка приймає 1-індексований вхід і повертає відповідний вихід через permavar +.

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

((        // begin subroutine
 }        // we'll only need 3 variables - b, e, g
 1vn2nD   // b = 0.5
 #`       // retrieve input and swap, now b = input and e = 0.5
 nP       // power, resulting in b=sqrt(input)
 nC       // ceiling - this gives the index i of the rhombus we want
 dU!*     // keep a copy of i in the permavar ! for later use
 2nM1`nR  // generate the range [1, 2i)
 :        // map the following block over the range...
  #nS     // subtract i, resulting in e.g. [-3 -2 -1 0 1 2 3] for i=4
  NaB     // absolute value - [3 2 1 0 1 2 3]
  #`nS    // subtract from i, giving [1 2 3 4 3 2 1]
  2nMNdE  // double and decrement, [1 3 5 7 5 3 1]
 ;aM      // map
 |        // shove the rhombus columns into g
 #NdE2nP  // b = (i-2)^2
 +#`      // move b into e and replace it with the original input
 nSNdE    // subtract the two and decrement, giving input-(i-2)^2-1
 `|aA     // this is the index into the rhombus columns that we want
 #nM*     // multiply by the original input and return
))

Для цього використовується в основному той же алгоритм, що і відповідь містера Xcoder. Єдина відмінність полягає в тому, що тут ми генеруємо лише потрібні нам стовпчики ромба, а саме це перегородка (sqrt (n)). Щоб проілюструвати, чому це працює, ось такі входи, які відповідають кожному ромбу:

rhombus #   inputs
1           1
2           2 3 4
3           5 6 7 8 9
4           10 11 12 13 14 15 16
...

Зауважте, що лівий стовпець відповідає точно стелі квадратного кореня кожного елемента правого стовпця. Щоб отримати звідси індекс на основі 1, ми просто віднімаємо квадрат індексу попереднього ромба.


2

Желе , 10 байт

Ḥ€€’ŒBFị@×

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

Повна програма / монадичне посилання, що повертає N- й термін (1-індексований).

Я помітив, що кожна сума - це індекс цього стовпця у загальному списку стовпців (сам вхід), помножений на індекс цього стовпця у відповідному Ромбі, тому не потрібно насправді генерувати рядки.

Як?

Ḥ €$ 'ŒBFị @ × ~ Повна програма. Я зателефоную на вхід N.

  € ~ Для кожного цілого числа X у діапазоні [1, N].
Ḥ € ~ Подвійне кожне ціле число в діапазоні [1, X].
   '~ Зменшення (віднімання 1).
    ŒB ~ Відскок (стильний). Паліндромізуйте кожного.
      F ~ Згладжувати.
       ị @ ~ Отримайте елемент у індексі N у нашому списку.
         × ~ Помножимо на N.


2

JavaScript (ES7), 42 41 байт

Збережено 1 байт завдяки @ovs

0-індексований. Вираз закритої форми, похідне від A004737 .

n=>((k=n**.5|0)-Math.abs(n+k*~k))*2*++n+n

Тестові справи


2

Befunge, 62 60 байт

&:1>:00p:*`|
00:-\*:g00:<>2-\-0v!`\g
*.@v+1<g00:<^*2g00_2*1+

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

Пояснення

Вихідний код із виділеними шляхами виконання

*Почнемо з читання єдиного елемента, n , з stdin, і збереження дубліката.
*Тоді ми визначаємо, у якому ромбі ми знаходимось, підраховуючи ціле число, r , до r*r >= n.
*Стовпчик зміщений з правого боку ромба, с , є r*r - n.
*Щоб відобразити це зміщення навколо центральної осі, ми перевіряємо, чи є c >= r.
*А якщо воно є, то відбивається c стає r*2 - 2 - c.
*Після того, як ми відобразили c , сума стовпця просто (c*2 + 1) * n.



1

Желе , 8 байт

_.ạ²€ṂḤ×

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

Як це працює

_.ạ²€ṂḤ×  Main link. Argument: n

_.        Subtract 0.5; yield (n - 0.5).
   ²€     Square each; yield [1², 2², ..., n²].
  ạ       Take the absolute differences of (n - 0.5) and each of the squares.
     Ṃ    Take the minimum.
      Ḥ   Unhalve; double the minimum.
       ×  Multiply the result by n.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.