掛けやすい数字


34

あなたの仕事は2つの数字を掛けるの簡単かどうかを決定することです。これは、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
 ^^^

また、加算ステップでキャリーが発生しなくても、get に乗算するとキャリーオーバーが発生するため、乗算は簡単1216はありません。12 * 672

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

入力: 2つの正の整数またはそれらの文字列表現。あなたの言語の整数型がオーバーフローせず、製品もオーバーフローしないと仮定するかもしれません。

出力:乗算が容易な場合は1つの一貫した値、そうでない場合は別の一貫した値。

テストケース:最初の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いいえ。ただし、文字列オプションはデフォルトでstringオプションに有効です。
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すごい畳み込み:DIコードゴルフで使用される畳み込みを見るのはこれが初めてだと思います:D +1
HyperNeutrino



@LuisMendoいいえ、それは別の畳み込みです。
エリックアウトゴルファー

ところで、最後の3バイトは<⁵Ạ、ブール演算を実行せずに出力用に置き換えることができます。
エリックアウトゴルファー

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バイト

@Shaggyが示唆するように、文字列を取ることで3バイトを節約
しました@LeakyNunが指摘したように、このメソッドは特定の大きな整数で失敗します

入力をカリー化構文の2つの文字列として受け取ります(a)(b)true簡単に、または簡単falseではないために戻ります。

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

テストケース

どうやって?

ここでの考え方は、各要素の各桁の前にゼロを挿入することにより、キャリーを明示的に公開することです。

例:

  • 331 x 102130301 x 1000201になり337951ではなく30307090501になります。結果に先行ゼロを追加し、すべての数字を2でグループ化することにより、03 03 07 09 05 01と記述できます。すべてのグループは10未満です。これは、標準の乗算ではキャリーがなかったことを意味します。

  • 431 x 102140301 x 1000201になります。これは40309100501となり04 03 09 10 05 01と記述できます。今回は、標準の乗算でキャリーを明らかにする10があります。


できる...アルゴリズムの基本的な説明はありますか?
完全に人間

@totallyhuman説明を追加しました。(おっと...また、バグを修正しました。)
Arnauld

1
入力を文字列として取得することで3バイトを節約できるはずです。
シャギー

3
あなたのアルゴリズムが失敗する(理論的な)反例を見つけるのに私は永遠を要しました:tio.run / ##y0rNyan8 / 9 / l8LJk / f///…108中央はアルゴリズムを台無しにします)
Leaky Nun

@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

R135 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のanswerのように畳み込みアプローチを使用するようになったため、整数として入力を取得し、TRUE乗算が難しい数値と乗算FALSEが容易な数値を返します。

私は過去に畳み込みアプローチを移植するのに常に苦労していましたが、今日私はついにドキュメントを読みまし

2つの配列の畳み込みの通常の定義をすることを注意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))

2つの整数を入力として受け取り、False(乗算が簡単)またはTrue(無効)を返します。

オンラインでお試しください!(テストケースの1つに対して遅すぎる)



len(`n+m`)実際のために失敗する40、30
デニス

len(`n+m`)+1
リーキーN僧

それはのために失敗した400、300len(`n`+`m`)しかしする必要があります。
デニス

4

JavaScript(Node.js)43 41 37 36バイト

この回答で文字列補間を使用して4バイトを節約するアイデアを@ Dennisに感謝します!

@ ØrjanJohansenに感謝します-1!

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

オンラインでお試しください!

もちろん、宛先ベースが元のベースよりも小さい場合(私のゼリーの回答のように、ベースは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 Max関数の@MartinEnderに感謝


3

Pythonの2158の 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です:
ロッド


3

ジュリア0.6、30バイト

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

オンラインでお試しください!

入力は数字のタプルであり、出力はtrue数字を乗算するのが難しくfalse、簡単な数字です。

. 要素ごとの関数アプリケーションです。

...(整数桁のリストの)タプルをconv関数の2つの独立した入力に展開します。



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

オンラインでお試しください!

ニトロドンによるアプローチを移植します。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への出力:乗算しやすい単一の改行、および乗算しにくいための出力なし。

これは賞を獲得するものではありませんが、別のアプローチを提示します(実際、これは単純なアプローチです)。私はこれをキュービックスで書くことができるとは思いませんが、SNOBOLはそのままで動作するのに十分に厳しいです。

入力を文字列として受け取るため、これはそれぞれ512桁未満の入力に対して機能します。ARRAYSNOBOLのsがどれだけ大きいかは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§ηκ

長い乗算の1ステップを実行します。

‹⌈ζχ

キャリーを確認してください。



2

Haskell、82 81バイト

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

文字列として取られる数字。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

いい解決策!インポートを削除する方法を探していましたが、それらはさらに長くなりました。
ライコニ

2

Haskell45 44バイト

編集:

  • -1バイトがに変更さ==<ます。

私は他の答えを見る前にこれを考え、そしてアリスの人が同じ基本的なアイデアを使用していることを発見しました。とにかく投稿するのは、他のHaskellの回答よりも短いからです。

?2つの整数を取り、を返しますBool。として使用し331?1021ます。False乗算が簡単であることを意味します。

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

オンラインでお試しください!

  • s整数の桁の合計を計算する関数です。(read.pure1桁の文字を整数に変換します。)
  • 数値のペアを乗算するのが簡単な場合、積の桁合計は桁合計の積に等しくなります。
  • 逆に、長い乗算中のキャリーは、その理想の積の桁数を減らします。




1

ゼリー、8バイト

;PDḄµṪ⁼P

オンラインでお試しください!

私のJavascript 回答の移植版。既存のゼリーの答えより短くないJellyには強力な畳み込みが組み込まれているため。

入力を2つの数字のリストとして受け取ります。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.