Triangolo di Clark


10

Ok, di recente ho fatto un calcio al triangolo, quindi eccone un altro.

Il triangolo di Clark è un triangolo in cui la voce più a sinistra di ogni riga è 1 e quella più a destra è composta da multipli di 6 che aumentano all'aumentare del numero di riga. Ecco una visualizzazione

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

Proprio come il triangolo di Pascal, tutte le altre voci sono la somma dei numeri in alto a destra e in alto a sinistra.

Ecco le prime righe compilate

          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

Compito

Dato un numero di riga (a partire dall'alto) e un numero di colonna (a partire dal primo elemento diverso da zero su quella riga) restituisce il valore in quella particolare cella. Entrambi gli ingressi possono essere indicizzati 1 o 0 (è possibile combinare e abbinare se lo si desidera). Fuori dai limiti del triangolo non è definito e puoi fare tutto ciò che desideri quando ti vengono chiesti questi valori.

Questo è , l'obiettivo è ridurre al minimo il numero di byte nella soluzione.

OEIS A046902


1
Possiamo costruire una soluzione con zero nella prima riga? come nella sequenza OEIS
Jörg Hülsermann,

1
@ JörgHülsermann Dato che è fuori limite per il triangolo qui definito, puoi fare quello che vuoi.
Ad Hoc Garf Hunter,

Risposte:


7

MATL , 15 byte

[lBB]i:"TTY+]i)

Il primo input è una riga basata su 0; il secondo è una colonna basata su 1.

Provalo online!

Spiegazione

[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 byte

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;

Provalo online!

1-indicizzati.


Il triangolo di Pascal!
Henry,

5

CJam , 22 18 byte

-4 byte grazie a Martin Ender

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

L'input è (0-based row) (0-based column)

Provalo online!

Spiegazione

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.

Una tecnica diversa per ottenere somme a coppie è spostare una copia a sinistra e utilizzarla .+. Normalmente questo ha il problema che mantiene l'elemento finale senza sommarlo (che costa i byte da rimuovere), ma in questo caso ciò salva effettivamente i byte perché quindi non è necessario aggiungere 6a ogni iterazione. È possibile salvare ancora più byte perché lo spostamento a sinistra è gratuito se si antepone solo 0una copia:X6_]ri{0X$+.+}*ri=
Martin Ender,

_0\+invece di 0X$+è lo stesso numero di byte se preferisci.
Martin Ender,

@MartinEnder Oh, vedo, ne ottieni altri 6 alla fine di ogni riga che è fuori limite quindi non importa. Intelligente, grazie.
Business Cat,

4

C #, 157 byte

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

Provalo online


3

Python 2 , 67 byte

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

Provalo online!

Approccio a forza bruta, calcolare la ariga th e quindi stampare il bnumero th, entrambi gli input sono basati su 0


3

Python 3 , 64 60 52 byte

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

Provalo online!

Soluzione ricorsiva mediante 1-indicizzazione. Produce "Vero" invece di 1 per il golf.


Grazie a:

  • @totallyhuman per aver salvato 4 byte!
  • @Rod per salvare 8 byte!


2
52 byte sostituendo if / else con operatori booleani e con un output più flessibile
Rod

@ Rod, questa è una soluzione geniale. Sto ancora cercando di avvolgere la testa perché funziona. Sono ancora abbastanza nuovo qui (questa è solo la mia seconda risposta sul sito), quindi non sono sicuro del protocollo: dovrei includere la tua revisione nella mia risposta anche se sei passato da Python 3 a 2?
Chase Vogeli,

3
@icosahedron la versione di Python è irrilevante in quel caso, quindi non devi preoccupartene. in generale, il passaggio tra le versioni di Python per sfruttare le funzionalità è considerato OK.
Uriel,

@Uriel grazie per il chiarimento.
Chase Vogeli,

2

Haskell , 41 byte

n#1=1
n#m|m>n=6*n
n#m=(n-1)#(m-1)+(n-1)#m

Provalo online!

Chiama utilizzando n # mdove nè il numero di riga e mil numero di colonna, entrambi con 1 indice.


1

Mathematica, 32 byte

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

ingresso

[riga, colonna]
[1 indicizzato, 0 indicizzato]


1

JavaScript (ES6), 38 byte

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

Si arresta in modo anomalo per colonne negative e restituisce multipli di sei per righe negative o colonne ingrandite.


1

C # (.NET Core) , 44 byte

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

Accetta colonna e riga, entrambe con 1 indice. Può prendere fila poi colonna scambiando gli ingressi: (r,c). Restituirà row * 6per le coordinate al di fuori dei limiti a destra (ad es. column > row + 1) E 1per le coordinate al di fuori dei limiti a sinistra (ad es column < 1.).


1

PHP , 64 byte

funzione ricorsiva

righe 1-indicizzazione colonne 0-indicizzazione

L'output per riga = 0 e colonna = 0 è 0 come nella sequenza OEIS

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

Provalo online!

PHP , 126 byte

righe 1-indicizzazione colonne 0-indicizzazione

L'output per riga = 0 e colonna = 0 è 0 come nella sequenza OEIS

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

Provalo online!


0

R , 77 byte

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

Richiede la zoolibreria; legge dallo stdin (gli input sono separati da due nuove righe) e restituisce il valore, con NAper le selezioni fuori limite.

Provalo online!


0

Gelatina , 13 byte

,"’U0¦c/x6,1S

Un collegamento monadico che prende un elenco di [row, entry](0-indicizzazione per voci, 1-indicizzazione per righe), che restituisce il valore.

Provalo online!

Come?

,"’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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.