Perluas beberapa nomor

23

Tantangan ini didasarkan pada pertanyaan Stackoverflow ini .

Dengan angka positif sebagai input, output sebagai jumlah dari setiap digit dikalikan dengan representasi power-of-10-nya.

Memasukkan

Suatu angka, sebagai bilangan bulat, string atau daftar angka / karakter.

  • Jumlahnya akan sangat positif.
  • Jika Anda menerima nomor sebagai string atau daftar, itu tidak akan dimulai dengan a 0.

Keluaran

Sebuah string yang mewakili jumlah dari masing-masing basis-10 digit yang relevan, masing-masing dikalikan dengan kekuatan basis-10 masing-masing. Jumlah direpresentasikan sebagai a + b. Anda dapat menggunakan hingga satu ruang di sekitar setiap sisi +tanda jika Anda mau. Operan terdaftar dalam urutan menurun.

  • 0 tidak akan pernah bisa menjadi operan yang valid.
  • The +tanda (dikelilingi atau tidak dengan spasi) mungkin bukan bagian terkemuka atau trailing.

Contohnya

Input       Output
12          10 + 2
         or 10+2
         or 10 +2
         or 10+ 2
9           9
123         100 + 20 + 3
10          10
101         100 + 1

Output tidak valid

2           1 + 1
10          10 + 0
1           0 + 1
12          + 10 + 2
12          10 + 2 +
12          2 + 10

Ini adalah kode-golf sehingga kode terpendek dalam byte menang!

Olivier Grégoire
sumber
Sandbox
Olivier Grégoire
Terkait
caird coinheringaahing
Bisakah kita mengeluarkan jumlah secara terbalik? Ex. 123 = 3 + 20 + 100
Quintec
1
Apakah ruang memimpin dan tertinggal diizinkan?
ngn
2
Berapa output yang diharapkan untuk input 0? (Jika 0 adalah input yang tidak valid di tempat pertama, maka itu harus dihapus dari contoh output yang tidak valid IMO)
Pedro A

Jawaban:

11

Python 3: 83 80 79 Bytes

Cobalah secara Online!

Pengiriman Golf Code pertama saya.

t=input();x=len(t);print(*[t[i]+'0'*(x+~i)for i in range(x)if'0'<t[i]],sep='+')

-3 Bytes by ovs. Terima kasih atas tip yang bermanfaat :) -4 Bytes oleh mypetlion. Terima kasih atas tip pemendeknya :)

Gareth Ma
sumber
Selamat datang di PPCG! Anda dapat meningkatkan skor Anda dengan menyusun ulang pernyataan if Anda menjadi if'0'<t[i]dan mengubah formula Anda dari x-i-1menjadi x+~i. Berikut ini adalah tautan TIO dengan perubahan langkah demi langkah.
ovs
Ubah printpernyataan menjadi print(*[t[i]+'0'*(x+~i)for i in range(x)if'0'<t[i]],sep='+')untuk menyimpan 1 byte.
mypetlion
10

Jelly , 9 byte

ḊƬḌQIAj”+

Cobalah online!

Bagaimana itu bekerja

ḊƬḌQIAj”+  Main link. Argument: A (digit array)

 Ƭ         Til; apply the link to the left until the results are no longer unique.
           Return all unique results.
Ḋ              Dequeue; discard the first element.
           For input [1,2,0,4], this yields [[1,2,0,4], [2,0,4], [0,4], [4], []].
  Ḍ        Undecimal; convert the digit arrays into integers.
           For input [1,2,0,4], this yields [1204, 204, 4, 4, 0].
   Q       Unique; deduplicate the resulting integers.
           For input [1,2,0,4], this yields [1204, 204, 4, 0].
    I      Increments; yield the forward differences.
           For input [1,2,0,4], this yields [-1000, -200, -4].
     A     Absolute value.
      j”+  Join with separator '+'.
