Cette question est inspirée de cette réponse . Par coïncidence, j'avais l'habitude d'utiliser la multiplication éthiopienne quand j'étais enfant, mais je n'avais jamais connu le nom de la méthode jusqu'à récemment.
La multiplication éthiopienne est une méthode de multiplication d'entiers utilisant uniquement l'addition, le doublement et la réduction de moitié.
Méthode:
- Prenez deux nombres à multiplier et notez-les en haut de deux colonnes.
- Dans la colonne de gauche, divisez par deux à plusieurs reprises le dernier nombre, en supprimant tout reste et écrivez le résultat sous le dernier dans la même colonne, jusqu'à ce que vous écriviez une valeur de 1.
- Dans la colonne de droite, doublez plusieurs fois le dernier chiffre et écrivez le résultat ci-dessous. arrêtez lorsque vous ajoutez un résultat dans la même ligne que là où la colonne de gauche indique 1.
- Examinez le tableau produit et supprimez toute ligne où la valeur dans la colonne de gauche est paire. Additionnez les valeurs de la colonne de droite qui restent pour produire le résultat de la multiplication des deux nombres d'origine.
Par exemple: 17 x 34
17 34
Réduire de moitié la première colonne:
17 34
8
4
2
1
Doubler la deuxième colonne:
17 34
8 68
4 136
2 272
1 544
Barrer les lignes dont la première cellule est paire, nous le ferons en mettant ces chiffres à droite entre crochets:
17 34
8 [68]
4 [136]
2 [272]
1 544
Additionnez les nombres restants dans la colonne de droite:
17 34
8 [68]
4 [136]
2 [272]
1 544
=====
578
Donc 17 multiplié par 34, par la méthode éthiopienne est 578.
La tâche:
Code de golf qui prend deux nombres entre 1 et 1000 et exécute la même disposition et le même algorithme, affichant le produit ci-dessous.
Méthode d'entrée: Cependant, vous choisissez ...
Exemple d'entrée:
19 427
Résultat résultant:
19 427
9 854
4 [1708]
2 [3416]
1 6832
======
8113
Veuillez noter l'alignement des chiffres. C'est le plus important dans la mise en page. Notez également que la double ligne tracée par des signes égaux doit être de deux caractères plus longue que la réponse globale et doit être justifiée au centre.
Essai
Comment allez-vous tester cela? En fournissant une exécution de votre programme en utilisant deux nombres. Ces numéros peuvent être extraits de votre numéro d'utilisateur (vous pouvez les obtenir en plaçant votre curseur sur votre avatar dans la fenêtre supérieure). Prenez votre numéro et prenez les trois derniers chiffres, ce sera le numéro B, prenez tout ce qui reste à l'avant, ce sera le numéro A. Ensuite, testez A fois B.
Exemple de test:
Mon numéro d'identification d'utilisateur est 8555, donc mes numéros sont 8 et 555. Donc, ma sortie devrait ressembler à ceci:
8 [555]
4 [1110]
2 [2220]
1 4440
======
4440
Restrictions:
Aucun opérateur de multiplication natif n'est autorisé sauf dans l'utilisation du "doublage", comme mentionné dans l'algorithme. En d'autres termes, si vous utilisez un opérateur comme *, il ne peut être utilisé que pour la multiplication par 2 uniquement.
Les inscriptions qui n'y adhèrent pas ne seront pas prises en compte et l'utilisateur sera escorté hors des lieux avec une boîte en carton pleine de ses effets personnels. Chaque entrée aura un code, plus le test basé sur votre numéro d'identification d'utilisateur.
C'est le golf de code. Le plus petit nombre d'octets recevra le prix, la gloire et l'admiration de leurs pairs ... (Et peut-être une Lamborghini ... j'ai dit "peut-être"!)
*
oux
), mais il est impossible de détecter si la multiplication est utilisée ou non. Hormis cette partie, le défi est intéressant.Réponses:
Fusain , 91 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Définit
t
sur la liste vide ets
sur0
. (u
déjà par défaut dans la liste vide.)Saisit les deux nombres.
Se répète alors qu'il
q
est différent de zéro.Enveloppez le
q
rembourrage et ajoutez-le à la listet
.Enveloppez-
h
le dans du rembourrage ou[]
selon qu'ilq
est impair et ajoutez-le à la listeu
.Ajouter
h
às
siq
est impair.Entier divisé
q
par 2.Ajoutez
h
à lui-même.Ajoutez une chaîne de
=
signes appropriée à la listeu
.Ajoutez la somme rembourrée
s
à la listeu
.Faites pivoter la liste
t
de 180 ° et imprimez-la à l'envers, la justifiant ainsi à droite.Déplacez le curseur de sorte que lorsque
u
est justifié à droite, son coin supérieur gauche soit aligné avec le coin supérieur droit que nous venons d'atteindre, et imprimezu
justifié à droite.la source
Python 2 ,
203202187133 octetsEssayez-le en ligne!
Si je peux utiliser
*
pour la multiplication de chaînes ('='*R
) et comme 'sélecteur' (b*(a%2)
au lieu de[0,b][a%2]
), j'obtiens:118 octets
Essayez-le en ligne!
Explication:
la source
Java (OpenJDK 8) ,
353316267214210 octetsEssayez-le en ligne!
la source
(a,b)->{int g=0;for(;a>0;g+=a%2*b,a/=2,b*=2)System.out.printf("%1$8d%2$10s\n",a,a%2<1?"["+b+"]":" "+b+" ");System.out.printf("%1$19s%2$18s","".valueOf(new char[(int)Math.log10(g)+3]).replace("\0","=")+"\n",g+" ");}
a%2*b
sympa et simple, merciMathematica, 264 octets
contribution
production
la source
s=Quotient[s,2]
:)Perl 5 , 157 octets
155 octets de code + 2 drapeaux de ligne de commande (
-nl
)Essayez-le en ligne!
la source
JavaScript 2017, 221 octets
Surtout un problème de formatage de sortie
Moins golfé
Tester
la source
C, C ++,
319313301299 octets-8 octets grâce à Zacharý
Grand merci à la
printf
magie que je viens d'apprendre en 60 minutes entre les éditionsOptimisation C ++, remplacez l'en-tête
stdio.h
parcstdio
etstring.h
parcstring
, économise 2 octetsLa compilation avec MSVC nécessite d'ajouter
#pragma warning(disable:4996)
afin d'utilisersprintf
Test avec mon ID PPCG:
72 x 535 =>
Il respecte les règles, les chiffres sont alignés et les signes égaux seront toujours supérieurs de 2 caractères au nombre final. Exemple avec 17 x 34 =>
la source
#define O printf("%*d %c%*d%c\n",5,a,a%2?' ':'[',9,b,a%2?' ':']');
etvoid m(int a,int b){int r=0,i=0;O while(a>1){r+=a%2*b;a/=2;b*=2;O}r+=b;char t[20],p[20];memset(t,0,20);memset(p,0,20);sprintf(t,"%d",r);for(;i<strlen(t)+2;++i)p[i]='=';printf("%*c%*s\n%*d",5,' ',12,p,16,r);}
%
et*
sont les mêmes,r+=a%2*b
devrait donc fonctionner.[Bash],
144142140 140131128 octetsMeilleur respect de l'affichage, notez qu'il y a un caractère d'espace de fin
Première réponse
la source
Haskell , 305 octets
Essayez-le en ligne!
L'
!
opérateur crée les deux listes,?
calcule le produit.%
et#
sont utilisés pour la disposition ascii.la source
C,
205201190183156150143 octetsCela se compilera avec des avertissements en tant que C89, et je ne pense pas que ce soit un C99 valide, mais il finit par être plus petit que la version de HatsuPointerKun, car il économise des octets en omettant
#include
, sans utiliser de longueurs dynamiques pour imprimer car elles sont inutiles, et utiliserlog10()
pour calculer le nombre de=
nécessaires:Comme mon numéro est
64586
, j'ai utilisé ce programme de test pour calculer64 * 586
:& il génère:
Éditer
enregistré 4 octets par la règle "implicit int"
modifier 2
enregistré 11 octets en passant à une
do...while()
boucle et en déplaçant le printf dans la boucle à partir d'une macro. Devrait également fonctionner correctement sia=1
.modifier 3
enregistré 7 octets et fait fonctionner le code correctement.
modifier 4
Sauvegardé 26 octets avec quelques astuces printf.
modifier 5
enregistré 6 octets en réduisant le remplissage supplémentaire en 1 nombre.
modifier 6
sauvé 7 octets par la supercherie printf avec l'opérateur ternaire et ne déclarant pas une variable inutilisée
la source
Excel VBA, 183 octets
Une fonction de fenêtre immédiate VBE anonyme qui prend les entrées de la plage
[A1:B1]
et les sorties vers la console.Non golfé
Production
la source