Trójkąt Clarka

10

Ok, ostatnio miałem trochę kopnięcia w trójkąt, więc oto kolejny.

Trójkąt Clarka to trójkąt, w którym skrajnie lewy wpis każdego rzędu wynosi 1, a skrajne prawe wpisy składają się z wielokrotności 6, które rosną wraz ze wzrostem liczby wierszy. Oto wizualizacja

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

Podobnie jak Trójkąt Pascala, wszystkie inne wpisy są sumą liczb w ich prawym górnym i lewym górnym rogu.

Oto kilka pierwszych wypełnionych wierszy

          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

Zadanie

Podany numer wiersza (zaczynając od góry) i numer kolumny (zaczynając od pierwszego niezerowego elementu w tym wierszu) wyprowadza wartość w tej konkretnej komórce. Oba wejścia mogą być indeksowane 1 lub 0 (możesz miksować i dopasowywać, jeśli chcesz). Poza granicami trójkąta jest niezdefiniowana i możesz zrobić, co chcesz, gdy będziesz pytany o te wartości.

To jest , celem jest zminimalizowanie liczby bajtów w twoim rozwiązaniu.

OEIS A046902

Ad Hoc Garf Hunter
źródło
1
Czy w pierwszym rzędzie możemy zbudować rozwiązanie zerowe? jak w sekwencji OEIS
Jörg Hülsermann
1
@ JörgHülsermann Ponieważ jest to poza zakresem zdefiniowanego tutaj trójkąta, możesz zrobić, co chcesz.
Ad Hoc Garf Hunter

Odpowiedzi:

7

MATL , 15 bajtów

[lBB]i:"TTY+]i)

Pierwsze wejście to wiersz oparty na 0; druga to kolumna oparta na 1.

Wypróbuj online!

Wyjaśnienie

[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
Luis Mendo
źródło
6

Pascal , 132 bajty

function f(n,k:integer):integer;begin if k=1 then f:=1 else if k>n then f:=6*n else if k<0 then f:=0 else f:=f(n-1,k-1)+f(n-1,k)end;

Wypróbuj online!

1-indeksowany.

Uriel
źródło
Trójkąt Pascala!
Henry
5

CJam , 22 18 bajtów

-4 bajty dzięki Martinowi Enderowi

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

Dane wejściowe to (0-based row) (0-based column)

Wypróbuj online!

Wyjaśnienie

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.
Business Cat
źródło
Inną techniką uzyskiwania sum par jest przesunięcie jednej kopii w lewo i użycie .+. Zwykle ma to problem polegający na tym, że zachowuje element końcowy bez sumowania (co kosztuje usunięcie bajtów), ale w tym przypadku faktycznie oszczędza bajty, ponieważ wtedy nie trzeba dodawać 6znaku przy każdej iteracji. Możesz zaoszczędzić jeszcze więcej bajtów, ponieważ przesunięcie w lewo jest bezpłatne, jeśli wstawisz tylko 0jedną kopię:X6_]ri{0X$+.+}*ri=
Martin Ender
_0\+zamiast tego 0X$+jest taka sama liczba bajtów, jeśli wolisz.
Martin Ender,
@MartinEnder Och, widzę, dostajesz dodatkowe 6 na końcu każdego wiersza, który jest poza zakresem, więc to nie ma znaczenia. Sprytne, dzięki.
Business Cat,
4

C #, 157 bajtów

using System.Linq;(b,c)=>{var f=new[]{1,6};for(;c>0;c--){int s=f.Length;f=new int[s+1].Select((e,i)=>i<1?1:i==s?f[s-1]+6:f[i-1]+f[i]).ToArray();}return f[b];

Wypróbuj online

LiefdeWen
źródło
3

Python 2 , 67 bajtów

a,b=input()
x=[1,6]
exec"x=map(sum,zip([0]+x,x+[6]));"*a
print x[b]

Wypróbuj online!

Podejście brutalnej siły, obliczyć ath rząd, a następnie wydrukować bliczbę th, oba wejścia są oparte na 0

Pręt
źródło
3

Python 3 , 64 60 52 bajtów

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

Wypróbuj online!

Rozwiązanie rekurencyjne z wykorzystaniem 1-indeksowania. Zwraca „True” zamiast 1 ze względu na grę w golfa.


Dzięki:

  • @ totalniehuman dla oszczędności 4 bajtów!
  • @Rod za zapisanie 8 bajtów!
Chase Vogeli
źródło
2
60 bajtów
całkowicie ludzki,
2
52 bajty zastępując if / else operatorami logicznymi i bardziej elastycznymi wyjściem
Rod
@Rod, jest to genialne rozwiązanie. Wciąż próbuję owinąć głowę, dlaczego to działa. Nadal jestem tutaj dość nowy (to tylko moja druga odpowiedź na stronie), więc nie jestem pewien co do protokołu: czy powinienem dołączyć do twojej wersji, nawet jeśli przeszedłeś z Pythona 3 na 2?
Chase Vogeli
3
@icosahedron wersja python jest w tym przypadku nieistotna, więc nie musisz się tym przejmować. Ogólnie rzecz biorąc, przełączanie między wersjami Pythona w celu wykorzystania funkcji jest uważane za prawidłowe.
Uriel
@Uriel dziękuję za wyjaśnienie.
Chase Vogeli
2

Haskell , 41 bajtów

n#1=1
n#m|m>n=6*n
n#m=(n-1)#(m-1)+(n-1)#m

Wypróbuj online!

Zadzwoń, używając n # mgdzie njest numerem wiersza i mnumerem kolumny, oba indeksowane 1.

Julian Wolf
źródło
1

Mathematica, 32 bajty

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

Wejście

[wiersz, kolumna]
[1-indeksowany, 0-indeksowany]

J42161217
źródło
1

JavaScript (ES6), 38 bajtów

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

Zawiesza się w przypadku ujemnych kolumn i zwraca wielokrotności sześciu w przypadku ujemnych wierszy lub nadmiernych kolumn.

Neil
źródło
1

C # (.NET Core) , 44 bajty

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

Pobiera kolumnę, a następnie wiersz, oba indeksowane 1. Może podjąć rząd następnie kolumny poprzez zamianę wejść: (r,c). Powróci row * 6dla współrzędnych poza granicami po prawej (tj. column > row + 1) I 1dla współrzędnych poza granicami po lewej (tj column < 1.).

Kamil Drakari
źródło
1

PHP , 64 bajty

funkcja rekurencyjna

wiersze 1-indeksowanie kolumny 0-indeksowanie

Dane wyjściowe dla wiersza = 0 i kolumny = 0 wynoszą 0, podobnie jak w sekwencji OEIS

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

Wypróbuj online!

PHP , 126 bajtów

wiersze 1-indeksowanie kolumny 0-indeksowanie

Dane wyjściowe dla wiersza = 0 i kolumny = 0 wynoszą 0, podobnie jak w sekwencji 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]];

Wypróbuj online!

Jörg Hülsermann
źródło
0

R , 77 bajtów

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

Wymaga zoobiblioteki; odczytuje ze standardowego wejścia (wejścia oddzielone dwoma znakami nowej linii) i zwraca wartość, z NAopcjami wyboru poza zakresem.

Wypróbuj online!

Giuseppe
źródło
0

Galaretka , 13 bajtów

,"’U0¦c/x6,1S

Monadyczny link pobierający listę [row, entry](indeksowanie 0 dla wpisów, indeksowanie 1 dla wierszy), zwracający wartość.

Wypróbuj online!

W jaki sposób?

,"’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)
Jonathan Allan
źródło