これら2つの数字を追加するには、いくつのキャリーが必要ですか?


27

仕事

2つの正の整数が与えられた場合、基数10で長い加算で加算するために必要な桁上げの数を出力します。

¹¹¹   <-- carries
 999
+  1
----
1000

3つのキャリーが必要です。

 ¹
 348
+ 91
----
 439

1つのキャリーが必要です。

テストケース

999,   1 -> 3
398,  91 -> 1
348,  51 -> 0
348,  52 -> 2
  5,  15 -> 1
999, 999 -> 3
505, 505 -> 2

得点

これはです。バイト単位の最短回答が優先されます。標準の抜け穴が適用されます。



14
推奨されるテストケース:(190192, 90909キャリーが途切れています)。
ジョナサンアラン

5
@Jenny_mathyの答え:運びの数は、2つの入力と、(2)9で割った2つの入力の和の数字和の数字和の和(1)との差に等しいです。これは、キャリーがある場合、桁の合計から10を減算し、1を加算するためです。たとえば、9+9が表示されます18が、桁上げは桁上げ9+9-10+1があるためです。
ジョンファンミン


言語のint型に数値が適合すると仮定できますか?特にPython 2の場合、上記のfor数値をrepr追加するL必要があり2**63-1ますか?
-xnor

回答:


21

Mathematica、46 39バイト

