Pascal'ın Rhombus'u


20

Pascal'ın Rhombus'u (aslında bir üçgen), desende eklenerek elde edilir:

  *
 ***
  x

onun yerine

* *
 x

Bu, her hücrenin doğrudan üstündeki satırdaki üç hücrenin ve üstündeki 2 satırındaki bir hücrenin toplamı olduğu anlamına gelir. Pascal'ın üçgeni gibi, sıfırıncı satırda 1da üçgeni oluşturan bir tane var.

İşte Pascal Rhombus'un ilk sıraları

      1
    1 1 1
  1 2 4 2 1
1 3 8 9 8 3 1

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).

Bu bu nedenle kaynak kodunuzun dosya boyutunu olabildiğince küçük yapmayı hedeflemelisiniz.

OEIS A059317



kodumu komut satırı argümanı olarak koyarsam , kaynak kodunuzun dosya boyutunu mümkün olduğunca küçük yapmayı hedeflemelisiniz ? : P
outgolfer erik

Kısayollar için googling'e gitti ve görünüşe göre arxiv.org/abs/1504.04404 , sonucun doğrudan hesaplanmasının kod golfu için kullanılamadığını söylüyor.
JollyJoker

Yanıtlar:


12

Haskell , 59 55 bayt

Pascal'ın Rhombus'u mu? Haskell's Rhombus gibi! amiright?

Ørjan Johansen sayesinde 4 bayt tasarruf edildi

Kendi sorunuma bir göz atacağım ve Haskell'imi uygulayacağımı düşündüm. Umarım bu daha fazla insana bunu cevaplaması için ilham verir.

1!1=1
n!k=sum[(n-2)!(k-2)+sum(map((n-1)!)[k-2..k])|n>1]

Çevrimiçi deneyin!

açıklama

Bu son golf ile biraz güncel değil

Hesaplamak yerine

  *
 ***
  x

Hesaplıyoruz

*
***
  x

Bu tüm üçgenin eğimli olmasını sağlıyor

1
1 1 1
1 2 4 2 1
1 3 8 9 8 3 1

Bu, tüm satırlarımızı sıralar ve herhangi bir sütunun n. Öğesini dizine eklemeyi kolaylaştırır. Daha sonra temel vakalarımızı tanımlarız.

Sıfırıncı satırın tümü sıfır

0!_=0

Tek yoktur 1pozisyonda 1,1biz tanımlamak böylece

1!1=1

İlk satırın geri kalanını da sıfır olarak tanımlıyoruz

1!_=0

Ardından, genel durumu, yukarıda açıklanan deseni kullanarak özyineli olarak tanımlarız:

n!k=(n-2)!(k-2)+(sum$map((n-1)!)[k-2..k])

Beni döv! Bu da benimkinden çok daha temiz.
Julian Wolf

@JulianWolf Bunun için üzgünüm, bunu gönderdiğimde Jorg'den başka kimsenin problemi gerçekleştirmediğine benziyordu. Hala çözümünüzü görmek istiyorum.
Buğday Büyücüsü

1
İle dört bayt kaydedebilirsiniz n!k=sum[(n-2)!(k-2)+sum(map((n-1)!)[k-2..k])|n>1].
Ørjan Johansen

10

Pascal , 122 bayt

Eh, bu kadar Pascal eşkenar dörtgen.

@Manatwork sayesinde 37 bayt kaydedildi

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

Çevrimiçi deneyin!


Tüm ifdurum etrafında parantez anlamsızdır. ( ifBirincisinde 2 karakter, 2. if1 karakterine thenanahtar kelime ile önceki basamak arasında boşluk bırakarak kaydedersiniz.) Oh ve r değişkeni tamamen gereksizdir.
manatwork

Pascal Ideone üzerinde tuhaf bir hayvan. Daha önce herhangi bir Pascal varyantında çift tırnaklarla ayrılmış çift tırnaklar görmedim. Kaldırabileceğiniz Bir şey daha: ;önce function's end.
manatwork

@manatwork evet, şimdi bahsettiğinizde, diğer tüm çevrimiçi editörler şikayet etti
Uriel

