Diese Frage ist von dieser Antwort inspiriert . Zufälligerweise verwendete ich als Kind die äthiopische Multiplikation, kannte aber den Namen der Methode bis vor kurzem nicht.
Die äthiopische Multiplikation ist eine Methode zur Multiplikation ganzer Zahlen, bei der nur Addition, Verdopplung und Halbierung verwendet werden.
Methode:
- Nimm zwei zu multiplizierende Zahlen und schreibe sie oben in zwei Spalten auf.
- In der linken Spalte halbieren Sie wiederholt die letzte Zahl, wobei Sie alle Reste verwerfen, und schreiben Sie das Ergebnis unter die letzte in derselben Spalte, bis Sie den Wert 1 schreiben.
- In der rechten Spalte immer wieder die letzte Zahl verdoppeln und das Ergebnis unten eintragen. stoppen Sie, wenn Sie ein Ergebnis in derselben Zeile hinzufügen, in der die linke Spalte 1 anzeigt.
- Untersuchen Sie die erzeugte Tabelle und verwerfen Sie alle Zeilen, in denen der Wert in der linken Spalte gerade ist. Addieren Sie die verbleibenden Werte in der rechten Spalte, um das Ergebnis der Multiplikation der beiden ursprünglichen Zahlen zu erhalten.
Zum Beispiel: 17 x 34
17 34
Die erste Spalte halbieren:
17 34
8
4
2
1
Verdoppelung der zweiten Spalte:
17 34
8 68
4 136
2 272
1 544
Durchgestrichene Zeilen, deren erste Zelle gerade ist, tun dies, indem Sie diese Zahlen rechts in eckige Klammern setzen:
17 34
8 [68]
4 [136]
2 [272]
1 544
Summiere die verbleibenden Zahlen in der rechten Spalte:
17 34
8 [68]
4 [136]
2 [272]
1 544
=====
578
Also ist 17 multipliziert mit 34 nach der äthiopischen Methode 578.
Die Aufgabe:
Golfcode, der zwei Zahlen zwischen 1 und 1000 annimmt und dasselbe Layout und denselben Algorithmus ausführt, wobei das folgende Produkt angezeigt wird.
Eingabemethode: Wie auch immer Sie wählen ...
Beispiel Eingabe:
19 427
Resultierende Ausgabe:
19 427
9 854
4 [1708]
2 [3416]
1 6832
======
8113
Bitte beachten Sie die Ausrichtung der Ziffern. Dies ist im Layout am wichtigsten. Beachten Sie auch, dass die durch Gleichheitszeichen dargestellte doppelte Linie zwei Zeichen länger sein muss als die Gesamtantwort und mittig ausgerichtet sein muss.
Testen
Wie werden Sie das testen? Indem Sie ein Programm ausführen, das zwei Zahlen verwendet. Diese Nummern können aus Ihrer Benutzer-ID-Nummer extrahiert werden (dies erhalten Sie, indem Sie den Mauszeiger über Ihren Avatar im oberen Fenster bewegen). Nehmen Sie Ihre Nummer und nehmen Sie die letzten drei Ziffern, dies ist die Nummer B, nehmen Sie alles, was vorne noch übrig ist, das ist die Nummer A. Dann testen Sie A mal B.
Testbeispiel:
Meine Benutzer-ID-Nummer ist 8555, meine Nummern sind also 8 und 555. Meine Ausgabe sollte also so aussehen:
8 [555]
4 [1110]
2 [2220]
1 4440
======
4440
Beschränkungen:
Es sind keine nativen Multiplikationsoperatoren zulässig, außer bei der Verwendung von "Verdopplung", wie im Algorithmus erwähnt. Mit anderen Worten, wenn Sie einen Operator wie * verwenden, kann dieser nur zum Multiplizieren mit 2 verwendet werden.
Beiträge, die sich nicht daran halten, werden nicht berücksichtigt und der Benutzer wird mit einem Pappkarton voller Habseligkeiten von den Räumlichkeiten begleitet. Jeder Eintrag enthält einen Code sowie den Test basierend auf Ihrer Benutzer-ID-Nummer.
Das ist Code Golf. Die kürzeste Anzahl von Bytes erhält den Preis, den Ruhm und die Bewunderung ihrer Kollegen ... (Und vielleicht ein Lamborghini ... Ich sagte "vielleicht"!)
*
oderx
) einschränken , aber es ist unmöglich zu erkennen, ob Multiplikation verwendet wird oder nicht. Abgesehen von diesem Teil ist die Herausforderung interessant.Antworten:
Kohle , 91 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Setzt
t
auf die leere Liste unds
auf0
. (u
Standardmäßig ist die Liste bereits leer.)Gibt die beiden Zahlen ein.
Wiederholt, solange
q
ungleich Null ist.Wickeln Sie die
q
Füllung ein und hängen Sie sie an die Liste ant
.Wickeln Sie sie
h
entweder in Auffüllung oder,[]
je nachdem, ob sieq
ungerade ist, in die Liste ein und hängen Sie sie anu
.Add
h
tos
ifq
ist ungerade.Ganze Zahl
q
durch 2 teilen .h
Zu sich selbst hinzufügen .Fügen Sie
=
der Liste eine geeignete Zeichenfolge hinzuu
.Hängen Sie die aufgefüllte Summe
s
an die Liste anu
.Drehen Sie die Liste
t
um 180 ° und drucken Sie sie kopfüber aus.Bewegen Sie den Cursor so, dass
u
seine linke obere Ecke mit der rechten oberen Ecke übereinstimmt, die wir gerade erreicht haben, und drucken Sie sieu
rechtsbündig aus.quelle
Python 2 ,
203202187133 BytesProbieren Sie es online!
Wenn ich
*
zur Zeichenkettenmultiplikation ('='*R
) und als 'Selektor' (b*(a%2)
anstelle von[0,b][a%2]
) verwenden kann, erhalte ich:118 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Java (OpenJDK 8) ,
353316267214210 BytesProbieren Sie es online!
quelle
(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
schön und einfach, dankeMathematica, 264 Bytes
Eingang
Ausgabe
quelle
s=Quotient[s,2]
:)Perl 5 , 157 Bytes
155 Byte Code + 2 Befehlszeilenflags (
-nl
)Probieren Sie es online!
quelle
JavaScript 2017, 221 Byte
Meistens ein Problem der Ausgabeformatierung
Weniger golfen
Prüfung
quelle
C, C ++,
319313301299 Bytes-8 Bytes dank Zacharý
Dank der
printf
Magie habe ich es in 60 Minuten zwischen den Bearbeitungen gelerntC ++ - Optimierung, Header
stdio.h
nachcstdio
undstring.h
nach ersetzencstring
, spart 2 ByteDas Kompilieren mit MSVC erfordert das Hinzufügen,
#pragma warning(disable:4996)
um es verwenden zu könnensprintf
Testen mit meiner PPCG ID:
72 x 535 =>
Die Regeln werden eingehalten, die Ziffern werden ausgerichtet und die Gleichheitszeichen sind immer 2 Zeichen größer als die endgültige Zahl. Beispiel mit 17 x 34 =>
quelle
#define O printf("%*d %c%*d%c\n",5,a,a%2?' ':'[',9,b,a%2?' ':']');
undvoid 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);}
%
und*
sind die gleichen,r+=a%2*b
sollte also funktionieren.[Bash],
144142140131128 BytesBeachten Sie bei der Anzeige, dass ein Leerzeichen nachgestellt ist
Erste Antwort
quelle
Haskell , 305 Bytes
Probieren Sie es online!
Der
!
Bediener erstellt die beiden Listen und?
berechnet das Produkt.%
und#
werden für das ASCII-Layout verwendet.quelle
C
205201190183156150143 BytesDies wird mit Warnungen wie C89 kompiliert, und ich glaube nicht, dass es C99 ist, aber es wird kleiner als die Version von HatsuPointerKun, da es Bytes spart, indem es
#include
keine dynamischen Längen verwendet, um zu drucken , wenn sie nicht benötigt werden. Verwenden Sielog10()
, um die Anzahl der=
benötigten zu berechnen :Wie meine Nummer ist
64586
, habe ich dieses Testprogramm verwendet, um Folgendes zu berechnen64 * 586
:& es gibt aus:
bearbeiten
4 Bytes durch die "implicit int" -Regel gespart
bearbeiten 2
11 Bytes gespart, indem in eine
do...while()
Schleife gewechselt und das printf aus einem Makro in die Schleife verschoben wurde. Sollte auch richtig funktionieren wenna=1
.bearbeiten 3
7 Bytes gespart und der Code funktioniert.
bearbeiten 4
Sparte 26 Bytes mit einigem printf-Trick.
bearbeiten 5
6 Bytes gespart, indem zusätzliches Auffüllen in 1 Zahl reduziert wurde.
bearbeiten 6
7 Bytes durch printf-Trick mit dem ternären Operator gespart und keine unbenutzte Variable deklariert
quelle
Excel VBA, 183 Bytes
Eine anonyme VBE-Direktfensterfunktion, die Eingaben aus dem Bereich
[A1:B1]
und Ausgaben an die Konsole weiterleitet.Ungolfed
Ausgabe
quelle