ตัวเลขที่ง่ายต่อการคูณ


34

งานของคุณคือการพิจารณาว่าตัวเลขสองตัวนั้นง่ายต่อการคูณหรือไม่ ซึ่งหมายความว่าการคูณยาว 10 ฐานของพวกเขาไม่มีการถือครอง (การจัดกลุ่มใหม่) ระหว่างค่าสถานที่โดยดูที่ขั้นตอนการคูณและขั้นตอนการบวก สิ่งนี้จะเกิดขึ้นเมื่อตัวเลขแต่ละคู่ถูกคูณให้ 9 หรือน้อยกว่าและผลรวมของแต่ละคอลัมน์คือ 9 หรือน้อยกว่า

ตัวอย่างเช่น331และ1021ง่ายต่อการคูณ:

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

และเหมือนกันคือจริง (เช่นเคย) ถ้าเราคูณในลำดับอื่น ๆ :

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

แต่431และ1021ไม่ใช่เรื่องง่ายที่จะคูณด้วยการดำเนินการเกิดขึ้นระหว่างคอลัมน์ที่ระบุ:

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

นอกจากนี้12และ16ไม่ใช่เรื่องง่ายที่จะคูณเพราะการพกพาเกิดขึ้นเมื่อคูณ12 * 6เพื่อรับ72แม้ว่าจะไม่มีการพกติดตัวในขั้นตอนการบวก

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

อินพุต:จำนวนเต็มบวกสองค่าหรือการแทนค่าสตริง คุณอาจคิดว่าพวกเขาจะไม่ล้นประเภทจำนวนเต็มของภาษาของคุณและจะไม่ผลิตภัณฑ์ของพวกเขา

เอาท์พุท:หนึ่งค่าที่สอดคล้องกันถ้าพวกเขาจะง่ายต่อการคูณและอีกมูลค่าที่สอดคล้องกันถ้าไม่

กรณีทดสอบ: 5 ตัวแรกนั้นง่ายต่อการคูณ 5 ตัวสุดท้ายไม่ใช่

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

ลีดเดอร์บอร์ด:


1
สามารถป้อนข้อมูลสำหรับแต่ละหมายเลขเป็นรายการตัวเลขได้หรือไม่?
dylnan

@dylnan ไม่แม้ว่ารายการอักขระจะใช้ได้โดยค่าเริ่มต้นสำหรับตัวเลือกสตริง
xnor

คำตอบ:


14

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

Dæc/>9Ẹ

ลองออนไลน์!

ใช้การโน้มน้าวใจ (ซึ่งฉันสนับสนุนให้ Jelly: D)

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

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

o ว้าว convolution: DI คิดว่านี่เป็นครั้งแรกของฉันที่ได้เห็นการใช้ convolution ใน code-golf: D +1
HyperNeutrino



@ LuisMendo ไม่นั่นเป็นความเชื่อที่ต่างไป
Erik the Outgolfer

BTW คุณสามารถแทนที่ 3 ไบต์สุดท้ายด้วย<⁵Ạสำหรับเอาต์พุตโดยไม่มีบูลีนไม่ได้ดำเนินการ
Erik the Outgolfer

8

JavaScript (ES6), 67 ไบต์

จะเข้าเป็น 2 (a)(b)สายในไวยากรณ์ ผลตอบแทนที่falseง่ายหรือtrueไม่ง่าย

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

กรณีทดสอบ


Alt รุ่น (มีข้อบกพร่อง), 64 55 52 ไบต์

บันทึก 3 ไบต์โดยการใช้สตริงตามที่แนะนำโดย @Shaggy
ตามที่ชี้ให้เห็นโดย @LeakyNun วิธีนี้จะล้มเหลวในจำนวนเต็มเฉพาะจำนวนมาก

จะเข้าเป็น 2 (a)(b)สายในไวยากรณ์ ผลตอบแทนที่trueง่ายหรือfalseไม่ง่าย

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

กรณีทดสอบ

อย่างไร?

