ส่งออกผลิตภัณฑ์บางส่วน


17

ในการคูณยาวหลังจากคูณตัวเลขคุณจะเหลือผลิตภัณฑ์บางส่วนในการท้าทายนี้คุณจะส่งออกผลิตภัณฑ์บางส่วนเหล่านั้น

เนื่องจากการคูณแบบยาวนั้นมีความยาวการชดเชยรหัสของคุณจะต้องสั้นที่สุดเท่าที่จะทำได้

ตัวอย่าง

34, 53
102, 1700

48, 38 
384, 1440

361, 674
1444, 25270, 216600

0, 0
0

1, 8
8

ข้อมูลจำเพาะ

  • อินพุต / เอาท์พุตอาจอยู่ในรูปแบบที่เหมาะสมเช่นอาร์เรย์สตริงที่คั่นด้วยเครื่องหมายจุลภาค (หรือตัวคั่นอื่น ๆ ที่ไม่ใช่ตัวเลข) รายการอาร์กิวเมนต์ของฟังก์ชัน ฯลฯ
  • ผลิตภัณฑ์บางส่วนจะต้องอยู่ในลำดับที่เพิ่มขึ้น
  • หากผลิตภัณฑ์บางส่วนเป็น0คุณสามารถเลือกได้ว่าต้องการส่งออกหรือไม่

นี่คือสั้นที่สุดในหน่วยไบต์!


ฉันสมมุติว่าตัวเลขนั้นเป็นสตริงได้จริงไหม?
Mama Fun Roll

กรณีทดสอบ 0,0 นั้นทำให้มันยากขึ้นมาก
xnor

ผลลัพธ์ที่คาดหวัง12, 102คืออะไร 24, 0, 1200คำตอบส่วนใหญ่ดูเหมือนจะกลับมา
Dennis

@Dennis 24, 0, 1200เป็นเรื่องปกติ ฉันจะระบุในโพสต์
Downgoat

คำตอบ:


4

เยลลี่ 10 ไบต์

DU×µLR’⁵*×

ลองออนไลน์!

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

DU×µLR’⁵*×  Left argument: multiplier -- Right argument: multiplicant

D           Convert the multiplier to base 10 (array of digits).
 U          Reverse the array.
  ×         Multiply each digit by the multiplicant.
   µ        Begin a new, monadic chain. Argument: A(array of products)
    L       Get the length of A.
     R      Turn length l into [1, ..., l].
      ’     Decrement to yield [0, ..., l-1].
       ⁵*   Compute 10**i for each i in that range.
         ×  Hook; multiply the powers of ten by the corresponding elements of A.

3
ฉันเดาว่าชื่อของภาษานี้มาจากความจริงที่ทำให้ทุกคนรู้สึกเจลลี่
geokavel

7

Pyth, 12 ไบต์

.e**Qsb^Tk_w

ชุดทดสอบ

แยกอินพุต newline ออกเช่น

361
674

คำอธิบาย:

.e**Qsb^Tk_w
                Implicit: Q = eval(input()),T = 10
           w    Input the second number as a string.
          _     Reverse it.
.e              Enumerated map, where b is the character and k is the index.
     sb         Convert the character to an int.
   *Q           Multiply by Q.
  *    ^Tk      Multiply by T ^ k. (10 ^ index)

4

JavaScript (ES7), 48 ไบต์

(a,b)=>[...b+""].reverse().map((d,i)=>10**i*a*d)

ES6 (56 ไบต์)

(a,b)=>[...b+""].reverse().map((d,i)=>a*d+"0".repeat(i))

คำอธิบาย

ส่งคืนอาร์เรย์ของผลิตภัณฑ์บางส่วนเป็นตัวเลข

(a,b)=>
  [...b+""]    // convert the multiplier to an array of digits
  .reverse()   // reverse the digits of the multiplier so the output is in the right order
  .map((d,i)=> // for each digit d of the multiplier
    10**i      // get the power of ten of the digit
      *a*d     // raise the product of the digit to it
  )

ทดสอบ

ทดสอบใช้Math.powแทนที่จะ**ทำให้มันทำงานในเบราว์เซอร์มาตรฐาน



3

APL, 21 ไบต์

{⍺×x×10*1-⍨⍳≢x←⊖⍎¨⍕⍵}

นี่คือฟังก์ชัน dyadic ที่รับจำนวนเต็มทางซ้ายและขวาและส่งกลับอาร์เรย์ หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

