आसान-से-गुणा संख्या


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 नहीं, हालांकि स्ट्रिंग विकल्प के लिए वर्णों की एक सूची डिफ़ॉल्ट रूप से मान्य है।
xnor

जवाबों:


14

जेली , 7 बाइट्स

Dæc/>9Ẹ

इसे ऑनलाइन आज़माएं!

दृढ़ संकल्प का उपयोग करता है (जो मैंने जेली में योगदान दिया: डी)

यह काम किस प्रकार करता है

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

o वाह विश्वास: DI को लगता है कि यह मेरा पहली बार है जब किसी कोड-गोल्फ में उपयोग किए गए कनवल्शन को देखते हुए: D +1
हाइपरन्यूट्रीनो



@LuisMendo नहीं, यह एक अलग दृढ़ संकल्प है।
आउटगॉल्फ

BTW आप पिछले 3 बाइट्स को <⁵Ạबूलियन के बिना आउटपुट के साथ बदल सकते हैं ।
को आउटगॉल्फ को एरिक करें

8

जावास्क्रिप्ट (ईएस 6), 67 बाइट्स

करी सिंटैक्स में 2 स्ट्रिंग्स के रूप में इनपुट लेता है (a)(b)falseआसान या trueआसान नहीं के लिए रिटर्न ।

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

परीक्षण के मामलों


ऑल्ट। संस्करण (त्रुटिपूर्ण), 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 एक्स 1,000,201 है, जो देता है +३०३०७०९०५०१ बजाय 337,951 । परिणाम में एक अग्रणी शून्य जोड़कर और सभी अंकों को 2 से जोड़कर, इसे 03 03 07 09 05 01 के रूप में लिखा जा सकता है । सभी समूह 10 से कम हैं , जिसका अर्थ है कि मानक गुणा में कोई भी कैरी नहीं हुआ होगा।

  • 431 x 1021 40301 x 1000201 बन जाता है , जो 40309100501 देता है और इसे 04 03 09 10 05 01 के रूप में लिखा जा सकता है । इस बार, हमारे पास एक 10 है जो मानक गुणा में एक कैरी का खुलासा करता है।


कर सकते हैं ... हम एल्गोरिथ्म पर एक बुनियादी स्पष्टीकरण हो सकता है?
अशुभ

@totallyhuman मैंने एक स्पष्टीकरण जोड़ा है। (उफ़ ... और एक बग भी तय किया।)
अरनौलड

1
लगता है कि आपको इनपुट को स्ट्रिंग्स के रूप में ले कर 3 बाइट्स को बचाने में सक्षम होना चाहिए।
झबरा

3
मुझे एक (सैद्धांतिक) प्रति-उदाहरण खोजने में अनंत काल लग गया, जो आपका एल्गोरिथ्म विफल हो जाएगा: tio.run/##y0rNyan8/9/l8LJk/f//// ( 108बीच में अपने एल्गोरिथ्म को गड़बड़)
लीक नन

@LeakyNun अच्छा लगा। हां, यह सैद्धांतिक रूप से अतिप्रवाह हो सकता है।
अरनुलड

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

आर , 135 110 109 86 बाइट्स

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

इसे ऑनलाइन आज़माएं!

तार के रूप में इनपुट लेता है।

यह बदसूरत है, लेकिन यह ™ काम करता है।

अब यह एक कन्वेक्शन अप्रोच का उपयोग करता है, जैसा कि लीकी नून के उत्तर में है , इसलिए यह पूर्णांकों के रूप में इनपुट लेता है, और TRUEहार्ड से गुणा करने के FALSEलिए और आसानी से गुणा करने के लिए रिटर्न करता है।

मुझे हमेशा अतीत में कन्वेंशन दृष्टिकोण को पोर्ट करने में कुछ परेशानी हुई है, लेकिन आज मैं अंत में प्रलेखन पढ़ता हूं :

ध्यान दें कि दो अनुक्रमों के दृढ़ीकरण की सामान्य परिभाषा xऔर yद्वारा दी गई हैconvolve(x, rev(y), type = "o")

जो सिर्फ मूर्खतापूर्ण है। अतः डिजिट निष्कर्षण के लिए उल्टा होता है n, और यह लीक नून के उत्तर के एक बंदरगाह में बदल जाता है।


4

पायथन 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 के लिए असफल होगा ।
डेनिस

len(`n+m`)+1?
लीक नन

यह 400, 300 के लिए विफल रहता है । len(`n`+`m`)हालांकि करना चाहिए।
डेनिस

4

जावास्क्रिप्ट (Node.js) , 43 41 37 36 बाइट्स

