Pascal'ın Alternatif Üçgeni


21

Pascal üçgeni , 1her bir sıranın art arda gelen eklemelerden oluşması ile başlayarak ve elde edilerek oluşturulur. Burada, bunun yerine, çarpma ve toplama işlemlerini değiştirerek bir üçgen oluşturacağız.

1Sadece bir soliter ile kürek çekiyoruz 1. Daha sonra, tek sıralara ekleme yapılır ve çift sıralara (1 indeksli) çarpma yapılır. Ekleme adımını gerçekleştirirken, üçgenin dışındaki boşlukların 0s ile doldurulduğunu varsayalım . Çarpma adımını gerçekleştirirken, dışın 1s ile doldurulduğunu varsayalım .

İşte 7 satıra kadar tam üçgen. Soldaki *veya +o satırı oluşturmak için hangi adımın gerçekleştirildiği gösterilir.

1                1
2 *            1   1
3 +          1   2   1
4 *        1   2   2   1
5 +      1   3   4   3   1
6 *    1   3  12  12   3   1
7 +  1   4  15  24  15   4   1

Meydan okuma

Verilen giriş n, nbu üçgenin inci satırını gösterir.

kurallar

  • Bunun yerine 0 dizini seçebilirsiniz, ancak daha sonra toplama ve çarpma satırlarının flip-flop olması gerektiğini, böylece tam olarak aynı üçgenin yukarıdaki gibi üretildiğini fark edin. Lütfen bunu yapmayı seçerseniz gönderiminizde belirtiniz.
  • Giriş ve çıktının, dilinizin yerel tamsayı tipine uyacağı varsayılabilir.
  • Giriş ve çıkış herhangi bir uygun formatta verilebilir .
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlevse, çıktıyı yazdırmak yerine geri gönderebilirsiniz.
  • Mümkünse, lütfen başkalarının kodunuzu deneyebilmesi için çevrimiçi bir test ortamına bir bağlantı ekleyin!
  • Standart boşluklar yasaktır.
  • Bu bu nedenle normal golf kurallarının tümü geçerli olur ve en kısa kod (bayt cinsinden) kazanır.

Örnekler

Çok sayıda çıktının iki olası örneği gösteriliyor: bir liste veya boşlukla ayrılmış bir dize.

4
[1, 2, 2, 1]

8
"1 4 60 360 360 60 4 1"

2
@totallyhuman Hayır, saklanacak tek şey nth satırı olmalı .
AdmBorkBork

Yanıtlar:


16

Pascal , 249 247 233 bayt

Bu Pascal'ın alternatif üçgeni.

@ Mr.Xcoder sayesinde 1 bayt kurtarıldı

function f(n,k:integer):integer;begin if((k<1)or(k>n)or(n=1))then f:=n mod 2 else if n mod 2=0then f:=f(n-1,k-1)*f(n-1,k)else f:=f(n-1,k-1)+f(n-1,k)end;
procedure g(n:integer);var k:integer;begin for k:=1to n do write(f(n,k),' ')end;

Çevrimiçi deneyin!



7

Python 2 , 97 93 86 81 78 bayt

Rod sayesinde -4 byte. Halvard Hummel sayesinde -10 bayt.

f=lambda n:n and[[i+j,i*j][n%2]for i,j in zip([n%2]+f(n-1),f(n-1)+[n%2])]or[1]

0 endeksli.

Çevrimiçi deneyin!


1
İyi iş, daha uzun bir yaklaşımım vardı . Yine de golf oynamak için zamanım olmadı.
Bay Xcoder

1
Bunun map([int.__add__ ,int.__mul__][i%2],[i%2]+a,a+[i%2])çalışması gerektiğini düşünüyorum (test edilmedi)
Rod


1
Hayır, bu özyinelemeli. Adı eklemelisiniz.
Bay Xcoder,


5

Jöle , 17 12 bayt

µ×+LḂ$?Ḋ1;µ¡

Bu, STDIN'den girdi alan tam bir programdır (ya da niladik bağlantı).

