Số dễ nhân


34

Nhiệm vụ của bạn là xác định xem hai số có dễ nhân lên không . Điều này có nghĩa là phép nhân dài 10 cơ sở của chúng không có bất kỳ sự mang (tập hợp lại) nào giữa các giá trị địa điểm, xem xét cả các bước nhân và bước bổ sung. Điều này xảy ra khi mỗi cặp chữ số được nhân cho 9 hoặc ít hơn và tổng của mỗi cột là 9 hoặc ít hơn.

Ví dụ, 3311021dễ nhân lên:

   331
x 1021
------
+  331
  662
   0
331
------
337951

Và điều tương tự cũng đúng (như mọi khi) nếu chúng ta nhân lên theo thứ tự khác:

  1021
x  331
------
+ 1021
 3063
3063
------
337951

Nhưng, 4311021không dễ để nhân lên, với các trường hợp xảy ra giữa các cột được chỉ định:

   431
x 1021
------
+  431
  862
   0
431
------
440051
 ^^^

Ngoài ra, 1216không dễ dàng để nhân lên vì việc mang lại xảy ra khi nhân lên 12 * 6để có được 72, mặc dù không có việc thực hiện nào xảy ra trong bước bổ sung.

  12
x 16
----
+ 72
 12
----
 192

Đầu vào: Hai số nguyên dương hoặc biểu diễn chuỗi của chúng. Bạn có thể cho rằng họ sẽ không tràn loại ngôn ngữ của bạn, cũng như sản phẩm của họ.

Đầu ra: Một giá trị nhất quán nếu chúng dễ nhân lên và một giá trị nhất quán khác nếu không.

Các trường hợp kiểm tra: 5 đầu tiên dễ dàng nhân lên, 5 cuối cùng thì không.

331 1021
1021 331
101 99
333 11111
243 201

431 1021
12 16
3 4
3333 1111
310 13

[(331, 1021), (1021, 331), (101, 99), (333, 11111), (243, 201)]
[(431, 1021), (12, 16), (3, 4), (3333, 1111), (310, 13)]

Bảng xếp hạng:


1
Đầu vào cho mỗi số có thể là một danh sách các chữ số không?
dyl Nam

@dylnan Không, mặc dù một danh sách các ký tự là hợp lệ theo mặc định cho tùy chọn chuỗi.
xnor

Câu trả lời:


14

Thạch , 7 byte

Dæc/>9Ẹ

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

Sử dụng tích chập (mà tôi đã đóng góp cho Jelly: D)

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

Dæc/>9Ẹ
D        converts to decimal list
 æc      convolution
    >9Ẹ  checks if any number is greater than 9

o chập chững: DI nghĩ rằng đây là lần đầu tiên tôi thấy tích chập được sử dụng trong môn đánh gôn: D +1
HyperNeutrino



@LuisMendo Không, đó là một tổ hợp khác.
Erik người vượt trội

BTW Bạn có thể thay thế 3 byte cuối cùng <⁵Ạcho đầu ra mà không cần boolean KHÔNG được thực hiện trên nó.
Erik the Outgolfer 19/12/17

8

JavaScript (ES6), 67 byte

Lấy đầu vào là 2 chuỗi trong cú pháp currying (a)(b). Trả về falsecho dễ hoặctrue không dễ.

a=>b=>[...a].some((x,i,a)=>[...b].some(y=>(a[-++i]=~~a[-i]+x*y)>9))

Các trường hợp thử nghiệm


Alt. phiên bản (thiếu sót), 64 55 52 byte

Đã lưu 3 byte bằng cách lấy chuỗi, như được đề xuất bởi @Shaggy
Như được chỉ ra bởi @LeakyNun, phương pháp này sẽ thất bại trên một số số nguyên cụ thể lớn

Lấy đầu vào là 2 chuỗi trong cú pháp currying (a)(b). Trả về truecho dễ hoặcfalse không dễ.

a=>b=>/^.(0.)*$/.test((g=n=>[...n].join`0`)(a)*g(b))

Các trường hợp thử nghiệm

Làm sao?

Ý tưởng ở đây là phơi bày rõ ràng các carry bằng cách chèn các số 0 trước mỗi chữ số của mỗi yếu tố.

Ví dụ:

  • 331 x 1021 trở thành 30301 x 1000201 , mang lại 30307090501 thay vì 337951 . Bằng cách thêm số 0 đứng đầu vào kết quả và nhóm tất cả các chữ số bằng 2, điều này có thể được viết là 03 03 07 09 05 01 . Tất cả các nhóm ít hơn 10 , có nghĩa là sẽ không có bất kỳ sự mang theo nào trong phép nhân tiêu chuẩn.

  • 431 x 1021 trở thành 40602 x 1000201 , cung cấp 40309100501 và có thể được viết là 04 03 09 10 05 01 . Lần này, chúng ta có một số 10 cho thấy một phép nhân trong phép nhân tiêu chuẩn.


