0
votes

Code pour imprimer un diamant d'une longueur donnée en JavaScript

Je suis donc en train d'apprendre JavaScript et je suis intéressé par les nombreuses façons différentes que l'on peut accomplir quelque chose dans la programmation. Ceci est mon code de diamant, qui fonctionnera avec un nombre impair donné: xxx

y a-t-il d'autres moyens plus intuitifs de faire cela?


0 commentaires

5 Réponses :


3
votes

Vous pouvez adopter une approche récursive et appeler la fonction jusqu'à ce que vous obteniez la plus longue ligne en étoile.

.as-console-wrapper { max-height: 100% !important; top: 0; }
function diamond(l, i = 1) {
    const
        STAR = '*',
        SPACE = ' ',
        LINE = SPACE.repeat((l - i) / 2) + STAR.repeat(i);

    console.log(LINE);
    if (i >= l) return;
    diamond(l, i + 2);
    console.log(LINE);
}

diamond(11);


0 commentaires

1
votes

Approche itérative

Si vous souhaitez utiliser une approche itérative pour résoudre ce problème, vous pouvez faire:

const makeDiamond = n => {
   let total = n, iter = 0
   const base = ['*'.repeat(n)] // Start with the middle, build out
   while((n-=2) > 0) {
      const layer = ' '.repeat(++iter)+'*'.repeat(n)
      base.unshift(layer) // Prepend layer
      base.push(layer)    // Append layer
   }
   base.forEach(l => console.log(l)) // Print each layer in sequence
}

Remarque: cela fonctionne pour les diamants de tailles paires ou impaires.


0 commentaires

0
votes

J'ai en fait réussi à créer un autre code similaire qui maintient i = i + 2 au lieu de le diminuer dans la deuxième boucle.

const l = 11;
let space = ' '; 
let star = '*';
let i = 1;
let k;
let n = 0;

while(i <= l) {
  k = (l - i)/2;
  console.log(space.repeat(k) + star.repeat(i));
  i = i + 2;
}

while(i >= l) {
  k = (i - l)/2;
  n = i - (4 * k);
  if (n > 0) {console.log(space.repeat(k) + star.repeat(n));
  } else { break; }
  i = i + 2;
}


0 commentaires

1
votes

Créez une fonction pour créer la nième ligne.
Créez le haut en créant un tableau égal à la moitié de la hauteur et mappez-le avec la fonction de ligne.
Rejoignez le haut, puis inversez le haut et utilisez-le comme bas.

const diamond=n=>(n=Array(~~(n/2)).fill().map((v,i)=>" ".repeat((n-i*2+1)/2)+"*".repeat(i*2+1))).join("\n")+"\n"+n.reverse().slice(1).join("\n");
console.log(diamond(10))


0 commentaires

1
votes

avec reduce:

const n = 11;
Array.from(Array(~-n/2|0), (_,i) => " ".repeat(i+1) + "*".repeat(n+~i*2))
  .reduce((a, c) => [c, ...a, c], ["*".repeat(n)])
  .forEach(l=>console.log(l))

~ -n / 2 | 0 === Math.floor ((n-1) / 2)

n + ~ i * 2 === n- (i + 1) * 2


0 commentaires