ความคิดที่นี่คือการเปิดเผยการดำเนินการอย่างชัดเจนโดยการแทรกศูนย์ก่อนแต่ละหลักของแต่ละปัจจัย

ตัวอย่าง:

  • 331 x 1021กลายเป็น30301 x 1000201ซึ่งจะช่วยให้30307090501แทน337951 โดยการเพิ่มศูนย์นำไปสู่ผลและการจัดกลุ่มตัวเลขทั้งหมด 2 นี้สามารถเขียนเป็น03 03 07 09 05 01 ทุกกลุ่มมีค่าน้อยกว่า10ซึ่งหมายความว่าจะไม่มีการพกพาใด ๆ ในการคูณมาตรฐาน

  • 431 x 1021จะกลายเป็น40,301 x 1000201ซึ่งจะช่วยให้40309100501และสามารถเขียนเป็น04 03 09 10 05 01 เวลานี้เรามี10ซึ่งเผยให้เห็นการพกพาในการคูณมาตรฐาน


สามารถ ... เรามีคำอธิบายพื้นฐานเกี่ยวกับอัลกอริทึมได้หรือไม่
สิ้นเชิงมนุษย์

@tallyallyhuman ฉันได้เพิ่มคำอธิบายแล้ว (โอ๊ะโอ ... และแก้ไขข้อผิดพลาดด้วย)
Arnauld

1
ดูเหมือนว่าคุณควรจะสามารถบันทึกได้ 3 ไบต์โดยรับอินพุตเป็นสตริง
Shaggy

3
ฉันใช้เวลาชั่วนิรันดร์ในการหาตัวอย่างเคาน์เตอร์ (ตามทฤษฎี) ซึ่งอัลกอริทึมของคุณจะล้มเหลว: tio.run/##y0rNyan8/9/l8LJk/f///… ( 108ตรงกลางทำให้อัลกอริทึมของคุณยุ่งเหยิง )
Leaky Nun

@LeakyNun ยินดีที่ได้พบ ใช่มันสามารถไหลล้นในทางทฤษฎี
Arnauld

6

อลิซ 30 ไบต์

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

ลองออนไลน์!

เอาต์พุต1สำหรับง่ายและ0ยาก

ตัวเลขนั้นง่ายต่อการคูณหากว่าจำนวนรวมของผลิตภัณฑ์เท่ากับผลคูณของจำนวนหลัก

/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

MATL 10 ไบต์

,j!U]Y+9>a

เอาต์พุต0ให้ง่ายและ1ยาก

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

,       % Do twice
  j     %   Input as a string
  !     %   Transpose into a column vector of characters
  U     %   Convert each character to number. Gives a numeric column vector
]       % End
Y+      % Convolution, full size
9>      % Greatear than 1? Element-wise
a       % Any: true if there is some true entry. Implicitly display

4

R , 135 110 109 86 86 ไบต์

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

ลองออนไลน์!

รับอินพุตเป็นสตริง

มันน่าเกลียด แต่ก็ใช้งานได้

ตอนนี้ใช้วิธีการสนทนาเช่นเดียวกับในคำตอบของ Leaky Nunดังนั้นมันจึงป้อนข้อมูลเป็นจำนวนเต็มและส่งกลับTRUEสำหรับการคูณที่ยากต่อการคูณและFALSEง่ายต่อการคูณ

ฉันมักจะมีปัญหาในการพูดถึงวิธีการโน้มน้าวในอดีต แต่วันนี้ฉันอ่านเอกสารในที่สุด:

โปรดทราบว่าคำนิยามตามปกติของการบิดของสองลำดับxและyได้รับโดยconvolve(x, rev(y), type = "o")

ซึ่งมันช่างงี่เง่า ดังนั้นการสกัดหลักจะกลับด้านnและจะแก้ไขลงในพอร์ตของคำตอบของ Leaky Nun


4

Python 2 , 88 ไบต์

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