Có thể ... chúng ta có thể có một lời giải thích cơ bản về thuật toán không?
hoàn toàn là

@totallyhuman Tôi đã thêm một lời giải thích. (Rất tiếc ... và cũng đã sửa một lỗi.)
Arnauld

1
Có vẻ như bạn sẽ có thể lưu 3 byte bằng cách lấy các đầu vào làm chuỗi.
Xù xì

3
Nó đã cho tôi một cõi đời đời để tìm một (lý thuyết) phản ví dụ mà thuật toán của bạn sẽ thất bại: tio.run/##y0rNyan8/9/l8LJk/f///... (các 108trong messes giữa lên thuật toán của bạn)
Leaky Nun

@LeakyNun Đẹp tìm. Vâng, về mặt lý thuyết nó có thể tràn.
Arnauld

6

Alice , 30 byte

/Q.\d3-&+k!*?-n/ o @
\ic/*2&w~

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

Đầu ra 1cho dễ dàng và0 khó.

Các số dễ dàng nhân lên khi và chỉ khi tổng chữ số của sản phẩm bằng với tổng của chữ số.

/i    Input both numbers as a single string
.     Duplicate this string
/*    Coerce into two integers and multiply
2&w   Push return address twice (do the following three times)
~\Q     Swap the top two stack entries, then reverse the stack
        This produces a 3-cycle, and the first iteration coerces
        the original input string into two integers
c       Convert into individual characters
\d3-&+  Add all numbers on the stack except the bottom two (i.e., add all digits)
k     Return to pushed address (end loop)
      At this point, all three numbers are replaced by their digit sums
!*?   Multiply the digit sums of the original two numbers
-     Subtract the digit sum of the product
n     Logical negate: convert to 1 or 0
/o@   Output as character and terminate


4

R , 135 110 109 86 byte

function(m,n)any(convolve(m%/%10^(nchar(m):1-1)%%10,n%/%10^(1:nchar(n)-1)%%10,,"o")>9)

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

Lấy đầu vào dưới dạng chuỗi.

Nó xấu nhưng nó hoạt động ™.

Bây giờ sử dụng cách tiếp cận tích chập, như trong câu trả lời của Leaky Nun , do đó, nó lấy đầu vào là số nguyên và trả vềTRUE cho các số khó nhân vàFALSE dễ dàng nhân số.

Tôi đã luôn gặp một số khó khăn trong việc chuyển các cách tiếp cận tích chập trong quá khứ, nhưng hôm nay tôi cuối cùng đã đọc tài liệu :

Lưu ý rằng định nghĩa thông thường về tích chập của hai chuỗi xyđược đưa ra bởiconvolve(x, rev(y), type = "o")

Mà chỉ là ngớ ngẩn. Vì vậy, trích xuất chữ số được đảo ngược nvà nó giải quyết thành một câu trả lời của Leaky Nun.


4

Python 2 , 88 byte

lambda n,m:any(sum(n/10**(k-j)%10*(m/10**j%10)for j in range(k+1))>9for k in range(n+m))

Lấy hai số nguyên là đầu vào và trả về False(dễ nhân) hoặc True(không).

Hãy thử trực tuyến! (quá chậm đối với một trong các trường hợp thử nghiệm)



len(`n+m`)thực sự sẽ thất bại trong 40, 30 .
Dennis

len(`n+m`)+1?
Nữ tu bị rò rỉ

Điều đó thất bại trong 400, 300 . len(`n`+`m`)nên làm
Dennis

4

JavaScript (Node.js) , 43 41 37 36 byte

Cảm ơn @ Dennis về ý tưởng sử dụng phép nội suy chuỗi trong câu trả lời này và tiết kiệm 4 byte!

Cảm ơn @ rjanJohansen cho -1!

a=>b=>eval(`0x${a}*0x${b}<0x${a*b}`)

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

Tất nhiên khi cơ sở đích nhỏ hơn cơ sở ban đầu (như trong câu trả lời Jelly của tôi, cơ sở là 2) < phải lật.


Xin chúc mừng bạn là người đầu tiên tìm ra cách sử dụng chuyển đổi cơ sở, mà tôi mang lại cho bạn tiền thưởng!
xnor

3

Ngôn ngữ Wolfram (Mathicala) , 75 66 65 56 byte

f:=#~FromDigits~x&
g:=Max@CoefficientList[f@#2f@#,x]<=9&

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

Nhận 2 chuỗi đầu vào

Giải trình:

f:=#~FromDigits~x&                      (* Turns the number to a polynomial
                                           with the digits as coefficients      *)
g:=Max@CoefficientList[f@#2f@#,x]<=9&   (* Polynomial multiplication, and check
                                           whether all coefficients are smaller
                                           than 10                              *)

-9 để thay đổi sử dụng chuỗi làm đầu vào

-1 để sử dụng toán tử infix

-9 Cảm ơn @MartinEnder cho Maxchức năng



3

Julia 0,6 , 30 byte

~x=any(conv(digits.(x)...).>9)

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

Đầu vào là một bộ số, đầu ra là trueđể nhân số khó và falsecho số dễ.

. là ứng dụng chức năng phần tử khôn ngoan.

...mở rộng tuple (danh sách các chữ số nguyên) thành hai đầu vào riêng biệt của convhàm.



3

SNOBOL4 (CSNOBOL4) , 268 264 247 246 243 131 byte

	DEFINE('D(A)')
	M =INPUT
	N =INPUT
	OUTPUT =EQ(D(M) * D(N),D(M * N)) 1	:(END)
D	A LEN(1) . X REM . A	:F(RETURN)
	D =D + X	:(D)
END

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

Cổng cách tiếp cận của Nitrodon . Tôi nghĩ rằng đây là lần đầu tiên tôi xác định hàm trong SNOBOL, Dvới tổng số.

	DEFINE('D(A)')					;* function definition
	M =INPUT					;* read input
	N =INPUT					;* read input
	OUTPUT =EQ(D(M) * D(N),D(M * N)) 1	:(END)	;* if D(M)*D(N)==D(M*N),
							;* print 1 else print nothing. Goto End
D	A LEN(1) . X REM . A	:F(RETURN)		;* function body
	D =D + X	:(D)				;* add X to D
END

phiên bản cũ, 243 byte:

	M =INPUT
	N =INPUT
	P =SIZE(M)
	Q =SIZE(N)
	G =ARRAY(P + Q)
Z	OUTPUT =LE(P)	:S(E)
	M LEN(P) LEN(1) . A
	J =Q
Y	GT(J)	:F(D)
	N LEN(J) LEN(1) . B
	W =I + J
	X =G<W> + A * B
	G<W> =LE(A * B,9) LE(X,9) X	:F(E)
	J =J - 1	:(Y)
D	P =P - 1	:(Z)
E
END

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

Đầu vào trên STDIN được phân tách bằng các dòng mới, xuất ra STDOUT: một dòng mới để dễ nhân lên và không có đầu ra nào để không dễ nhân lên.

Điều này sẽ không giành được bất kỳ giải thưởng nào nhưng nó trình bày một cách tiếp cận khác (tốt, thực sự đây là cách tiếp cận ngây thơ). Tôi không nghĩ rằng tôi có thể viết nó thành khối, nhưng SNOBOL đủ cứng để làm việc như vậy.

Vì nó lấy đầu vào là một chuỗi, nên chuỗi này sẽ hoạt động cho bất kỳ đầu vào nào có ít hơn 512 chữ số mỗi chuỗi; Tôi không chắc chắn 100% mức độ lớn ARRAYtrong SNOBOL có thể.

INPUT được đệm trong phiên bản SNOBOL này để có chiều rộng tối đa 1024 ký tự; tất cả các nhân vật khác sau đó bị mất. Dường như một ARRAY có thể khá lớn; tốt hơn 2048 tế bào cần thiết.

	M =INPUT				;*read input
	N =INPUT				;*read input
	P =SIZE(M)				;*P = number of M's digits, also iteration counter for outer loop
	Q =SIZE(N)				;*Q = number of N's digits
	G =ARRAY(P + Q)				;*G is an empty array of length P + Q
Z	GE(P)	:F(T)				;*if P<0, goto T (outer loop condition)
	M LEN(P) LEN(1) . A			;*A = P'th character of M
	J =Q					;*J is the iteration counter for inner loop
Y	GT(J)	:F(D)				;*if J<=0, goto D (inner loop condition)
	N LEN(J) LEN(1) . B			;*B = J'th character of N
	W =I + J				;*W=I+J, column number in multiplication
	X =G<W> + A * B				;*X=G[W]+A*B, temp variable for golfing
	G<W> =LE(A * B,9) LE(X,9) X	:F(END)	;*if A*B<=9 and X<=9, G[W]=X otherwise terminate with no output
	J =J - 1	:(Y)			;*decrement J, goto Y
D	P =P - 1	:(Z)			;*decrement P, goto Z
T	OUTPUT =				;*set output to ''; OUTPUT automatically prints a newline.
END

2

Than , 38 byte

≔E⁺θη⁰ζFLθFLη§≔ζ⁺ικ⁺§ζ⁺ικ×I§θιI§ηκ‹⌈ζχ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Xuất ra một- khi dễ dàng nhân lên. Giải trình:

≔E⁺θη⁰ζ

Khởi tạo z một mảng đủ lớn (tổng độ dài của đầu vào) của các số không.

FLθFLη

Lặp lại các chỉ số của đầu vào qh .

§≔ζ⁺ικ⁺§ζ⁺ικ×I§θιI§ηκ

Thực hiện một bước của phép nhân dài.

‹⌈ζχ

Kiểm tra mang.



2

Haskell, 82 81 byte

q=map$read.pure
f a=any(>9).concat.scanr((.(0:)).zipWith(+).(<$>q a).(*))(0<$a).q

Các số a lấy dưới dạng chuỗi. Trả về Falsenếu số dễ nhân lên vàTrue ngược lại.

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

Tôi nghĩ nó đủ khác với câu trả lời của @ Laikoni . Làm thế nào nó hoạt động:

q                    -- helper function to turn a string into a list of digits

f a =                -- main function, first number is parameter 'a' 
      scanr    .q    -- fold the following function from the right (and collect
                     -- the intermediate results in a list) into the list of
                     -- digits of the second number
            0<$a     --   starting with as many 0s as there are digits in 'a'
                     -- the function is, translated to non-point free:
  \n c->zipWith(+)((*n)<$>q a)$0:c 
                     -- 'n': next digit of 'b'; 'c': value so far
        (*n)<$>a     --    multiplay each digit in 'a' with 'n'
        0:c          --    prepend a 0 to 'c'
        zipWith(+)   --    add both lists element wise
                     --    (this shifts out the last digit of 'c' in every step)
   concat            -- flatten the collected lists into a single list
 any(>9)             -- check if any number is >9

Giải pháp tốt đẹp! Tôi đang tìm cách để thoát khỏi việc nhập khẩu, nhưng chúng thậm chí còn lâu hơn nữa.
Laikoni

2

Haskell , 45 44 byte

Chỉnh sửa:

  • -1 byte thay đổi ==thành <.

Tôi nghĩ về điều này trước khi nhìn vào các câu trả lời khác, sau đó phát hiện ra rằng người Alice đã sử dụng cùng một ý tưởng cơ bản. Dù sao thì việc đăng cũng vì nó ngắn hơn các câu trả lời của Haskell khác.

?lấy hai số nguyên và trả về a Bool. Sử dụng như 331?1021. Falsecó nghĩa là phép nhân dễ dàng.

a?b=s(a*b)<s a*s b
s=sum.map(read.pure).show

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

  • slà một hàm tính tổng các chữ số của một số nguyên. ( read.purechuyển đổi một ký tự một chữ số thành một số nguyên.)
  • Nếu một cặp số dễ nhân, tổng số chữ số của sản phẩm bằng với tổng của chữ số.
  • Ngược lại, bất kỳ thực hiện nào trong quá trình nhân dài sẽ làm giảm tổng số chữ số của sản phẩm từ lý tưởng đó.


1

Haskell , 123 byte

import Data.List
r=read.pure
a%b|l<-transpose[reverse$map((*r d).r)b++(0<$e)|d:e<-scanr(:)""a]=all(<10)$concat l++map sum l

Hãy thử trực tuyến! Ví dụ sử dụng: "331" % "1021"sản lượng True.



1

Thạch , 8 byte

;PDḄµṪ⁼P

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

Một cổng của câu trả lời Javascript của tôi . Không ngắn hơn Jelly hiện có câu trả lời vì Jelly có tích hợp mạnh mẽ tích hợp.

Lấy đầu vào là một danh sách của hai số. Trả lại 1cho dễ dàng,0 cho không dễ.


Giải trình:


;PDḄµṪ⁼P     Main link. Let input = [101, 99]
;P           Concatenate with product. Get [101, 99, 9999]
  D          Convert to decimal. Get [[1,0,1], [9,9], [9,9,9,9]]
   Ḅ         Convert from binary. Get [1 * 2^2 + 0 * 2^1 + 1 * 2^0, 
             9 * 2^1 + 9 * 2^0, 9 * 2^3 + 9 * 2^2 + 9 * 2^1 + 9 * 2^0]
             = [5, 27, 135]
    µ        With that value,
     Ṫ       Take the tail from that value. Get 135, have [5, 27] remain.
      ⁼      Check equality with...
       P       The product of the remaining numbers (5 and 17).

1

C (gcc) , 104 byte

Về cơ bản thực hiện phép nhân "bằng tay" thành r [] và đặt giá trị trả về nếu bất kỳ cột nào cao hơn 9, vì điều đó có nghĩa là việc thực hiện đã xảy ra.

Đáng ngạc nhiên, điều này ngắn hơn so với nỗ lực đầu tiên của tôi, lấy chuỗi làm đối số.

f(a,b){int*q,r[10]={0},*p=r,R=0,B;for(;a;a/=10)for(q=p++,B=b;B;B/=10)R|=(*q+++=a%10*(B%10))>9;return R;}

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

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.