ขยายจำนวน


23

ความท้าทายนี้จะขึ้นอยู่กับคำถาม Stackoverflow นี้

ด้วยจำนวนบวกเป็นอินพุตเอาต์พุตมันเป็นผลรวมของแต่ละหลักคูณด้วยการแทนค่า power-of-10

อินพุต

จำนวนเป็นจำนวนเต็มสตริงหรือรายการของตัวเลข / ตัวอักษร

  • จำนวนจะเป็นบวกอย่างเคร่งครัด
  • 0ถ้าคุณยอมรับจำนวนเป็นสตริงหรือรายการก็จะไม่เริ่มต้นด้วย

เอาท์พุต

สตริงที่แสดงถึงผลรวมของแต่ละฐาน 10 หลักที่เกี่ยวข้องแต่ละคูณด้วยพลังงานฐาน 10 ตามลำดับ a + bผลรวมจะแสดงเป็น คุณสามารถใช้พื้นที่ได้มากถึงหนึ่งช่องรอบแต่ละด้านของ+เครื่องหมายถ้าคุณต้องการ ตัวถูกดำเนินการอยู่ในลำดับจากมากไปน้อย

  • 0 ไม่สามารถเป็นตัวถูกต้องที่ถูกต้องได้
  • +สัญญาณ (ล้อมรอบหรือไม่ด้วยช่องว่าง) ไม่อาจจะเป็นส่วนหนึ่งที่นำหน้าหรือต่อท้าย

ตัวอย่าง

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

เอาต์พุตไม่ถูกต้อง

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

นี่คือ code-golf ดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!




เราสามารถส่งออกผลรวมในสิ่งที่ตรงกันข้ามหรือไม่? อดีต 123 = 3 + 20 + 100
Quintec

1
ช่องว่างนำหน้าและต่อท้ายได้รับอนุญาตหรือไม่
NGN

2
ผลลัพธ์ที่คาดหวังสำหรับอินพุต 0 คืออะไร (ถ้า 0 เป็นอินพุตที่ไม่ถูกต้องตั้งแต่แรกดังนั้นควรลบออกจากตัวอย่างเอาต์พุตที่ไม่ถูกต้อง IMO)
Pedro A

คำตอบ:


11

Python 3: 83 80 79 ไบต์

ลองออนไลน์!

การส่งรหัสกอล์ฟครั้งแรกของฉัน

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

-3 ไบต์โดย ovs ขอบคุณสำหรับคำแนะนำที่เป็นประโยชน์ :) -4 bytes โดย mypetlion ขอบคุณสำหรับเคล็ดลับการทำให้สั้นลง :)


ยินดีต้อนรับสู่ PPCG! คุณสามารถปรับปรุงคะแนนของคุณโดยการจัดเรียงใหม่ถ้ามีคำสั่งของคุณเพื่อif'0'<t[i]และเปลี่ยนสูตรของคุณจากไปx-i-1 นี่คือลิงค์ TIO พร้อมการเปลี่ยนแปลงทีละขั้นตอน x+~i
ovs

เปลี่ยนprintคำสั่งprint(*[t[i]+'0'*(x+~i)for i in range(x)if'0'<t[i]],sep='+')เป็นบันทึก 1 ไบต์
mypetlion

10

เยลลี่ขนาด 9 ไบต์

ḊƬḌQIAj”+

ลองออนไลน์!

มันทำงานอย่างไร

ḊƬḌ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 '+'.

3
วิธีการที่ชาญฉลาด!
Quintec

8

JavaScript (ES6), 47 ไบต์

รับอินพุตเป็นจำนวนเต็ม

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

ลองออนไลน์!

แสดงความคิดเห็น

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

7

R , 55 ไบต์

สมมติว่าจำนวนเต็มต่ำกว่า 1e10 ซึ่งมีขนาดใหญ่กว่าจำนวนเต็มสูงสุด 32 บิตต่อไป ...

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

ลองออนไลน์!