ใช้จำนวนเต็มสองจำนวนเป็นอินพุตและส่งคืนFalse(ง่ายต่อการคูณ) หรือTrue(ไม่ใช่)

ลองออนไลน์! (ช้าเกินไปสำหรับหนึ่งในกรณีทดสอบ)



len(`n+m`)จริงจะล้มเหลว40, 30
Dennis

len(`n+m`)+1?
Leun Nun

ที่ล้มเหลวสำหรับ400, 300 len(`n`+`m`)ควรทำอย่างไร
Dennis

4

JavaScript (Node.js) , 43 41 37 36 ไบต์

ขอบคุณ @ Dennisสำหรับความคิดในการใช้การแก้ไขสตริงในคำตอบนี้และบันทึก 4 ไบต์!

ขอบคุณ @ ØrjanJohansenสำหรับ -1!

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

ลองออนไลน์!

แน่นอนเมื่อฐานปลายทางนั้นต่ำกว่าฐานเดิม (เช่นในคำตอบ Jelly ของฉันฐานคือ 2) <ต้องพลิก


ขอแสดงความยินดีกับการเป็นคนแรกที่คิดออกว่าจะใช้การแปลงฐานซึ่งฉันให้ความโปรดปรานแก่คุณ!
xnor

3

ภาษา Wolfram (Mathematica) , 75 66 65 56 ไบต์

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

ลองออนไลน์!

รับอินพุต 2 สตริง

คำอธิบาย:

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 สำหรับการเปลี่ยนการใช้สตริงเป็นอินพุต

-1 สำหรับการใช้ตัวดำเนินการมัด

-9 ขอบคุณ @MartinEnder สำหรับMaxฟังก์ชั่น


3

Python 2 , 158 135 123 113 ไบต์

-12 bytes ขอบคุณแม่ชี Leaky -10 bytes ขอบคุณ ovs

a,b=input()
e=enumerate
l=[0,0]*len(a+b)
for i,x in e(a):
 for j,y in e(b):l[i-~j]+=int(x)*int(y)
print max(l)<10

ลองออนไลน์! หรือลองกรณีทดสอบทั้งหมด


ใช้งานไม่ได้all(d[k]<10for k in d)หรือเป็นเพียง Python 3
shooqie

1
@ shooqie ใช่แล้ว แต่ตอนนี้มันเป็นรายการ c:
Rod


3

Julia 0.6 , 30 ไบต์

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

ลองออนไลน์!

อินพุตเป็น tuple ของตัวเลขเอาต์พุตtrueสำหรับตัวเลขที่ยากต่อการคูณและfalseเพื่อให้ง่าย

. เป็นฟังก์ชั่นการใช้งานองค์ประกอบที่ชาญฉลาด

...ขยาย tuple (ของรายการตัวเลขจำนวนเต็ม) เป็นสองอินพุตแยกของconvฟังก์ชั่น



3

SNOBOL4 (CSNOBOL4) , 268 264 247 246 243 131 ไบต์

	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

ลองออนไลน์!

พอร์ตวิธีโดยNitrodon ฉันคิดว่านี่เป็นครั้งแรกที่ฉันเคยกำหนดฟังก์ชั่นใน SNOBOL Dสำหรับผลรวมหลัก

	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

รุ่นเก่า 243 ไบต์:

	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

ลองออนไลน์!

อินพุตบน STDIN คั่นด้วยบรรทัดใหม่เอาท์พุทไปยัง STDOUT: ขึ้นบรรทัดใหม่เดียวเพื่อให้ง่ายต่อการคูณและไม่มีเอาต์พุตสำหรับการคูณที่ไม่ง่าย

นี่จะไม่ชนะรางวัลใด ๆ แต่มันนำเสนอแนวทางอื่น (ดีจริงๆนี่คือแนวทางที่ไร้เดียงสา) ฉันไม่คิดว่าฉันจะเขียนสิ่งนี้ได้ใน cubix แต่ SNOBOL นั้นแข็งแกร่งพอที่จะทำงานด้วยเหมือนเดิม

