Imprimer le triangle numérique


25

Étant donné un nombre N, sortez un triangle à angle droit NxN, où chaque ligne iest remplie de nombres jusqu'à i.

Exemple

n = 0

(pas de sortie)

n = 4

1
1 2
1 2 3
1 2 3 4

n = 10

1
1 2
1 2 3
.
.
.
1 2 3 4 5 6 7 8 9 10

(aucun alignement nécessaire)

n = N

1
1 2
1 2 3
.
.
.
1 2 3 4 .... N

Il n'y a pas d'espace à la fin de chaque ligne.

Le plus petit nombre d'octets gagne et les failles standard ne sont pas autorisées.


La sortie peut-elle être une liste imbriquée de nombres?
seequ

Quel devrait être le comportement pour n = 0 et pour n> 9?
freekvd

@Sieg Bien sûr, tant que la sortie est correcte.
Tan WS

@freekvd pour 0 il n'y a pas de sortie, pour n> 9 aucun formatage spécial requis
Tan WS

Ah bon sang, tu as cassé ma soumission. Correction ASAP
seequ

Réponses:


17

Joe , 5 3 octets (+2 ou +3 pour l' -tindicateur)

Eh bien, apparemment, je n'ai pas utilisé tout le potentiel de Joe. C'était possible lorsque j'ai posté cela pour la première fois.

\AR

Ici, Rdonne la plage de 0 à n, exclusif. En \Aprend ensuite des préfixes successifs ( Ac'est la fonction d'identité). Exemples:

Avec -tindicateur (remarque: c'est maintenant la sortie standard même sans indicateur):

   (\AR)5
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
   \AR5
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
   \AR2
0
0 1
   \AR1
0
   \AR0

Sans ça:

   \AR5
[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
   (\AR)5
[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
   \AR2
[[0], [0, 1]]
   \AR1
[[0]]
   \AR0
[]

Les règles ont un peu changé. Mon ancien code ne se comportait pas correctement avec N = 0. De plus, la sortie peut désormais être simplement une liste imbriquée, elle -tpeut donc être supprimée.

1R1+R

Maintenant, Rndonne une plage de 0 à n, exclusif. Si donné 0, il renvoie une liste vide. 1+ajoute 1 à chaque élément de cette plage. 1Rmappe les valeurs sur des plages de 1 à x. Les menteurs vides, lorsqu'ils sont mappés, renvoient des listes vides.

Exemple de sortie:

   1R1+R0
[]
   1R1+R5
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]]

Mise à jour: je viens de remarquer quelque chose. La fonction mappe automatiquement pour classer les éléments 0. L'exemple suivant est exécuté avec -tflag.

   1R1+R3 5 8
1
1 2
1 2 3

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8

Ancien: 5 octets (avec le -tdrapeau)

1R1R

Il s'agit d'une fonction anonyme qui prend un nombre, crée une liste de 1 à N ( 1Rn) et mappe ces valeurs à la plage précédente, donnant une plage de 1 à x pour chaque élément de la plage 1 à N.

Le -tdrapeau donne la sortie sous forme de table de type J.

   1R1R5
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Remarque: la langue est très nouvelle et incomplète, mais la dernière version a été publiée avant ce défi.


4
Donc, J n'était pas suffisant pour avoir un avantage sur les défis basés sur les baies? : D
Optimizer

4
@Optimizer L'optimisation est importante.
seequ

4
Du coup, ma réponse la plus votée est celle sur laquelle j'ai passé le moins de temps. L'injustice.
seequ

1
Je suppose que Joe n'est pas votre Joe moyen ...
Justin

10

Python 3, 48 45 octets

f=lambda n:n and[f(n-1),print(*range(1,n+1))]

Hourra pour les effets secondaires.


2
Le néant imbriqué. Maintenant, c'est tordu.
seequ

C'est une astuce astucieuse: mettre la fonction avant le printpour exécuter le prints dans l'ordre inverse.
xnor

8

APL, 5

⍪⍳¨⍳⎕

crée un vecteur 1..n et pour chaque élément un autre tel vecteur.

Alors ⍪ fait une colonne de tous les vecteurs. Cela évite le problème avec les blancs de fin.

Essayez-le sur tryapl.org


Solution plus ancienne:

{⎕←⍳⍵}¨⍳⎕

Crée un vecteur 1..n

{⎕ ← ⍳⍵} est une fonction qui génère pour chaque (¨) élément un vecteur 1..n sur une ligne distincte

Celui-ci ne peut malheureusement pas être essayé sur tryapl.org, car ⎕ ← n'y fonctionne pas.


Il ne doit y avoir aucun espace de fin dans aucune ligne.
randomra

ah merci, j'ai raté celui-là. Corrigera bientôt
Moris Zucca

Je savais qu'APL serait une solution
Conor O'Brien

Oh mon Dieu, que voient mes yeux
Codefun64

6

J, 27 octets

J n'est pas bon avec une sortie numérique non matricielle. Cette fonction crée une chaîne correctement formatée à partir des nombres.

   ;@(<@,&LF@":@:>:@:i.@>:@i.)

   (;@(<@,&LF@":@:>:@:i.@>:@i.)) 4
1
1 2
1 2 3
1 2 3 4

Essayez-le en ligne ici.


Vous pouvez également utiliser ]\@i.pour obtenir;@(<@,&LF@":@:>:@:]\@i.)
seequ

6

PHP, 53 octets

Edit 2: Ismael Miguel a suggéré de lire depuis l'entrée au lieu de définir une fonction, donc le score est maintenant de 53 octets pour PHP:

for($a=1;@$i++<$n=$argv[1];$a.=" ".($i+print"$a\n"));

Et encore une fois, il peut être amélioré si PHP est configuré pour ignorer les erreurs (52 octets):

for($a=1;$i++<$n=$argv[1];$a.=" ".($i+print"$a\n"));
for($a=1;$i++<$n=$_GET[n];$a.=" ".($i+print"$a\n"));

Edit: Austin a suggéré une version de 60 octets dans les commentaires:

function f($n){for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));}

Ce qui peut être amélioré si nous n'affichons pas les erreurs PHP (59 octets):

function f($n){for($a=1;$i++<$n;$a.=" ".($i+print"$a\n"));}

$astocke la ligne suivante qui sera imprimée, et chaque fois qu'elle est imprimée, un espace et le numéro suivant ( printrevient toujours 1) lui sont concaténés.


Fonctions récursives (65 octets):

function f($n){$n>1&&f($n-1);echo implode(' ',range(1,$n))."\n";}
function f($n){$n>1&&f($n-1);for(;@$i++<$n;)echo$i,' ';echo"\n";}   // Using @ to hide notices.

Fonction récursive plus courte, avec rapport d'erreurs désactivé (64 octets):

function f($n){$n>1&&f($n-1);for(;$i++<$n;)echo$i,' ';echo"\n";}

Fonction récursive encore plus courte, avec rapport d'erreurs désactivé et une ligne vide avant la sortie réelle (62 octets):

function f($n){$n&&f($n-1);for(;$i++<$n;)echo$i,' ';echo"\n";}

Juste pour des fonctions amusantes et non récursives:

function f($n){for($i=0;$i<$n;print implode(' ',range(1,++$i))."\n");}    // 70 bytes
function f($n){for(;@$i<$n;print implode(' ',range(1,@++$i))."\n");}      // 68 bytes, hiding notices.
function f($n){for(;$i<$n;print implode(' ',range(1,++$i))."\n");}        // 66 bytes, error reporting disabled.

2
45 octets:for($a=1;@$i<$n;$a.=" ".(@++$i+print"$a\n"));
Austin

@Austin: J'ai lu dans un commentaire que le code doit être soit une lecture complète du programme depuis l'entrée, soit une fonction. Très belle astuce, elle peut être améliorée d'un bit / octet: for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));(44 octets)
Benoit Esnard

Ah ok, alors je suppose que vous feriez function f($n){for($a=1;@$i++<$n;$a.=" ".($i+print"$a\n"));}, ce qui fait 60 octets.
Austin

Effectivement. Êtes-vous d'accord si je modifie ma réponse pour ajouter votre solution?
Benoit Esnard

1
for($a=1;$i++<$n=$_GET[n];$a.=" ".($i+print"$a\n"));-> essayez ceci (code complet, en utilisant le paramètre url navec le numéro)
Ismael Miguel

5

CJam, 13 12 octets

ri{),:)S*N}/

Comment ça marche :

ri{       }/     "Run the block input number of times with iteration index from 0 to N-1";
   )             "Increment the iteration index (making it 1 to N)";
    ,            "Get an array of 0 to iteration index";
     :)          "Increment each of the above array members by 1";
       S*        "Join all above array numbers with space";
         N       "Add a new line. After all iterations, things are automatically printed";

