ความแตกต่างของจำนวนเต็มสามจำนวน


30

ใช้ฟังก์ชั่นต่างที่รับเป็นจำนวนเต็มสามจำนวนเต็ม x, y และ z มันควรกลับว่าการลบหนึ่งในจำนวนเหล่านี้จากอันอื่นให้อันที่สามหรือไม่

Test cases:
diff(5, 3, 2) yields True because 5 - 3 = 2
diff(2, 3, 5) yields True because 5 - 3 = 2
diff(2, 5, 3) yields True because 5 - 3 = 2
diff(-2, 3, 5) yields True because 3 - 5 is -2
diff(-5, -3, -2) # -5 - -2 is -3
diff(2, 3, -5) yields False
diff(10, 6, 4) yields True because 10 - 6 = 4
diff(10, 6, 3) yields False

คุณไม่จำเป็นต้องตั้งชื่อฟังก์ชั่นคุณอาจใช้วิธีป้อนข้อมูลเริ่มต้นตัวอย่างข้างต้นไม่ใช่แนวทางที่เข้มงวด


5
นี่เป็นความท้าทายที่สมเหตุสมผล แต่ไม่จำเป็นต้อง จำกัด เฉพาะ Python หรือฟังก์ชั่น โดยทั่วไปข้อ จำกัด ดังกล่าวถูกขมวดคิ้วเนื่องจากพวกเขา จำกัด การมีส่วนร่วม นอกจากนี้คุณควรมีกรณีทดสอบ
xnor

เฮ้ฉันแก้ไขมันเล็กน้อย หวังว่าพอเพียงนี้!
เมียร์

2
ดูดีขึ้น! ฉันยังคงแนะนำอย่างยิ่งให้อนุญาตวิธีการป้อนข้อมูลเริ่มต้นในบางโปรแกรมเนื่องจากบางภาษาไม่มีฟังก์ชั่น และอนุญาตให้ฟังก์ชั่นมีชื่ออื่นหรือไม่มีชื่อ
xnor

ย่อหน้าแรกและย่อหน้าสุดท้ายมีความขัดแย้งกันดังนั้นเพียงแค่ตรวจสอบอีกครั้ง - เราต้องเขียนฟังก์ชั่นหรือโปรแกรมเต็มหรือไม่
Sp3000

โปรแกรมเต็มรูปแบบดีฉันต้องการกำหนดข้อ จำกัด ให้น้อยที่สุดยกเว้นว่าจะใช้วิธีการป้อนข้อมูลเริ่มต้น ef the python3 เป็นระเบียบเรียบร้อย!
เมียร์

คำตอบ:


14

เยลลี่ , 5 3 ไบต์

ขอบคุณ@ Sp3000สำหรับการบันทึกสองไบต์!

โค้ดใช้อัลกอริทึมค่อนข้างเหมือนกันกับคำตอบที่ยอดเยี่ยมของ @ xnor :

SfḤ

คำอธิบาย:

S     # Sum of the argument list
  Ḥ   # Double the list
 f    # Filter, remove everything that isn't equal to the sum of the list

สิ่งนี้ทำให้[]เป็นเท็จและสิ่งอื่นใดเป็นความจริง

ลองออนไลน์!


51

Python 3, 21 ไบต์

lambda*l:sum(l)/2in l

หากตัวเลขสองตัวบวกกันผลรวมของทั้งสามจะเป็นสองเท่าของจำนวนอื่นดังนั้นผลรวมครึ่งหนึ่งจะเป็นองค์ประกอบของรายการ งูหลาม 3 เป็นสิ่งจำเป็นเพื่อหลีกเลี่ยงพื้นส่วนเว้นแต่ตัวเลขที่จะได้รับเช่นมากกว่า3.03


7

ES6, 31 ไบต์

(a,b,c)=>a+b==c|b+c==a|c+a==b

เพิ่ม 5 diffไบต์ถ้าคุณต้องการที่จะตั้งชื่อฟังก์ชั่น

แก้ไข: บันทึก 2 ไบต์ด้วย @Alex L.


