Menguraikan angka menjadi jumlah repdigits

9

Repdigits adalah angka dengan bentuk ( a * (10^n - 1)/9dengan a in [-9,9]\{0}kata lain 111, -3333, 66, angka yang dibuat dengan mengulang hanya satu digit)

Sasaran: Menulis program atau fungsi yang mengambil satu bilangan bulat positif Ndan mencetak N = s_1 + s_2 + ... + s_k. Seharusnya ada satu angka per baris dan angka-angka itu harus lurus. Tidak ada dua puncak harus memiliki jumlah digit yang sama dan menambahkan nol tidak diperbolehkan. Output harus dipesan dalam urutan menaik atau menurun (berdasarkan jumlah digit)

Contoh:

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

Seperti yang Anda lihat ada beberapa solusi dan beberapa kebebasan artistik diperbolehkan. Whitespace terkemuka dan tertinggal di setiap baris diizinkan

Hitungan byte terpendek menang

DenDenDo
sumber
Haruskah Anda mendeklarasikan beberapa aturan untuk mencegah misalnya hanya mencetak Nyang?
PurkkaKoodari
3
Ini sudah dibahas: "Tidak ada dua puncak harus memiliki jumlah digit yang sama"
nutki
Angka-angka ini juga disebut repdigits.
Ypnypn

Jawaban:

6

perl 5 - 97 92 93 86

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

Input diberikan sebagai parameter:

$perl a.pl 2224192
     2224192
    =2222222
       +1111
        +888
         -22
          -7
nutki
sumber
Itu tidak mencetak apa pun jika angka itu memiliki 0 di dalamnya. Mungkin itu adalah /0/kondisi pengulangan.
feersum
Terima kasih, memang itulah masalahnya. Saya bingung dengan loop pintas perl. Mereka memiliki kondisi pada akhirnya tetapi masih memeriksanya pada iterasi pertama. Saya harus mencari "+0" kalau begitu.
nutki
Sebenarnya saya bisa mensimulasikan do ... while () dengan hanya menggunakan satu karakter tambahan redo.
nutki
2

CJam, 55 50 byte

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

Uji di sini.

Menggunakan format output

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

Saya mungkin bermain golf ini lagi setelah saya dipukuli.

Penjelasan:

'=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.";

Array yang dihasilkan dicetak secara otomatis di akhir program.

Martin Ender
sumber
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)}

Rekatkan ke konsol Firefox. Jalankan sebagai f(24192).

Output untuk f(24192):

24192=
22222+
 1111+
  888-
   22-
    7
Scimonster
sumber
Dengan input 55itu termasuk 0 dalam jumlah (yang merupakan bug).
feersum
0

GolfScript 77

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

Tautan demo online:

Versi yang sedikit lebih mudah dibaca (jika GolfScript bisa disebut terbaca) dengan versi unit test tersedia di sini .

Cristian Lupascu
sumber