Trójkąt przemienny Pascala


21

Trójkąt Pascala jest generowany przez rozpoczęcie 1i utworzenie każdego rzędu z kolejnych dodań. Zamiast tego utworzymy trójkąt, naprzemiennie mnożąc i dodając.

Zaczynamy wiosłę 1od samotności 1. Następnie dodawane są wiersze nieparzyste, a mnożenie odbywa się w wierszach parzystych (indeksowane 1). Podczas wykonywania kroku dodawania załóż, że spacje poza trójkątem są wypełnione 0s. Wykonując krok mnożenia, załóż, że na zewnątrz jest wypełniony 1s.

Oto pełny trójkąt do 7 rzędów. Symbol *lub +po lewej stronie pokazuje, jaki krok został wykonany, aby wygenerować ten wiersz.

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

Wyzwanie

Biorąc pod uwagę dane wejściowe n, wyślij nth rząd tego trójkąta.

Zasady

  • Zamiast tego możesz wybrać indeksowanie 0, ale pamiętaj, że wiersze dodawania i mnożenia muszą przerzucać, aby wygenerować dokładnie taki sam trójkąt jak powyżej. Jeśli zdecydujesz się to zrobić, podaj w swoim zgłoszeniu.
  • Można założyć, że dane wejściowe i wyjściowe pasują do natywnego typu liczb całkowitych twojego języka.
  • Dane wejściowe i wyjściowe można podawać w dowolnym dogodnym formacie .
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

Przykłady

Pokazuje dwa możliwe przykłady wyników spośród wielu: listę lub ciąg znaków oddzielony spacjami.

4
[1, 2, 2, 1]

8
"1 4 60 360 360 60 4 1"

2
@ totalniehuman Nie, jedyną rzeczą, którą należy stdout, powinien być nrząd.
AdmBorkBork,

Odpowiedzi:


16

Pascal , 249 247 233 bajtów

To jest na przemian trójkąt Pascala .

1 bajt zapisany dzięki @ Mr.Xcoder

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;

Wypróbuj online!



7

Python 2 , 97 93 86 81 78 bajtów

-4 bajty dzięki Rod. -10 bajtów dzięki Halvardowi Hummelowi.

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

Wypróbuj online!


1
Dobra robota, miałem (znacznie) dłuższe podejście . Chociaż nie miałem jeszcze czasu na grę w golfa.
Pan Xcoder,

1
Myślę, że to map([int.__add__ ,int.__mul__][i%2],[i%2]+a,a+[i%2])powinno zadziałać (nie testowałem)
Rod


1
Nie, to jest rekurencyjne. Musisz podać nazwę.
Pan Xcoder,


5

Galaretka , 17 12 bajtów

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

Jest to pełny program (lub łącze niladyczne), który pobiera dane wejściowe ze STDIN.

Wypróbuj online!

Jak to działa

µ×+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 bajtów

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

0-indeksowane.

Wypróbuj online!

Wyjaśnienie

Jest to anonimowy blok, który pobiera liczbę ze stosu i pozostawia wynik na stosie.

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.

Poczekaj, 2%!należy nacisnąć 1, jeśli parzysty i 0, jeśli nieparzysty, nie?
Esolanging Fruit

3

Mathematica, 92 bajty

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

Wypróbuj online! (w celu pracy z matematyką „Tr” zastępuje się „Total”)


3

Haskell , 76 72 bajtów

Rozwiązanie 0-indeksowane:

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

Wypróbuj online!

Wyjaśnienie

p rekurencyjnie definiuje przemienny trójkąt, podstawa / pierwszy jego element to [1]

p=[1]:[                                                            ]

Następnie buduje trójkąt, biorąc poprzednią linię ( l). Aby wiedzieć, co z tym zrobić, musimy śledzić poprawny operator ( o) i odpowiadający mu element neutralny ( e):

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

Z tego zbuduj nową linię, powielając linię, a dla jednej kopii wstawiamy element neutralny, spakowujemy je operatorem i dołączamy 1:

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

3

R , 108 98 bajtów

-10 bajtów poprzez zastąpienie rzeczywistego znaku mnożenia znakiem plus. Proszę wybacz mi.

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

Wypróbuj online!

Zadowolony z ogólnej metody (po raz pierwszy aliasuję prymityw), ale jestem pewien, że trzeba jeszcze zagrać w golfa, szczególnie z niezręczną obsługą przypadków, w których n <3, co prowadzi do dużej ilości płyt kotłowych.


