Нарисовать пустой двойной ромб

155
23 июля 2021, 18:00

Подскажите пжл как нарисовать двойной пустой ромб. Сам ромб я реализовал, но не пойму как сделать его двойным.

function printMirror(n) {
    let i, j;
    let str = '';
    for (i = 1; i <= n; i++) {
        for (j = n; j > i; j--) {
            str += ' ';
        }
        str += '*';
        for (j = 1; j < (i - 1) * 2; j++) {
            str += ' ';
        }
        if (i == 1) {
            str += ('\n');
        } else {
            str += ('*\n');
        }
    }
    for (i = 2; i <= n; i++) {
        for (j = 1; j < i; j++) {
            str += " ";
        }
        for (j = 1; j <= n * 2 - (2 * i - 1); j++) {
            if (i == 0 || j == 1 || j == n * 2 - (2 * i - 1)) {
                str += "*";
            } else {
                str += " ";
            }
        }
        str += "\n";
    }
    return '`\n' + str + '`';
}
Answer 1

Это можно было бы делать "чистыми" for... но показалось легче немного поиграть с массивами.

( JsFiddle )

let demo = document.getElementById('demo'); 
 
demo.value = printMirror(6, 3, 3); // 6 "этажей", 3 ромбика, по 3 пробела между ними 
 
function printMirror(n, qty, space) { 
  space = space ? multiplyStr(" ", space) : ""; 
   
  let strs = []; // Будем собирать все строчки в массив 
  for( let i = 0; i < n; i++ ){ 
    let str = ""; 
    for( let j = n; j >= 0; j-- ){ // Обратный перебор, чтобы в конце был один reverse 
      str += ( j == i ) ? "*" : " "; // Можно поставить и 2-3 пробела - будет "толще" 
    }  
    // Один раз пробежались и усё - уже есть основная "лесенка" из звездочек. 
    // Всё остальное можно строить на её основе. 
     
    str += str.split("").reverse().slice(1).join(""); 
    // Перевернули, убрали один символ, результат добавили к начальной строке. Было 
     
    //      *                 * 
    //     *      станет     * * 
    //    *                 *   * 
     
    let s = str; 
    for( let j = 1; j < qty; j++ ){ 
      str += space + s; 
      /* Повторяем еще qty-1 раз, вставляя между ними нужное кол-во пробелов */ 
    } 
     
    strs.push(str); // Сохраняем каждую готовую строку в массиве 
  } 
   
  return '`\n' + strs.join('\n') + '\n' + strs.reverse().slice(1).join('\n') + '\n`'; 
} 
 
function multiplyStr(str, qty){ 
  let x = ""; 
  for( let i = 0; i < qty; i++ ){ 
    x += str; 
  } 
  return x; 
} 
 
 
/***** Кусок Демо *****/ 
 
let n = document.getElementById('n'); 
let qty = document.getElementById('qty'); 
let space = document.getElementById('space'); 
 
document.getElementById('print').addEventListener('click', function(){ 
  demo.value = printMirror(n.value || 5, qty.value, space.value); 
});
#demo {   
  position: fixed; 
  top: 0; 
  left: 0; 
  width: 100vw; 
  height: 100vh; 
  padding-top: 20px; 
  box-sizing: border-box; 
  overflow-x: auto; 
  white-space: pre; 
} 
 
.menu { 
  position: fixed; 
  top: 5px; 
  right: 20px; 
} 
 
input { width: 40px; text-align: center; }
<textarea id="demo"></textarea> 
<div class="menu"> 
  <button id="print">printMirror</button> ( 
  <input id="n" placeholder="n">,  
  <input id="qty" placeholder="qty">,  
  <input id="space" placeholder="space">) 
</div>

P.s. если соберетесь вставить это куда-нибудь в textarea - надо дать ему overflow-x: auto; white-space: pre; — чтобы всё не испортилось, если экран окажется меньше, чем длина строк.

READ ALSO
Как записать новое значение?

Как записать новое значение?

Как мне записывать новое значение переменной oB? Чтобы каждую секунду оно обновлялось

200
Как работает свойство left? [дубликат]

Как работает свойство left? [дубликат]

Как менять значение left с интервалом? Например left = -800px , нужно каждые три секунды увеличивать left на 260px , как правильно прописать свойство в js , у меня...

219
Как посчитать сколько остановок нужно проехать?

Как посчитать сколько остановок нужно проехать?

Очень нужна помощь в JavaScriptЗадание для новичков, но совсем не удаётся решить ее

218