แยกตัวเลขออกเป็นผลรวมของ repdigits


9

Repdigits เป็นตัวเลขของแบบฟอร์มa * (10^n - 1)/9ด้วย a in [-9,9]\{0}(ในคำอื่น ๆ 111, -3333, 66, ตัวเลขที่ทำโดยการทำซ้ำเพียงหนึ่งหลัก)

ประตู:เขียนโปรแกรมหรือฟังก์ชั่นซึ่งจะเป็นจำนวนเต็มบวกเดียวและภาพพิมพ์N N = s_1 + s_2 + ... + s_kควรมีหนึ่งหมายเลขต่อบรรทัดและหมายเลขจะต้องจัดชิดขวา ไม่มีการสรุปสองครั้งควรมีตัวเลขเท่ากันและไม่อนุญาตให้เพิ่มศูนย์ เอาต์พุตควรเรียงลำดับจากน้อยไปมากหรือมากไปน้อย (ตามจำนวนหลัก)

ตัวอย่าง:

in:
24192
out:
24192 =
22222 +
 2222 -
  222 -
   33 +
    3

in:
24192
out:
    -7
   -22
  +888
 +1111
+22222
=24192

in:
113
out:
113=    NOT  111+  no empty lines  111+
111+          00+                    
  2            2                     2

อย่างที่คุณเห็นมีหลายทางแก้และอนุญาตให้มีอิสระทางศิลปะบางอย่าง อนุญาตให้มีช่องว่างนำหน้าและต่อท้ายในแต่ละบรรทัด

จำนวนไบต์ที่สั้นที่สุดจะชนะ


คุณควรประกาศกฎบางอย่างเพื่อป้องกันเช่นเพียงแค่พิมพ์กฎN?
PurkkaKoodari

3
สิ่งนี้ถูกกล่าวถึงแล้ว: "ไม่มีการสรุปสองรายการควรมีจำนวนตัวเลขเท่ากัน"
nutki

ตัวเลขเหล่านี้เรียกว่า repdigits
Ypnypn

คำตอบ:


6

perl 5 - 97 92 93 86

$x=$_=pop;{printf"%15s
",$_;$_=$x,s!\d!//,$&!eg,$x-=$_,$i++?s/^\b/+/:s/^/=/;/0/||redo}

อินพุตที่กำหนดเป็นพารามิเตอร์:

$perl a.pl 2224192
     2224192
    =2222222
       +1111
        +888
         -22
          -7

มันจะไม่พิมพ์อะไรเลยถ้าจำนวนมี 0 ในนั้น อาจเป็น/0/เงื่อนไขการวนซ้ำ
feersum

ขอบคุณแน่นอนว่าเป็นกรณี ฉันสับสนตัวเองด้วยปุ่มลัดลัด พวกเขามีสภาพในตอนท้าย แต่ก็ยังตรวจสอบได้ที่การทำซ้ำครั้งแรก ฉันต้องมองหา "+0" แล้ว
nutki

ที่จริงผมสามารถจำลองการทำ ... ในขณะที่ () redoมีเพียงตัวละครตัวหนึ่งเป็นพิเศษโดยใช้
nutki

2

CJam, 55 50 ไบต์

'=l:L+Li{_W>"-+"=1$zs(\,)*+:Ii-L,_S*I+\~>\}h;]W%N*

ทดสอบที่นี่

ใช้รูปแบบเอาต์พุต

      -7
     -22
    +888
   +1111
+2222222
=2224192

ฉันอาจตีกอล์ฟนี้อีกครั้งเมื่อฉันถูกตี

คำอธิบาย:

'=l:L+Li{_W>"-+"=1$zs(\,)*+:Ii-L,_S*I+\~>\}h;]W%N*
'=                                                 "Push = character.";
  l:L                                              "Read STDIN and store in L.";
     +L                                            "Concatenate, push new copy of L.";
       i                                           "Convert to integer.";
        {                                 }h       "Do-while loop. Leaves the condition on the
                                                    stack. I will use the remainder for that.";
         _W>                                       "Duplicate remainder, compare with -1.";
            "-+"=                                  "Select appropriate sign character.";
                 1$                                "Copy remainder again.";
                   zs                              "Take abs() and convert to string.";
                     (                             "Shift off first digit.";
                      \                            "Swap with string.";
                       ,                           "Get length.";
                        )                          "Increment.";
                         *                         "Repeat digit that often.";
                          +                        "Concatenate with sign.";
                           :I                      "Store in I.";
                             i-                    "Convert to integer. Subtract from remainder.";
                                                   "Now we'll right-justify I.";
                               L,                  "Load input, get length.";
                                 _                 "Duplicate.";
                                  S*               "Repeat space that often.";
                                    I+             "Load string and concatenate.";
                                      \~           "Swap with length. Bitwise complement.";
                                        >          "Take that many characters from the right.";
                                         \         "Swap with remainder.";
                                            ;      "Discard final remainder (0).";
                                             ]     "Wrap in array.";
                                              W%   "Reverse.";
                                                N* "Join with line feeds.";

อาร์เรย์ผลลัพธ์จะถูกพิมพ์โดยอัตโนมัติเมื่อสิ้นสุดโปรแกรม


0

JavaScript ES6 - 145

i=0;f=n=>{return g=n<0,n=Math.abs(n)+'',l=n.length,r=l-1?n[0].repeat(l):n,(i>0?g?'-':'+':n+'=')+'\n'+' '.repeat(i++)+(l-1?r+f((+n-r)*(g?-1:1)):r)}

วางในคอนโซล Firefox f(24192)ทำงานเป็น

เอาท์พุทสำหรับf(24192):

24192=
22222+
 1111+
  888-
   22-
    7

ด้วยอินพุต55จะรวม 0 ในผลรวม (ซึ่งเป็นข้อบกพร่อง)
feersum

0

GolfScript 77

~.[{..0>2*(.@*`.,\[0=]*''+~*.@\-.}do;]-1%{[.0>' +'=\`n].1=,2$`,\-' '*\+}%'='@

ลิงค์สาธิตออนไลน์:

รุ่นเล็กน้อยอ่านได้มากขึ้น (ถ้า GolfScript สามารถเรียกอ่านได้) กับรุ่นทดสอบหน่วยสามารถใช้ได้ที่นี่

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