Il existe un bon moyen d'effectuer une longue multiplication pour deux entiers sans avoir à faire autre chose que compter, qui est parfois partagé sur Internet. Vous écrivez les chiffres de chaque nombre sous la forme d'un groupe de lignes inclinées, avec les deux nombres à un angle de 90 degrés. Ensuite, vous pouvez simplement compter les intersections dans les colonnes séparées qui se présentent. Un diagramme clarifiera probablement cela. Voici un exemple de calcul 21 * 32
:
Si vous recherchez «multiplication visuelle / graphique longue» sur Google, vous trouverez beaucoup plus d'exemples.
Dans ce défi, vous devez générer ces diagrammes en utilisant l'art ASCII. Pour le même exemple, la sortie ressemblerait à ceci:
\ /
X /
\ / X /
\ X / X
X X / \ /
/ X X X /
/ X \ / X
/ \ X / \
X X
/ X \
/ \
Il est probablement plus facile de comprendre les règles de construction pour ceux-ci à partir de quelques exemples (voir ci-dessous), mais voici quelques détails:
- Les segments entrecroisés sont
X
, les segments non entrecroisés des lignes sont/
ou\
. - Il devrait y avoir exactement un segment après les intersections les plus à l'extérieur.
- Il devrait y avoir exactement un segment entre les intersections appartenant à des chiffres différents. S'il y a zéro chiffre, il en résultera des segments consécutifs
/
ou\
. - Vous devez prendre en charge toute entrée positive (au moins jusqu'à une limite raisonnable comme 2 16 ou 2 32 ) et tous les chiffres de
0
à9
. Cependant, vous pouvez supposer qu'il n'y a ni0
art. Premier ni arrière . - Vous ne devez pas imprimer d'espaces blancs de début superflus ni de lignes vides de début ou de fin.
- Vous pouvez imprimer un espace de fin, mais il ne doit pas dépasser la zone de délimitation alignée sur l'axe du diagramme.
- Vous pouvez éventuellement imprimer une seule nouvelle ligne de fin.
- Vous pouvez choisir dans quel ordre vous prenez les deux numéros d'entrée. Cependant, si vous devez prendre en charge des nombres arbitraires pour l'une ou l'autre orientation, vous ne pouvez pas choisir quelque chose comme "Le plus grand nombre est donné en premier".
- Si vous prenez l'entrée comme une chaîne, vous pouvez utiliser n'importe quel séparateur non numérique entre les deux nombres.
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), une valeur de retour de fonction ou un paramètre de fonction (out).
C'est le golf de code, la réponse la plus courte (en octets) l'emporte.
Exemples
1*1
\ /
X
/ \
2*61
\ /
\ X /
X X /
/ X X /
/ X X /
/ X X /
/ X X
/ X \ /
/ \ X
X \
/ \
45*1
\ /
\ X
\ X \
\ X \
\ X \
X \
\ / \
\ X
\ X \
\ X \
X \
/ \
21001*209
\ /
X /
/ X
/ / \
\ / / \ /
X / X /
\ / X / X /
\ X / \ / / X /
X X \ / / / X /
/ X \ X / / / X /
/ \ \ / X / / / X /
\ X / X / / / X /
X X / X / / / X /
/ X X / X / / / X
/ X X / X / / / \
/ X X / X / /
/ X X / X /
/ X X / X
/ X X / \
/ X X
/ X \
/ \