Çevrimiçi deneyin!

Nasıl çalışır

µ×+LḂ$?Ḋ1;µ¡  Main link. No arguments. Implicit argument: 0

          µ¡  Start a monadic chain and apply the ntimes quick to the previous one.
              This reads an integer n from STDIN and executes the previous chain n
              times, with initial argument 0, returning the last result.
µ             Start a monadic chain. Argument: A (array or 0)
       Ḋ          Dequeue; yield A without its first element.
   LḂ$?           If the length of A is odd:
 ×                    Multiply A and dequeued A.
                  Else:
  +                   Add A and dequeued A.
        1;        Prepend a 1 to the result.


3

CJam , 25 bayt

{1a\{2%!_2$+\{.*}{.+}?}/}

0 endeksli.

Çevrimiçi deneyin!

açıklama

Bu, sayıyı yığından alan ve sonucu yığında bırakan adsız bir bloktur.

1a                        Push [1].
  \                       Bring the number to the top.
   {                 }/   For reach number 0 .. arg-1, do:
    2%!                    Push 0 if even, 1 if odd.
       _                   Copy that.
        2$+                Copy the list so far and prepend the 0 or 1 to it.
           \               Bring the 0 or 1 back to the top.
            {.*}{.+}?      If 1, element-wise multiplication. If 0, element-wise addition.

Bekle 2%!, eğer eşitse 1, eğer tek ise 0 olmalı, hayır mı?
Esolanging Fruit

3

Mathematica, 92 bayt

