เห็นภาพการเพิ่มความยาวด้วย ASCII art


13

ไม่ได้รับแรงบันดาลใจโดยสิ้นเชิงจากการเห็นภาพการหารยาวด้วยศิลปะ ASCII ;)

งานของคุณคือการแสดงเพิ่มเติมด้วย ASCII art คุณแก้ปัญหาการเพิ่มในระยะยาวได้โดยการเพิ่มคอลัมน์จากขวาไปซ้ายวางค่าของตำแหน่งที่อยู่ในผลลัพธ์และถือสิบตำแหน่งไว้ที่ด้านบนของคอลัมน์ถัดไป

อินพุต

อินพุตสามารถมาในรูปแบบใดก็ได้ตามที่คุณต้องการตราบใดที่คุณรับตัวเลข 2 ถึง 9 เป็นอินพุต

เอาท์พุต

การจัดรูปแบบที่นี่น่าจะตรงกับที่คุณเรียนในโรงเรียน:

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

คุณสามารถมีช่องว่างต่อท้ายที่คุณต้องการได้ที่นี่;)

ตัวอย่าง

50, 50

1
 50
+50
---
100


1651, 9879

1111
 1651
+9879
-----
11530

6489789, 9874, 287

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

เห็นภาพการลบแบบยาวด้วยศิลปะ ASCII: มาตรงถึงคุณใน 6 เดือน
เครื่องคิดเลข

ไม่มากเลยมันอยู่ในรายชื่อของฉัน;)
J Atkin

1
ที่จริงฉันถูกสอนให้วางแถวหิ้วใต้ผล
Neil

1
เราควรจัดการ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

คำตอบ:


5

Pyth, 59 58 ไบต์

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

ลองออนไลน์ ชุดทดสอบ

ทางยาวเกินไป ควรตีกอล์ฟให้มากขึ้น

คำอธิบาย

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

แบตช์ 326 ไบต์

จำนวนไบต์ไม่รวมคำอธิบายแน่นอน

@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 ไบต์

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

โดยที่ตัวแรก\nแสดงถึงอักขระบรรทัดใหม่ตามตัวอักษรในขณะที่ตัวที่สองคือลำดับการยกเว้น regexp สองตัวอักษร คำอธิบาย:

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 -

การคำนวณการพกพาทำงานโดยการใช้ตัวเลขทั้งหมด, การเติมหน้า90, การลบตัวเลขค่าอินพุตทั้งหมดในคอลัมน์นั้นและการมอดูโลผลลัพธ์ 10 (คำนำหน้านั้น90แทนการใช้9เพื่อให้คอลัมน์นำสร้างช่องว่างว่าง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.