Dennis
sumber
3
Pendekatan cerdas!
Quintec
8

JavaScript (ES6), 47 byte

Mengambil input sebagai integer.

f=(n,m=1,k=n%m)=>n-k?f(n-k,m*10)+(k?'+'+k:''):n

Cobalah online!

Berkomentar

f = (                     // f is a recursive function taking:
  n,                      //   n = number to process
  m = 1,                  //   m = modulo (a power of 10, starting at 1)
  k = n % m               //   k = n mod m
) =>                      //
  n - k ?                 // if n is not equal to k:
    f(n - k, m * 10)      //   do a recursive call with n - k and m * 10
    + (k ? '+' + k : '')  //   if k is not zero: append '+' and k
  :                       // else:
    n                     //   append n and stop recursion
Arnauld
sumber
7

R , 55 byte

Dengan asumsi integer semuanya di bawah 1e10, yang lebih besar dari integer maksimum 32 bit ...

function(n,p=10^(9:0),x=p*n%/%p%%10)cat(x[!!x],sep='+')

Cobalah online!

J.Apakah
sumber
Nah, 10^(nchar(n):1-1secara teori akan bekerja untuk bilangan bulat apa pun ...
Giuseppe
1
Ya, tapi lihat semua byte ekstra itu!
J.Doe
7

Bahasa Pemrograman Shakespeare , 807 806 805 804 byte

,.Ajax,.Ford,.Page,.Act I:.Scene I:.[Enter Ajax and Ford]Ford:Listen tothy!Scene V:.Ajax:Remember the remainder of the quotient between I twice the sum of a cat a big big cat.You be the sum of you a cat.Ford:You be the quotient between you twice the sum of a cat a big big cat.Be you nicer zero?If solet usScene V.You be I.Scene X:.Ajax:Recall.Be you worse a cat?If solet usScene D.[Exit Ford][Enter Page]Ajax:Be you nicer zero?If sospeak thy.You be the sum of a big big big big cat the cube of the sum of a cat a big cat.[Exit Page][Enter Ford]Ajax:Open heart.Remember I.You zero.Scene L:.Ajax:Am I nicer a cat?If notlet usScene C.Open heart.Ford:You be the sum of you a pig.Let usScene L.Scene C:.Ajax:Recall.Ford:You be I.Scene D:.Ford:You be the sum of you a pig.Be you nicer zero?If solet usScene X.

Cobalah online!

-23 byte jika karakter nol dapat di-output terlebih dahulu

,.Ajax,.Ford,.Page,.Act I:.Scene I:.[Enter Ajax and Ford]Ford:Listen tothy!Scene V:.Ajax:Remember the remainder of the quotient between I twice the sum of a cat a big big cat.You be the sum of you a cat.Ford:You be the quotient between you twice the sum of a cat a big big cat.Be you nicer zero?If solet usScene V.You be I.Scene X:.Ajax:Recall.Be you worse a cat?If solet usScene D.[Exit Ford][Enter Page]Ajax:Speak thy.You be the sum of a big big big big cat the cube of the sum of a cat a big cat.[Exit Page][Enter Ford]Ajax:Open heart.Remember me.You zero.Scene L:.Ajax:Am I nicer a cat?If notlet usScene C.Open heart.Ford:You be the sum of you a pig.Let usScene L.Scene C:.Ajax:Recall.Ford:You be I.Scene D:.Ford:You be the sum of you a pig.Be you nicer zero?If solet usScene X.

Penjelasan

,.Ajax,.Ford,.Page,.Act I:.Scene I:.[Enter Ajax and Ford]

    Boilerplate, introducing the characters.

Ford:Listen tothy!

    Input a value to Ajax.

Scene V:.Ajax:Remember the remainder of the quotient between I twice the sum of a cat a big big cat.You be the sum of you a cat.Ford:You be the quotient between you twice the sum of a cat a big big cat.Be you nicer zero?If solet usScene V.

    Push the digits of Ajax onto Ford's stack, and set Ford's value to be the number of digits in Ajax.

You be I.

    Store the number of digits in the input to Ajax.

Scene X:.Ajax:Recall.Be you worse a cat?If solet usScene D.

    Pop the next digit off the stack, and skip processing it if it equals 0.

[Exit Ford][Enter Page]Ajax:Be you nicer zero?If sospeak thy.You be the sum of a big big big big cat the cube of the sum of a cat a big cat.[Exit Page][Enter Ford]

    All characters start out with a value of 0.
    If Page is 0, that means this is the first number being processed, and we shouldn't output a plus.
    In either case, store the ASCII value of "+" to Page to output next time it is needed.

Ajax:Open heart.Remember I.You zero.

    Output the digit, save the remaining-digit-count for later, and store 0 to Ford for output purposes.

Scene L:.Ajax:Am I nicer a cat?If notlet usScene C.Open heart.Ford:You be the sum of you a pig.Let usScene L.

    Output one fewer 0 than the number of remaining digits to process.

Scene C:.Ajax:Recall.Ford:You be I.

    Store the remaining-digit-count back into Ajax.

Scene D:.Ford:You be the sum of you a pig.Be you nicer zero?If solet usScene X.

    Subtract 1 from the remaining-digit-count, and loop back until there are no more digits left to process.
JosiahRyanW
sumber
6

Python 2 , 64 byte

f=lambda s='',*x:s and(s>'0')*(s+'0'*len(x)+(f(*x)and'+'))+f(*x)

Cobalah online!


Python 2 , 66 byte

f=lambda n,m=1:n>10and f(n/10,m*10)+(n%10>0)*('+'+`n%10*m`)or`n*m`

Cobalah online!

ovs
sumber
6

Jelly ,  12  11 byte

J’⁵*Ṛ×ḟ0j”+

Program lengkap yang menerima nomor sebagai daftar digit (dalam format Python) yang mencetak hasilnya.

Cobalah online!

Bagaimana?

J’⁵*Ṛ×ḟ0j”+ - Main Link: list of digits  e.g. [1,0,2,0,3,0]
J           - range of length                 [1,2,3,4,5,6]
 ’          - decrement (vectorises)          [0,1,2,3,4,5]
  ⁵         - literal 10                      10
   *        - exponentiate (vectorises)       [1,10,100,1000,10000,100000]
    Ṛ       - reverse                         [100000,10000,1000,100,10,1]
     ×      - multiply (vectorises)           [100000,0,2000,0,30,0]
      ḟ0    - filter discard zeros            [100000,2000,30]
        j”+ - join with '+'                   [100000,'+',2000,'+',30]
            - implicit (smashing) print       "100000+2000+30"

Sebelumnya @ 12 byte:

Ḣ;0€ƊÐƤẸƇj”+
Jonathan Allan
sumber
5

Haskell, 60 54 byte

Edit: -6 bytes berkat Delfad0r.

tail.(>>=('+':)).filter(>="1").scanr((.('0'<$)).(:))""

Mengambil nomor input sebagai string.

Cobalah online!

    scanr(        )""    -- starting with the empty string fold from the right and
                         -- collect the intermediate results in a list
      (.('0'<$)).(:)     -- non pointfree: \d s -> d : ('0'<$s)
                         -- i.e. take the next digit 'd' and append the current result
                         -- from the scanr where each char is replaced by 0
                         --
                         -- e.g. "103" -> ["100","00","3"]
                         --
  f ilter(>="1")         -- keep only elements that have not a 0 as the first char
 (>>=('+':))             -- prepend a + to each element and flatten into
                         -- a single list
tail                     -- drop the first char, ie.e the leading +
nimi
sumber
2
tail.(>>=('+':)).filter(>="1").scanr((.('0'<$)).(:))""hemat 6 byte Cobalah online! .
Delfad0r
1
@ Delfad0r: bagus, terima kasih banyak!
nimi
4

05AB1E , 10 byte

Implementasi lurus ke depan.
Input sebagai daftar digit.

āR<°*0K'+ý

Cobalah online!

Penjelasan

    *        # multiply each digits in the input with
āR<°         # 10^(len(input)-1-index)
     0K      # remove results that are zero
       '+ý   # merge on "+"
Emigna
sumber
4

Python 2 , 64 byte

lambda n:'+'.join(`b`+~e*'0'for e,b in enumerate(n,-len(n))if b)

Fungsi yang tidak disebutkan namanya yang mengambil daftar digit, n ,, dan mengembalikan sebuah string.

Cobalah online!

enumerate(n)akan menghasilkan tupel dari index, itemseberangn dengan indeks mulai dari 0.

Namun enumeratejuga mengambil indeks awal opsional sebagai argumen kedua, dengan menetapkan ini untuk -len(n)kita mendapatkan indeks ( es) dari -len(n),-len(n)+1 , ..., -1.

Ini berarti jumlah nol yang diperlukan untuk setiap item ( b) adalah -1-e, yang ~edemikian ~e*'0' mendapat nol membuntuti diperlukan.

`b`mendapat representasi string dari angka integer bdan +menyatukan ini dengan nol tersebut.

if bmemfilter entri dengan b==0.

'+'.join(...)kemudian gabungkan string yang dihasilkan dengan +karakter.

Jonathan Allan
sumber
4

Python 2, 82 73 71 byte

-9 byte terima kasih kepada @ovs

-2 byte terima kasih kepada @JonathanAllan

lambda n:'+'.join(v+'0'*(len(`n`)-i)for i,v in enumerate(`n`,1)if'0'<v)

Cobalah secara Online

Don Thousand
sumber
4

Haskell , 56 55 52 byte

-4 byte terima kasih kepada nimi .

tail.f
f('0':x)=f x
f(d:x)='+':d:('0'<$x)++f x
f x=x

Cobalah online!


penjelasan

g :: String -> String

-- drop the first char (the leading +) from f
g = tail.f

f :: String -> String

-- if the first digit is 0, continue with the rest of the number
f ( '0' :rest) = f rest

-- otherwise, add a +, the digit and as many 0s as there are digit in the rest.
f (digit:rest) = '+' : digit : ('0' <$ rest) ++ f rest

-- if there is no digit left, return the empty string
f "" = ""

Cobalah online!

ovs
sumber
3

Perl 6 , 38 byte

{join '+',grep +*,($_ Z~[R,] 0 Xx^$_)}

Cobalah online!

Blok kode anonim yang mengambil daftar angka dan mengembalikan string.

Penjelasan:

{                                    }  # Anonymous code block
                   $_ Z~   # Zip concatenate the list of digits with
                        [R,] 0 Xx^$_   # The correct number of 0s

          grep +*,(                 )  # Filter out all all the 0 values
 join '+',   # And join with '+'s
Jo King
sumber
3

APL (Dyalog), 46 41 40 byte

{¯1↓∊{'0'=⊃⍵:⍬⋄⍵}¨⍵,¨('0'⍴⍨¨⌽⍳≢⍵),¨'+'}

-5 byte terima kasih kepada @dzaima

Fungsi awalan anonim. Mengambil input sebagai string. TIO

(Ini adalah pertama kalinya saya menggunakan APL di PPCG, mungkin golf. Juga, kutukan kamu, nol!)

Quintec
sumber
41 byte dengan⎕IO←0
dzaima
3

Retina , 19 byte

|'+L$`[1-9]
$&$.'*0

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

L`[1-9]

Daftar semua digit bukan nol

$
$&$.'*0

Untuk setiap digit, tambahkan angka nol sebanyak ada digit tambahan.

|'+

Pisahkan setiap hasil dengan +s alih-alih baris baru default.

Retina 0.8.2 , 21 byte

M&!`[1-9].*
\B.
0
¶
+

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

M&!`[1-9].*

Daftar semua sufiks input yang dimulai dengan digit non-nol.

\B.
0

Ganti semua digit trailing dengan nol.

¶
+

Gabung hasilnya dengan +s.

Neil
sumber
3

C (gcc) , 71 69 byte

Setiap langkah fungsi rekursif mengurangi bagian yang akan dicetak dan melewati sisa nomor.

Terima kasih kepada ceilingcat untuk sarannya.

g(v,c,w){v&&printf("+%d"+!g(v-w,c*10)+!w*3,w=v%c);w=v;}f(v){g(v,10);}

Cobalah online!

ErikF
sumber
3

Brachylog , 35 32 byte

l⟧₅;?z{tℕ₁I&h;10↔^;I×ṫ}ˢ;"+"zckc

-3 byte menyebabkan 0 bukan input yang valid

Cobalah online! atau testuite

Penjelasan

                                    #   implicit input          eg  105
l                                   #   length of input             3
 ⟧₅                                 #   descending range ]n,0]      [2, 1, 0]
   ;?                               #   pair with input             [[2, 1, 0], [105]]
     z                              #   zip (considers numbers as array of digits)
                                    #                               [[2, 1], [1, 0], [0, 5]]
      {               }ˢ            #   select (map and filter)     [2, 1]  |   [1, 0]  |   [0, 5]
       t                            #       tail (last element)     1       |   0       |   5
        ℕ₁                          #       is at least 1           1       |   fail    |   5
          I                         #       store in I
           &h                       #       head of input           2       |           |   0
             ;10↔                   #       pair with 10 & reverse  [10, 2] |           |   [10, 0]
                 ^                  #       power                   100     |           |   1
                  ;I                #       pair with I             [100, 1]|           |   [1, 5]
                    ×               #       multiply                100     |           |   5
                     ṫ              #       to string               "100"   |           |   "5"
                        ;"+"        #   pair with "+"               [["100", "5"], "+"]
                            z       #   zip (cycles shorter)        [["100", "+"], ["5", "+"]]
                             c      #   concat (flattens)           ["100", "+", "5", "+"]
                              k     #   knife (remove last)         ["100", "+", "5"]
                               c    #   concat                      "100+5"
Kroppeb
sumber
OP sekarang telah menetapkan bahwa 0 bukan input yang harus Anda tangani, sehingga Anda dapat menghapusnya |∧Ṡdari akhir. :)
DLosc
3

Brachylog v2, 15 byte

~+bᵛ⁰↔;"+"zckwᵐ

Cobalah online!

Sangat, sangat tidak efisien.

Entah bagaimana, ini berhasil menggunakan hanya 6 byte pada apa yang ada dalam kebanyakan bahasa bagian yang sulit (membelah nomor ke dalam formulir yang 10 b di mana suatu adalah satu digit, dalam urutan), dan seluruh 9 byte untuk "bergabung dengan+ "(yang merupakan bawaan dalam sebagian besar bahasa golf, tetapi tidak untuk Brachylog).

Tidak seperti kebanyakan pengiriman Brachylog saya (yang merupakan fungsi), ini adalah program lengkap, mengambil input dari input standar dan menghasilkan output pada output standar.

Penjelasan

~+bᵛ⁰↔;"+"zckwᵐ
~+               Find an additive partition of the input number
   ᵛ               such that each component of the partition,
  b                when the first digit is removed
    ⁰              is equal to 0;
     ↔           reverse it,
      ;"+"z      pair every element with "+",
           c     flatten the resulting list one level,
            k    remove the last element (i.e. the final "+"),
             w   and print
              ᵐ  each remaining element.

(Alasannya wᵐdigunakan daripada yang lebih normalc adalah bahwa kita berhadapan dengan daftar yang heterogen - berisi daftar angka dan string - dan daripada membiarkannya untuk bercampur, lebih mudah untuk hanya mencetak semuanya secara individu.)

Algoritma di sini brute-force atas semua partisi aditif input sampai menemukan yang cocok (!). Brachylog lebih memilih mempartisi menjadi beberapa kemungkinan, dan dengan kemungkinan yang diurutkan dalam urutan naik, sehingga solusi pertama yang akan ditemukannya adalah kebalikan dari solusi yang ditanyakan oleh pertanyaan itu. Jadi kita hanya perlu membalikkannya untuk mendapatkan solusi yang kita inginkan.

ais523
sumber
2

Bersih , 73 byte

import StdEnv,Text
$n=join"+"[rpad{c}(size n-p)'0'\\c<-:n&p<-[0..]|c>'0']

Cobalah online!

Menentukan fungsi $ :: String -> Stringmengambil string dan mengembalikan string.

Suram
sumber
2

Attache , 37 byte

Join&"+"@{Id\`-&>Pairs[_'0]}@Suffixes

Cobalah online!

Versi pointfree (41 byte): Join&"+"##`\&:Id##`-&>Pairs@`'&0@Suffixes

Penjelasan

Join&"+"@{Id\`-&>Pairs[_'0]}@Suffixes      input e.g.: 1203
                             Suffixes      take the suffixes of the input digit
                                           e.g.: [1203, 203, 3, 3] 
         {                 }@              apply the inner lambda to the suffixes:
                       _'0                   append `0`
                                             e.g.: [1203, 203, 3, 3, 0]
                 Pairs[   ]                  generate the pairs of integers of the above
                                             e.g.: [[1203, 203], [203, 3], [3, 3], [3, 0]]
             `-&>                            subtraction over each pair
                                             e.g.: [1000, 200, 0, 3]
          Id\                                keep only truthy (nonzero) elements
                                             e.g.: [1000, 200, 3]
Join&"+"@                                  join the result by `+`
                                           e.g.: "1000+200+3"
Conor O'Brien
sumber
2

C (gcc), 87 byte

j;k;f(x){for(j=1;j<x;j*=10);for(;k=x*10/j*j/10%j,j/=10;)k&&printf("%d%c",k,j-1?43:10);}

Cobalah online!

pizzapants184
sumber
2

Powershell, 55 52 byte

$i=$args.Count;($args|%{$_+'0'*--$i}|?{+$_})-join'+'

Script mengharapkan array string, setiap string berisi satu digit. Skrip uji:

$f = {

$i=$args.Count;($args|%{$_+'0'*--$i}|?{+$_})-join'+'

}

@(
    ,('10','1','0')
    ,('10+2','1','2')
    ,('9','9')
    ,('100+20+3','1','2','3')
    ,('100+1','1','0','1')
) | % {
    $e, $a = $_
    $r = &$f @a
    "$($e-eq$r): $(-join$a)=$r"
}

Keluaran:

True: 10=10
True: 12=10+2
True: 9=9
True: 123=100+20+3
True: 101=100+1
mazzy
sumber
2

Japt , 13 byte

Mengambil input sebagai array angka.

í*¡ApYÃw)f q+

Cobalah


Penjelasan

í                 :Interleave
  ¡               :  Map input
   A              :    10
    p             :    To the power of
     Y            :    The current 0-based index
      Ã           :  End map
       w          :  Reverse
 *                :  Reduce each pair by multiplication
        )         :End interleaving
         f        :Filter (remove 0s)
           q+     :Join with "+"

