Es gibt eine gute Möglichkeit, eine lange Multiplikation für zwei ganze Zahlen durchzuführen, ohne etwas anderes zu tun als zu zählen, was gelegentlich im Internet geteilt wird. Sie schreiben die Ziffern jeder Zahl als Bündel von schrägen Linien, wobei sich die beiden Zahlen in einem Winkel von 90 Grad befinden. Dann können Sie einfach die Schnittpunkte in den einzelnen Spalten zählen, die entstehen. Ein Diagramm wird dies wahrscheinlich verdeutlichen. Hier ist ein Beispiel für die Berechnung 21 * 32
:
Wenn Sie für "visuelle / grafische lange Multiplikation" googeln, finden Sie viel mehr Beispiele.
In dieser Herausforderung müssen Sie diese Diagramme mit ASCII-Grafik erstellen. Für dasselbe Beispiel würde die Ausgabe folgendermaßen aussehen:
\ /
X /
\ / X /
\ X / X
X X / \ /
/ X X X /
/ X \ / X
/ \ X / \
X X
/ X \
/ \
Es ist wahrscheinlich am einfachsten, die Konstruktionsregeln für diese anhand einiger Beispiele herauszufinden (siehe unten), aber hier einige Details:
- Sich
X
überschneidende Segmente sind/
oder sich nicht überschneidende Segmente der Linien\
. - Nach den äußersten Kreuzungen sollte genau ein Segment vorhanden sein.
- Zwischen den Schnittpunkten, die zu verschiedenen Ziffern gehören, sollte genau ein Segment liegen. Wenn es Nullstellen gibt, führen diese zu aufeinanderfolgenden
/
oder\
Segmenten. - Sie müssen jede positive Eingabe (mindestens bis zu einer angemessenen Grenze wie 2 16 oder 2 32 ) und alle Ziffern von
0
bis unterstützen9
. Sie können jedoch davon ausgehen, dass es weder führende noch nachfolgende0
s gibt. - Sie dürfen keine überflüssigen führenden Leerzeichen oder führende oder nachfolgende Leerzeilen drucken.
- Sie können nachgestellte Leerzeichen drucken, diese dürfen jedoch das achsenausgerichtete Begrenzungsfeld des Diagramms nicht überschreiten.
- Sie können optional eine einzelne nachgestellte Zeile drucken.
- Sie können wählen, in welcher Reihenfolge Sie die beiden Eingabenummern nehmen. Sie müssen jedoch für beide Ausrichtungen beliebige Zahlen unterstützen, damit Sie nicht die Option "Die größere Zahl wird zuerst vergeben" auswählen können.
- Wenn Sie Eingaben als Zeichenfolge verwenden, können Sie ein beliebiges nicht-stelliges Trennzeichen zwischen den beiden Zahlen verwenden.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Dies ist Code Golf, die kürzeste Antwort (in Bytes) gewinnt.
Beispiele
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 \
/ \
Antworten:
Pyth - 79 Bytes
Eine Übersetzung von @ AlexeyBurdins Antwort. Kann wahrscheinlich viel mehr golfen werden.
Nimmt die Eingabe als zwei Zahlen, getrennt durch Zeilenumbrüche. Erklärung folgt in Kürze.
Probieren Sie es hier online aus .
quelle
Python, 303
Ich denke, es ist genug für Menschen lesbar.
Nachprüfung:
quelle
reversed
ist das Gleiche wie[::-1]
, Sie können den Inhalt der for-Schleife in eine Zeile setzen, um Einrückung zu sparen,len(a)+len(b)
ist kürzer alssum(map(len,[a,b]))
, nichtxrange
zum Golfen verwenden, der Platz) for
kann entfernt werden, und da Sie sind Mit python2 können Sie Leerzeichen und Tabulatoren in Einrückungen kombinieren.276
vom einfachen syntaktischen Golfen ausgehen: gist.github.com/Maltysen/e8231c0a9b585e2a4941e=enumerate
zu Beginn Golf 4 ZeichenPython 3, 205 Bytes
Die Ausdrücke sind ziemlich lang und ich denke, es gibt eine Menge Raum für Verbesserungen, aber trotzdem ...
Nimmt die Eingabe durch STDIN getrennt vor, z
In einigen Zeilen ist möglicherweise ein Leerzeichen nachgestellt, aber das
A+B-2
stellt sicher, dass sich alle nachgestellten Leerzeichen innerhalb des Begrenzungsrahmens befinden.quelle
C #, 451 Bytes
Aus Gründen der Lesbarkeit formatiert, die Funktion im Kontext:
Das bitweise ODER war nur zum Spaß, aber das Hinzufügen würde auch funktionieren.
quelle
JavaScript ( ES6 ) 271
Ich bin mir sicher, dass es eine Lösung gibt, die die Ausgabe Zeile für Zeile erstellt und dabei mit Mathe- und XY-Koordinaten spielt (x + y == k, xy == k ...). Aber ich kann es immer noch nicht nageln.
Hier ist also eine Lösung, die die Linien einfach nacheinander zeichnet.
Führen Sie das Snippet zum Testen in Firefox aus.
quelle
VC ++
(289)280Verwendung
Ergebnisse
quelle
---48
?...)-- - 48)...
.Canvas , 41 Bytes
Probieren Sie es hier aus!
quelle
C (329 b)
VERSUCH ES
quelle
R 294 Bytes
Probieren Sie es online!
quelle
Jelly , 58 Bytes
Probieren Sie es online!
Erläuterung
Ein vollständiges Programm, das die beiden Zahlen als Liste mit zwei Ganzzahlen verwendet und eine Zeichenfolge zurückgibt.
Hilfslink 1: Matrix drehen
Hilfslink 2: Generieren Sie die Zeilen- und Spaltenvorlagen
Hauptlink
quelle