Voici la tresse de Pascal:
1 4 15 56 209 780 2911 10864 40545 151316 564719
1 3 11 41 153 571 2131 7953 29681 110771 413403 1542841
1 4 15 56 209 780 2911 10864 40545 151316 564719
J'ai totalement inventé ça. Autant que je sache, Blaise Pascal n'avait pas de tresse, et s'il l'a fait, c'était probablement en cheveux plutôt qu'en chiffres.
Il est défini comme ceci:
- La première colonne a un seul
1
au milieu. - La deuxième colonne a un
1
en haut et en bas. - Maintenant, nous alternons entre mettre un nombre au milieu ou deux copies d'un nombre en haut et en bas.
- Si le nombre va en haut ou en bas, ce sera la somme des deux nombres adjacents (par exemple
56 = 15 + 41
). Si vous inclinez un peu la tête, c'est comme une étape dans le triangle de Pascal. - Si le nombre va au milieu, ce sera la somme des trois nombres adjacents (par exemple
41 = 15 + 11 + 15
).
Votre tâche sera d'imprimer (une partie de) cette tresse.
Contribution
Vous devez écrire un programme ou une fonction, qui reçoit un seul entier n
, donnant l'index de la dernière colonne à sortir.
Vous pouvez choisir si la première colonne (en n'imprimant qu'une seule 1
sur la ligne médiane) correspond à n = 0
ou n = 1
. Cela doit être un choix cohérent parmi toutes les entrées possibles.
Sortie
Sortez la tresse de Pascal jusqu'à la n
e colonne. L'espace doit correspondre exactement à la disposition d'exemple ci-dessus, sauf que vous pouvez remplir la ou les lignes plus courtes avec la longueur de la ou des lignes plus longues avec des espaces et vous pouvez éventuellement générer un seul saut de ligne de fin.
En d'autres termes, chaque colonne doit être exactement aussi large que le nombre (ou une paire de nombres égaux) dans cette colonne, les nombres dans les colonnes successives ne doivent pas se chevaucher et il ne doit pas y avoir d'espaces entre les colonnes.
Vous pouvez soit imprimer le résultat dans STDOUT (ou l'alternative la plus proche), ou si vous écrivez une fonction, vous pouvez renvoyer soit une chaîne avec le même contenu soit une liste de trois chaînes (une pour chaque ligne).
Plus de détails
Vous pouvez supposer que n
ce ne sera pas inférieur à l'index de la première colonne (donc pas inférieur 0
ou 1
dépendant de votre indexation). Vous pouvez également supposer que le dernier nombre de la tresse est inférieur à 256 ou le plus grand nombre représentable par le type entier natif de votre langue, selon le plus élevé des deux . Donc, si votre type d'entier natif ne peut stocker que des octets, vous pouvez supposer que le plus grand n
est 9
ou 10
(selon que vous utilisez 0 ou 1 n
) et s'il peut stocker des entiers 32 bits signés, n
sera au plus 33
ou 34
.
Les règles de code-golf standard s'appliquent. Le code le plus court gagne.
OEIS
Voici quelques liens pertinents de l'OEIS. Bien sûr, ceux-ci contiennent des spoilers pour différentes façons de générer les nombres dans la tresse:
Cas de test
Ces cas de test utilisent l'indexation 1 base. Chaque cas de test est de quatre lignes, la première étant l'entrée et les trois autres étant la sortie.
1
1
---
2
1
1
1
---
3
1
1 3
1
---
5
1 4
1 3 11
1 4
---
10
1 4 15 56 209
1 3 11 41 153
1 4 15 56 209
---
15
1 4 15 56 209 780 2911
1 3 11 41 153 571 2131 7953
1 4 15 56 209 780 2911
---
24
1 4 15 56 209 780 2911 10864 40545 151316 564719 2107560
1 3 11 41 153 571 2131 7953 29681 110771 413403 1542841
1 4 15 56 209 780 2911 10864 40545 151316 564719 2107560
Réponses:
Gelée ,
313029 octetsCeci est un lien monadique; il accepte un index de colonne basé sur 0 comme argument et renvoie une liste de chaînes.
Essayez-le en ligne!
Comment ça marche
la source
Pyth , 44 octets
La génération du nombre a pris 20 octets et le formatage a pris 24 octets.
Essayez-le en ligne!
la source
Python 2, 120 octets
Essayez-le sur Ideone.
la source
MATL , 38 octets
Essayez-le en ligne!
Le calcul d'un tableau avec les nombres (uniques) prend les 17 premiers octets. Le formatage prend les 21 octets restants.
Explication
Partie 1: générer les nombres
Cela génère un tableau contenant les numéros des première et seconde rangées dans l'ordre croissant:
[1; 1; 3; 4; 11; 15; ...]
. Il commence par1
,1
. Chaque nouveau numéro est obtenu itérativement à partir des deux précédents. Parmi ceux-ci, le second est multiplié par1
ou en2
fonction de l'indice d'itération, puis additionné au premier pour produire le nouveau nombre.Le nombre d'itérations est égal à l'entrée
n
. Cela signifie que desn+2
nombres sont générés. Une fois généré, le tableau doit être coupé afin que seules les premièresn
entrées soient conservées.Partie 2: formater la sortie
Pour chaque nombre dans le tableau obtenu, cela génère deux chaînes: une représentation sous forme de chaîne du nombre et une chaîne de même longueur composée du caractère 0 répété (le caractère 0 est affiché comme un espace dans MATL). Pour des itérations égales, ces deux chaînes sont permutées.
Les deux chaînes sont ensuite concaténées verticalement. Les
n
tableaux de caractères 2D sont donc produits comme suit (en utilisant·
pour représenter le caractère 0):Ces tableaux sont ensuite concaténés horizontalement pour produire
Enfin, ce tableau de caractères 2D est divisé en ses deux lignes, et le premier est dupliqué sur le haut de la pile. Les trois chaînes sont affichées dans l'ordre, chacune sur une ligne différente, produisant la sortie souhaitée
la source
Haskell, 101 octets
Définit une fonction
f :: Int → [String]
.Michael Klein m'a rappelé que je n'avais pas besoin d'appeler
unlines
le résultat, économisant 7 octets. Merci!J'ai enregistré un octet en le remplaçant
" 9"!!mod i 2
parcycle" 9"!!i
.Trois octets supplémentaires en écrivant deux listes corecursives au lieu d'utiliser
drop
.Ma copine a souligné que je pouvais économiser deux octets de plus en commençant mes réponses à la
0
place de1
.la source
C,
183177176 octetsExplication
C ne gagnera jamais de prix pour la brièveté contre une langue de niveau supérieur, mais l'exercice est intéressant et constitue une bonne pratique.
La macro F réduit six octets au détriment de la lisibilité. Les variables sont déclarées globalement pour éviter plusieurs déclarations. J'avais besoin d'un tampon de caractères pour sprintf, mais comme K&R est lâche avec la vérification de type, sprintf et printf peuvent interpréter t [9] comme un pointeur vers un tampon de 36 octets. Cela enregistre une déclaration distincte.
Jolie fonction d'impression, où r est le numéro de ligne. Sprintf formate le nombre et calcule la largeur de la colonne. Pour économiser de l'espace, nous l'appelons simplement trois fois, un pour chaque ligne de sortie; l'expression ri & 1 filtre ce qui est imprimé.
Fonction point d'entrée, l'argument est le nombre de colonnes. Calcule le tableau a des valeurs de colonne a [], puis appelle la fonction d'impression p une fois pour chaque ligne de sortie.
Exemple d'appel (non inclus dans la réponse et le nombre d'octets):
Mis à jour
Intégration de la suggestion de sprintf en ligne du tomsmeding. Cela a réduit le nombre de 183 à 177 caractères. Cela permet également de supprimer les accolades autour du bloc printf (sprintf ()) car ce n'est qu'une seule instruction maintenant, mais cela n'a enregistré qu'un seul caractère car il a encore besoin d'un espace comme délimiteur. Donc, jusqu'à 176.
la source
w
endroit où il est utilisé? Vous semblez ne l'utiliser qu'une seule fois.itoa
au lieu de sprintf?PowerShell v2 +, 133 octets
44 octets pour calculer les valeurs, 70 octets pour formuler l'ASCII
Prend l'entrée
$n
comme colonne indexée zéro. Définit le début de notre tableau de séquences$a=1,1
. On boucle ensuite$n
avec1..$n|%{...}
pour construire le tableau. À chaque itération, nous concaténons la somme de (il y a deux éléments) + (l'élément précédent) * (que nous soyons impairs ou pairs). Cela générera$a=1,1,3,4,11...
jusqu'à$n+2
.Donc, nous devons couper
$a
pour ne prendre que les premiers0..$n
éléments et les diriger vers une autre boucle|%{...}
. À chaque itération, nous définissons helper$z
comme un nombre d'espaces plus l'élément actuel sous forme de chaîne. Ensuite, nous divisons si cela est concaténé sur$x
(les rangées du haut et du bas) ou$y
(la rangée du milieu) par un simple pairif
/ impair /else
. Ensuite, nous calculons le nombre d'espaces pour$l
en prenant le nombre actuel, en le stratifiant et en prenant son.Length
.Enfin, nous avons mis
$x
,$y
et$x
à nouveau sur le pipeline, et la sortie est implicite. Étant donné que le.ToString()
séparateur par défaut d'un tableau lors de l'impression sur STDOUT est une nouvelle ligne, nous l'obtenons gratuitement.Exemple
la source
PHP 265 octets
Non-golfé:
Python 278 octets
la source
Rubis, 120 octets
Renvoie une chaîne multiligne.
Essayez-le en ligne!
la source
Matlab, 223 caractères, 226 octets
Non golfé et commenté:
la source
PHP,
135124123120 120 octetsen profitant des typecasts implicites et des variables variables,
un tiers du code (37 octets) va dans les espaces, 64 octets au total utilisés pour la sortie
panne
la source
Lot, 250 octets
Étant donné que les première et troisième lignes sont identiques, il nous suffit de créer deux chaînes. Ici
d
représente la chaîne qui se termine par la dernière entrée ets
représente la chaîne qui se termine par des espaces; les quatre dernières lignes garantissent qu'elles sont imprimées dans l'ordre approprié.i
est juste le compteur de boucles (c'est un peu moins cher que le compte à rebours%1
).j
est la bascule entre doubler le nombre précédent avant de l'ajouter au nombre actuel pour obtenir le nombre suivant.m
etn
contenir ces numéros.l
, en plus d'être utilisé comme un temporaire pour calculer le nombre suivant, obtient également ses chiffres remplacés par des espaces à remplirs
;s
etd
sont échangés à chaque fois via la variable intermédiairet
.la source