Alternatif

Mengambil input sebagai array string digit.

ËúTUÊ-EÃfn q+

Cobalah

Shaggy
sumber
2

Java 10, 82 78 byte

n->f(n,1)Object f(int n,int m){return m<n?f(n-n%m,m*10)+(n%m>0?"+"+n%m:""):n;}

Port of Arnauld 's JavaScript (ES6) menjawab .
-2 byte terima kasih kepada @ceilingcat .
-2 byte terima kasih kepada Arnauld .

Cobalah online.

Penjelasan:

n->                      // Method with int parameter & Object return-type
  f(n,1)                 //  Call the recursive method with `n` and 1

Object f(int n,int m){   // Recursive method with 2 int parameters & Object return-type
  return m<n?            //  If `m` is smaller than `n`:
          f(n-n%m,m*10)  //   Do a recursive call with `n-n%m` and `m` multiplied by 10
          +(n%m>0?       //   And if `n` is not divisible by `m`:
            "+"          //    Append a "+"
            +n%m         //    As well as `n%m`
           :             //   Else:
            "")          //    Append nothing more
         :               //  Else:
          n;}            //   Simply return the input `n`
Kevin Cruijssen
sumber
Saya kira jawaban ini juga akan menjadi jawaban yang valid untuk pertanyaan awal . :) (Mungkin dengan n%mditugaskan ke variabel untuk dibaca.)
Arnauld
1
Bagus! Solusi asli saya adalah 91 byte.
Olivier Grégoire
1
@ceilingcat Sebenarnya, m<nharus bekerja.
Arnauld
2