85 bajtów . Naprawdę podoba mi się twoje rozwiązanie `*`=`+`! całkiem sprytny. Reszta moich ulepszeń to tylko standardowe techniki gry w golfa, które chętnie wyjaśnię na twoją prośbę :)
Giuseppe

80 bajtów . Inspiracją była twoja notatka na temat załatwiania spraw, w którychn<3
Giuseppe,

2

Łuska , 17 16 bajtów

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

Wypróbuj online!

Rozwiązanie 1-indeksowane.

Wyjaśnienie

Pierwsza linia jest główną funkcją, która wywołuje funkcję pomocniczą na drugiej linii. Funkcja pomocnika jest zwykle wywoływana za pomocą , ale w tym przypadku korzystam z funkcji przepełnienia etykiet Husk: jeśli odwołujesz się do linii N w programie z M <N linii, otrzymujesz linię N mod M z funkcją modyfikatora M / Zastosowano do tego N. Druga funkcja modyfikująca to flip, więc używam do odwracania argumentów funkcji pomocniczej bez dodatkowych kosztów bajtu.

Oto funkcja pomocnika.

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

Oto główna funkcja.

!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 bajtów

-4 bajty dzięki Phaeze
-5 bajtów dzięki Zac Faragher
-6 bajtów dzięki Kevin Cruijssen

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

Wypróbuj online!

Wyjaśnienie:

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

Powinieneś być w stanie zmienić inicjalizację tablicy b na, var b=new[]{1};a kompilator określi dla ciebie typ tablicy.
JustinM - Przywróć Monikę

1
Innym sposobem na zbudowanie pierwszej warstwy jest int[]b={1};- 11 bajtów vs 20 jak jest lub 16 jak w sugestii
@ Phaeze

1
@ZacFaragher i Phaeze dziękuję!
Grzegorz Puławski,

1
Wiem, że minęło sporo czasu, ale możesz zagrać w golfa jeszcze 6 bajtów: 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;} . Mam połączone ctak int[]b={1},c;; skrócone i%2==0do i%2<1; I usunąłem wsporniki pętli, wkładając wszystko do środka.
Kevin Cruijssen

Świetny! Dzięki @KevinCruijssen
Grzegorz Puławski


1

Pyth , 22 bajty

Zaoszczędź mnóstwo bajtów dzięki @FryAmTheEggman ! Wstępne rozwiązanie znajduje się poniżej.

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

Pełny pakiet testowy (indeksowany 0).

Pyth , 40 38 36 35 bajtów

To wydaje się zbyt długie. Sugestie są mile widziane.

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

Pakiet testowy lub wypróbuj online!


Korzystanie z redukcji wydaje się być znacznie krótsze . Nie jestem przekonany, czy to jest optymalne, czy myślę, że sub 20 jest wykonalny?
FryAmTheEggman

@FryAmTheEggman Zobacz moją historię zmian. Powiedziałem, że próbuję znaleźć obejście z redukcją u(ale nie mogłem tego rozgryźć). Dzięki!
Pan Xcoder,

Gdyby Pyth miał wbudowaną funkcję dodawania-dodawania ...
Pan Xcoder,



1

Mathematica, 70 bajtów

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

Wypróbuj w piaskownicy Wolfram ! Niestety nie działa w matematyce. Jest indeksowany na 0.

Objaśnienie: Partition[#,2,1,{-1,1},{}]pobiera listę i zwraca wszystkie dwuelementowe listy podrzędne oraz listy 1-elementowe dla początku i końca - np . {1,2,3,4}Staje się {{1}, {1,2}, {2,3}, {3,4}, {4}}. PadRight[{},#,{1##&,Plus}]tworzy na przemian listę 1##&(efektywnie Times) i Plus, którego długość jest liczbą wejściową. Potem Foldwielokrotnie stosuje funkcję partycji z PlusES i Timeses stosowanych do tego, aby wiersze trójkąta.




0

TI-Basic (TI-84 Plus CE), 100 bajtów

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-indeksowany, monituje użytkownika o podanie danych i drukuje listę zawierającą nth rząd naprzemiennego trójkąta Pascala.

Podczas zapętlania: L M jest bieżącym rzędem, a L L jest poprzednim rzędem.

TI-Basic to tokenizowany język . Wszystkie użyte tutaj tokeny są jednobajtowe.

Myślę, że mogę pograć w golfa, modyfikując M na miejscu od końca.

Wyjaśnienie:

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 bajtów

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

Wypróbuj online!

0-indeksowane.
-3 bajty przez @Arnauld

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
Używanie trójki powinno zaoszczędzić 3 bajty:i--?n%2?v*p[i]:v+p[i]
Arnauld
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.