คุณสามารถบันทึกสองไบต์ด้วยการแทนที่||ด้วย|(ฉันคิดว่า)
HyperNeutrino

@AlexL ใช่แล้วฉันถูกวางสายเกินไปที่จะต้องส่งคืน Booleans
Neil

แม้ว่าบูลีน|จะส่งคืนบูลีนถ้าทั้งสองค่าเป็นบูลีน ดังนั้นแต่true | false == true 3 | 5 == 7เช่นเดียวกับและ&& &ข้อแตกต่างระหว่าง|และ||เมื่อพูดถึงบูลีนเท่านั้น: |จะใช้ค่าแรกกับค่าที่สองและหาค่าORของสองค่านั้น ||จะรับค่าแรก ถ้าเป็นจริงส่งคืนtrueมิฉะนั้นส่งคืนค่าที่สอง
HyperNeutrino

@AlexL true | falseประเมินเป็น 1 ใน JavaScript (ซึ่งเป็นความจริง แต่ไม่ใช่บูลีน)
Neil

โอ้ ขออภัยฉันไม่ได้ใช้ JS จริงๆ ฉันส่วนใหญ่ใช้ Java ซึ่งเป็นที่ที่ฉันได้รับข้อมูลนั้น ;)
HyperNeutrino

4

APL, 8 5 ไบต์

+/∊+⍨

นี่คือการฝึกอบรมฟังก์ชั่น monadic ที่ยอมรับอาร์เรย์และส่งกลับบูลีน (0/1 ใน APL) มันใช้วิธีการเดียวกับ XNOR ของงูหลาม 3 คำตอบ

คำอธิบาย:

   +⍨  ⍝ Double the input (+⍨x is the same as x+x)
  ∊    ⍝ Test the membership of
+/     ⍝ The sum of the input

ลองออนไลน์

บันทึกแล้ว 3 ไบต์ขอบคุณเดนนิส!


4

JavaScript ES6, 38 34 33 ไบต์

x=>x.some(a=>2*a==x[0]+x[1]+x[2])

ฟังก์ชั่นนิรนามที่ง่ายมากและยืมมาจากคำตอบของ Python รับอินพุตxเป็นอาร์เรย์ ผลตอบแทนหรือtrue falseBytes โกนหนวดให้ Molarmanful และดูร่าเริง

โปรแกรมขนาด 38 ไบต์นำแต่ละหมายเลขมาเป็นอาร์กิวเมนต์:

(a,b,c)=>[a,b,c].some(t=>t==(a+b+c)/2)

ลองx=>x.some(a=>a==eval(x.join`+`)/2)ซึ่งจะช่วยประหยัด 4 ไบต์
Mama Fun Roll

@ ӍѲꝆΛҐӍΛПҒЦꝆขอบคุณ! เคล็ดลับดี
Conor O'Brien

x=>x.some(a=>2*a==x[0]+x[1]+x[2])ดูเหมือนว่าจะทำงาน
jrich

@ jrich ขอบคุณ! เคล็ดลับดี!
Conor O'Brien

3

Oracle SQL 11.2, 49 ไบต์

SELECT 1 FROM DUAL WHERE(:1+:2+:3)/2IN(:1,:2,:3);

เขียนซ้ำของโซลูชั่น @xnor รุ่งโรจน์กับเขา


3

J, 6 ไบต์

+/e.+:

ลองกับJ.js

มันทำงานอย่างไร

+/e.+:    Monadic verb. Argument: A
    +:    Double the elements of A.
+/        Compute the sum of the elements of A.
  e.      Test for membership.

3

DUP , 31 ตัวอักษร / 39 ไบต์

[2ø2ø2ø++2/\%3ø^=3ø2ø=3ø3ø=||.]

Try it here!

ส่ง DUP ครั้งแรกของฉัน! Unicode เป็นหอยนางรมของคุณ

มันเป็นฟังก์ชัน / แลมบ์ดานิรนาม การใช้งาน:

5 3 2[2ø2ø2ø++2/\%3ø^=3ø2ø=3ø3ø=||.]!

คำอธิบาย