(s={i=1};While[i<#,s=Flatten@{1,{Tr/@#,Times@@@#}[[i~Mod~2+1]]&@Partition[s,2,1],1};i++];s)&

Çevrimiçi deneyin! ("Tr" matematiği üzerinde çalışmak için "Toplam" ile değiştirilir)


3

Haskell , 76 72 bayt

0 indeksli çözüm:

(p!!)
p=[1]:[zipWith o(e:l)l++[1]|(l,(o,e))<-zip p$cycle[((*),1),((+),0)]]

Çevrimiçi deneyin!

açıklama

p Alternatif üçgeni yinelemeli olarak tanımlar, temel durum / bunun ilk elemanı [1]

p=[1]:[                                                            ]

Daha sonra önceki satırı ( l) alarak üçgeni oluşturur . Bununla ne yapılacağını bilmek için, doğru operatörün ( o) ve ilgili nötr elementin ( e) kaydını tutmamız gerekir :

                           |(l,(o,e))<-zip p$cycle[((*),1),((+),0)]

Bundan sonra, satırın çoğaltılmasıyla yeni satırın oluşturulması ve bir kopya için nötr elementi hazırlarız, bunları operatörle sıkıştırırız ve 1 ekleriz:

       zipWith o(e:l)l++[1]

3

R , 108 98 bayt

Gerçek çarpma işaretini artı işaretiyle değiştirerek -10 bayt. Beni Affet lütfen.

f=function(n){if(n<3)return(rep(1,n))else{v=f(n-1)};if(n%%2)`*`=`+`;return(c(1,v[3:n-2]*v[-1],1))}

Çevrimiçi deneyin!

Genel yöntemden oldukça memnun kaldım (ilkel olarak ilkel olarak yeni bir isim verdim) ancak henüz çok fazla kazan plakasına yol açan davaların çok garip bir şekilde ele alınmasıyla ilgili henüz golf oynayacağına eminim.


85 bayt . Çözümünüzü gerçekten çok seviyorum `*`=`+`! oldukça zeki. Gelişmelerimin geri kalanı sadece isteğiniz üzerine açıklamaktan memnuniyet duyacağım standart golf teknikleridir :)
Giuseppe

80 bayt . Davaların ele alınmasıyla ilgili notunuzdan ilham aldımn<3
Giuseppe

2

Kabuğu , 17 16 bayt

!G₅;1¢e*+
:1Sż⁰t

Çevrimiçi deneyin!

1 indeksli bir çözüm.

açıklama

İlk satır, ikinci satırdaki yardımcı işlevi çağıran ana işlevdir. Yardımcı işlevi genellikle ile çağrılır , ancak bu durumda ben kullanıyorum taşan etiketler Zurufundan özelliğini: Bir satır başvurmak durumunda N ile bir programda M <N , satır olsun hatları N mod M değiştirici fonksiyon ile M / N ona uygulandı. İkinci değiştirici işlevi, flipkullanıyorum yardımcı fonksiyonun argümanlarını ek bayt maliyeti olmadan çevirmek için .

İşte yardımcı fonksiyon.

:1Sż⁰t  Takes a function f and a list x.
   ż    Zip preserving elements of longer list
    ⁰   using function f
  S  t  x and its tail,
:1      then prepend 1.

İşte ana işlev.

!G₅;1¢e*+  Takes a number n.
      e*+  2-element list of the functions * and +
     ¢     repeated infinitely.
 G         Left scan this list
  ₅        using the flipped helper function
   ;1      with initial value [1].
!          Get n'th element.

2

C # (.NET Core) , 143 134 128 bayt

Zac Faragher -6 byte Phaeze
-5 byte sayesinde -4 byte Kevin Cruijssen
sayesinde-6 byte

n=>{int[]b={1},c;for(int i=0,j;++i<n;b=c)for(c=new int[i+1],c[0]=c[i]=1,j=0;++j<i;)c[j]=i%2<1?b[j-1]+b[j]:b[j-1]*b[j];return b;}

Çevrimiçi deneyin!

Açıklama:

n =>
{
    int[] b = { 1 }, c;               // Create first layer
    for(int i = 0, j; ++i < n; b = c) // Iterate for every layer, replace last layer with a new one
        for(c = new int[i+1],         // Create new layer
            c[0] = c[i] = 1,          // First and last elements are always 1
            j = 0;
            ++j < i; )                // Replace every element (besides 1st and last)...
                c[j] = i % 2 == 0 ?
                    b[j - 1] + b[j] : // ... with addition...
                    b[j - 1] * b[j];  // ... or multiplication of two from previous layers
    return b;                         // Return latest layer
};

B dizini başlangıç ​​ayarlarınızı değiştirebilmelisiniz var b=new[]{1};ve derleyici dizi türünü sizin için belirleyecektir.
JustinM - Monica

1
Birinci katman oluşturmak için bir başka yoldur int[]b={1};- 11 olduğu gibi, 20 vs bayt veya @Phaeze 'in öneri olarak 16
Zac Faragher

1
@ZFargher ve Phaeze teşekkür ederim!
Grzegorz Puławski

1
Ben oldukça zaman oldu biliyorum ama golf 6 daha bayt yapabilir: n=>{int[]b={1},c;for(int i=0,j;++i<n;b=c)for(c=new int[i+1],c[0]=c[i]=1,j=0;++j<i;)c[j]=i%2<1?b[j-1]+b[j]:b[j-1]*b[j];return b;}. Ben araya getirdik cböyle int[]b={1},c;; kısaltılmışi%2==0 için i%2<1; Ve içine her şeyi koyarak döngü dirseklerini çıkardı.
Kevin Cruijssen

Harika! Teşekkürler @KevinCruijssen
Grzegorz


1

Pyth , 22 bayt

@FryAmTheEggman sayesinde kaydedilmiş ton byte ! İlk çözüm aşağıdadır.

u++1@,+VGtG*VGtGlG1Q[1

Tam Test Paketi (0 dizinli).

Pyth , 40 38 36 35 bayt

Bu, waaaaaaaay'in makul bir şekilde çok uzun sürdüğünü hissediyor . Önerilerinizi bekliyoruz.

K]1VStQ=K++]1m@,sd*hded%N2C,KtK]1;K

Test Suite veya çevrimiçi deneyin!


