ฉันต้องมีจำนวนเท่าใดที่ต้องเพิ่มตัวเลขทั้งสองนี้


27

งาน

กำหนดจำนวนเต็มบวกสองตัวเอาท์พุทจำนวนการถือครองที่ต้องการเพื่อรวมเข้าด้วยกันในการเพิ่มความยาวในฐาน 10

ตัวอย่าง

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

ต้องมีสามอุ้ม

 ¹
 348
+ 91
----
 439

ต้องพกหนึ่งอัน

Testcases

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

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดในการชนะไบต์ ช่องโหว่มาตรฐานใช้


ที่เกี่ยวข้อง
Leun Nun

14
กรณีทดสอบที่แนะนำ: 190192, 90909(มีการหยุดพักระหว่างการทดสอบ)
Jonathan Allan

5
จาก@Jenny_mathy คำตอบ : จำนวนของการดำเนินการเท่ากับความแตกต่างระหว่าง (1) ผลรวมของผลรวมหลักของสองอินพุตและ (2) ผลรวมหลักของผลรวมของทั้งสองอินพุตหารด้วยเก้า นี่คือเนื่องจากเมื่อมีการพกพาคุณลบ 10 จากและเพิ่ม 1 กับผลรวมหลัก ตัวอย่างเช่น9+9ให้คุณ18แต่ผลรวมหลักคือ9+9-10+1เพราะมีการพกพา
JungHwan Min


เราสามารถสมมติว่าตัวเลขเหมาะสมกับชนิด int ของภาษาของเราหรือไม่? โดยเฉพาะอย่างยิ่งสำหรับ Python 2 เราควรจัดการกับการreprต่อท้ายLตัวเลขด้านบน2**63-1หรือไม่
xnor

คำตอบ:


21

Mathematica, 46 39 ไบต์

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

อินพุต

[348,51]

-7 bytes จาก JungHwan


แดงฉันชอบวิธีนี้มาก ความแตกต่างระหว่าง (1) ผลรวมของผลรวมหลักของทั้งสองอินพุทและ (2) ผลรวมหลักของผลรวมของทั้งสองอินพุทคือเก้าเท่าของจำนวนการบรรทุกเพราะเมื่อมีการพกพาคุณลบ 10 จาก ผลรวมหลักและเพิ่ม 1 เข้ากับผลรวมหลัก
JungHwan Min

ฉันด้วย! ขอบคุณสำหรับเคล็ดลับการเล่นกอล์ฟ
J42161217

ผู้ทดสอบพูดว่า [348,51] ควรกลับ 0 แต่ฉันได้รับ 56/3 เมื่อฉันเรียกใช้ ...
numbermaniac

Welp ดูเหมือนว่าจะใช้งานได้ในขณะนี้ ไม่แน่ใจว่าสิ่ง Mathematica ได้ทำมาก่อน ...
numbermaniac

6

JavaScript (ES6), 50 ไบต์

แก้ไข Stolen จากโซลูชันของ 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
Toto

มันทำงานอย่างไร คุณสามารถเพิ่มคำอธิบายได้ไหม?
Arjun

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 คุณจำเป็นต้องใช้หากพวกมันถูกใช้ภายในฟังก์ชั่นโดยไม่ต้องเริ่มต้น
Leun Nun

1
เพิ่งได้รับหัวของฉันรอบเริ่มต้นที่นี่: ตัวแปรเป็นศูนย์เริ่มต้นโดยอัตโนมัติ แต่เพียงครั้งเดียวดังนั้นเนื่องจากการส่งฟังก์ชั่นใน PPCG ต้องทำงานหากฟังก์ชั่นการทำงานมากกว่าหนึ่งครั้งพวกเขาจะต้องเป็นศูนย์ด้วยตนเองเพื่อประโยชน์ของวินาที และวิ่งตามมา

5

เยลลี่ ,  13 12 11  9 ไบต์

-1 ไบต์โดย porting คำตอบวิชาคณิตศาสตร์ Jenny_mathy ของ
-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

ลิงก์ monadic ที่จับคู่เป็นจำนวนเต็มและส่งคืนจำนวนการดำเนินการเป็นจำนวนเต็ม

อาจมีวิธีที่สั้นกว่านี้! มี!

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร

:⁵+ · 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

การใช้งานหลายอย่างDและS...
Erik the 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 ไบต์ที่ลอยaและbเลื่อนลงแทน

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

น่าเศร้าที่พบปัญหาความแม่นยำลอย


คุณใช้a+b<mเป็นเงื่อนไขสิ้นสุดไม่ได้ใช่ไหม
Neil

@ Neil มันจะต้อง<=มีความยาว
xnor

1e99andน่ารังเกียจ
Jonas Schäfer

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 บันทึกแล้ว 7 ไบต์โดยดำเนินการตรวจสอบการพกพาของ @ xnor ฉันยังมีรุ่น 45 ไบต์ที่หรูหรากว่า แต่ก็มีปัญหาจากความไม่ถูกต้องของเลขทศนิยม มันจะทำงานได้ดีในการแปลเป็นภาษาที่มีเลขทศนิยมที่แน่นอน:

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

3

Python 2 , 55 ไบต์

f=lambda a,b,c=0:c+a+b and c+f(a/10,b/10,a%10+b%10+c>9)

ลองออนไลน์!


1
ตามที่โจนาธานอัลลันชี้ให้เห็นว่าถ้าคุณใช้การเรียกไปยังฟังก์ชั่นของคุณคุณต้องประกาศเช่นกัน ที่ถูกกล่าวว่าคำตอบของคุณคือ 55 ไบต์
นาย Xcoder

@ Mr.Xcoder คงมัน
OVS


2

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

ลองมัน!


1

PHP> = 7.1, 81 ไบต์

for([,$x,$y]=$argv,$i=1;($x+$y)/$i|0;$i*=10)$d+=$c=$x/$i%10+$y/$i%10+$c>9;echo$d;

-2 Bytes remove |0ในกรณีนี้ลูปจะทำงานจนกว่า$iจะเป็นINF

กรณีทดสอบ


เมื่อไหร่จะ$iกลายเป็นINF?
แมว

@cat ฉันไม่แน่ใจว่าทำไมมันถึงสำคัญ ฉันไม่ได้ใช้สิ่งนี้ 1.0E+309เป็นINFค่าแรก ลองออนไลน์!
JörgHülsermann

0

Braingolf , 20 ไบต์

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

ลองออนไลน์!

ใช้วิธีการเดียวกันกับคนอื่น ๆ

ฉันสามารถบันทึกไบต์หรือ 2 ได้ฉันมีความสุขุมในการอนุญาตให้dใช้ตัวแก้ไขโลภแล้วฉันจะแทนที่d<dด้วย&dอาได้ดีในครั้งต่อไป

คำอธิบาย

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.