Essayez-le en ligne ici


4

Pyth, 9 octets

VQjdr1hhN

Vraiment pensé que cela peut être fait plus court, mais cela ne semble pas le cas.

Essayez-le en ligne .

            Q = input()
VQ          For N in [0, 1, ..., Q-1]:
    r1hhN       create list [1, ..., N+1+1-1]
  jd            print joined with spaces

1
Une alternative 9: VQaYhNjdY. Si seulement arenvoyé la liste, alors quelque chose comme VQjdaYhNserait 8.
Sp3000

2
abrièvement utilisé pour renvoyer la liste annexée.
Optimizer

Je ne connais pas Pyth, pourriez-vous expliquer pourquoi N+1+1-1?
seequ

1
@Sieg rest la fonction de plage Python, donc le -1 ( r1Ncrée la liste [1, 2, ..., N-1]). Mais dans la Nième itération de la boucle, je veux la liste [1, 2, ..., N+1], donc je dois ajouter 2à N. r1hhNse traduit directement par range(1, N+1+1). Une autre possibilité serait r1+N2( range(1, N+2)).
Jakube

Ou même mhdhN, mais c'est une approche complètement différente.
Jakube

4

JavaScript (ES6) 49 52

Une tâche aussi simple, je me demande si cela peut être raccourci en JS (mise à jour: oui, en utilisant la récursivité)