@manatwork Anladığımdan emin değilim. sadece kodu ile uzatmak olmaz mıydı >= <=? Hala if n=0
korumam

Üzgünüm @Uriel, artık bu sürüme sahip değilim. Şu anda benfunction f(n,k:integer):integer;begin f:=1-Ord((k<0)or(k>n*2));if n>0then f:=f(n-1,k-2)+f(n-1,k-1)+f(n-1,k)+f(n-2,k-2)end;
manatwork 06

7

PHP , 86 bayt

yalnızca işlev satırı ve 0-Dizinli sütun özyinelemeli

function f($r,$c){return$r|$c?$r<0?0:f($r-=1,$c)+f($r,$c-1)+f($r,$c-=2)+f($r-1,$c):1;}

Çevrimiçi deneyin!

PHP , 114 bayt

özyinelemeli tam program satırı ve sütun 0-Endeksli

<?=f(...$_GET);function f($r,$c){return$r|$c?$r<0|$c<0|$c>2*$r?0:f($r-=1,$c)+f($r,$c-1)+f($r,$c-=2)+f($r-1,$c):1;}

Çevrimiçi deneyin!

PHP , 129 bayt

satır ve sütun 0-Endeksli

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

Çevrimiçi deneyin!


ve +1 aslında geliştirmek için :)
Uriel


3

MATL , 22 20 19 bayt

Ti:"2Y6Y+FT_Y)]!i_)

Her iki giriş de 0 tabanlıdır.

Çevrimiçi deneyin!

açıklama

Izin vermek rve csırayla 0 tabanlı satır ve sütun belirterek, iki giriş belirtiniz.

Pascal'ın eşkenar dörtgenindeki her yeni satır , çekirdekle birlikte dönerek[1 1 1; 0 1 0] ve sonucun son iki sırasını değiştirerek önceki iki satırı içeren matristen oluşturulabilir . Bu, rmatristen başlayarak yapılır 1.

[0 1 0; 1 1 1; 0 1 0]Önceden tanımlanmış bir hazır bilgi olan çekirdeği kullanmak daha kısa çıkıyor . Bu, atılacak ekstra bir satır oluşturur.

Örneğin düşünün r = 3, bu yüzden 3tekrarlar var.

  1. Den başlayarak

    1
    

    evrişim [0 1 0; 1 1 1; 0 1 0]verir

    0 1 0
    1 1 1
    0 1 0
    

    Son iki satırı tutmak (bu durumda tüm matris) ve bunları değiştirmek

    0 1 0
    1 1 1
    
  2. Yukarıdakilerin [0 1 0; 1 1 1; 0 1 0]verir ile konvolüsyonu

    0 0 1 0 0
    0 1 1 1 0
    1 2 4 2 1
    0 1 1 1 0
    

    Değiştirilen son iki satırdan oluşan matris

    0 1 1 1 0
    1 2 4 2 1
    

    Bu, alttaki yeni satırı ve birincisi sıfırlarla genişletilmiş içerir.

  3. Tekrar kıvrım kazandırır

    0 0 1 1 1 0 0
    0 1 2 3 2 1 0
    1 3 8 9 8 3 1
    0 1 2 4 2 1 0
    

    Değiştirilen son iki satırı almak

    0 1 2 4 2 1 0
    1 3 8 9 8 3 1
    

rYinelemeler yapıldıktan sonra, çıktı son matrisin son satırında bulunur. Örneğin, c = 2(0 tabanlı) için sonuç olur 8. Son sırayı ve istenen sütunu indekslemek yerine, her sıranın simetrisinden yararlanan bir hile kullanılabilir : son matris transpoze edilir

0 1
1 3
2 8
4 9
2 8
1 3
0 1

ve onun -celementi alınır. Olan bu kullanımlar doğrusal indeksleme, matris tarafından dizine tek bir indeks olarak sütun büyük için. İndeksleme modüler olduğundan, 0-giriş sağ alt köşedir (değer 1) ve- -2giriş iki adımdan (değer 8) yüksektir .