ดี10^(nchar(n):1-1การทำงานจะในทางทฤษฎีสำหรับจำนวนเต็มใด ๆ ...
จูเซปเป้

1
มันจะ แต่ดูไบต์พิเศษเหล่านั้นทั้งหมด!
J.Doe

7

ภาษาการเขียนโปรแกรมของเช็คสเปียร์ , 807 806 805 804 ไบต์

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

ลองออนไลน์!

-23 ไบต์หากอักขระ null อาจถูกส่งออกก่อน

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

คำอธิบาย

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


6

เจลลี่ ,  12  11 ไบต์

J’⁵*Ṛ×ḟ0j”+

โปรแกรมเต็มรูปแบบรับหมายเลขเป็นรายการของตัวเลข (ในรูปแบบ Python) ซึ่งพิมพ์ผลลัพธ์

ลองออนไลน์!

อย่างไร?

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"

ก่อนหน้า @ 12 ไบต์:

Ḣ;0€ƊÐƤẸƇj”+

5

Haskell, 60 54 ไบต์

แก้ไข: -6 ไบต์ขอบคุณ Delfad0r

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

ใช้หมายเลขอินพุตเป็นสตริง

ลองออนไลน์!

    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 +

2
tail.(>>=('+':)).filter(>="1").scanr((.('0'<$)).(:))""บันทึก 6 ไบต์ลองออนไลน์! .
Delfad0r

1
@ Delfad0r: ดีขอบคุณมาก!
nimi

4

05AB1E , 10 ไบต์

การนำไปปฏิบัติได้อย่างตรงไปตรงมา
ป้อนเป็นรายการตัวเลข

āR<°*0K'+ý

ลองออนไลน์!

คำอธิบาย

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

4

Python 2 , 64 ไบต์

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

ฟังก์ชั่นที่ไม่มีชื่อซึ่งใช้รายการตัวเลขnและส่งกลับสตริง

ลองออนไลน์!

enumerate(n)จะให้ผลผลิตของ tuples index, itemข้ามกับดัชนีราคาเริ่มต้นที่n0

แต่enumerateยังใช้เป็นดัชนีตัวเลือกเริ่มต้นเป็นอาร์กิวเมนต์ที่สองโดยการตั้งค่านี้เพื่อ-len(n)เราจะได้รับดัชนี ( es) ของ-len(n), -len(n)+1, ... -1,

ซึ่งหมายความว่าจำนวนของที่จำเป็นศูนย์ต่อท้ายสำหรับรายการใด ๆ ( b) เป็น-1-eซึ่งเป็น~eเพื่อให้ ~e*'0'ได้รับเลขศูนย์ต่อท้ายที่จำเป็น

`b`รับการแทนค่าสตริงของตัวเลขจำนวนเต็มbและ+ต่อค่านี้กับศูนย์เหล่านั้น

if bb==0กรองออกรายการด้วย

'+'.join(...)จากนั้นรวมสตริงผลลัพธ์เข้ากับ+อักขระ



4

Haskell , 56 55 52 ไบต์

-4 ขอบคุณไบต์Nimi

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

ลองออนไลน์!


คำอธิบาย

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

ลองออนไลน์!


3

Perl 6 , 38 ไบต์

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

ลองออนไลน์!

บล็อกโค้ดแบบไม่ระบุชื่อที่รับรายการตัวเลขและส่งคืนสตริง

คำอธิบาย:

{                                    }  # 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

3

APL (Dyalog), 46 41 40 ไบต์

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

-5 ไบต์ขอบคุณ @dzaima

ฟังก์ชั่นคำนำหน้าแบบไม่ระบุชื่อ รับอินพุตเป็นสตริงTIO

(นี่เป็นครั้งแรกที่ฉันใช้ APL บน PPCG ซึ่งอาจเล่นกอล์ฟได้นอกจากนี้สาปคุณด้วยเลขศูนย์!)


41 ไบต์ด้วย⎕IO←0
dzaima

3

เรติน่า 19 ไบต์

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

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

L`[1-9]

แสดงรายการตัวเลขที่ไม่เป็นศูนย์ทั้งหมด

$
$&$.'*0

สำหรับแต่ละหลักให้เติมศูนย์ให้มากที่สุดเท่าที่มีตัวเลขต่อท้าย

|'+

คั่นแต่ละผลลัพธ์ด้วย+s แทนการขึ้นบรรทัดใหม่

เรติน่า 0.8.2 , 21 ไบต์

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

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

M&!`[1-9].*

แสดงรายการส่วนต่อท้ายทั้งหมดของอินพุตที่ขึ้นต้นด้วยตัวเลขที่ไม่ใช่ศูนย์

\B.
0

แทนที่ตัวเลขทั้งหมดต่อท้ายด้วยเลขศูนย์

¶
+

เข้าร่วมผลลัพธ์ด้วย+s


3

C (gcc) , 71 69 ไบต์

แต่ละขั้นตอนของฟังก์ชันเรียกซ้ำจะลบส่วนที่จะพิมพ์และส่งผ่านหมายเลขที่เหลือ

ขอบคุณสำหรับคำแนะนำ

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

ลองออนไลน์!


3

Brachylog , 35 32 ไบต์

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

-3 ไบต์ทำให้เกิด 0 ไม่ใช่อินพุตที่ถูกต้อง

ลองออนไลน์! หรือTestuite

คำอธิบาย

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

ตอนนี้ OP ระบุว่า 0 ไม่ใช่อินพุตที่คุณต้องจัดการดังนั้นคุณสามารถลบออก|∧Ṡจากท้ายได้ :)
DLosc