Récursif 49

f=n=>alert((r=w=>n-i++?w+'\n'+r(w+' '+i):w)(i=1))

Iteraive 52

f=n=>{for(o=r=i=1;i++<n;o+='\n'+r)r+=' '+i;alert(o)}

Où puis-je tester cela? Je n'arrive pas à trouver de terrains de jeux ES6 qui acceptent cela
Kristoffer Sall-Storgaard

@ KristofferSall-Storgaard Firefox prend en charge ES6 par défaut. Donc, Firefox Console.
Optimizer

4

Java, 85 84 octets

C'est étonnamment court en Java.

void a(int a){String b="";for(int c=0;c++<a;System.out.println(b+=(c>1?" ":"")+c));}

Dentelé:

void a(int a){
    String b="";
    for(int c=0;
        c++<a;
        System.out.println(
                b+=(c>1?" ":"")+c
        ));
}

1 octet grâce à Bigtoes / Geobits


Vous pouvez en enregistrer un en déplaçant le b+=...dans println(b+=...).
Geobits

3

Prolog - 119

h(N):-setof(X,(between(1,N,K),setof(Y,between(1,K,Y),X)),[L]),k(L),nl,fail.
k([A|B]):-write(A),(B=[];write(" "),k(B)).

3

Python 2 - 62 54 65 octets

def f(n):
 for x in range(n):print' '.join(map(str,range(1,x+2)))

Le nombre ndoit être donné en entrée du programme, non initialisé dans une variable.
Zgarb

Merci pour l'astuce. Je n'en étais pas sûr.
pepp

2
Désolé, j'aurais dû être plus clair. Ce que je voulais dire, c'est que vous devez réellement définir Nen faisant N=input()ou quelque chose de similaire, afin que votre programme puisse être exécuté comme tel. Voici une discussion Meta sur le sujet.
Zgarb

