Zwiększ liczbę

23

To wyzwanie jest oparte na pytaniu dotyczącym przepływu stosu .

Po wprowadzeniu liczby dodatniej wyślij ją jako sumę każdej cyfry pomnożonej przez jej reprezentację potęgi-10.

Wkład

Liczba jako liczba całkowita, ciąg znaków lub lista cyfr / znaków.

  • Liczba będzie ściśle dodatnia.
  • Jeśli zaakceptujesz liczbę jako ciąg znaków lub listę, nie rozpocznie się ona od 0.

Wydajność

Łańcuch reprezentujący sumę każdej odpowiedniej cyfry podstawy 10, każda pomnożona przez odpowiednią moc podstawy 10. Suma jest reprezentowana jako a + b. Jeśli chcesz, możesz użyć do jednego miejsca po każdej stronie +znaku. Operandy są wymienione w kolejności malejącej.

  • 0 nigdy nie może być poprawnym operandem.
  • +Znak (lub nie otoczony spacjami) nie może być wiodącym lub część spływu.

Przykłady

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

Niepoprawne dane wyjściowe

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

To jest code-golf, więc wygrywa najkrótszy kod w bajtach!

Olivier Grégoire
źródło
Piaskownica
Olivier Grégoire,
Powiązane
caird coinheringaahing
Czy możemy wyprowadzić sumę w odwrotnej kolejności? Dawny. 123 = 3 + 20 + 100
Quintec
1
czy dozwolone są spacje wiodące i końcowe?
ngn
2
Jaka jest oczekiwana wydajność dla wejścia 0? (Jeśli 0 to w pierwszej kolejności nieprawidłowe dane, należy je usunąć z przykładów nieprawidłowych danych wyjściowych IMO)
Pedro A,

Odpowiedzi:

11

Python 3: 83 80 79 bajtów

Wypróbuj online!

Moje pierwsze zgłoszenie do Code Golf.

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

-3 Bajtów przez jaja. Dziękuję za tę przydatną wskazówkę :) -4 Bytes by mypetlion. Dziękuję za tę wskazówkę dotyczącą skrócenia :)

Gareth Ma
źródło
Witamy w PPCG! Możesz poprawić swój wynik, if'0'<t[i]zmieniając kolejność instrukcji if na i zmieniając formułę z x-i-1na x+~i. Oto link TIO ze zmianami krok po kroku.
ovs
Zmień printinstrukcję, print(*[t[i]+'0'*(x+~i)for i in range(x)if'0'<t[i]],sep='+')aby zapisać 1 bajt.
mypetlion
10

Galaretka , 9 bajtów

ḊƬḌQIAj”+

Wypróbuj online!

Jak to działa

ḊƬḌ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
źródło
3
Inteligentne podejście!
Quintec,
8

JavaScript (ES6), 47 bajtów

Pobiera dane wejściowe jako liczbę całkowitą.

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

Wypróbuj online!

Skomentował

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
źródło
7

R , 55 bajtów

Zakładając, że liczby całkowite są mniejsze niż 1e10, co i tak jest większe niż maksymalna 32-bitowa liczba całkowita ...

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

Wypróbuj online!