x=Tr@*IntegerDigits;(x@#+x@#2-x@+##)/9&

入力

[348,51]

ジョンファンから-7バイト


ダン、私はこの方法が本当に好きです。(1)2つの入力の桁合計の合計と(2)2つの入力の合計桁の合計との差は、桁上げがある場合、桁上げがある場合は10桁合計し、桁合計に1を加算します。
ジョンファンミン

私も!ゴルフのヒントをありがとう
J42161217

テストケースでは、[348,51]は0を返すはずですが、これを実行すると56/3になります...?
numbermaniac

Welp、今は動いているようだ。Mathematicaが以前何をしていたのかわからない
...-numbermaniac

6

JavaScript(ES6)、50バイト

ovsのソリューションから盗まれた問題を修正

f=(a,b,c=0)=>a|b|c&&c+f(a/10,b/10,a%10+b%10+c>=10)

説明

f=(a,b,c=0)=>                                      Function taking two numbers and optional carry
             a|b|c                                 If a number or the carry are nonzero
                  &&                               Then
                    c+f(a/10,b/10,a%10+b%10+c>=10) Return carry plus all other carries

説明を運ぶ

a%10+b%10+c     Sum of mod 10 of the numbers and c - remember these are not floordiv'ed
           >=10 Greater than or equals to 10 (we can't use greater than 9 here)

f=(a,b,c=0)=>a|b|c&&c+f(a/10,b/10,a%10+b%10+c>=10)
console.log([[999,1],[398,91],[348,51],[348,52],[5,15],[999,999],[256,64],[190192,90909]].map(test=>`${(test[0]+'').padStart(6,' ')}, ${(test[1]+'').padStart(6,' ')} -> ${f(...test)}`).join('\n'));


1
348 , 52する必要があります2
トト

これはどのように作動しますか?説明を追加してもらえますか?
アルジュン

5

C(gcc)、65バイト

i,l;f(a,b){for(i=l=0;a+b;a/=10,b/=10)i+=a%10+b%10+l>9?l=1:0;a=i;}

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


グローバル変数を初期化する必要はありません。
user1502040

@ user1502040は、初期化されずに関数内で使用される場合に必要です。
リーキー修道女

1
ここで初期化に頭を悩ますだけです:変数自動的にゼロで初期化されますが、一度だけです。したがって、PPCGでの関数送信は、関数が複数回実行された場合に機能する必要があるため、2番目の利点のために手動でゼロにする必要があります以降の実行。

5

ゼリー 13 12 11  9 バイト

Jenny_mathyの数学的な答えを移植して-1バイト。
-2より良いゴルフでバイトを増やす:p

;SN$DFS:9

テストスイートをご覧ください

どうやって?

;SN$DFS:9 - Main link: list of numbers, [a,b]     e.g.   [348,53]
   $      - last two links as a monad
 S        -   sum                                            401
  N       -   negate                                        -401
;         - concatenate                             [348,53,-401] 
    D     - convert to decimal lists     [[3,4,8],[5,3],[-4,0,-1]]
     F    - flatten                           [3,4,8,5,3,-4,0,-1]
      S   - sum                                               18
       :9 - integer divide by nine                             2

私の12バイトのソリューション...

:⁵+
DUSç\>9S

整数のペアを取り、キャリーの数を整数として返すモナドリンク。

おそらくもっと短い方法があります!ありました!

オンラインでお試しください!またはテストスイートをご覧ください。

どうやって

:⁵+ · Link 1: perform a carry: right-column's-digit-sum, a; left-colum's-digit-sum; b
 ⁵  · literal 10
:   · a integer-divided by 10 - the carry amount
  + · add to b

DUSç\>9S · Main link: list of summands        e.g. [348,52]
D        · convert to decimal lists                [[3,4,8],[5,2]]
 U       · upend (reverse each)                    [[8,4,3],[2,5]]
  S      · sum (add the digits up)                 [10,9,3]
    \    · cumulative reduce with:
   ç     ·   last link (1) as a dyad               [10,10,4]
      9  · literal 9
     >   · greater than?                           [ 1, 1,0]
       S · sum                                     2

多くの用途DS...
エリックOutgolfer

4

Python、48バイト

f=lambda a,b,m=1:m<1e99and(~a%m<b%m)+f(a,b,m*10)

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

各場所の値について、その場所の値m=1, 10, 100, ..., 10**99にキャリーがあるかどうかを確認します。オーバーフローチェックa%m+b%m>=mはに短縮され~a%m<b%mます。

代わりにフロートしてシフトダウンする、より優れた45バイトのバリアントab

f=lambda a,b:a+b and(a%1+b%1>=1)+f(a/10,b/10)

悲しいことにフロート精度の問題に遭遇します。


a+b<m終了条件として使用できませんか?
ニール

@Neil <=どちらが長いかが必要です。
-xnor

1e99and厄介です。
ジョナスシェーファー

4

JavaScript(ES6)、53 45バイト

f=(a,b,d=1)=>a+b<d?0:(a%d+b%d>=d)+f(a,b,d*10)

キャリーを1の場所に追加することにより、1バイトを節約しました。@xnorのキャリーチェックを適切に使用することで7バイトを節約しました。また、よりエレガントな45バイトバージョンもありましたが、浮動小数点の不正確さに悩まされています。正確な10進数の算術演算を備えた言語に翻訳するとうまく機能します。

f=(a,b,c=a+b)=>c<1?0:a%1+b%1-c%1+f(a/10,b/10)



2

ニーム、10バイト

𝔸𝐣𝐬₁₂𝔻𝐬𝕊λ𝕍

説明:

𝔸            𝔸ppend the two inputs into a list
 𝐣            𝐣oin them together
  𝐬           𝐬um the characters
   ₁₂         Push the first input, then the second
     𝔻        A𝔻d.
      𝐬       𝐬um the characters
       𝕊      𝕊ubtract
         𝕍    Integer di𝕍ision by
        λ     nine (variable)

それを試してみてください!

代替ソリューション、10バイト:

𝔸D𝐣𝐬S𝐬𝐬𝕊9𝕍

説明:

𝔸             𝔸ppend the two inputs into a list
 D            Duplicate
  𝐣            𝐣oin
   𝐬           𝐬um
    S          Swap
     𝐬         𝐬um
      𝐬        𝐬um the characters
       𝕊       𝕊ubtract
         𝕍     integer di𝕍ide by
        λ       nine (variable)

それを試してみてください!



0

Braingolf、20バイト

VR{.M}d<d&+v+d&+c-9/

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

他の全員と同じ方法を使用します。

d貪欲な修飾子を使用できるようにする先見があった場合、1バイトまたは2バイトを保存できましたが、次回d<d&dahで置き換えることができました。

説明

VR{.M}d<d&+v+d&+c-9/  Implicit input from commandline args
VR                    Create stack2 and return to stack1
  {..}                Foreach loop, runs on each item in stack1
   .M                 Duplicate and move duplicate to stack2
      d<d             Split both items on stack into digits
         &+           Sum entire stack
           v+         Switch to stack2 and sum last 2 items on stack
             d&+      Split result into digits and sum all digits
                c     Collapse stack2 into stack1
                 -    Subtract last item from 2nd to last
                  9/  Divide by 9
                      Implicit output of last item on stack
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.