Bir sayıyı toplam repdigitlere ayırın


9

Repdigits, formun a * (10^n - 1)/9sayılarıdır a in [-9,9]\{0}(başka bir deyişle 111, -3333, 66, yalnızca bir rakam tekrarlanarak yapılan sayılar)

Amaç: Tek bir pozitif tam sayı alan Nve yazdırılan bir program veya işlev yazın N = s_1 + s_2 + ... + s_k. Her satırda bir sayı olmalıdır ve sayıların sağa hizalanması gerekir. Hiçbir iki özet aynı sayıda basamağa sahip olmamalı ve sıfır eklenmesine izin verilmez. Çıktı, artan veya azalan sırada sıralanmalıdır (rakam sayısına göre)

Örnekler:

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

Gördüğünüz gibi birden fazla çözüm olabilir ve bazı sanatsal özgürlüklere izin verilir. Her satırda öndeki ve sondaki boşluklara izin verilir

En kısa bayt sayısı kazanır


Önlemek için bazı kurallar açıklamalı Nmısın?
PurkkaKoodari

3
Bu zaten kapsanmıştır: "Hiçbir iki toplam aynı sayıda basamak
içermemelidir

Bu sayılara repdigits de denir.
Ypnypn

Yanıtlar:


6

perl 5 - 97 92 93 86

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

Parametre olarak verilen giriş:

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

Sayıda 0 varsa hiçbir şey yazdırmaz. Belki /0/döngüsel durumdur.
feersum

Teşekkürler, gerçekten de durum böyle. Perl kısayol döngüleriyle kendimi karıştırdım. Sonunda şart var ama yine de ilk iterasyonda kontrol et. O zaman "+0" ı aramalıyım.
nutki

Aslında ben sadece bir ekstra karakter kullanarak do ... while () simüle edebilirsiniz redo.
nutki

2

CJam, 55 50 bayt

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

Burada test edin.

Çıktı formatını kullanır

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

Dövüldükten sonra bu golf daha olabilir.

Açıklama:

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

Ortaya çıkan dizi, programın sonunda otomatik olarak yazdırılır.


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 konsoluna yapıştırın. Farklı çalıştır f(24192).

Çıktı f(24192):

24192=
22222+
 1111+
  888-
   22-
    7

Girdi ile 55toplamda 0 (bir hata) içerir.
feersum

0

GolfScript 77

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

Çevrimiçi demo bağlantıları:

Birim testleri sürümü ile biraz daha okunabilir bir sürüm (GolfScript okunabilir olarak adlandırılabilirse) burada mevcuttur .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.