Трикутник Кларка


10

Гаразд, я нещодавно був у трикутнику, тому ось ще один.

Трикутник Кларка - це трикутник, де найменший лівий запис кожного ряду дорівнює 1, а правий крайній склад складається з кратних 6, які збільшуються в міру збільшення числа рядків. Ось візуалізація

     1 6
    1 . 12
   1 . . 18
  1 . . . 24
 1 . . . . 30
1 . . . . . 36

Так само, як і Трикутник Паскаля, всі інші записи - це сума чисел у верхньому правому та верхньому лівому куті.

Ось перші кілька рядків, заповнені

          1   6
        1   7  12
      1   8  19  18
    1   9  27  37  24
  1  10  36  64  61  30
1  11  46  100 125 91  36

Завдання

З огляду на номер рядка (починаючи з верхнього) та номер стовпця (починаючи з першого ненульового елемента в цьому рядку) виводить значення для цієї конкретної комірки. Обидва входи можуть бути індексованими як 1, так і 0 (ви можете змішувати та поєднувати, якщо хочете). Поза межами трикутника не визначено, і ви можете робити все, що завгодно, запитуючи про ці значення.

Це , мета - мінімізувати кількість байтів у вашому рішенні.

OEIS A046902


1
Чи можемо ми побудувати рішення з нулем у першому ряду? як у послідовності OEIS
Йорг Гюльсерманн

1
@ JörgHülsermann Оскільки це є поза межами визначеного тут трикутника, ви можете робити все, що завгодно.
Ad Hoc Hunter Hunter

Відповіді:


7

MATL , 15 байт

[lBB]i:"TTY+]i)

Перший вхід - це рядок на основі 0; друга - 1-базова колонка.

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

Пояснення

[lBB]   % Push [1 6 6]
i       % Input: row number (0-based)
:"      % Repeat that many times
  TT    %   Push [1 1]
  Y+    %   Convolution, increasing size. This computes the sum of overlapping
        %   pairs, including the endpoints. So for example [1 6 6] becomes
        %   [1 7 12 6], which will later become [1 8 19 18 6], ...
]       % End
i       % Input: column number (1-based)
)       % Use as index. Implicit display


5

CJam , 22 18 байт

-4 байти завдяки Мартіну Ендеру

X6_]ri{0X$+.+}*ri=

Введення є (0-based row) (0-based column)

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

Пояснення

X6_]  e# Push the list [1 6 6]. This is the first row, but each row will have an extra 6 at
      e# the end, which is out of bounds.
ri    e# Push the first input as an integer.
{     e# The following block calculates the next row given a row on top of the stack:
 0X$+ e#  Copy the top list on the stack and prepend 0.
 .+   e#  Element-wise addition with the list before prepending 0. This adds each element of
      e#  with the one to its left, except the initial 1 gets added to 0 and the final number
      e#  gets added to the out-of-bounds 6. The out-of-bounds 6 is unchanged since one list
      e#  is longer.
}*    e# Run this block (row index) times.
ri=   e# Get the (column index)th item of the final list.

Інша методика отримання парних сум - це переміщення однієї копії вліво та використання .+. Як правило, проблема полягає в тому, що він зберігає останній елемент, не підсумовуючи його (що коштує для видалення байтів), але в цьому випадку він фактично економить байти, оскільки тоді вам не потрібно додавати 6кожну ітерацію. Ви можете зберегти ще більше байтів, оскільки переміщення ліворуч вільне, якщо ви додасте лише 0одну копію:X6_]ri{0X$+.+}*ri=
Martin Ender

_0\+замість 0X$+того самого байта, якщо ви хочете.
Мартін Ендер

@MartinEnder О, я бачу, ви отримуєте додаткові 6 в кінці кожного ряду, який знаходиться поза межами, так що це не має значення. Розумний, спасибі.
Ділова кішка



3

Python 3 , 64 60 52 байт

f=lambda r,c:c<2or c>r and r*6or f(r-1,c-1)+f(r-1,c)

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

Рекурсивне рішення з використанням 1-індексації. Виходить "Правда" замість 1 заради гри в гольф.


Завдяки:

  • @totallyhuman для економії 4 байтів!
  • @Rod для економії 8 байт!


2
52 байти замінюють if / else булевими операторами та більш гнучким висновком
Rod

@Rod, це геніальне рішення. Я все ще намагаюся обернути голову, чому це працює. Я все ще досить новий тут (це лише моя друга відповідь на сайті), тому я не впевнений у протоколі: чи варто включити вашу ревізію у свою відповідь, навіть якщо ви перейшли з Python 3 на 2?
Chase Vogeli

3
@icosahedron версія python у цьому випадку є невідповідною, тому вам не потрібно це заперечувати. як правило, перехід між версіями python для використання функцій вважається нормальним.
Уріель

@Uriel дякую за роз’яснення.
Chase Vogeli


1

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

b=Binomial;b[#,#2-1]6+b[#-1,#2]&

вхід

[рядок, стовпець]
[1-індексований, 0-індексований]


1

JavaScript (ES6), 38 байт

f=(r,c)=>c?r>c?f(--r,c)+f(r,--c):r*6:1

Збиває для негативних стовпців і повертає кратні шість для негативних рядків або стовпців із великим розміром.


1

C # (.NET Core) , 44 байти

f=(c,r)=>c<=1?1:c>r?6*r:f(c-1,r-1)+f(c,r-1);

Знімає стовпчик, а потім рядок, обидва з 1-індексом. Можна взяти рядок потім колонку шляхом заміни входів: (r,c). Повернеться row * 6за координатами поза межами праворуч (тобто column > row + 1), а 1для координат поза межами зліва (тобтоcolumn < 1 ).


1

PHP , 64 байти

рекурсивна функція

рядки 1-індексація стовпців 0-індексація

Вихід для рядка = 0 і стовпця = 0 дорівнює 0, як у послідовності OEIS

function f($r,$c){return$c-$r?$c?f($r-=1,$c-1)+f($r,$c):1:$r*6;}

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

PHP , 126 байт

рядки 1-індексація стовпців 0-індексація

Вихід для рядка = 0 і стовпця = 0 дорівнює 0, як у послідовності OEIS

for(;$r<=$argv[1];$r++)for($z++,$c=~0;++$c<$z;)$t[+$r][$c]=$c<$r?$c?$t[$r-1][$c-1]+$t[$r-1][$c]:1:$r*6;echo$t[$r-1][$argv[2]];

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


0

R , 77 байт

Reduce(function(x,y)zoo::rollsum(c(0,x,6),2),double(scan()-1),c(1,6))[scan()]

Потрібна zooбібліотека; читає з stdin (вхідні дані розділені двома новими рядками) і повертає значення, з NAвибором поза межами меж.

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


0

Желе , 13 байт

,"’U0¦c/x6,1S

Монадічне посилання, що містить список [row, entry](0-індексація записів, 1-індексація рядків), повертає значення.

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

Як?

,"’U0¦c/x6,1S - Link: list of numbers, [row, entry]
  ’           - decrement     -> [row-1, entry-1]
 "            - zip with:
,             -   pair        -> [[row, row-1], [entry, entry-1]]
     ¦        - sparse application of:
   U          -   upend
    0         - for indexes: 0 -> [[row, row-1], [entry-1, entry]]
       /      - reduce by:
      c       -   choose       -> [(row choose entry-1), (row-1 choose entry)]
         6,1  - 6 paired with 1 = [6,1]
        x     - times        i.e. [a, a, a, a, a, a, a, b]
            S - sum            -> 6*(row choose entry-1) + (row-1 choose entry)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.