[                               {start lambda}
 2ø2ø2ø                         {duplicate 3 inputnums}
       ++                       {push sum(3 popped stack items)}
         2/\%                   {push (popped stack item)/2}
             3ø^=3ø2ø=3ø3ø=     {for all 3 inputs, -1 if inputnum=sum/2; else 0}
                           ||   {check if any of the 3 resulting values are truthy}
                             .  {output top of stack (boolean value)}
                              ] {end lambda}

ฉันไม่คิดว่าวิธีการที่ผลงานการเข้ารหัส ...
Conor โอไบรอัน

øมีจุดรหัส 248 ดังนั้นจึงเป็นหนึ่งไบต์ถ้าเข้ารหัสเป็น ISO 8859-1
เดนนิส

1
... ซึ่งใช้ได้ตราบใดที่ล่ามสามารถทำงานกับไฟล์ต้นฉบับที่เข้ารหัส ISO 8859-1 ได้
Martin Ender

@ MartinBüttnerฉันไม่คิดว่าเป็นไปได้ที่จะทดสอบ
Mama Fun Roll


3

Perl 6, 20 19 ไบต์

ฉันมีสองฟังก์ชั่นเท่ากับจำนวนไบต์ดังนั้นฉันจะใส่ทั้งสองอย่าง ชื่นชมสิ่งใดที่ทำให้คุณนึกถึงแฟนซี

{@_@_.sum div 2}
{@_∋+~(@_.sum/2)}

การใช้งาน: กำหนดหนึ่งตัวแปรให้กับตัวแปรที่คุณสามารถเรียกมันได้
แก้ไข: ขอบคุณ @ b2gills สำหรับการลดไบต์


{@_∋@_.sum div 2}และ{@_∋+~(@_.sum/2)}สั้นกว่า
แบรดกิลเบิร์ต b2gills

โอ้ขอบคุณฉันลืมไปแล้วว่าคุณสามารถโทรหา sum เป็นวิธี dotty
Hotkeys

อะไรทำอย่างไร
User112638726

"∋" คือโอเปอเรเตอร์ 'contain' infix ซึ่งระบุว่าด้านซ้ายมีสิทธิ์ มันเป็นน้องสาวของสหกรณ์ "∈" 'ซึ่งบอกว่าด้านซ้ายเป็นองค์ประกอบของสิทธิ ทั้งคู่ตั้งค่า ops และ perl 6 ให้การสนับสนุนคนอื่น ๆ ด้วย! docs.perl6.org/language/ ......
ฮอตคีย์

3

Java 8 (ฟังก์ชั่นแลมบ์ดา), 29 ไบต์

// Lambda Signature: (int, int, int) -> boolean

(a,b,c)->a+b==c|a+c==b|b+c==a

Java code golf solution มักจะสั้นเพียงเมื่อโปรแกรมไม่จำเป็นต้องใช้งานได้อย่างสมบูรณ์ (* อาการไอ * ประกาศคลาสวิธีหลัก)


2

Pyth, 6 ไบต์

/Q/sQ2

ลองออนไลน์!

ต้องการอินพุตเป็นรายการของจำนวนเต็ม เอาท์พุท 0 ถ้าไม่มีหมายเลขสามารถสร้างได้โดยลบอีกสองและ> 0 ถ้าอย่างน้อยหนึ่งสามารถ

คำอธิบาย:

อัลกอริทึมเช่นเดียวกับคำตอบของ @xnor

/ Q / ไตรมาสที่ 2

   sQ # รวมองค์ประกอบทั้งหมดในรายการ
  / 2 # หารผลรวมด้วย 2
/ Q # นับจำนวนที่เกิดขึ้นของข้างต้นในรายการ

2

05AB1Eไม่ใช่การแข่งขัน

4 ไบต์ไม่ใช่การแข่งขันเนื่องจากสิ่งที่โง่ รหัส:

DO;¢

ใช้ 0 เป็นเท็จและ> 0 เป็นจริง ใช้การเข้ารหัส CP-1252


อะไรคือสิ่ง "โง่" ที่ทำให้สิ่งนี้ไม่ใช่การแข่งขัน?
Kyle Kanos

