Hình dung bổ sung dài với nghệ thuật ASCII


13

Hoàn toàn không lấy cảm hứng từ Visualize phân chia dài với nghệ thuật ASCII ;)

Công việc của bạn là thể hiện sự bổ sung lâu dài với nghệ thuật ASCII. Bạn giải quyết bổ sung thủ công bằng cách thêm các cột từ phải sang trái, đặt giá trị của các vị trí trong kết quả và mang hàng chục vị trí lên trên cùng của cột tiếp theo.

Đầu vào

Đầu vào về cơ bản có thể ở bất kỳ định dạng nào bạn muốn, chỉ cần bạn lấy từ 2 đến 9 số làm đầu vào.

Đầu ra

Định dạng ở đây có thể phù hợp với cách bạn học nó ở trường:

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

Bạn có thể có khoảng bất kỳ khoảng trắng dấu vết nào bạn muốn ở đây;)

Ví dụ

50, 50

1
 50
+50
---
100


1651, 9879

1111
 1651
+9879
-----
11530

6489789, 9874, 287

   1122
 6489789
    9874
+    287
--------
 6499950

Hình dung phép trừ dài với nghệ thuật ASCII: Đến thẳng với bạn sau 6 tháng
CalculatorFeline

Không hoàn toàn, nó nằm trong danh sách của tôi;)
J Atkin

1
Trên thực tế, tôi đã được dạy để đặt hàng thực hiện theo kết quả.
Neil

1
Chúng ta nên xử lý 9+9+9+9+9+9+9+9+9+9+9+9+9như thế nào?
Hạ cấp

1
@Downgoat ... you take from 2 to 9 numbers as input...
PurkkaKoodari

Câu trả lời:


5

Pyth, 59 58 byte

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

Hãy thử trực tuyến. Bộ thử nghiệm.

Con đường quá dài. Nên chơi golf nhiều hơn.

Giải trình

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

1

Mẻ, 326 byte

Số lượng byte không bao gồm giải thích, tất nhiên.

@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 +)

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-)/,`+`)

Trong đó cái đầu tiên \nđại diện cho một ký tự dòng mới, trong khi cái thứ hai là một chuỗi thoát regrec hai ký tự. Giải trình:

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 -

Tính toán mang theo hoạt động bằng cách lấy tổng số chữ số, tiền tố 90, trừ tất cả các chữ số giá trị đầu vào trong cột đó và lấy modulo kết quả 10. (Tiền tố 90thay 9vì để cột dẫn đầu tạo không gian mang trống.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.