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 \
/ \
Réponses:
Pyth - 79 octets
Une traduction de la réponse de @ AlexeyBurdin. Peut probablement être joué beaucoup plus.
Prend la saisie sous la forme de deux nombres séparés par un saut de ligne. Explication à venir.
Essayez-le en ligne ici .
la source
python, 303
Je pense que c'est assez lisible par l'homme.
Vérification:
la source
reversed
c'est la même chose que[::-1]
, vous pouvez mettre le contenu de la boucle for sur une seule ligne pour économiser sur l'indentation,len(a)+len(b)
est plus court quesum(map(len,[a,b]))
, ne pas utiliserxrange
au golf, l'espace) for
peut être supprimé, et puisque vous êtes en utilisant python2, vous pouvez combiner des espaces et des tabulations en retrait.276
du golf syntaxique simple: gist.github.com/Maltysen/e8231c0a9b585e2a4941e=enumerate
au départ 4 golfsPython 3, 205 octets
Les expressions sont assez longues, donc je pense qu'il y a pas mal de marge d'amélioration, mais de toute façon ...
Prend l'espace d'entrée séparé via STDIN, par exemple
Il y a un espace de fin possible sur certaines lignes, mais
A+B-2
cela garantit que tous les espaces de fin se trouvent dans le cadre de sélection.la source
C #, 451 octets
Formatée pour la lisibilité, la fonction en contexte:
L'OR au niveau du bit était juste pour le plaisir, mais l'addition fonctionnerait aussi.
la source
JavaScript ( ES6 ) 271
Je suis sûr qu'il existe une solution qui construit la sortie ligne par ligne, en jouant avec les mathématiques et les coordonnées x, y (x + y == k, xy == k ...). Mais je ne peux toujours pas le comprendre.
Voici donc une solution qui trace simplement les lignes une par une.
Exécutez l'extrait dans Firefox pour tester.
la source
VC ++
(289)280Usage
Résultats
la source
---48
sert?...)-- - 48)...
.Toile , 41 octets
Essayez-le ici!
la source
C (329 b)
ESSAYEZ-LE
la source
R , 294 octets
Essayez-le en ligne!
la source
Gelée , 58 octets
Essayez-le en ligne!
Explication
Un programme complet qui prend les deux nombres comme une liste de deux entiers et renvoie une chaîne.
Lien d'assistance 1: faire pivoter la matrice
Lien d'assistance 2: générer les modèles de ligne et de colonne
Lien principal
la source