เนื่องจากมันใช้อินพุตเป็นสตริงสิ่งนี้จะทำงานสำหรับอินพุตใด ๆ ที่มีน้อยกว่า 512 หลักแต่ละตัว ฉันไม่แน่ใจ 100% ว่าARRAYSNOBOL จะใหญ่ขนาดไหน

อินพุตถูกบัฟเฟอร์ใน SNOBOL เวอร์ชันนี้มีความกว้างสูงสุด 1024 อักขระ ตัวละครอื่น ๆ ทั้งหมดจะสูญหายไป ดูเหมือนว่า ARRAY อาจมีขนาดค่อนข้างใหญ่ ดีกว่าเซลล์ 2048 ที่จำเป็น

	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

ถ่านขนาด 38 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด เอาต์พุต a -เมื่อตัวเลขนั้นง่ายต่อการคูณ คำอธิบาย:

≔E⁺θη⁰ζ

กำหนดค่าเริ่มต้นzเป็นอาร์เรย์ขนาดใหญ่ (ผลรวมของความยาวของอินพุต) ที่มีค่าศูนย์

FLθFLη

ห่วงกว่าดัชนีของปัจจัยการผลิตที่และqh

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

ดำเนินการหนึ่งขั้นตอนของการคูณแบบยาว

‹⌈ζχ

ตรวจสอบการพกพา



2

Haskell, 82 81 ไบต์

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

ตัวเลขที่นำมาเป็นสตริง ส่งคืนFalseถ้าตัวเลขนั้นง่ายต่อการคูณและTrueอื่น ๆ

ลองออนไลน์!

ฉันคิดว่ามันเพียงพอที่แตกต่างจาก@ คำตอบของ มันทำงานอย่างไร:

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

ทางออกที่ดี! ฉันกำลังมองหาวิธีที่จะกำจัดการนำเข้า แต่พวกเขาก็จบลงได้นานขึ้น
Laikoni

2

Haskell , 45 44 ไบต์

แก้ไข:

  • -1 ไบต์ที่เปลี่ยนแปลงไป==<

ฉันคิดถึงสิ่งนี้ก่อนที่จะดูคำตอบอื่น ๆ จากนั้นค้นพบว่าอลิซใช้แนวคิดพื้นฐานเดียวกัน การโพสต์ต่อไปเนื่องจากสั้นกว่าคำตอบของ Haskell อื่น ๆ

?Boolใช้เวลาสองจำนวนเต็มและผลตอบแทน 331?1021ใช้เป็น Falseหมายถึงการคูณนั้นง่าย

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

ลองออนไลน์!

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



1

Perl 5 , 100 + 2 ( -F) = 102 ไบต์

push@a,[reverse@F]}{map{for$j(@{$a[0]}){$b[$i++].='+'.$_*$j}$i=++$c}@{$a[1]};map$\||=9>eval,@b;say$\

ลองออนไลน์!

เอาต์พุตเป็นเท็จเพื่อความง่าย, เป็นจริงสำหรับไม่ใช่เรื่องง่าย


1

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

;PDḄµṪ⁼P

ลองออนไลน์!

พอร์ตจาวาสคริของฉันคำตอบ ไม่สั้นกว่าคำตอบของเยลลี่ที่มีอยู่เพราะเจลลี่มีการโน้มน้าวในตัว

รับอินพุตเป็นรายการของตัวเลขสองตัว ผลตอบแทน1สำหรับง่าย0ไม่ง่าย


คำอธิบาย:


;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 ไบต์

โดยทั่วไปทำการคูณ "ด้วยมือ" เป็น r [] และตั้งค่าส่งคืนหากคอลัมน์ใด ๆ ได้สูงกว่า 9 เนื่องจากนั่นหมายถึงการพกพาเกิดขึ้น

น่าแปลกที่นี่สั้นกว่าความพยายามครั้งแรกของฉันที่ใช้สตริงเป็นอาร์กิวเมนต์

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

ลองออนไลน์!

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