Xuất các sản phẩm một phần


17

Trong phép nhân dài , sau khi nhân số, bạn còn lại các sản phẩm một phần, trong thử thách này, bạn sẽ xuất ra các sản phẩm một phần đó.

Vì phép nhân dài là dài, để bù lại mã của bạn sẽ cần phải càng ngắn càng tốt.

Ví dụ

34, 53
102, 1700

48, 38 
384, 1440

361, 674
1444, 25270, 216600

0, 0
0

1, 8
8

Thông số kỹ thuật

  • Đầu vào / Đầu ra có thể ở bất kỳ định dạng hợp lý nào, chẳng hạn như mảng, chuỗi được phân tách bằng dấu phẩy (hoặc bất kỳ dấu phân cách nào khác không phải là chữ số), danh sách, đối số hàm, v.v.
  • Các sản phẩm một phần phải theo thứ tự tăng dần.
  • Nếu một sản phẩm là một phần 0, bạn có thể chọn xem bạn có muốn xuất nó hay không.

Đây là để mã ngắn nhất tính theo byte thắng!


Tôi đang giả sử rằng các số có thể là chuỗi, phải không?
Mama Fun Roll

Đó là trường hợp kiểm tra 0,0 làm cho nó khó hơn rất nhiều.
xnor

Kết quả mong đợi là 12, 102gì? Hầu hết các câu trả lời dường như trở lại 24, 0, 1200.
Dennis

@Dennis 24, 0, 1200vẫn ổn. Tôi sẽ chỉ định trong bài viết
Downgoat

Câu trả lời:


4

Thạch, 10 byte

DU×µLR’⁵*×

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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
Tôi đoán tên của ngôn ngữ này xuất phát từ thực tế là nó làm cho mọi người cảm thấy thạch.
geokavel

7

Bình thường, 12 byte

.e**Qsb^Tk_w

Bộ kiểm tra

Đưa dòng mới đầu vào tách ra, ví dụ

361
674

Giải trình:

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

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

ES6 (56 byte)

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

Giải trình

Trả về một mảng các sản phẩm một phần dưới dạng số.

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

Kiểm tra

Kiểm tra sử dụng Math.powthay vì **để làm cho nó hoạt động trong các trình duyệt tiêu chuẩn.


3

Lua, 72 68 byte

b=arg[2]:reverse()for i=1,#b do print(arg[1]*b:sub(i,i)*10^(i-1))end

3

APL, 21 byte

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

Đây là một hàm dyadic chấp nhận số nguyên ở bên trái và bên phải và trả về một mảng. Để gọi nó, gán nó cho một biến.

Giải trình:

             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
⍎¨⍕là khá thông minh.
Dennis

2

05AB1E , 15 byte

Mã số:

VDgUSXFTNmY**=\

Giải trình:

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

Bình thường, 26 byte

DcGHKjHTFNJlK*G*@Kt-JN^TN

Điều này xác định một hàm csao cho nó chấp nhận các 2đối số và hàm này in các sản phẩm một phần.

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 byte

ij48-tn:1-P10w^**P

Trình biên dịch (5.1.0) hoạt động trong Matlab và Octave.

Mỗi số là đầu vào trên một dòng riêng biệt.

Thí dụ

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

Giải trình

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 byte

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

Ít hơn 5 byte (thả .show) nếu tôi có thể lấy số thứ hai làm chuỗi.

Ví dụ sử dụng: g 361 674-> [1444,25270,216600].

Nhân mỗi chữ số ngược lại yvới xvà tỷ lệ với 10^iđâu i = 0,1,2,....

Chỉnh sửa: Cảm ơn @Mauris cho 3 byte!


Bạn thậm chí có thể làm (\b->(x*10^b*).read.pure).
Lynn

@Mauris: Hay đấy. Cảm ơn rất nhiều!
nimi

1

Julia, 50 49 byte

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

Đây là một hàm chấp nhận hai số nguyên và trả về một mảng số nguyên.

Các digitshàm trả về một mảng các chữ số của số nguyên đầu vào trong thứ tự ngược lại. Chúng tôi nhận được các chỉ số, các cặp giá trị bằng cách sử dụng enumeratevà tính toán các sản phẩm một phần khi đầu vào đầu tiên nhân với các chữ số nhân 10 được nâng lên thành sức mạnh của chỉ số của chữ số - 1.

Đã lưu một byte nhờ Dennis!


1

Con trăn 2, 61

def p(a,b):
 j=0
 while b>0:
  print`b%10*a`+j*'0';b/=10;j+=1 

1

CJam, 19 17 byte

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

Đưa đầu vào với mục đầu tiên là một số nguyên và chuỗi thứ hai (ví dụ 34 "53"). Đề xuất được chào đón, vì tôi chắc chắn rằng nó có thể ngắn hơn. Cảm ơn Dennis vì đã lưu hai byte.

Hãy thử trực tuyến.

Giải trình

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@#**tiết kiệm một vài byte.
Dennis

1

Haskell, 37 byte

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

Không xâu chuỗi, chỉ là số học. Đệ quy đệ trình sản phẩm một phần nhỏ nhất cho phần còn lại, trong đó chữ số cuối cùng bđược cắt bớt và hệ số nhân là 10 được áp dụng. Các ưu tiên điều hành hoạt động độc đáo.


0

, 11 ký tự / 23 byte (không cạnh tranh)

ᴙíⓢⓜî*$*Ⅹⁿ_

Try it here (Firefox only).

Tìm thấy một lỗi trong khi mã hóa giải pháp cho vấn đề này ...

Giải trình

          // 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 byte

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

Giải trình:

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

Do lỗi trong trình thông dịch, phải sử dụng ApY+1 /10thay vì ApY, bởi vì Ap0(đó là 10 ^ 0) cho 100. Tôi đoán đó là lý do cho phép bình phương nhanh với Ap, nhưng 0không có nghĩa là "không có đối số". Xin hãy sửa, Eth.
nicael

0

Python 2, 42 byte

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

Không xâu chuỗi, chỉ là số học. Đệ quy nối thêm sản phẩm một phần nhỏ nhất vào phần còn lại, trong đó chữ số cuối cùng bđược cắt bớt và hệ số nhân là 10 được áp dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.