3

Brachylog v2, 15 ไบต์

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

ลองออนไลน์!

มากไม่มีประสิทธิภาพมาก

ยังไงก็ตามสิ่งนี้จัดการเพื่อใช้เพียง 6 ไบต์ในสิ่งที่อยู่ในภาษาส่วนใหญ่ยาก (แยกหมายเลขลงในแบบฟอร์ม 10 ที่เป็นตัวเลขหลักเดียวในลำดับถัดลงมา) และทั้ง 9 ไบต์สำหรับ "เข้าร่วมด้วย"(ซึ่งเป็นภาษาในภาษากอล์ฟส่วนใหญ่ แต่ไม่ใช่ Brachylog)+

แตกต่างจากการส่ง Brachylog ส่วนใหญ่ของฉัน (ซึ่งเป็นฟังก์ชั่น), โปรแกรมนี้เต็มรูปแบบ, รับข้อมูลจากอินพุตมาตรฐานและสร้างเอาต์พุตบนเอาต์พุตมาตรฐาน

คำอธิบาย

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

(เหตุผลwᵐนั้นถูกใช้มากกว่าปกติมากกว่าcคือเรากำลังจัดการกับรายการที่ต่างกัน - มันมีทั้งตัวเลขและสตริง - และแทนที่จะปล่อยให้สิ่งเหล่านี้มาผสมกันมันง่ายที่สุดที่จะพิมพ์ทั้งหมดทีละรายการ)

อัลกอริทึมที่นี่กำลังดุร้ายเหนือพาร์ติชันเสริมทั้งหมดของอินพุทจนกระทั่งพบอันที่เหมาะสม (!) Brachylog สนับสนุนการแบ่งเป็นความเป็นไปได้ที่น้อยลงและด้วยความเป็นไปได้ที่เรียงตามลำดับจากน้อยไปมากดังนั้นวิธีแก้ปัญหาแรกที่พบคือการย้อนกลับของโซลูชันที่คำถามนั้นถาม ดังนั้นเราแค่ต้องย้อนกลับเพื่อให้ได้ทางออกที่เราต้องการ




2

ทูต , 37 ไบต์

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

ลองออนไลน์!

รุ่น Pointfree (41 ไบต์): Join&"+"##`\&:Id##`-&>Pairs@`'&0@Suffixes

คำอธิบาย

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"


2

Powershell, 55 52 ไบต์

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

สคริปต์คาดหวังอาร์เรย์ของสตริงแต่ละสตริงมีหนึ่งหลัก สคริปต์ทดสอบ:

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

เอาท์พุท:

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

2

Japt , 13 ไบต์

รับอินพุตเป็นอาร์เรย์ของตัวเลข

í*¡ApYÃw)f q+

ลองมัน


คำอธิบาย

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

ทางเลือก

รับอินพุตเป็นอาร์เรย์ของสตริงหลัก

ËúTUÊ-EÃfn q+

ลองมัน


2

Java 10, 82 78 ไบต์

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

ท่าเรือArnauld JavaScript (ES6) คำตอบของ
-2 ไบต์ขอบคุณที่@ceilingcat
-2 ไบต์ขอบคุณArnauld Arnauld

ลองออนไลน์

