곱하기 쉬운 숫자


34

당신의 임무는 두 숫자 를 곱하기 쉬운 지 결정하는 것 입니다. 즉, 10의 긴 곱셈 에는 곱셈 단계와 더하기 단계를 모두보고 자리 값 사이에 캐리 (재 그룹화)가 없습니다. 이것은 곱하는 각 숫자 쌍이 9 이하를 제공하고 각 열의 합이 9 이하일 때 발생합니다.

예를 들어, 331및은 1021곱셈에 쉽게 :

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

그리고 우리가 다른 순서로 곱하면 항상 그렇습니다.

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

그러나, 4311021열 사이에 발생 된 캐리하는 표시로, 곱셈에 쉽지 않은 :

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

또한, 1216곱 없을 때 캐리 오버 발생 곱하기 때문에에 쉽지 않다 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 wow convolution : DI 코드 골프에서 사용 된 컨볼 루션을 본 것은 처음이라고 생각합니다 : D +1
HyperNeutrino



@LuisMendo 아니오, 그것은 다른 회선입니다.
아웃 골퍼 에릭

BTW <⁵Ạ부울 NOT을 수행하지 않고 마지막 3 바이트 를 출력으로 대체 할 수 있습니다 .
아웃 골퍼 에릭

8

자바 스크립트 (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 바이트

@Shaggy가 제안한 것처럼 문자열을 가져 와서 3 바이트를 절약했습니다. @LeakyNun
이 지적한 것처럼이 방법은 일부 큰 정수에서 실패합니다.

카레 구문에서 2 개의 문자열로 입력을 (a)(b)받습니다. true쉬운 또는 쉽지 false않은 반환 합니다 .

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

테스트 사례

어떻게?

여기서 아이디어는 각 요인의 각 숫자 앞에 0을 삽입하여 캐리를 명시 적으로 노출하는 것입니다.

예 :

  • 331 x 102130301 x 1000201 이되어 337951 대신 30307090501이 됩니다. 결과에 선행 0을 추가하고 모든 숫자를 2로 그룹화하면 03 03 07 09 05 01 로 쓸 수 있습니다 . 모든 그룹이 10 보다 작으므로 표준 곱셈에 캐리가 없었을 것입니다.

  • X 1,021 431 해진다 40,301 X 1,000,201 부여 40,309,100,501을 과 같이 쓸 수있다 04 03 09 10 05 01 . 이번에 는 표준 곱셈의 캐리를 나타내는 10 이 있습니다.


... 알고리즘에 대한 기본적인 설명이 있습니까?
완전히 인간적인

@totallyhuman 설명을 추가했습니다. (죄송합니다 ... 또한 버그를 수정했습니다.)
Arnauld

1
입력을 문자열로 사용하여 3 바이트를 절약 할 수 있어야합니다.
Shaggy

3
: 그것은 당신의 알고리즘이 실패합니다 (이론) 카운터 - 예를 찾기 위해 나에게 영원을했다 tio.run/##y0rNyan8/9/l8LJk/f///... 합니다 ( 108알고리즘까지 중간 놨에서)
새는 수녀

@LeakyNun 좋은 발견. 예, 이론적으로 오버플로 될 수 있습니다.
Arnauld

6

Alice , 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

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

온라인으로 사용해보십시오!

입력을 문자열로받습니다.

못 생겼지 만 작동합니다.

이것은 이제 Leaky Nun의 답변 에서와 같이 컨벌루션 접근법을 사용 하므로 입력을 정수로 가져 와서 TRUE곱하기 어려운 숫자와 FALSE곱하기 쉬운 숫자로 반환 합니다.

과거에는 항상 컨볼 루션 접근법을 이식하는 데 문제가 있었지만 오늘은 마침내 설명서를 읽었 습니다 .

두 시퀀스의 회선의 일반적인 정의가 있음을 참고 x하고 y주어진다convolve(x, rev(y), type = "o")

그냥 바보입니다. 따라서 자릿수 추출은에 대해 반대로되어 nLeaky Nun의 답변 포트로 해석됩니다.


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 동안 실패합니다 .
Dennis

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

400, 300에서는 실패합니다 . len(`n`+`m`)그래야합니다.
Dennis

4

자바 스크립트 (Node.js) , 43 41 37 36 바이트

이 답변에 문자열 보간을 사용 하고 4 바이트를 절약 한다는 아이디어에 대해 @ Dennis 에게 감사드립니다 !

-1 주셔서 감사합니다 @ ØrjanJohansen !

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

온라인으로 사용해보십시오!

물론 목적지 기지가 원래 기지보다 작을 때 (내 젤리 답변에서와 같이베이스는 2입니다) <뒤집어 야합니다.


기본 전환을 사용하여 처음으로 현상금을 지급 한 것을 축하합니다.
xnor

3

Wolfram Language (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 Max기능에 대한 감사 @MartinEnder


3

파이썬 (2) , 158 (135) 123 113 바이트

Leaky Nun 덕분에 -12 바이트 ovs 덕분에 -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)작동 하지 않거나 Python 3입니까?
shooqie

1
@shooqie 네, 그렇습니다. 그러나 이제는 목록 c입니다.
Rod


3

Julia 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

온라인으로 사용해보십시오!

Nitrodon 의 접근 방식을 포팅 합니다. 나는 이것이 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에 출력 : 곱하기 쉬운 단일 개행 및 곱하기 쉽지 않은 출력이 없습니다.

이것은 어떤 상도 얻지 못하지만 다른 접근법을 제시합니다 (실제로 이것은 순진한 접근법입니다). 나는 이것을 cubix로 작성할 수는 없다고 생각하지만 SNOBOL은 그 자체로 작업하기에 충분히 강합니다.

문자열로 입력을 받기 때문에 각각 512 자리 미만의 입력에 작동합니다. ARRAYSNOBOL이 얼마나 큰지 100 % 확신 할 수 없습니다.

이 버전의 SNOBOL에서 INPUT은 버퍼링되어 최대 너비는 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η

입력 q과 의 인덱스를 반복합니다 h.

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

긴 곱셈의 한 단계를 수행하십시오.

‹⌈ζχ

운반을 확인하십시오.



2

하스켈, 82 81 바이트

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

숫자 a는 문자열로 사용됩니다. 반환합니다 False숫자는 곱셈에 쉽게 경우 True그렇지.

온라인으로 사용해보십시오!

@Laikoni의 답변 과 충분히 다르다고 생각합니다 . 작동 방식 :

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

하스켈 , 45 44 바이트

편집하다:

  • -1 바이트가로 변경 ==되었습니다 <.

나는 다른 답변을보기 전에 이것을 생각한 다음 Alice가 동일한 기본 아이디어를 사용한다는 것을 발견했습니다. 어쨌든 다른 Haskell의 답변보다 짧기 때문에 게시하십시오.

?두 정수를 가져와 a를 반환합니다 Bool. 로 사용하십시오 331?1021. False곱셈이 쉽다는 것을 의미합니다.

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

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.