Seidel Üçgeni


14

Seidel Üçgeni, Pascal Üçgeni'ne benzer bir matematik yapısıdır ve Bernoulli sayılarıyla bağlantısıyla bilinir.

İlk birkaç satır:

      1
      1  1
   2  2  1
   2  4  5  5
16 16 14 10 5
16 32 46 56 61 61

Her satır aşağıdaki gibi oluşturulur:

Satır numarası çift ise (1 dizinli):

  • Önceki satırın ilk öğesini aşağı indir

  • Sonraki her öğe önceki öğenin ve üzerindeki öğenin toplamıdır

  • Son öğeyi çoğalt

Satır numarası tek ise:

  • Önceki satırın son öğesini aşağı indir

  • Devam ters takmış , her öğe, önceki öğenin toplamı ve üstünde öğedir

  • Şimdi ilk öğe olanı çoğaltın.

Temel olarak, üçgeni zig-zag deseninde inşa ediyoruz:

    1
    v
    1 > 1
        v
2 < 2 < 1
v
2 > 4 > 5 > 5

Daha fazla bilgi için Bernoulli numaraları hakkındaki Wikipedia sayfasına bakın .

Meydan okuma:

Verilen n, ya bir fonksiyon argüman olarak veya STDIN, baskı ya da iade birinden nSeidel üçgenin veya birinci inci sıranın nsıraları. 0 veya 1 indeksleme kullanabilirsiniz.

Negatif veya tamsayı olmayan girdiyi işlemenize gerek yoktur (ne de 1 dizinli ise 0). Daha büyük çıkışları işlemeniz gerekmez2147483647 = 2^31 - 1

Bu kod golf olduğundan, bunu mümkün olduğunca az bayt ile yapın.

Örnekler:

Bu örneklerde, dönüş değeri n0 dizinli th satırıdır.

Input   ->  Output

0           1
1           1 1
2           2 2 1
6           272 272 256 224 178 122 61
13          22368256 44736512 66750976 88057856 108311296 127181312 144361456 159575936 172585936 183194912 191252686 196658216 199360981 199360981

"Dilinizin varsayılan int türünden daha büyük çıktıları işlemek zorunda değilsiniz" bunu sadece 1 bitlik girişler olan diller için önemsiz kılar
sadece ASCII-sadece

Çıktılar her zaman küçükten büyüğe sıralanabilir mi?
Angs

@ ASCII-only C ++ 'in maksimum int
Bolce Bussiere

@Hayırlar Hayır, satırlar gösterildiği gibi sipariş edilmelidir
Bolce Bussiere

@ Yalnızca ASCII-Bu varsayılan bir boşluk (IMO, insanların "makul" olarak neleri dikkate alacağına bağlı olarak biraz zayıf yazılmış olsa da)
user202729 17:18

Yanıtlar:


7

Brain-Flak , 66 bayt

<>(())<>{({}[()]<(()[{}]<<>{(({}<>{}))<>}>)>)}{}{{}<>{({}<>)<>}}<>

Çevrimiçi deneyin!

Satır 0 dizinlidir.

# Push 1 (the contents of row 0) on other stack; use implicit zero as parity of current row
<>(())<>

# Do a number of times equal to input:
{({}[()]<

  # Subtract the row parity from 1
  (()[{}]<

    # For each entry in old row:
    <>{

      # Add to previous entry in new row and push twice
      (({}<>{}))<>

    }

  >)

>)}{}

# If row parity is odd:
{{}

  # Reverse stack for output
  <>{({}<>)<>}

# Switch stacks for output
}<>

4

JavaScript (SpiderMonkey) , 67 bayt

Bu kod sort()yöntemi kötüye kullanır ve tüm motorlarda çalışmaz.

Satırlar 0 dizinlidir.

f=(n,a=[1],r)=>n--?f(n,[...a.map(n=>k+=n,k=0),k].sort(_=>n|r),!r):a

Çevrimiçi deneyin!

Nasıl?

sort()Parametreleri yok sayan ve 0 veya pozitif bir tamsayı döndüren bir geri çağırma işlevine sahip yöntemi kullanarak bir diziyi koşullu olarak tersine çeviririz. Bunu evde denemeyin! Bu yalnızca SpiderMonkey'de güvenilir bir şekilde çalışır.

let A = [1,2,3,4,5] and B = [1,2,3,4,5,6,7,8,9,10,11]

             | SpiderMonkey (Firefox)  | V8 (Chrome)             | Chakra (Edge)