Ce serait donc vrai, non?
pepp

Ça a l'air bien maintenant!
Zgarb

3

J, 9 caractères

Comme verbe tacite et monadique.

[:":\1+i.
  • i. y- les nombres de 0à y - 1.
  • 1 + i. y- les nombres de 1à y.
  • ": y- le vecteur yreprésenté par une chaîne.
  • ":\ y- chaque préfixe de yreprésenté sous forme de chaîne.
  • ":\ 1 + i. y- chaque préfixe des nombres de 1à yreprésenté sous forme de matrice de caractères.

Maintenant, c'est assez intelligent. +1
seequ

C'est plus J-esque mais ne viole-t-il pas la règle selon laquelle il n'y a pas d'espaces de fin sur chaque ligne?
miles

@miles C'est vrai! Tout le reste serait très compliqué.
FUZxxl

3

> <> (Poisson) , 40 37 + 3 = 40 octets

&1>:&:&)?;1\
(?v:n" "o1+>}:{:@
ao\~1+

Encore une fois,> <> réussit bien lors d'un autre exercice d'impression de nombres. Exécuter avec le -vdrapeau d'entrée, par exemple

py -3 fish.py -v 4

Explication

&               Put n in register
1               Push 1 (call this "i")

[outer loop]

:&:&)?          If i > n...
;                 Halt
1                 Else push 1 (call this "j")