J.Doe
źródło
Cóż, 10^(nchar(n):1-1teoretycznie działałby dla dowolnej liczby całkowitej ...
Giuseppe,
1
Tak, ale spójrz na te wszystkie dodatkowe bajty!
J.Doe
7

Język programowania Szekspira , 807 806 805 804 bajtów

,.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.

Wypróbuj online!

-23 bajty, jeśli pierwszy znak może być pusty

,.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.

Wyjaśnienie

,.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
źródło
6

Galaretka ,  12  11 bajtów

J’⁵*Ṛ×ḟ0j”+

Pełny program akceptujący liczbę jako listę cyfr (w formacie Python), która wypisuje wynik.

Wypróbuj online!

W jaki sposób?

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"

Poprzednie @ 12 bajtów:

Ḣ;0€ƊÐƤẸƇj”+
Jonathan Allan
źródło
5

Haskell, 60 54 bajtów

Edycja: -6 bajtów dzięki Delfad0r.

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

Pobiera liczbę wejściową jako ciąg znaków.

Wypróbuj 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
źródło
2
tail.(>>=('+':)).filter(>="1").scanr((.('0'<$)).(:))""oszczędza 6 bajtów Wypróbuj online! .
Delfad0r
1
@ Delfad0r: ładne, wielkie dzięki!
nimi
4

05AB1E , 10 bajtów

Proste wdrożenie.
Wprowadź jako listę cyfr.

āR<°*0K'+ý

Wypróbuj online!

Wyjaśnienie

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

Python 2 , 64 bajty

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

Nienazwana funkcja, która pobiera listę cyfr ni zwraca ciąg znaków.

Wypróbuj online!

enumerate(n)przyniosłoby krotki w index, itempoprzek nz indeksem zaczynającym się od 0.

Jednak enumeratebierze również opcjonalny indeks początkowy jako drugi argument, ustawiając to -len(n)otrzymujemy indeksami ( ey) -len(n), -len(n)+1, ..., -1.

Oznacza to, że liczba wymaganych zer końcowych dla dowolnego elementu ( b) jest -1-e, co oznacza, ~eże ~e*'0'otrzymuje wymagane końcowe zera.

`b`pobiera ciąg znaków reprezentujący cyfrę całkowitą bi +łączy to z zerami.

if bodfiltrowuje wpisy za pomocą b==0.

'+'.join(...)następnie łączy powstałe ciągi ze +znakami.

Jonathan Allan
źródło
4

Python 2, 82 73 71 bajtów

-9 bajtów dzięki @ovs

-2 bajty dzięki @JonathanAllan

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

Wypróbuj online

Don Thousand
źródło
4

Haskell , 56 55 52 bajtów

-4 bajt dzięki Nimi .

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

Wypróbuj online!


wyjaśnienie

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 "" = ""

Wypróbuj online!

ovs
źródło
3

Perl 6 , 38 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera listę cyfr i zwraca ciąg znaków.

Wyjaśnienie:

{                                    }  # 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
źródło
3

APL (Dyalog), 46 41 40 bajtów

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

-5 bajtów dzięki @dzaima

Anonimowa funkcja przedrostka. Pobiera dane wejściowe jako ciąg. TIO

(To jest mój pierwszy raz, gdy używam APL-a na PPCG, prawdopodobnie grywalnego. Przeklinajcie też, zera!)

Quintec
źródło
41 bajtów z⎕IO←0
dzaima
3

Retina , 19 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

L`[1-9]

Wyświetl wszystkie niezerowe cyfry

$
$&$.'*0

Do każdej cyfry dodaj tyle zer, ile cyfr końcowych.

|'+

Oddziel każdy wynik literą +s zamiast domyślnej nowej linii.

Retina 0.8.2 , 21 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

M&!`[1-9].*

Wyświetl wszystkie sufiksy danych wejściowych rozpoczynające się od niezerowych cyfr.

\B.
0

Zastąp wszystkie końcowe cyfry zerami.

¶
+

Połącz wyniki z +s.

Neil
źródło
3

C (gcc) , 71 69 bajtów

Każdy krok funkcji rekurencyjnej odejmuje część, którą wydrukuje, i przekazuje resztę liczby.

Dzięki pułapkowi cat za sugestię.

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

Wypróbuj online!

ErikF
źródło
3

Brachylog , 35 32 bajtów

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

-3 bajty, ponieważ 0 nie jest prawidłowym wejściem

Wypróbuj online! lub testsuite

Wyjaśnienie

                                    #   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
źródło
OP określił teraz, że 0 nie jest wejściem, z którym musisz sobie poradzić, więc możesz usunąć |∧Ṡkoniec. :)
DLosc
3

Brachylog v2, 15 bajtów

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

Wypróbuj online!

Bardzo, bardzo nieefektywny.

Jakoś to udaje się używać tylko 6 bajtów, co jest w większości języków twarde części (podział numer w formularzu do 10 b, gdzie jest jednocyfrowy, w porządku malejącym), a całe 9 bajtów do „przyłączenia się do „(który jest wbudowany w większość języków golfowych, ale nie Brachylog).+

W przeciwieństwie do większości moich poleceń Brachylog (które są funkcjami), jest to pełny program, pobierający dane wejściowe ze standardowego wejścia i generujący dane wyjściowe na standardowym wyjściu.

Wyjaśnienie

~+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.

(Powodem wᵐjest raczej wykorzystywanie niż bardziej normalne cjest to, że mamy do czynienia z heterogeniczną listą - zawiera ona zarówno liczby, jak i łańcuchy - i zamiast pozwolić na ich mieszanie, najłatwiej jest po prostu wydrukować je wszystkie osobno.)

Algorytm tutaj brutalnie wymusza wszystkie addytywne partycje wejścia, aż znajdzie odpowiednią (!). Brachylog preferuje podział na mniejsze możliwości, a przy możliwościach posortowanych w porządku rosnącym, więc pierwszym rozwiązaniem, jakie znajdzie, jest odwrotność rozwiązania, o które pyta pytanie. Musimy to tylko odwrócić, aby uzyskać pożądane rozwiązanie.

ais523
źródło
2

Czysty , 73 bajty

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

Wypróbuj online!

Definiuje funkcję $ :: String -> Stringpobierającą ciąg znaków i zwracającą ciąg znaków.

Obrzydliwe
źródło
2

Attache , 37 bajtów

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

Wypróbuj online!

Wersja Pointfree (41 bajtów): Join&"+"##`\&:Id##`-&>Pairs@`'&0@Suffixes

Wyjaśnienie

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
źródło
2

C (gcc), 87 bajtów

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);}

Wypróbuj online!

pizzapanty184
źródło
2

PowerShell, 55 52 bajtów

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

Skrypt oczekuje tablicy ciągów, każdy ciąg zawiera jedną cyfrę. Skrypt testowy:

$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"
}

Wydajność:

True: 10=10
True: 12=10+2
True: 9=9
True: 123=100+20+3
True: 101=100+1
mazzy
źródło
2

Japt , 13 bajtów

Pobiera dane wejściowe jako tablicę cyfr.

í*¡ApYÃw)f q+

Spróbuj


Wyjaśnienie

í                 :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 "+"

Alternatywny

Pobiera dane wejściowe jako tablicę ciągów cyfr.

ËúTUÊ-EÃfn q+

Spróbuj

Kudłaty
źródło
2

Java 10, 82 78 bajtów

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;}

Odpowiedź JavaScript (ES6) Port of Arnauld .
-2 bajty dzięki @ceilingcat .
-2 bajty dzięki Arnauldowi .

Wypróbuj online.

Wyjaśnienie:

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
źródło
Przypuszczam, że ta odpowiedź byłaby również ważna dla pierwotnego pytania . :) (Być może z n%mprzypisaną do zmiennej dla czytelności.)
Arnauld
1
Miły! Moje oryginalne rozwiązanie miało 91 bajtów.
Olivier Grégoire,
1
@ceilingcat Właściwie m<npowinno działać.
Arnauld,
2

SNOBOL4 (CSNOBOL4) , 134 133 129 bajtów

	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

Wypróbuj online!

Zaoszczędzono cały bajt, wykonując przetwarzanie ciągów zamiast arytmetyki!

Giuseppe
źródło
2

sed -E ,109 99 97 75 74 bajty

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

Każdy wiersz danych wejściowych jest traktowany jako osobna liczba. Wypróbuj online .

Wyjaśnienie:

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

… Można grać w golfa, jak sądzę.

hidefromkgb
źródło
Witam i witam w PPCG. Twoja odpowiedź wygląda dobrze, choć nie rozumiem, dlaczego dodałeś przypadek testowy BADC0FFEE . Myślę, że wyzwanie dotyczy tylko reprezentacji dziesiętnych.
Jonathan Frech,
Nie musisz obsługiwać 01010101010ani 000000, zgodnie ze specyfikacją wyzwania. Czy to oszczędza jakieś bajty?
Dennis,
@Dennis Najprawdopodobniej nie, ponieważ wiodące zera i te między nimi zachowują się tak samo, więc i tak muszę je usunąć.
hidefromkgb
2

Brainfuck, 147 bajtów

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

Wypróbuj online! (Będziesz musiał zaznaczyć pole oznaczone „!” I wpisać swoje dane po „!” W drugim wierszu kodu, w przeciwnym razie będzie nadal pytał o dane wejściowe na zawsze.)

Prawdopodobnie nie będzie to najkrótsza odpowiedź ani gra w golfa w możliwie najkrótszy sposób, ale fajnie było spróbować zrobić to w Brainfuck, więc równie dobrze mogę to opublikować.

Jak wskazał @JoKing, ten program nie usuwa zer. Spróbuję to naprawić, ale może to być dość trudne.

Wyjaśnienie:

>>+[[<]>+[>],]                            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
FinW
źródło
Przepraszamy, ale to nie usuwa zer tak, jak określono. Wypróbuj online!
Jo King
Dzięki, nie zauważyłem tego. Spróbuję to naprawić. Podczas gdy ja będę edytować swój post
FinW
2

APL (Dyalog Unicode) , 20 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako wektor cyfr. Generuje spację przed i po każdej z nich +oraz zawiera zmienną liczbę spacji wiodących.

To jest pociąg. Jest on podzielony na następujące.

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

Pierwszą funkcją jest to , że odwraca tablicę, więc 1 0 2staje się 2 0 1.

Następnie wchodzimy do (10×⊢)\, która jest stosowana do odwróconej tablicy. Ta część została zainspirowana odpowiedzią ngn na wyzwanie Boustrophedonise. Pożyczanie wyjaśnienia ngn, biorąc pod uwagę wektor cyfr A B C ..., zastosowanie (10×⊢)\tego wektora daje następujące.

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

On 2 0 1, (10×⊢)\daje 2 0 100.

Dalej nadchodzi 0~⍨. To usuwa wszystkie 0s z tablicy, dając 2 100.

Wreszcie jest +s. {⍵'+'⍺}/to redukcja rozpoczynająca się od prawej, która łączy lewy arg z a +, a następnie prawy arg. Skutecznie odwraca to tablicę podczas wstawiania +s. To daje 100 '+' 2, który jest wyświetlany jako 100 + 2.

Kritixi Lithos
źródło
2

MathGolf , 12 11 10 bajtów

hrzúm*ç'+u

Wypróbuj online!

Wyjaśnienie

Pierwsze polecenie nie jest potrzebne, ponieważ dane wejściowe można podać jako listę cyfr.

(▒           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

Mogę dodać operator mnożenia parami, który jest jednym bajtem, ale obecnie nie jest częścią tego języka. Następnie mógłbym usunąć jeden bajt z tego rozwiązania.

maxb
źródło