@KyleKanos ฉันได้เขียนไว้ในInfo.txt แล้วว่า;ครึ่งหนึ่งของสแต็ค แต่คาดเดาสิ่งที่ฉันไม่เคยใช้มัน -_-
Adnan

1
อา ฉันสามารถดูวิธีการที่จะทำมัน
Kyle Kanos

2

Kona 16 ตัวอักษร

{((+/x)%2)_in x}

ใช้เวกเตอร์จากสแต็กบวกจำนวนหารด้วย 2 และพิจารณาว่ามันอยู่ในเวกเตอร์หรือไม่ ส่งคืน 1 เป็นจริงและ 0 เป็นเท็จ

เรียกได้ว่าผ่าน

> {((+/x)%2)_in x} [(2;3;5)]
1
> {((+/x)%2)_in x} [(2;3;4)]
0

2

jq, 17 ตัวอักษร

(ยังเขียนอีกคนหนึ่งของXNOR 's หลาม 3 คำตอบ . upvotes ควรไปที่ที่หนึ่ง.)

contains([add/2])

อินพุต: อาร์เรย์ของ 3 จำนวนเต็ม

วิ่งตัวอย่าง:

bash-4.3$ jq 'contains([add/2])' <<< '[5, 3, 2]'
true

bash-4.3$ jq 'contains([add/2])' <<< '[2, 3, -5]'
false

การทดสอบออนไลน์:

jq, 18 ตัวอักษร

(ตัวเลือกรหัสคำสั่ง 17 ตัวอักษร + 1 ตัวอักษร)

contains([add/2])

อินพุต: รายการ 3 จำนวนเต็ม

วิ่งตัวอย่าง:

bash-4.3$ jq -s 'contains([add/2])' <<< '5 3 2'
true

bash-4.3$ jq -s 'contains([add/2])' <<< '2 3 -5'
false

2

MATL , 5 ไบต์

ใช้วิธีการที่ยอดเยี่ยมของ @ xnor :

s2/Gm

ลองออนไลน์!

s    % implicitly input array of three numbers. Compute their sum
2/   % divide by 2
G    % push input again
m    % ismember function: true if sum divided by 2 equals some element of the input

วิธีการแบบเดรัจฉานบังคับ 12 ไบต์ :

Y@TT-1h*!s~a

ลองออนไลน์!

Y@       % input array of three numbers. Matrix with all
         % permutations, each one on a different row
TT-1h    % vector [1,1,-1]
*        % multiply with broadcast
!s       % transpose, sum of each column (former row)
~a       % true if any value is 0


2

CJam, 10 12ไบต์

l~:d_:+2/&

ลบ 2 ไบต์ด้วย @ MartinBüttner

สิ่งนี้แสดงจำนวนเป็นผลลัพธ์ที่เป็นความจริงและไม่มีผลลัพธ์เป็นผลลัพธ์ที่เป็นเท็จ

ลองที่นี่

l~     e# read line and evaluate. Pushes the array
:d     e# convert array to double
_      e# duplicate
:+     e# fold addition on the array. Computes sum of the array
2/     e# divide sum by 2
&      e# setwise and (intersection)

2

อย่างจริงจัง 6 ไบต์

,;䫡u

ส่งออก 0 ถ้าเท็จและจำนวนเต็มบวกมิฉะนั้น


2

Mathematica, 20 19 ไบต์

MemberQ[2{##},+##]&

ทำงานคล้ายกับคำตอบอื่น ๆ ส่วนใหญ่


แล้วไงMemberQ[2{##},+##]&ล่ะ (และคุณลืมจำนวนไบต์ของคุณ)
Martin Ender

2

Haskell, 20 ไบต์

(\l->sum l/2`elem`l)

ใช้โซลูชันของ xnor


เนื่องจากใช้(/)ไม่ได้กับจำนวนเต็มและความท้าทายขอเลขจำนวนเต็มฉันไม่แน่ใจว่านี่เป็นทางออกที่ถูกต้องจริง ๆ
ซีตา

ฉันไม่เห็นว่า การแปลงประเภทควรเป็นส่วนหนึ่งของรหัสหรือไม่ เช่นนี้และมันสามารถนำมาใช้เช่นนี้(\l->sum l/2`elem`l).map fromInteger ((\l->sum l/2`elem`l).map fromInteger) ([2,3,5] :: [Integer])ฉันเดาว่าสิ่งที่ทำให้ฉันผิดคือ xnor พูดถึงการใช้งาน python 3 ดังนั้นอินพุตไม่จำเป็นต้องเป็น 3.0 แทนที่จะเป็น 3 ฉันคิดว่าประเภทอินพุตไม่ได้ระบุวิธีการเขียน ...
basile- เฮนรี่

หากประเภทเป็นปัญหาที่แท้จริงไม่ควรข้อเท็จจริงที่ว่าฉันรับรายการเป็นอินพุตเป็นปัญหามากกว่าหรือไม่
basile-henry

จุดดี. ฉันจะถาม OP เกี่ยวกับเรื่องนั้น แต่เนื่องจากคำตอบอื่น ๆ ทั้งหมดยังใช้รายการฉันเดาว่ามันใช้ได้ (เช่นกันตอนนี้ฉันเข้าใจแล้วว่าทำไมฟังก์ชั่นของคุณไม่ได้พิมพ์การตรวจสอบเมื่อใช้สิ่งอันดับ)
Zeta

ใช่ถ้าใส่เป็น tuple แทนของรายการค่าsumมิได้elemจะทำงานผมอาจจะได้ระบุว่ามันเป็นรายการ แต่เนื่องจากคำตอบนี้เป็นอักษรสิ่ง XNOR ส่ง (ใน Haskell) ฉันไม่คิดว่ามันเป็นสิ่งที่จำเป็น :)
basile-henry

2

Perl, 24 + 4 = 28 ไบต์

$^+=$_/2 for@F;$_=$^~~@F

ต้องการ-paXแฟล็กเพื่อรันพิมพ์1เป็น True และไม่มีอะไรเป็นเท็จ:

-X ปิดใช้งานคำเตือนทั้งหมด

$ perl -paXe'$^+=$_/2 for@F;$_=$^~~@F' <<< '5 3 7'
$ perl -paXe'$^+=$_/2 for@F;$_=$^~~@F' <<< '5 3 8'
1

เป็นแรงบันดาลใจอย่างหนึ่ง สร้างแรงบันดาลใจในสิ่งนี้: $_=eval(y/ /+/r)/2~~@F(ใช้ตัวเลือกบรรทัดคำสั่งเดียวกัน)
จัดการ

@manatwork วิธีการใช้งานที่น่าสนใจtr:)
andlrc

คุณสามารถปล่อยให้มัน-Xออกมาโดยระบุ Perl บางรุ่น [5.10 .. 5.18) (จับคู่แบบสมาร์ทได้รับการแนะนำใน 5.10 และคำเตือนแบบทดลองถูกนำมาใช้ใน 5.18 เวอร์ชันระหว่างสองเวอร์ชันนี้จะทำงานได้ดี~~หากไม่มี-X)
จัดการระหว่าง


1

เสา 8

ยังมีการใช้อัลกอริทึมของ xnor อีก

i:As2A/_

มันทำงานอย่างไร:

i    # Get command line input.
:A   # Initialize a constant A.
  s  # Set A to the sum of the stack.
2    # Push 2 to the stack.
A    # Push A to the stack.
/    # Divide A/2
_    # Check if the top of the stack is in the previous elements.
     # Print the stack on quit.


1

05AB1E , 6 5 ไบต์

;Oм_O

-1 ไบต์โดยการสร้างพอร์ตของ@xnor 's หลาม 3 ขั้นตอนวิธีการ

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

·        # Halve every item in the input-array
         #  i.e. [10,6,4] → [5.0,3.0,2.0]
 O       # Sum this array
         #  i.e. [5.0,3.0,2.0] → 10.0
  м_O    # Output 1 if the input-array contain this sum, 0 otherwise
         #  i.e. [10,6,4] and 10.0 → 1

ฉันค่อนข้างมั่นใจว่าм_Oสามารถย่อให้สั้นลง แต่ฉันไม่แน่ใจว่าต้องใช้คำสั่งใด


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.