SNOBOL4 (CSNOBOL4) , 134 133 129 byte

	N =INPUT
	S =SIZE(N) - 1
V	N LEN(X) LEN(1) . V	:F(O)
	O =GT(V) O V DUPL(0,S - X) '+'
	X =X + 1	:(V)
O	O ARB . OUTPUT RPOS(1)
END

Cobalah online!

Menyimpan seluruh byte dengan melakukan pemrosesan string daripada aritmatika!

Giuseppe
sumber
2

sed -E ,109 99 97 75 74 byte

h;s:.:0:g;G
:l;s:.(.*)\n(.)(.*)\+?(.*):\1\n\3+\4\2\1:;tl
s:\+0+::g;s:..?::

Setiap baris input dianggap sebagai nomor terpisah. Cobalah online .

Penjelasan:

h;                                           | copy the original string to the temporary buffer
  s:.:0:g;                                   | substitute all digits with zeroes
          G                                  | append the original string to the substituted one
                                             |
:l;                                          | main loop start
   s:.(.*)\n(.)(.*)\+?(.*):\1\n\3+\4\2\1:;   | cut the next digit from the number, append with zeroes and add to the back
                                          tl | loop if the substitution hasn`t converged yet
                                             |
s:\+0+::g;                                   | remove all zero terms
          s:..?::                            | remove \n and the first +, if any

… Saya bisa bermain golf lebih lanjut, saya kira.

hidefromkgb
sumber
Halo dan selamat datang di PPCG. Jawaban Anda terlihat baik, meskipun saya tidak mengerti mengapa Anda menambahkan BADC0FFEE test case. Saya pikir tantangannya hanya tentang representasi desimal.
Jonathan Frech
Anda tidak perlu menangani 01010101010atau 000000, sesuai dengan spec tantangan. Apakah itu menyimpan byte?
Dennis
@ Dennis Kemungkinan besar tidak, karena memimpin nol dan yang di antara berperilaku sama, jadi saya harus menghapusnya.
hidefromkgb
2

Brainfuck, 147 byte

>>+[[<]>+[>],]-[>+>+<<-----]>--->--------<<<[<]>---[[<+<+>>-]<[>+<-]>>.<<<[>>[>]>.<<[<]<-]>>[>]>>.<<<[<]>>>[<[-]>[<+>-]>]>[<+>-]>[<+>-]<<<<[<]>-]>.

Cobalah online! (Anda harus mencentang kotak yang bertanda "!" Dan ketik input Anda setelah "!" Pada baris kedua kode, jika tidak maka akan terus meminta input selamanya.)

Mungkin tidak akan menjadi jawaban terpendek atau golf sesingkat mungkin, tapi cukup menyenangkan untuk mencoba dan melakukan ini di Brainfuck jadi saya mungkin juga mempostingnya.

Seperti yang ditunjukkan oleh @JoKing, program ini tidak menghapus 0's. Saya akan mencoba dan memperbaiki ini tetapi mungkin cukup sulit.

Penjelasan:

>>+[[<]>+[>],]                            Takes inputs and records the amount of them
-[>+>+<<-----]>--->--------               Sets the next 2 cells to 48 (0) and 43 (plus)
<<<[<]>---                                Returns to the start and corrects the number of inputs
                                          Loop
[[<+<+>>-]<[>+<-]>>.                      Prints the first number
<<<[>>[>]>.<<[<]<-]                       Prints the correct number of 0's
>>[>]>>.                                  Prints plus
<<<[<]>                                   Returns to the first cell
>>[<[-]>[<+>-]>]>[<+>-]>[<+>-]<<<<[<]>-]  Removes the first number and shifts everything up by one to make the second number the first 
                                          Loops until on last number
>.                                        Prints last number
Baik
sumber
Maaf, tetapi ini tidak menghapus nol seperti yang ditentukan. Cobalah online!
Jo King
Terima kasih, saya tidak menyadarinya. Saya akan mencoba dan memperbaikinya. Sementara saya, saya akan mengedit posting saya
FinW
2

APL (Dyalog Unicode) , 20 byte

{⍵'+'⍺}/0~⍨(10×⊢)\∘

Cobalah online!

Mengambil input sebagai vektor digit. Keluaran dengan spasi sebelum dan sesudah masing-masing +, dan termasuk jumlah variabel ruang terkemuka.

Ini kereta. Ini dibagi menjadi yang berikut.

  ┌───┴───┐
  /     ┌─┼──┐
┌─┘     0   
{⍵'+'⍺} ┌─┘ ┌┴┐
        ~   \ 
          ┌─┘
       ┌──┼─┐
       10 × 

Fungsi pertama adalah , ini membalikkan array, jadi1 0 2 menjadi 2 0 1.

Kemudian kita masuk (10×⊢)\, yang diterapkan pada array terbalik. Bagian ini diilhami oleh jawaban Ngn untuk tantangan Boustrophedonise. Meminjam penjelasan ngn, diberi vektor digit A B C ..., menerapkan (10×⊢)\pada vektor ini memberikan berikut.

A (A (10×⊢) B) (A (10×⊢) (B (10×⊢) C)) ...
A ((10×⊢) B) ((10×⊢) (10×C)) ...
A (10×B) (10×10×C) ...

Aktif 2 0 1, (10×⊢)\beri 2 0 100.

Selanjutnya datang 0~⍨. Ini menghapus semua 0s dari array, memberi 2 100.

Akhirnya datanglah +s. {⍵'+'⍺}/adalah pengurangan yang dimulai dari kanan yang menyatukan arg kiri dengan +, diikuti oleh arg kanan. Secara efektif, ini membalik array saat memasukkan +s. Ini memberi 100 '+' 2, yang ditampilkan sebagai 100 + 2.

Kritixi Lithos
sumber
2

MathGolf , 12 11 10 byte

hrzúm*ç'+u

Cobalah online!

Penjelasan

Perintah pertama tidak diperlukan karena input dapat diberikan sebagai daftar angka.

(▒           Convert to a list of digits)
 h           Get length of input list without popping
  r          Push range(a)
   z         Reverse sort
    ú        Map i -> 10**i for each element in list
     m*      Element-wise multiplication
       ç     Filter faulty items in list
        '+   Push "+"
          u  Join with separator

Saya mungkin menambahkan operator perkalian berpasangan yang satu byte, tapi itu saat ini bukan bagian dari bahasa. Lalu saya bisa menghapus satu byte dari solusi ini.

maks
sumber