คำอธิบาย:

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`

ผมคิดว่าคำตอบนี้ยังจะเป็นหนึ่งที่ถูกต้องสำหรับคำถามเดิม :) (อาจมีการn%mกำหนดให้กับตัวแปรสำหรับการอ่านได้)
Arnauld


1
@ceilingcat ที่จริงm<nควรทำงานได้
Arnauld


2

sed -E ,109 99 97 75 74 ไบต์

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

แต่ละบรรทัดของอินพุตถือว่าเป็นตัวเลขแยกกัน ลองมันออนไลน์

คำอธิบาย:

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

…สามารถเล่นกอล์ฟได้มากกว่านี้ฉันเข้าใจ


สวัสดีและยินดีต้อนรับสู่ PPCG คำตอบของคุณดูดี แต่ฉันไม่เข้าใจว่าทำไมคุณเพิ่มกรณีทดสอบBADC0FFEE ฉันคิดว่าความท้าทายเป็นเพียงการแสดงทศนิยม
Jonathan Frech

คุณไม่จำเป็นต้องจัดการ01010101010หรือ000000ตามข้อมูลจำเพาะของการท้าทาย นั่นบันทึกไบต์ใด ๆ หรือไม่?
เดนนิส

@Dennis ส่วนใหญ่อาจไม่เป็นศูนย์นำและคนที่อยู่ในระหว่างการทำงานเหมือนกันดังนั้นฉันต้องลบพวกเขาต่อไป
hidefromkgb

2

Brainfuck, 147 ไบต์

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

ลองออนไลน์! (คุณจะต้องทำเครื่องหมายในช่องที่ระบุว่า "!" และพิมพ์ข้อมูลที่คุณป้อนหลังจาก "!" ในบรรทัดที่สองของรหัสมิฉะนั้นจะดำเนินการขออินพุตต่อไปเรื่อย ๆ )

มันอาจจะไม่ใช่คำตอบที่สั้นที่สุดหรือตีกอล์ฟให้สั้นที่สุดเท่าที่จะทำได้ แต่มันก็สนุกดีที่ได้ลองทำใน Brainfuck ดังนั้นฉันก็อาจโพสต์มันได้

@JoKing ชี้ให้เห็นว่าโปรแกรมนี้ไม่ได้ลบ 0 ของ ฉันจะพยายามและแก้ไขสิ่งนี้ แต่มันอาจจะค่อนข้างยาก

คำอธิบาย:

>>+[[<]>+[>],]                            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

ขออภัยไม่ได้ลบศูนย์ตามที่ระบุ ลองออนไลน์!
Jo King

ขอบคุณฉันไม่ได้สังเกตว่า ฉันจะพยายามและแก้ไข ในขณะที่ฉันเป็นฉันจะแก้ไขโพสต์ของฉัน
FinW

2

APL (Dyalog Unicode)ขนาด 20 ไบต์

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

ลองออนไลน์!

รับอินพุตเป็นเวกเตอร์ของตัวเลข ส่งออกด้วยช่องว่างก่อนและหลังแต่ละ+และรวมถึงจำนวนตัวแปรของช่องว่างนำ

นี่คือรถไฟ มันแบ่งออกเป็นดังต่อไปนี้

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

ฟังก์ชั่นแรกคือนี้กลับอาร์เรย์จึงกลายเป็น1 0 22 0 1

จากนั้นเราก็เข้ามา(10×⊢)\ซึ่งถูกนำไปใช้กับอาเรย์ที่กลับด้าน ส่วนนี้ได้รับแรงบันดาลใจจากคำตอบของ ngn ต่อความท้าทาย Boustrophedonise คำอธิบายการยืมของ ngn ให้เวกเตอร์ของตัวเลขA B C ...การใช้(10×⊢)\กับเวกเตอร์นี้ให้สิ่งต่อไปนี้

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

เมื่อวันที่2 0 1, ช่วยให้(10×⊢)\2 0 100

0~⍨ถัดมา นี้จะเอาทุก0s จาก array 2 100ให้

ในที่สุดก็มา+s {⍵'+'⍺}/เป็นการลดที่เริ่มต้นจากด้านขวาที่เชื่อม ARG ด้านซ้ายเข้าด้วย+กันตามด้วย ARG ด้านขวา ได้อย่างมีประสิทธิภาพนี้กลับอาร์เรย์ขณะที่ใส่+s นี้จะช่วยให้ซึ่งจะแสดงเป็น100 '+' 2100 + 2


2

MathGolf , 12 11 10 ไบต์

hrzúm*ç'+u

ลองออนไลน์!

คำอธิบาย

ไม่จำเป็นต้องใช้คำสั่งแรกเนื่องจากอินพุตสามารถกำหนดเป็นรายการของตัวเลข

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

ฉันอาจเพิ่มโอเปอเรเตอร์การคูณด้วยจำนวนเต็มที่เป็นหนึ่งไบต์ แต่นั่นไม่ได้เป็นส่วนหนึ่งของภาษาในปัจจุบัน จากนั้นฉันสามารถลบหนึ่งไบต์จากโซลูชันนี้

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