Le losange de Pascal (qui est en fait un triangle) est obtenu en ajoutant dans le motif:
*
***
x
au lieu de
* *
x
Cela signifie que chaque cellule est la somme des trois cellules de la ligne directement au-dessus et d'une cellule de la ligne 2 au-dessus. Tout comme le triangle de Pascal, la ligne zéro contient un simple 1
qui génère le triangle.
Voici les deux premières rangées du losange de Pascal
1
1 1 1
1 2 4 2 1
1 3 8 9 8 3 1
Tâche
Étant donné un numéro de ligne (à partir du haut) et un numéro de colonne (à partir du premier élément différent de zéro sur cette ligne), affichez la valeur à cette cellule particulière. Les deux entrées peuvent être indexées 1 ou 0 (vous pouvez mélanger et assortir si vous le souhaitez).
Il s'agit de code-golf , vous devez donc viser à réduire autant que possible la taille du fichier de votre code source.
Réponses:
Haskell ,
5955 octetsLe losange de Pascal? Plus comme le losange d'Haskell! ai-je raison?
4 octets économisés grâce à Ørjan Johansen
Je pensais que je devrais essayer mon propre problème et pratiquer mon Haskell. Espérons que cela incitera plus de gens à répondre à cette question.
Essayez-le en ligne!
Explication
C'est un peu dépassé avec le dernier golf
Au lieu de calculer
Nous calculons
Cela incline tout notre triangle pour devenir
Cela aligne toutes nos lignes, ce qui facilite l'indexation du nième élément de n'importe quelle colonne. Nous définissons ensuite nos cas de base.
La ligne zéro est entièrement composée de zéros.
Il y a un seul
1
en position1,1
donc nous définissons queEt nous définissons le reste de la première ligne comme des zéros
Ensuite, nous définissons récursivement le cas général en utilisant le modèle décrit ci-dessus:
la source
n!k=sum[(n-2)!(k-2)+sum(map((n-1)!)[k-2..k])|n>1]
.Pascal , 122 octets
Eh bien, c'est le losange de Pascal .
37 octets économisés grâce à @manatwork
Essayez-le en ligne!
la source
if
condition entière sont inutiles. (Le 1er,if
vous enregistrez 2 caractères, sur le 2èmeif
1 en ne laissant aucun espace entre lethen
mot-clé et le chiffre précédent.) Oh, et la variable r est complètement inutile.;
avant lesfunction
« send
.>=
<=
? J'ai encore besoin de préserver leif n=0
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;
PHP , 86 octets
manière récursive uniquement la ligne de fonction et la colonne 0-indexé
Essayez-le en ligne!
PHP , 114 octets
manière récursive ligne et colonne de programme complet indexées 0
Essayez-le en ligne!
PHP , 129 octets
ligne et colonne indexées 0
Essayez-le en ligne!
la source
Gelée ,
222019 octetsPrend une paire d'index basée sur 0 comme argument de ligne de commande.
Essayez-le en ligne!
la source
MATL ,
222019 octetsLes deux entrées sont basées sur 0.
Essayez-le en ligne!
Explication
Soit
r
etc
dénotons les deux entrées, en spécifiant respectivement une ligne et une colonne basées sur 0.Chaque nouvelle ligne du losange de Pascal peut être construite à partir de la matrice contenant les deux lignes précédentes en convoluant avec le noyau
[1 1 1; 0 1 0]
et en gardant les deux dernières lignes du résultat échangées. Cela se fait plusieursr
fois, à partir de la matrice1
.Il s'avère plus court d'utiliser le noyau
[0 1 0; 1 1 1; 0 1 0]
, qui est un littéral prédéfini. Cela produit une ligne supplémentaire, qui sera supprimée.Considérez par exemple
r = 3
, donc il y a des3
itérations.A partir de
convolution avec
[0 1 0; 1 1 1; 0 1 0]
donneGarder les deux dernières lignes (la matrice entière, dans ce cas) et les échanger donne
Convolution de ce qui précède avec
[0 1 0; 1 1 1; 0 1 0]
donneLa matrice formée par les deux dernières lignes permutées est
Celui-ci contient la nouvelle ligne en bas et la précédente étendue avec des zéros.
Convoluer à nouveau donne
Prendre les deux dernières lignes permutées donne
Une fois les
r
itérations effectuées, la sortie est contenue dans la dernière ligne de la matrice finale. Par exemple, pourc = 2
(basé sur 0), le résultat serait8
. Au lieu d'indexer la dernière ligne et la colonne souhaitée, une astuce peut être utilisée qui exploite la symétrie de chaque ligne: la matrice finale est transposéeet son
-c
-ème élément est pris. Cela utilise une indexation linéaire, c'est-à-dire que la matrice est indexée par un index unique dans l'ordre des colonnes . Étant donné que l'indexation est modulaire , l'0
entrée est le coin inférieur droit (valeur1
) et l'-2
entrée -th est deux étapes au-dessus (valeur8
).la source
Pari / GP , 60 octets
Essayez-le en ligne!
la source
Haskell , 74 octets
Essayez-le en ligne!
Appelez avec
n # m
, oùn
est la ligne etm
la colonne.la source
m<=2*n&&m>=0
peut être justen>0
.Mathematica, 56 octets
Fonction pure prenant deux arguments entiers (première ligne, deuxième colonne) et renvoyant un entier. Fonctionne également pour les arguments entiers négatifs, renvoyant
0
. Une structure récursive assez simple:If[#<1,Boole[##==0],...]
définit le comportement de cas de base pour la 0ème ligne (et au-dessus), tandis queSum[#0[#-i,#2-j],{i,2},{j,2i-2,2}]
met en œuvre la définition récursive.la source
Python 2 ,
706665 octetsEssayez-le en ligne!
la source
JavaScript (ES6), 68 octets
la source
Mathematica, 53 octets
Utilisation de la fonction de génération.
la source
Python 3 ,
8284 octetsIl s'agit d'une implémentation récursive avec des lignes et des colonnes indexées sur 1. (Techniquement, il a besoin d'un
f=
devant, quelqu'un m'a fait savoir si je devais le changer en 84 octets. Toujours nouveau et pas sûr à 100% des règles.)Cela utilise la formule récursive trouvée sur la page OEIS , mais avec celle
k
décalée vers la gauche pour s'aligner correctement. Par coïncidence,sum(f(n-1,k-i)for i in(0,1,2))
est de la même taille quef(n-1,k)+f(n-1,k-1)+f(n-1,k-2)
. La fonction entière est l'and or
astuce Python , où la première condition vérifie si k est à l'intérieur du triangle et non sur la frontière, auquel cas la formule récursive est utilisée. Si is n'est pas, la partie après leor
est retournée, qui vérifie sik
est dedans(1, 2*n-1)
, c'est-à-dire sur la frontière, en retournantTrue
etFalse
.k+1in(2,2*n)
est un octet plus court quek in(1,2*n-1)
. Envelopper cela entre parenthèses et mettre un+
devant convertit en entier, ce qui est nécessaire.Essayez-le en ligne!
la source
f=
.True
au lieu de1
car il se comporte comme1
Python. Cela vous permet de supprimer le+(...)
à la fin. Je comprends que si vous ne voulez pas faire cela, car cela rendra la sortie un peu étrange, c'est une option.Java (OpenJDK 8) , 87 octets
Essayez-le en ligne!
Au début, j'étais content de ma méthode itérative de 160 octets ... Hmmm ... oublions ça, OK?
la source
Python 3 , 75 octets
Il s'agit d'un lambda récursif qui prend la colonne et la ligne comme des entiers indexés 0.
Voici une version (légèrement) plus lisible avec une fonction d'impression:
la source