Azaltmayı kullanmak çok daha kısa görünüyor . Bunun da optimal olduğuna ikna olmadım, sanırım alt 20 yönetilebilir mi?
FryAmTheEggman

@FryAmTheEggman Revizyon geçmişime bakın. Azaltmak için bir geçici çözüm bulmaya çalıştığımı söyledim u(ancak çözemedi). Teşekkürler!
Bay Xcoder,

Pyth'un önceden yazılmış bir eki varsa ...
Bay Xcoder



1

Mathematica, 70 bayt

Fold[#2@@@Partition[#,2,1,{-1,1},{}]&,{1},PadRight[{},#,{1##&,Plus}]]&

Wolfram kum havuzunda deneyin ! Maalesef Matematik'te çalışmıyor. 0 indeksli.

Açıklama: Partition[#,2,1,{-1,1},{}]bir liste alır ve tüm iki elemanlı alt listeleri, artı başlangıç ​​ve bitiş için 1 elemanlı listeleri döndürür - örneğin, {1,2,3,4}olur {{1}, {1,2}, {2,3}, {3,4}, {4}}. (etkin ) ve uzunluğu girilen sayı olan PadRight[{},#,{1##&,Plus}]alternatif bir liste yapar . Ardından , üçgenin satırlarını oluşturmak için bölümleme işlevini uygulanmış es ve eslerle birlikte tekrar tekrar uygulayın .1##&TimesPlusFoldPlusTimes




0

TI-Basic (TI-84 Plus CE), 100 bayt

Prompt X
{1→M
For(A,2,X
LM→L
A→dim(M
For(B,2,A–1
If A/2=int(A/2
Then
LL(B–1)LL(B→LM(B
Else
LL(B–1)+LL(B→LM(B
End
End
1→LM(dim(LM
End
LM

1 indeksli, kullanıcıdan giriş ister ve nPascal'ın Alternatif Üçgeni'nin üçüncü satırını içeren bir liste yazdırır .

Döngü yaparken: L M geçerli satırdır ve L L önceki satırdır.

TI-Basic belirtilmiş bir dildir . Burada kullanılan tüm belirteçler bir baytlık belirteçlerdir.

Sanırım M'yi sondan itibaren yerinde değiştirerek daha fazla golf oynayabilirim.

Açıklama:

Prompt X            # 3 bytes; get user input, store in X
{1→M                # 5 bytes, store the first row into LM
For(A,2,X           # 7 bytes, Loop X-1 times, with A as the counter, starting at 2
LM→L                # 5 bytes, copy list M into list L
A→dim(M             # 5 bytes, extend M by one
For(B,2,A–1         # 9 bytes, for each index B that isn't the first or last...
If A/2=int(A/2      # 10 bytes,    if A is even...
Then                # 2 bytes,     then...
LL(B–1)LL(B→LM(B     # 17 bytes,        the Bth item in this row is the Bth times the (B-1)th of the previous row
Else                # 2 bytes,     else...
LL(B–1)+LL(B→LM(B    # 18 bytes,        the Bth item in this row is the Bth plus the (B-1)th of the previous row
End                 # 2 bytes,     endif
End                 # 2 bytes,  endfor
1→LM(dim(LM         # 9 bytes, the last item is always 1
End                 # 2 bytes, endfor
LM                  # 2 bytes, Implicitly print the final row


0

JavaScript (ES6), 71 69 66 bayt

f=n=>n?(p=f(n-1),[...p.map((v,i)=>i--?n%2?v*p[i]:v+p[i]:1),1]):[1]

Çevrimiçi deneyin!

0 endeksli. @Arnauld tarafından
-3 bayt

f=n=>n?(p=f(n-1),[...p.map((v,i)=>i--?n%2?v*p[i]:v+p[i]:1),1]):[1]

for (var i = 0; i < 10; ++i) {
  console.log(JSON.stringify(f(i)));
}


1
Üçlü kullanmak 3 bayttan tasarruf etmelidir:i--?n%2?v*p[i]:v+p[i]
Arnauld,
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.