T       % Push true
i       % Input row number
:"      % Do the following that many times
  2Y6   %   Push predefined literal [0 1 0; 1 1 1; 0 1 0]
  Y+    %   2D convolution, increasing size
  FT_   %   Push [0 -1]
  Y)    %   Matrix with rows 0 (last) and -1 (second-last), in that order
]       % End
!       % Transpose
i       % Input: colun number
_       % Negate
)       % Entry with that index. Implicitly display



2

Mathematica, 56 bayt

If[#<1,Boole[##==0],Sum[#0[#-i,#2-j],{i,2},{j,2i-2,2}]]&

İki tamsayı bağımsız değişkeni (ilk satır, ikinci sütun) alıp bir tamsayı döndüren saf işlev. Geri dönen negatif tamsayı argümanları için de çalışır 0. Oldukça basit bir özyinelemeli yapı: If[#<1,Boole[##==0],...]0'ıncı satır (ve üstü) için temel durum davranışını Sum[#0[#-i,#2-j],{i,2},{j,2i-2,2}]tanımlar, özyinelemeli tanımı uygular.



1

JavaScript (ES6), 68 bayt

f=(y,x)=>x<0|x>y+y?0:x>0&x<y+y?f(--y,x)+f(y,--x)+f(y,--x)+f(--y,x):1

1

Mathematica, 53 bayt

D[1/(1-x(1+y+y^2(1+x))),{x,#},{y,#2}]/#!/#2!/.x|y->0&

Üretme fonksiyonunu kullanma.


0

Python 3 , 82 84 bayt

Bu, 1 dizinli satır ve sütun içeren özyinelemeli bir uygulamadır. (Teknik olarak birf= ön tarafa , birisi bana 84 bayta değiştirmem gerekip gerekmediğini bana bildirir. Hala yeni ve kurallardan% 100 emin değilim.)

Bu, OEIS sayfasında bulunan özyinelemeli formülü kullanır , ancak kdüzgün bir şekilde hizalamak için 'sola kaydırılır. Tesadüfen, sum(f(n-1,k-i)for i in(0,1,2))ile aynı boyuttadır f(n-1,k)+f(n-1,k-1)+f(n-1,k-2). Bütün fonksiyon Python and ork üçgenin içinde olup olmadığını ilk şart denetler hüner, ve değil sınırda, bu durumda özyinelemeli formülü kullanılır. Değil ise, sonraki kısım orise, hangi kontroller döndürülür kolduğunu (1, 2*n-1)dönen, sınırda yani Trueve False. k+1in(2,2*n)bir bayt daha kısadır k in(1,2*n-1). Bunu parantez içinde sarmak ve +önüne koymak tam sayıya dönüşüyor.

f=lambda n,k:2*n-1>k>1and sum(f(n-1,k-i)for i in(0,1,2))+f(n-2,k-2)or+(k+1in(2,2*n))

Çevrimiçi deneyin!


Yinelemeli işlevler f=.
Buğday Sihirbazı

Ben bu biraz gömülü meta konsensüs göre kişisel olarak katılmıyorum olsa da , Trueyerine python 1gibi davranıyor çünkü çıktı olabilir 1. Bu +(...), sonunda kaldırmak için izin verir . Bunu yapmak istemiyorsanız anlıyorum, çünkü çıktı biraz garip görünecek, bu bir seçenek.
Buğday Sihirbazı

@WheatWizard Vay canına, bu çok ilginç. Bahşiş için teşekkürler.
C McAvoy


0

Python 3 , 75 Bayt

Bu, sütunu ve satırı 0 dizinli tamsayılar olarak alan özyinelemeli bir lambdadır.

p=lambda r,c:(r<0 or((c==0)|p(r-1,c-2)+p(r-1,c)+p(r-1,c-1)+p(r-2,c-2))+1)-1

Yazdırma işlevine sahip (biraz daha okunabilir bir sürüm):

p = lambda r,c:(r<0 or ((c==0) | p(r-1,c-2)+p(r-1,c)+p(r-1,c-1)+p(r-2,c-2))+1)-1

def pp(r):
    ml = len(str(p(r,r)))+1
    for i in range(0, r):
            a=" "*ml*(r-i)
            for j in range(0,i*2 + 1):
                    a+=str(p(i,j))+(" "*(ml-len(str(p(i,j)))))
            print(a)
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.