[inner loop]

}:{:@(?         If j > i...
~1+ao             Pop j, print newline, increment i and go to start of outer loop
:n" "o1+          Else print j, print a space, increment j and go to start of inner loop

3

C (sans boucles, ouais!) - 72 octets

b(n,c){if(n){b(n-1,32);printf("%d%c",n,c);}}r(n){if(n){r(n-1);b(n,10);}}

Cela crée une fonction r(n)qui peut être utilisée de cette façon:

main(){ r(5); }

Voyez-le en action, ici sur tutorialspoint.com

Cela nécessite quelques trucs faciles à expliquer. Je pense que cela peut être grandement amélioré.


1
En fait, c'est 75 octets, pas 74. Cependant, vous pouvez le réduire à 72 octets en remplaçant '' par 32 et '\ n' par 10:b(n,c){if(n){b(n-1,32);printf("%d%c",n,c);}}r(n){if(n){r(n-1);b(n,10);}}
FatalSleep

1
Très joli truc, merci!
A. Breust

Merci! J'ai fait de mon mieux pour vous hisser dans la catégorie C, mais je n'ai rien pu raccourcir! J'ai donc décidé de raccourcir le vôtre à la place.
FatalSleep

64 octets b(n,c){n&&b(n-1,32)^printf("%d%c",n,c);}r(n){n&&r(n-1)^b(n,10);} Wandbox
o79y

2

Python 2 - 72

>>> def p(N):print'\n'.join(' '.join(map(str,range(1,i+2)))for i in range(N))
... 
>>> p(5)
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Pour obtenir des réponses sur ce site, vous devez écrire un programme ou une fonction complète. Et vous devez imprimer le résultat sur stdout ou les renvoyer à partir d'une fonction. N doit être lu depuis l'entrée ou pris comme paramètre de fonction, et non prédéfini comme variable.
jimmy23013

@ user23013 OK, corrigé!
Kasramvd

La définition de la fonction doit être incluse dans le nombre d'octets, donc je ne pense pas que ce soit 61. Il est probablement dans votre intérêt d'appeler la fonction quelque chose de court, comme p. Sur une autre note, vous pouvez supprimer deux espaces - un entre printet '\n'et l'autre entre )))et for.
Sp3000

@ Sp3000 OK, merci de votre attention! fixe !;)
Kasramvd

72:def p(N):print'\n'.join(' '.join(map(str,range(1,i+2)))for i in range(N))
seequ

2

Perl, 28

Lit le paramètre depuis stdin.

@x=1..$_,print"@x
"for 1..<>

Depuis la ligne de commande:

perl -E'$,=$";say 1..$_ for 1..<>'

mais je ne sais pas maintenant comment compter cela (probablement entre 25 et 29).


1

Python

import string
N,s=int(input()),list(string.digits)
for i in range(1,N+1):
    print(' '.join(s[1:i+1]))

1
Cela n'échoue-t-il pas si N> = 10?
seequ

@Sieg Oui, vous avez raison. Je viens d'apprendre Python, je cherchais un moyen de convertir la liste d'int en liste de chaînes.
bacchusbeale

63 octets: for i in range(int(input())):print(' '.join("123456789"[:i+1]))- Notez que les chaînes sont traitées comme des listes.
seequ

1

Golfscript 14

,{2+,1>' '*n}/

Attend que le numéro d'entrée soit présent sur la pile.

Exemple en ligne: lien


1

Clip , 16

Jm[ijkw,1iwS},1n

Explication

J                   .- join with newlines                           -.
 m[i        },1n    .- map numbers from 1 to numeric value of input -.
    jkw   wS        .- join with spaces                             -.
       ,1i          .- numbers from 1 to index                      -.

1

Aller, 93 81 78 93 90 octets

func r(n int)(s string){s=string(n+48);if n!=1{s=r(n-1)+" "+s};println(s);return}

Actuel non golfé

func r(n int) (s string) {
    // Convert n to a string, we do not have to initialize s since
    // we hijacked the return value.
    // Numbers in the ascii table starts at 48
    s = string(n | 48)
    // Unless we are on our last iteration, we need previous iterations,
    // a space and our current iteration
    if n != 1 {
        // Collect the result of previous iteration for output
        s = r(n-1) + " " + s
    }
    println(s)
    // We can use a naked return since we specified the
    // name of our return value in the function signature
    return
}

Si nous devons gérer N> 9, nous pouvons utiliser ce qui suit à 78 octets, mais cela nécessite d'importer le fmtpackage.

func r(n int)(s string){s=Sprint(n);if n!=1{s=r(n-1)+" "+s};Println(s);return}

Si nous incluons la déclaration d'importation, je suis maintenant de retour à ma première 93 92 90 octets

import."fmt";func r(n int)(s string){s=Sprint(n);if n>1{s=r(n-1)+" "+s};Println(s);return}

Testez-le en ligne ici: http://play.golang.org/p/BWLQ9R6ilw

La version avec fmtest ici: http://play.golang.org/p/hQEkLvpiqt


Je ne sais pas ce que je pense de la distribution de chaînes, mais toute tentative de la transformer en un tableau d'octets la rend simplement plus longue
Kristoffer Sall-Storgaard

Le principal problème que je vois est qu'il ne fonctionne pas pour n> 9. Vous pouvez cependant enregistrer un octet en changeant !=en >.
Geobits

@Bigtoes, corrigé maintenant, je ne sais pas si je suis censé compter la importdéclaration
Kristoffer Sall-Storgaard

Je sais qu'ils sont comptés pour les langues que je connais mieux, donc très probablement oui. Sucks, je sais :)
Geobits

1

ZX / Sinclair BASIC - 39 octets

ZX Basic utilise 1 octet par mot clé (tous les mots en majuscules), ce qui permet de réduire un peu la taille des octets ...

1 INPUT n:FOR i=1 TO n:FOR j=1 TO i:PRINT j;" ";:NEXT j:PRINT:NEXT i

En utilisant n = 8

entrez la description de l'image ici


1
Agréable. Mais ZX basic utilise 6 octets cachés de plus pour chaque littéral numérique (une astuce courante était VAL("1")(6 octets car VAL est 1) au lieu de 1(7 octets))
edc65

1

R, 28

for(i in 1:scan())print(1:i)

La sortie est incorrecte pour une valeur d'entrée de 0. En outre, il n'est pas clair si le début [1]de chaque ligne est en violation de la spécification.
Alex A.

@AlexA. si vous regardez attentivement la question, vous verrez mon commentaire demandant quel comportement devrait être pour n = 0. Mais merci de m'avoir pointé dans la bonne direction!
freekvd

J'ai vu le commentaire. Le fait est que cela n'imprime rien pour 0, il imprime 1; 1 0. (Faire semblant ;est un saut de ligne.)
Alex A.

Vous voudrez peut-être également envisager d'utiliser cat(1:i,"\n"). Même s'il est légèrement plus long que print(1:i), il n'inclut pas de début [1]sur chaque ligne.
Alex A.

1

TI-Basic, 28 octets

Input N
For(I,1,N
randIntNoRep(1,N->L1
SortA(L1
Disp L1
End

1
Cela ne sort pas comme l'indique le format; le tableau est plutôt affiché, entre parenthèses et tout, sur l'écran d'accueil.
lirtosiast

1

C, 89 caractères

// 90 characters
f(int n){int a=1,b;for(;n--;++a){for(b=0;b<a;++b)printf("%c%d",(!!b)*' ',b+1);puts("");}}

Pour éliminer la confusion puts("");. Cela imprime simplement un caractère de nouvelle ligne (comme vu ici ):

Notez que put ne diffère pas seulement des fputs en ce qu'il utilise stdout comme destination, mais il ajoute également automatiquement un caractère de nouvelle ligne à la fin (ce qui n'est pas le cas pour fputs).

Je l'ai légèrement raccourci avec l'algorithme java de @ TheBestOne:

// 89 characters
f(int a){char b[999]="",*p=b+1;int c=0;for(;a--&&(sprintf(b,"%s %d",b,++c)&&puts(p)););}

puts("");ne fait rien. Vous pouvez utiliser char b[999]=""au lieu de char b[999]={0}pour enregistrer 1 caractère.
mch

2
puts("");imprime un caractère de nouvelle ligne.
Felix Bytow

1

Perl: 34 caractères

print"@$_\n"for map[1..$_],1..$_;

Ce code obtient le numéro d'entrée fourni via la variable spéciale $_.


1
La plupart des crochets sont redondants ici: print"@$_\n"for map[1..$_],1..$_fonctionne également.
nutki

J'ai ajusté le code.
Felix Bytow

1

C # - 94 octets

Écrit comme une fonction anonyme qui renvoie une chaîne, qui ne semble pas être interdite par la spécification.

n=>String.Join("\n\n",Enumerable.Range(1,n).Select(l=>String.Join(" ",Enumerable.Range(1,l))))

Voici une version non golfée (les commentaires sont lus dans l'ordre BDCA):

n =>
    String.Join("\n\n",                    //...then join it together with newlines.
        Enumerable.Range(1, n).Select(l => //For each l from 1 to n, ...
                String.Join(" ",              //...and join it with spaces, ...
                    Enumerable.Range(1, l)    //...get the range from 1 to l, ...

1

Bash + coreutils, 26 octets

seq $1|sed "x;G;s/\n/ /;h"
  • seq génère simplement les nombres 1 à n
  • sed enregistre la sortie entière pour une ligne donnée dans l'espace d'attente, puis lui ajoute la ligne suivante.

1

Haskell, 62 57 octets

e=enumFromTo 1
f=putStr.unlines.map(unwords.map show.e).e

Style sans point. Exemple d'utilisation:

Prelude> f 5
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Faire e=enumFromTo 1enregistre 7 octets.
Zgarb

@Zgarb: Merci, mais si je permute enumFromTo 1, je dois aussi donner un nom à la fonction principale, donc c'est 5 octets. Sans le nom, ce serait une letconstruction:let e=enumFromTo 1 in (putStr.unlines.map(unwords.map show.e).e) 5
nimi


1

Scala, 73 65 62 octets

(n:Int)=>print(1 to n map(1 to _ mkString " ") mkString "\n")

Non golfé

def printNumberTriangle(n: Int): Unit = {
  def rowString(m: Int): String = 1.to(m).mkString(" ")
  print(1.to(n).map(rowString).mkString("\n"))
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.