🎂 Houdini 150   🚚 FREE FEDEX SHIPPING from 397 USD   🌎 WORLDWIDE SHIPPING for 25 USD

Atom Square

À propos de

Un carré magique est une grille carrée de nombres, disposés de telle sorte que la somme des nombres sur toute ligne horizontale, verticale ou diagonale soit la même.

En tant que magicien, vous pouvez utiliser un carré magique comme une forme de mentalisme ou un tour de magie mathématique. Vous pouvez demander à un spectateur de choisir n'importe quel nombre sur la grille, puis de révéler la somme des nombres dans n'importe quelle ligne, colonne ou diagonale contenant ce nombre. Vous pouvez également demander au spectateur de choisir une ligne, une colonne ou une diagonale et de révéler la somme des nombres de cette ligne.

Cette mini-application vous aide à créer un carré magique à partir d'un chiffre. Il vous suffit d'entrer le nombre que le spectateur a dit et de copier les nombres apparaissant sur l'écran de PeekSmith 3 .

const PEEKSMITH_ID = '*';

// the array will contain the numbers of the 4x4 square
let square = newUint8Array(16);


function main() {
  ps.connect(PEEKSMITH_ID);
  ps.print('AtomSquare');
}

function formatNumber(n) {
  if (n < 10) return `\xA0${n}`;
  return `${n}`;
}

function buildSquare(n) {
  // we can calculate a magic square for numbers
  // between 22 and 117 when we would like to end with
  // max. two digit positive numbers
  if (n < 22 || n > 117) {
    ps.print(`<${n}>\nINVALID`);
    return;
  }
  square[0] = 7;
  square[1] = 12;
  square[2] = 1;
  square[3] = n - 20;
  square[4] = 2;
  square[5] = n - 21;
  square[6] = 8;
  square[7] = 11;
  square[8] = n - 18;
  square[9] = 3;
  square[10]= 10;
  square[11]= 5;
  square[12]= 9;
  square[13]= 6;
  square[14]= n - 19;
  square[15]= 4;
  let result = '';
  for (let row = 0; row < 4; row++) {
    for (let col = 0; col < 4; col++) {
      result += formatNumber(square[row * 4 + col]);
      result += col < 3 ? ' ' : '\n';
    }
  }
  ps.print(result);
}

let num = '';
let mapping = [
  '1', '2', '3',
  '4', '5', '6',
  '7', '8', '9',
  's', '0', '<'
];
function calc() {
  if (num === '') return;
  clearTimeout(timer);
  buildSquare(parseInt(num));
  num = '';
}
let timer;
function type(buttonId) {
  let digit = mapping[buttonId];
  if (digit === 's') return calc();
  if (digit === '<') {
    if (strLen(num) > 0) num = strSub(num, 0, strLen(num) - 1);
  } else {
    num += digit;
  }
  clearTimeout(timer);
  timer = setTimeout(calc, 2000);
  ps.print(`<${num}>`);
}

function onEvent(e) {
  if (e.type === 'click' && e.source === 'atom:button') type(parseInt(e.value));    
}
croix