Clark Üçgeni


10

Tamam, son zamanlarda biraz üçgen vuruşu yaptım, işte bir tane daha.

Clark Üçgeni, her bir satırın en soldaki girişinin 1 olduğu ve en sağdaki girişlerin, satır sayısı arttıkça artan 6'nın katlarından oluştuğu bir üçgendir. İşte bir görselleştirme

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

Pascal'ın Üçgeni gibi diğer tüm girdiler sağ üst ve sol üstteki sayıların toplamıdır.

İşte doldurulmuş ilk birkaç satır

          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

Görev

Bir satır numarası (üstten başlayarak) ve bir sütun numarası (o satırdaki sıfırdan farklı ilk öğeden başlayarak) belirli bir hücredeki değeri verir. Her iki giriş de 1 veya 0 dizinli olabilir (isterseniz karıştırıp eşleştirebilirsiniz). Üçgenin sınırları dışına tanımsızdır ve bu değerler için sorgulandığında istediğiniz her şeyi yapabilirsiniz.

Bu , amaç çözümünüzdeki bayt sayısını en aza indirmektir.

OEIS A046902


1
İlk sırada sıfır ile bir çözüm oluşturabilir miyiz?
OEIS

1
@ JörgHülsermann Burada tanımlanan üçgen için sınırların dışında olduğundan, istediğinizi yapabilirsiniz.
Ad Hoc Garf Hunter

Yanıtlar:


7

MATL , 15 bayt

[lBB]i:"TTY+]i)

İlk girdi 0 tabanlı satırdır; ikincisi 1 tabanlı sütundur.

Çevrimiçi deneyin!

açıklama

[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

6

Pascal , 132 bayt

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;

Çevrimiçi deneyin!

1 endeksli.


Pascal üçgeni!
Henry

5

CJam , 22 18 bayt

Martin Ender sayesinde -4 bayt

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

Girdi (0-based row) (0-based column)

Çevrimiçi deneyin!

açıklama

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.

Çift toplamları almak için farklı bir teknik, bir kopyayı sola kaydırıp kullanmaktır .+. Normalde bu, sondaki öğeyi toplamadan tutması sorunudur (kaldırılması gereken bayt maliyeti), ancak bu durumda aslında bayt tasarrufu sağlar, çünkü o zaman 6her yinelemeye bir eklemeniz gerekmez . Daha fazla bayt kaydedebilirsiniz, çünkü yalnızca 0bir kopyaya takarsanız sola kaydırma ücretsizdir :X6_]ri{0X$+.+}*ri=
Martin Ender

_0\+yerine 0X$+aynı bayt sayımıdır.
Martin Ender

@MartinEnder Oh, anlıyorum, sınırların dışında kalan her sıranın sonunda fazladan 6 elde edersiniz, bu yüzden önemli değil. Zekice, teşekkürler.
Business Cat

4

C #, 157 bayt

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];

Çevrimiçi deneyin


3

Python 2 , 67 bayt

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

Çevrimiçi deneyin!

Kaba kuvvet yaklaşımı, ath satırını hesaplayın ve sonra bth sayısını yazdırın , her iki giriş de 0 tabanlı


3

Python 3 , 64 60 52 bayt

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

Çevrimiçi deneyin!

1 indeksleme kullanarak özyinelemeli çözüm. Golf uğruna 1 yerine "Doğru" çıktılar.


Sayesinde:

  • 4 byte tasarruf için @totallyhuman!
  • @ 8 bayt kaydetmek için çubuk!


2
İf / else yerine boole operatörleri ve daha esnek bir çıktı ile 52 bayt
Rod

@ Çubuk, bu mükemmel bir çözüm. Hala neden işe yaradığına dair kafamı sarmaya çalışıyorum. Burada hala oldukça yeniyim (bu sadece sitedeki ikinci cevabım), bu yüzden protokolden emin değilim: Python 3'ten 2'ye geçiş yapmanıza rağmen cevabınıza revizyonunuzu dahil etmeli miyim?
Chase Vogeli

3
@icosahedron python sürümü bu durumda ilgisizdir, bu yüzden buna dikkat etmek zorunda değilsiniz. genellikle, özelliklerden yararlanmak için python sürümleri arasında geçiş yapılması OK olarak kabul edilir.
Uriel

@ Uriel açıklama için teşekkür ederim.
Chase Vogeli


1

Mathematica, 32 bayt

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

giriş

[satır, sütun]
[1 dizinli, 0 dizinli]


1

JavaScript (ES6), 38 bayt

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

Negatif sütunlar için kilitlenir ve negatif satırlar veya büyük sütunlar için altı katları döndürür.


1

C # (.NET Core) , 44 bayt

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

Her ikisi de 1 dizinli sütun, ardından satır alır. Girişlerini değiştirerek sütuna ardından satırı alabilir: (r,c). row * 6Sağdaki sınırların dışındaki koordinatlar (yani column > row + 1) ve 1soldaki sınırların dışındaki koordinatlar (yani ) için geri döner column < 1.


1

PHP , 64 bayt

özyinelemeli işlev

satırlar 1 dizinleme sütunları 0 dizinleme

Satır = 0 ve sütun = 0 için çıktı OEIS dizisindeki gibi 0

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

Çevrimiçi deneyin!

PHP , 126 bayt

satırlar 1 dizinleme sütunları 0 dizinleme

Satır = 0 ve sütun = 0 için çıktı OEIS dizisindeki gibi 0

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]];

Çevrimiçi deneyin!


0

R , 77 bayt

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

zooKütüphaneyi gerektirir ; stdin'den (girişler iki yeni satırla ayrılır) okur ve NAsınırların dışındaki seçimler için değeri döndürür .

Çevrimiçi deneyin!


0

Jöle , 13 bayt

,"’U0¦c/x6,1S

Bir liste [row, entry](girişler için 0-indeksleme, satırlar için 1-indeksleme) ve değeri döndüren monadik bir bağlantı .

Çevrimiçi deneyin!

Nasıl?

,"’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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.