Visualisieren Sie lange Hinzufügung mit ASCII-Kunst

13

Ganz und gar nicht inspiriert von Visualize long division with ASCII art ;)

Ihre Aufgabe ist es, mit ASCII-Kunst eine lange Hand zu zeigen. Sie lösen die Longhand-Addition, indem Sie die Spalten von rechts nach links addieren, den Wert der Einerstelle in das Ergebnis einfügen und die Zehnerstelle an den Anfang der nächsten Spalte setzen.

Eingang

Die Eingabe kann grundsätzlich in jedem gewünschten Format erfolgen, sofern Sie 2 bis 9 Zahlen als Eingabe verwenden.

Ausgabe

Die Formatierung hier entspricht wahrscheinlich dem, was Sie in der Schule gelernt haben:

carry row
 number1 
 number2
     ...
+   numX
--------
  result

Sie können hier so gut wie jede beliebige Anzahl von abschließenden Leerzeichen verwenden;)

Beispiele

50, 50

1
 50
+50
---
100


1651, 9879

1111
 1651
+9879
-----
11530

6489789, 9874, 287

   1122
 6489789
    9874
+    287
--------
 6499950
J Atkin
quelle
Visualisieren Sie lange Subtraktionen mit ASCII-Kunst: In 6 Monaten kommen Sie direkt zu Ihnen
CalculatorFeline
Nicht ganz, es ist auf meiner Liste;)
J Atkin
1
Eigentlich wurde mir beigebracht, die Tragereihe unter das Ergebnis zu stellen.
Neil
1
Wie sollen wir damit umgehen 9+9+9+9+9+9+9+9+9+9+9+9+9?
Downgoat
1
@ Downgoat ... you take from 2 to 9 numbers as input...
PurkkaKoodari

Antworten:

5

Pyth, 59 58 Bytes

L.[dJhl`eSQ`b:jk_.u/+NsYT.t_MjRTQ00\0djbyMPQXyeQ0\+*J\-ysQ

Probieren Sie es online aus. Testsuite.

Viel zu lang. Sollte mehr Golf spielen.

Erläuterung

L                  helper function y = lambda b:
        eSQ          largest number in input
      l`             length as string
     h               increment
    J                save to J
 .[d       `b        pad argument with spaces to that length

                             carry row:
                jRTQ           each input to base 10
              _M               reverse each result
            .t      0          transpose, padding with zeroes
    .u               0         cumulative reduce from 0:
         sY                      sum digits of column
       +N                        add previous carry
      /    T                     floor-divide by 10
   _                           reverse
 jk                            join by ""
:                     \0d      replace 0 by space

          number rows:
    PQ      all input numbers but last one
  yM        pad to correct length
jb          print on separate lines

           last number row:
  eQ         last input number
 y           pad to correct length
X   0\+      change first char to +

        separator row:
 J        width of input (saved in helper)
* \-      that many dashes

       result row:
 sQ      sum of inputs
y        pad to correct length
PurkkaKoodari
quelle
1

Batch, 326 Bytes

Die Byteanzahl enthält natürlich keine Erklärung.

@echo off
set t=%*                            Get the space separated parameters
set t=%t: =+%                       Change the spaces into + signs
set/at=%t%,l=p=1                    Add together, and initialise length and power
set c=                              Carry string
set d=-                             Dash string
:l                                  Loop though each power of 10
set/al+=1,p*=10,s=t/p               Divide the total by the power
for %%n in (%*)do set/as-=%%n/p     Subtract each parameter divided
set c=%s%%c%                        Anything left must have been carried
set d=-%d%                          Add a - to the line of dashes
if %p% leq %t% goto l               Keep going until we run out of powers
echo(%c:0= %                        Delete any zeros in the carry and output it
:i                                  Loop through each parameter
set n=%d:-= %%1                     Pad it with a whole bunch of spaces
call set n=%%n:~-%l%%%              Extract the rightmost characters
if "%2"=="" set n=+%n:~1%           Insert a + before the last parameter
echo %n%                            And output it
shift                               Move to the next parameter
if not "%1"=="" goto i              Until they are all consumed
echo %d%                            Output the line of dashes
echo  %t%                           Output the total (with an indent for the +)
Neil
quelle
0

JavaScript (ES6), 199 Byte

a=>[[...t=` `+a.reduce((t,n)=>t+n)].map((_,i)=>a.reduce((c,n)=>c-n[i],90+t[i])%10||` `),a=a.map(n=>(` `.repeat(l=t.length)+n).slice(-l))).join``,...a,`-`.repeat(l),t].join`\n`.replace(/ (?=.*\n-)/,`+`)

Wobei das erste \nein literales Zeilenumbruchzeichen darstellt, während das zweite eine aus zwei Zeichen bestehende Escape-Sequenz für reguläre Ausdrücke ist. Erläuterung:

a=>[                            Accept an array of numbers
 [...                           Split the total into digits
  t=` `+a.reduce((t,n)=>t+n)    Calculate the total and add a space
 ].map((_,i)=>a.reduce((c,n)=>  For each column
  c-n[i],90+t[i])               Subtract the column from the total
  %10||` `),                    Deduce the carry that was needed
  a=a.map(n=>                   For each input value
   (` `.repeat(l=t.length)+n)   Pad to the length of the total
    .slice(-l))                 Remove excess padding
 ).join``,                      Join the carries together
 ...a,                          Append the padded input values
 `-`.repeat(l),                 Append the dividing line
 t].join`\n`                    Append the total and join together
  .replace(/ (?=.*\n-)/,`+`)    Insert the + on the line above the -

Die Übertragsberechnungs funktioniert , indem die Gesamt digit ENTNAHME, prefixing 90, alle Eingangswert Ziffern in der Spalte subtrahiert, und wobei das Ergebnis modulo 10. (Das Präfix ist , 90statt , 9so dass die führende Spalte eine leere carry Raum erzeugt.)

Neil
quelle