คำอธิบาย:

             x←⊖⍎¨⍕⍵} ⍝ Define x to be the reversed digits of the right input
     10*1-⍨⍳≢         ⍝ Generate all 10^(1-i) for i from 1 to the number of digits
{⍺×x×                 ⍝ Multiply the right input by the digits and the powers of 10

1
⍎¨⍕ค่อนข้างฉลาด
เดนนิส

2

05AB1E , 15 ไบต์

รหัส:

VDgUSXFTNmY**=\

คำอธิบาย:

VDgUSXFTNmY**=\

V                 # Assign the input to Y
 D                # Duplicate of input, because the stack is empty
  g               # Pushes the length of the last item
   U              # Assign the length to X
    S             # Split the last item
     X            # Pushes X (length of the last item)
      F           # Creates a for loop: for N in range(0, X)
       TNm        # Pushes 10 ^ N
          Y       # Pushes Y (first input)
           *      # Multiplies the last two items
            *     # Multiplies the last two items
             =    # Output the last item
              \   # Discard the last item

2

Pyth, 26 ไบต์

DcGHKjHTFNJlK*G*@Kt-JN^TN

ฟังก์ชันนี้กำหนดฟังก์ชันcเพื่อรับ2อาร์กิวเมนต์และฟังก์ชันพิมพ์ผลิตภัณฑ์บางส่วน

DcGHKjHTFNJlK*G*@Kt-JN^TN
DCGH                      Define function c(G, H)
    KjHT                  Set K to the list of digits converting H to base 10
        FNJlK             Set J to the length of K and loop with variable N
                          (Implicit: print)
             *G*@Kt-JN    Calculates the partial product
                      ^TN Raising it to the appropriate power of 10

1

MATL , 18 ไบต์

ij48-tn:1-P10w^**P

คอมไพเลอร์ (5.1.0)ทำงานใน Matlab และคู่

แต่ละหมายเลขมีการป้อนข้อมูลในบรรทัดแยกต่างหาก

ตัวอย่าง

>> matl ij48-tn:1-P10w^**P
> 361
> 674
1444  25270 216600

คำอธิบาย

i           % input first number (say 361)
j           % input second number, interpreted as a string (say '674')
48-         % subtract '0' to obtain vector of figures (gives [6 7 4])
tn:1-P      % vector [n-1, ... 1, 0] where n is the number of figures (gives [2 1 0])
10w^        % 10 raised to that, element-wise (gives [100 10 1])
*           % multiply, element-wise (gives [600 70 4])
*           % multiply (gives 361*[600 70 4], or [216600 25270 1444])
P           % flip vector ([1444 25270 216600]). Implicitly display

1

Haskell, 60 57 54 ไบต์

g x=zipWith(\b->(x*10^b*).read.pure)[0..].reverse.show

5 ไบต์น้อยลง (ลดลง.show) ถ้าฉันสามารถใช้หมายเลขที่สองเป็นสตริง

ตัวอย่างการใช้งาน: ->g 361 674[1444,25270,216600]

คูณหลักของการย้อนกลับของทุกyกับxและขนาดกับที่10^ii = 0,1,2,...

แก้ไข: ขอบคุณ @Mauris เป็นเวลา 3 ไบต์!


(\b->(x*10^b*).read.pure)คุณยังสามารถทำ
ลินน์

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

1

Julia, 50 49 bytes

f(a,b)=[a*d*10^~-i for(i,d)=enumerate(digits(b))]

นี่คือฟังก์ชั่นที่ยอมรับสองจำนวนเต็มและส่งกลับอาร์เรย์จำนวนเต็ม

digitsฟังก์ชันส่งกลับอาร์เรย์ของตัวเลขจำนวนเต็มการป้อนข้อมูลของเพื่อย้อนกลับ เราได้รับดัชนีใช้คู่ค่าenumerateและคำนวณผลิตภัณฑ์บางส่วนเป็นอินพุทแรกคูณด้วยหลักคูณ 10 คูณกับกำลังของดัชนีหลัก - 1

บันทึกเป็นไบต์ขอบคุณ Dennis!



1

CJam, 19 17 ไบต์

q~W%eef{~~A@#**}p

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

ลองออนไลน์

คำอธิบาย

q~    e# Get input and evaluate it, x and "y"
W%    e# Reverse y so it will be properly sorted
ee    e# Enumerate through y with each character and its index
f{    e# For each digit in y...
  ~~  e# Convert the digit to an integer on the stack
  A@# e# Take 10 to the power of y's index
  **  e# Multiply all three together to get the final result
}
p     e# Print the array

1
~~A@#**บันทึกสองสามไบต์
เดนนิส

1

Haskell, 37 ไบต์

a%0=[]
a%b=b`mod`10*a:(a*10)%div b 10

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


0

𝔼𝕊𝕄𝕚𝕟, 11 ตัวอักษร / 23 ไบต์ (ไม่แข่งขัน)

ᴙíⓢⓜî*$*Ⅹⁿ_

Try it here (Firefox only).

พบข้อผิดพลาดขณะเข้ารหัสวิธีแก้ไขปัญหานี้ ...

คำอธิบาย

          // Implicit: î = input 1, í = input 2
ᴙíⓢ      // reverse í and split it into an array
ⓜî*$*Ⅹⁿ_ // multiply î by each individual digit in í and put in previous array
          // implicit output

0

Japt , 28 ไบต์

I=[]Vs w m@IpApY+1 /A*U*X};I

คำอธิบาย:

I=[]Vs w m@IpApY+1 /A*U*X};I
I=[]                         //that's simple, init an array I
    Vs                       //take the second input and convert to string
       w                     //reverse it and...
         m@              }   //...map through the chars; X is a char, Y is counter
           Ip............    //push the following value into I...
             ApY+1 /A*U*X    //10^(Y+1)/10*U*X, U is the first input
                           I //output the resulting array

เนื่องจากข้อผิดพลาดในล่ามต้องใช้ApY+1 /10แทนApYเพราะAp0(ซึ่งคือ 10 ^ 0) ให้ 100 ฉันคิดว่ามันเป็นเหตุผลที่อนุญาตให้มีการยกกำลังสองอย่างรวดเร็วApแต่0ไม่ได้หมายความว่า "ไม่มีอาร์กิวเมนต์" โปรดแก้ไข Eth
nicael

0

Python 2, 42 ไบต์

f=lambda a,b:b*[0]and[b%10*a]+f(a*10,b/10)

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

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