-------------+-------------------------+-------------------------+------------------------
A.sort(_=>0) | 1,2,3,4,5               | 1,2,3,4,5               | 1,2,3,4,5
A.sort(_=>1) | 5,4,3,2,1               | 5,4,3,2,1               | 1,2,3,4,5
B.sort(_=>0) | 1,2,3,4,5,6,7,8,9,10,11 | 6,1,3,4,5,2,7,8,9,10,11 | 1,2,3,4,5,6,7,8,9,10,11
B.sort(_=>1) | 11,10,9,8,7,6,5,4,3,2,1 | 6,11,1,10,9,8,7,2,5,4,3 | 1,2,3,4,5,6,7,8,9,10,11

V8'in dizinin uzunluğuna bağlı olarak muhtemelen farklı sıralama algoritmaları kullandığını unutmayın (10 öğeden az veya daha fazla).

Yorumlananlar

f = (                     // f = recursive function taking:
  n,                      //   n   = row counter
  a = [1],                //   a[] = current row, initialized to [1]
  r                       //   r   = 'reverse' flag, initially undefined
) =>                      //
  n-- ?                   // decrement n; if it was not equal to zero:
    f(                    //   do a recursive call with:
      n,                  //     - the updated value of n
      [ ...a.map(n =>     //     - a new array:
          k += n, k = 0   //       - made of the cumulative sum of a[]
        ), k              //         with the last value appended twice
      ].sort(_ => n | r), //       - reversed if n is not equal to 0 or r is set
      !r                  //     - the updated flag r
    )                     //   end of recursive call
  :                       // else:
    a                     //   stop recursion and return a[]

Bu hangi örümcek-maymuna özgü özellik kullanıyor?
Dowgoat

@Downgoat sort()Bu motorun özel uygulamasından faydalanıyor . Bir açıklama ekledim.
Arnauld


3

Haskell , 89 87 82 bayt

(cycle[r,id]!!)<*>s
r=reverse
s 0=[1]
s n=let a=zipWith(+)(0:a)$(r.s$n-1)++[0]in a

Sadece szig-zag amacıyla hatları, satırlar ilk satırı arka yüzleri yarısına anonim işlev basar.

@Nimi'ye 5 bayt kaydettiği için teşekkürler!

Çevrimiçi deneyin!



2

Python 3 , 98 91 bayt

from itertools import*
f=lambda n:n and[*accumulate(f(n-1)[::n&1or-1]+[0])][::n&1or-1]or[1]

Çevrimiçi deneyin!

0 tabanlı satır numaralandırmaya geçiş 7 bayt kaydedildi.


2

Julia 0.6 , 85 bayt

r(l,n=cumsum(l))=[n...,n[end]]
w=reverse
f(n)=n<2?[1]:n%2<1?r(f(n-1)):w(r(w(f(n-1))))

Çevrimiçi deneyin!

Bu Julia'da özyinelemeli bir çözümdür. 1 tabanlı dizine sahip olduğunu unutmayın. Dolayısıyla testler.

Mantıksız versiyon, mantığı anlamak için:

function new_row(last_row)
    new_row = cumsum(last_row)
    push!(new_row, new_row[end])
    return new_row
end


function triangle(n)
    if n == 1
        return [1]
    elseif mod(n,2) == 0
        return new_row(triangle(n-1))
    else
        return reverse(new_row(reverse(triangle(n-1))))
    end
end

Bonus olarak, özyinelemesiz bir sürüm, ancak bu daha uzun:

w=reverse;c=cumsum
r(l,i)=i%2<1?c([l...,0]):w(c(w([0,l...])))
f(n,l=[1])=(for i=2:n l=r(l,i)end;l)

1

Python 2 , 103 97 bayt

f=lambda n,r=[1],k=2:n and f(n-1,[sum(r[-2::-1][:i],r[-1])for i in range(k)],k+1)or r[::-(-1)**k]

Çevrimiçi deneyin!

Özyinelemesiz sürüm (okunması daha kolay):

Python 2 , 106 bayt

def f(n,r=[1],j=1):
 while n:
	a=r[-2::-1];r=r[-1:];n-=1;j=-j
	for x in a+[0]:r+=[r[-1]+x]
 return r[::-j]

Çevrimiçi deneyin!

Elbette, daha iyi mümkündür!


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.