इस उत्तर में स्ट्रिंग प्रक्षेप का उपयोग करने के विचार के लिए @ डेनिस और 4 बाइट्स बचाने के लिए धन्यवाद !

धन्यवाद @ @rjanJohansen -1 के लिए!

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

इसे ऑनलाइन आज़माएं!

बेशक जब गंतव्य आधार मूल आधार से कम हो (जैसे मेरे जेली उत्तर में, आधार 2 है) को <फ़्लिप किया जाना चाहिए।


आधार रूपांतरण का उपयोग करने वाले पहले व्यक्ति होने के लिए बधाई, जिसके लिए मैं आपको इनाम देता हूं!
xnor

3

वोल्फ्राम लैंग्वेज (गणितज्ञ) , 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

पायथन 2 , 158 135 123 113 बाइट्स

-12 बाइट्स के लिए धन्यवाद लीक नन -10 बाइट्स ओव्स के लिए धन्यवाद

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)काम नहीं करता है या यह सिर्फ पायथन 3 है?
शौकी

1
@shooqie हाँ, यह करता है, लेकिन अब यह एक सूची है c:
Rod


3

जूलिया 0.6 , 30 बाइट्स

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

इसे ऑनलाइन आज़माएं!

इनपुट संख्याओं का एक समूह है, आउटपुट trueकठिन संख्याओं के लिए और falseआसान लोगों के लिए है।

. तत्व-वार फ़ंक्शन अनुप्रयोग है।

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

इसे ऑनलाइन आज़माएं!

निट्रोडन द्वारा दृष्टिकोण को पोर्ट करता है । मुझे लगता है कि यह पहली बार है जब मैंने कभी Dअंक के लिए SNOBOL में एक फ़ंक्शन को परिभाषित किया है ।

	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 के लिए आउटपुट: आसान से गुणा करने के लिए एक ही नईलाइन, और गुणा करने के लिए आसान नहीं के लिए कोई आउटपुट।

यह किसी भी पुरस्कार को जीतने के लिए नहीं है, लेकिन यह एक और दृष्टिकोण प्रस्तुत करता है (ठीक है, वास्तव में यह अनुभवहीन दृष्टिकोण है)। मुझे नहीं लगता कि मैं इसे क्यूबिक्स में लिख सकता हूं, लेकिन एसएनओबीओएल इसके साथ काम करने के लिए काफी कठिन है।

चूंकि यह इनपुट को एक स्ट्रिंग के रूप में लेता है, यह किसी भी इनपुट के लिए 512 अंक से कम के साथ काम करेगा; मैं 100% निश्चित नहीं हूँ कि ARRAYSNOBOL में कितना बड़ा हो सकता है।

INPUT को 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§ηκ‹⌈ζχ

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। -संख्याओं को गुणा करने में आसान होने पर आउटपुट । स्पष्टीकरण:

≔E⁺θη⁰ζ

zशून्य के लिए एक बड़े पर्याप्त (इनपुट की लंबाई का योग) सरणी के लिए प्रारंभिक ।

FLθFLη

इनपुट्स के सूचकांकों पर लूप qऔर h

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

लंबी गुणा का एक चरण करें।

‹⌈ζχ

कैरी के लिए जाँच करें।



2

हास्केल, 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

अच्छा समाधान! मैं आयात से छुटकारा पाने के तरीकों की तलाश कर रहा था, लेकिन वे लंबे समय तक समाप्त हो गए।
लिकोनी

2

हास्केल , 45 44 बाइट्स

संपादित करें:

  • -1 बाइट को बदलने ==के लिए <

मैंने दूसरे उत्तरों को देखने से पहले यह सोचा, फिर पता चला कि ऐलिस एक ही मूल विचार का उपयोग करता है। वैसे भी पोस्ट करना क्योंकि यह अन्य हास्केल उत्तरों से छोटा है।

?दो पूर्णांक लेता है और एक रिटर्न देता है Bool। के रूप में उपयोग करें 331?1021Falseइसका मतलब यह है कि गुणन आसान है।

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

इसे ऑनलाइन आज़माएं!

  • sएक ऐसा फ़ंक्शन है जो पूर्णांक के अंकों के योग की गणना करता है। ( read.pureएकल अंक वर्ण को पूर्णांक में रूपांतरित करता है।)
  • यदि संख्याओं की एक जोड़ी को गुणा करना आसान है, तो उत्पाद का अंक योग अंक योग के उत्पाद के बराबर है।
  • इसके विपरीत, लंबी गुणा के दौरान कोई भी कैरी उस आदर्श से उत्पाद की अंक राशि को कम करेगा।




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

सी (जीसीसी) , 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;}

इसे ऑनलाइन आज़माएं!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.