มันเป็นชุดฟรี


32

ชุดไม่มีผลรวมหากไม่มีองค์ประกอบสอง (ไม่จำเป็นต้องแตกต่างกัน) เมื่อรวมเข้าด้วยกันเป็นส่วนหนึ่งของชุดตัวเอง

ตัวอย่างเช่นไม่มี{1, 5, 7}ผลรวมเนื่องจากสมาชิกทั้งหมดเป็นเลขคี่และสองเลขคี่เมื่อรวมเข้าด้วยกันจะเป็นเลขคู่เสมอ ในทางกลับกัน{2, 4, 9, 13}ไม่มีผลรวมเป็น2 + 2 = 4หรือ4 + 9 = 13เพิ่มเข้าด้วยกันเป็นสมาชิกของชุด

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

ตัวอย่าง:

Sum-free:
{}
{4}
{1, 5, 7}
{16, 1, 4, 9}

Not sum-free:
{0}
{1, 4, 5, 7}
{3, 0}
{16, 1, 4, 8}

ชุดสามารถเป็นอาร์เรย์ / รายการได้หรือไม่?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴแน่นอน
orlp

5
บางกรณีทดสอบเพิ่มเติมอาจจะดี!
ลินน์

4
ต้องการกรณีทดสอบไม่ดี มีการตั้งค่าที่ไม่ซ้ำกันหมดจด?
แมว

3
ฉันคิดว่าคุณควรชี้แจงว่าคุณหมายถึงผลรวมขององค์ประกอบสองอย่างที่ไม่จำเป็นต้องแยกจากชุด
Gregory Nisbet

คำตอบ:


14

Pyth - 8 5 ไบต์

ขอบคุณ @FryAmTheEggman ที่ช่วยฉัน 3 ไบต์

!@sM*

Test Suite

!             Logical not. This makes the empty intersection true and vice versa.
 @    Q       Setwise intersection with input (implictly).
  sM          Map sum to all the pairs.
   *QQ        Get all pairs by doing cartesian product with input*input (implicit).

@FryAmTheEggman smart ....
Maltysen

ฉันเพิ่งได้คำตอบเดียวกัน แต่เมื่อตระหนักแล้วว่า * QQ สร้าง [1,1] ซึ่งเป็นสององค์ประกอบเดียวกันและไม่ควรปรากฏในแผนที่
busukxuan

@busukxuan คำถามจริงขอให้คุณพิจารณาซ้ำ: 2 + 2 = 4จาก OP คำตอบของฉันก่อนเล่นกอล์ฟของ.CFryAmTheEggman ใช้คำว่าombinations แทนจริงๆเพราะสิ่งนี้
Maltysen

@ Maltysen โอ้ดี!
busukxuan

40

Python 2, 41 ไบต์

lambda s:s==s-{a+b for a in s for b in s}

s ควรเป็นชุด Python

สนุกจริง ๆ : sum-freeเป็นแอนนาแกรมของชื่อของฉัน


lambda s:not{a+b for a in s for b in s}&sมีความยาวเท่ากัน ฉันไม่สามารถหาวิธีที่จะลดทอนการปฏิเสธเศร้า
FryAmTheEggman

16
โหวตขึ้นสำหรับแอนนาแกรม
Neil

@feersum นี่คือคำถามของคุณ
Filip Haglund

@FilipHaglund ไม่มันเป็น orlp ของ
mbomb007

@ mbomb007 ถ้าจริงจังใช่ แต่นั่นอาจมีความหมายที่ไม่ร้ายแรง: นี่คือคำถามของคุณ / คุณเป็นเจ้าของคำถาม / คุณเอาชนะทุกคนที่นี่ (Python) พวกเขาไม่ได้พูดว่า " คุณเป็นOP ."
Erik the Outgolfer

26

เยลลี่ 5 ไบต์

ṗ3ḅ-P

ลองออนไลน์!

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

ṗ3ḅ-P  Main link. Argument: A (array)

ṗ3     Take the third Cartesian power of A, i.e., generate all triplets that
       consist of elements of A.
  ḅ-   Convert each triplet from base -1 to integer.
       This maps [a, b, c] to a - b + c = (a + c) - b.
       If (a + c) belong to A, this will yield 0 for some b.
    P  Take the product of all resulting integers. 

13

JavaScript, 86 42 41 ไบต์

n=>!n.some(m=>n.some(o=>n.includes(m+o)))

ขอบคุณCᴏɴᴏʀO'Bʀɪᴇɴที่ช่วยให้ฉันประหยัดได้ถึงหนึ่งไบต์ในการปิดวงเล็บ / วงเล็บปีกกา และขอขอบคุณนีลที่ชี้ให้เห็นว่าฟังก์ชั่นคืนค่าบูลีนตรงข้ามมากกว่าที่ควรจะเป็น

ฉันพยายามลดจำนวนไบต์ด้วยการกำหนดใหม่n.someแต่มันไม่ทำงานเพราะมันเป็นฟังก์ชั่นต้นแบบที่น่าเสียดาย อาจมีทางออกที่ดีกว่าArray.prototype.mapใน JS แต่ฟังก์ชั่นบางอย่างสนุกจริงๆ

ตอนนี้ฉันสงสัยว่ามีวิธีที่สั้นกว่าการ.includesใช้บางอย่างเช่น. indexOf และการเพิ่ม 1 (ซึ่งจะให้ค่าความจริงถ้ามันมีจำนวน)


การทดสอบ:

> (n=>!n.some(m=>n.some(o=>n.includes(m+o))))([1,5,7]);
true
> (n=>!n.some(m=>n.some(o=>n.includes(m+o))))([1,5,7,12]);
false

1
ลองn=>n.some(m=>n.some(o=>n.some(p=>m+o==p)))
Conor O'Brien

1
ไม่มีปัญหา! มันทำงานได้เพราะพฤติกรรมของฟังก์ชั่นที่ไม่ระบุชื่อ ดูคำตอบ ES6 อื่น ๆ แถวนี้คุณจะได้เรียนรู้มากมาย :)
Conor O'Brien

1
สวัสดีและยินดีต้อนรับสู่ PPCG!
NoOneIsHere

1
ความรู้สึกของสิ่งนี้มันผิดจะบอกคุณว่าเซตนั้นไม่ฟรีหรือไม่ นอกจากนี้การใช้งานn.contains(o+p)ที่ช่วยให้คุณประหยัดมากกว่า 2 someไบต์ด้านในสุด
Neil

1
ขออภัยใช่ฉันหมายถึงincludes(แต่เดิมจะเรียกว่าcontainsแต่ห้องสมุดบางแห่งมีคำจำกัดความที่ขัดแย้งกัน)
Neil

12

MATL, 5 ไบต์

t&+m~

สิ่งนี้จะส่งออกอาร์เรย์ซึ่งเป็นความจริงถ้ารายการทั้งหมดเป็น1เท็จและเป็นอย่างอื่น นี่คือการสาธิตการแสดงค่า truthy / falsey ต่าง ๆ ใน MATL

ลองออนไลน์

คำอธิบาย

        % Implicitly grab input
t       % Duplicate
&+      % Compute sum of each element with every other element (2D Matrix)
m       % Check which members of the input are present in this matrix of sums
~       % Negate the result to yield a truthy value for sum-free sets
        % Implicitly display truthy/falsey value

12

Mathematica, 23 ไบต์

{}==#⋂Tr/@#~Tuples~2&

ฉันแก้ไขการส่งของคุณโดยไม่ตั้งใจ แต่ก็ย้อนกลับไปในแบบเดิม ขออภัย!
DavidC

โดยวิธีการที่ดีเข้าใจว่าไม่มีองค์ประกอบจะต้องถูกลบออกจากรายการก่อนที่จะทำสิ่งอันดับ
DavidC

1
โปรดแทนที่ด้วย(U-22C2) รหัสในขณะนี้ไม่สามารถคัดลอกไปยัง Mathematica ได้
LLlAMnYP

@LLAMAMNYP ขอบคุณฉันต้องค้นหาอักขระ Unicode ด้วยตนเองเนื่องจาก Mathematica จัดรูปแบบนิพจน์โดยอัตโนมัติเมื่อคุณคัดลอก ฉันต้องพบสิ่งที่ผิด
Simmons

1
@ASimmons หากคุณเน้นอักขระใน Mathematica และกดปุ่ม F1 มันจะแสดงหน้าช่วยเหลือสำหรับตัวละครนั้น ๆ ซึ่งจะมีจุดโค้ด Unicode ของตัวละครอยู่เสมอ (เป็นเลขฐานสิบหก) มันน่ารำคาญจริงๆแม้ว่าคุณจะไม่สามารถคัดลอกเป็น Unicode ได้ ฉันคิดว่ามีวิธีแก้ปัญหาสำหรับ "คัดลอกเป็น Unicode" ที่ไหนสักแห่งใน Mathematica.SE แต่ IIRC มันอยู่ไกลจากเรื่องเล็กน้อย
Martin Ender

11

Haskell, 32 , 30 ไบต์

วิธีแก้ปัญหาง่าย ๆ :

f x=and[a+b/=c|a<-x,b<-x,c<-x]

บันทึกสองไบต์โดย @Lynn


f x=and[a+b/=c|a<-x,b<-x,c<-x]เป็นเวลา 30 ไบต์
ลินน์


6

J, 18 10 8 ไบต์

บันทึก 8 ไบต์ด้วยไมล์และ 2 ขอบคุณ FrownyFrog!

-:]-.+/~

จับคู่รายการต้นฉบับกับความแตกต่างที่กำหนดไว้ของผลรวมที่เป็นตาราง นี่เทียบเท่ากับ:

(-: (] -. +/~)) y

yสำหรับการป้อนข้อมูล สิ่งนี้แปลเป็น:

y -: (] -. +/~) y
y -: (y -. +/~ y)

+/~yส่งกลับตารางของจำนวนเงินที่ใช้ สำหรับy =: 16 1 4 9สิ่งนี้จะช่วยให้:

   +/~ 16 1 4 9
32 17 20 25
17  2  5 10
20  5  8 13
25 10 13 18

จากนั้นเราใช้-.ซึ่งสร้างรายการที่ประกอบด้วยองค์ประกอบทั้งหมดที่yไม่ได้อยู่ในตารางนี้ หากรายการไม่มีผลรวมสิ่งนี้จะสร้างรายการเดียวกัน จากนั้น-:ตรวจสอบความเท่าเทียมกันของรายการซึ่งสร้างผลลัพธ์ที่ต้องการ

เก่า 18 ไบต์

[:-.[:>./^:_+/~e.]

+/~สร้างตารางของค่าของชุดที่เพิ่มเข้าไปในตัวเองและe.ตรวจสอบว่าสมาชิกเหล่านั้นอยู่ในชุดเดิมหรือไม่ ส่วนที่เหลือคือการลบองค์ประกอบสูงสุด


-:]-.&,+/~สำหรับ 10 ไบต์โดยใช้ความแตกต่างของชุด-.และการจับคู่รายการ-:
ไมล์

Ooo ดีมาก!
Conor O'Brien

คุณไม่ต้องการ & -.ทำงานกับเซลล์ของ y ได้แล้ว
FrownyFrog

@FrownyFrog ที่น่าสนใจ TIL ขอบคุณ!
Conor O'Brien

5

เรติน่า45 45ไบต์

\d+
<$&$*1>
$
$`$`
M`(<1*)>.*<(1*>).*\1\2
^0

อินพุตเป็นรายการทศนิยมของตัวเลขคั่นด้วยเครื่องหมายจุลภาค ผลลัพธ์คือ0(เท็จ) หรือ1(จริง)

ลองออนไลน์! (บรรทัดแรกเปิดใช้งานชุดทดสอบที่แยกบรรทัดด้วยฟีด)

คำอธิบาย

ด่าน 1: การเปลี่ยนตัว

\d+
<$&$*1>

สิ่งนี้จะแปลงองค์ประกอบทั้งหมดของอินพุตให้เป็นเอกภาพและล้อม<...>รอบ วัตถุประสงค์ของวงเล็บมุมคือการแยกรายการที่มีเฉพาะ0จากรายการว่าง (เนื่องจากการแสดง unary ของ0ว่างเปล่า)

ด่าน 2: การเปลี่ยนตัว

$
$`$`

เราทำซ้ำสตริง 3 ครั้งโดยต่อท้ายสองครั้งในตอนท้าย

ด่าน 3: การแข่งขัน

M`(<1*)>.*<(1*>).*\1\2

ตอนนี้เราพยายามหาตัวเลขสามตัวในผลลัพธ์ที่ว่าสองตัวแรกรวมกันเป็นสาม การจับคู่เหล่านั้นจะถูกนับ (สิ่งนี้ไม่ได้นับสิ่งอันดับจริงทั้งหมดเนื่องจากการแข่งขันไม่สามารถทับซ้อนกันได้ แต่ถ้าพบสิ่งอันดับนั้นจะพบได้) ดังนั้นเราจะได้0ชุดที่ไม่มีผลรวมและสิ่งที่เป็นบวกเป็นอย่างอื่น

ด่าน 4: เข้าคู่

^0

เนื่องจากขั้นตอนก่อนหน้านี้ตรงกันข้ามกับสิ่งที่เราต้องการเราจึงคัดค้านผลโดยนับการแข่งขัน^0ที่มี1ไว้สำหรับการป้อนข้อมูล0และ0เพื่อทุกอย่างอื่น


5

Octave, 29 21 25 ไบต์

@(s)~[ismember(s,s+s') 0]

ขอบคุณSuever ! มันจะส่งกลับอาร์เรย์ ฉันเพิ่ม0ในตอนท้ายเพื่อให้[]กลายเป็นฟรี ในการตรวจสอบความจริงและเท็จในอ็อกเทฟคุณสามารถทำสิ่งนี้:

> f=@(s)~[ismember(s,s+s') 0]

> if f([]) "sum-free" else "not sum-free" end
ans = sum-free

> if f([0]) "sum-free" else "not sum-free" end
ans = not sum-free

> if f([4]) "sum-free" else "not sum-free" end
ans = sum-free

> if f([1 3]) "sum-free" else "not sum-free" end
ans = sum-free

> if f([2 4]) "sum-free" else "not sum-free" end
ans = not sum-free

ทางเลือกที่ส่งคืน 0 หรือ 1 คือ:

@(s)~numel(intersect(s+s',s))

คุณสามารถเปลี่ยนให้เป็น@(s)~ismember(s+s',s)ตั้งแต่อาร์เรย์สามารถ truthy / falsey
Suever

5

Clojure, 47 37 ไบต์

#(=(for[a % b % :when(%(+ a b))]a)[])

วิธีการแก้ปัญหาค่อนข้างธรรมดา ใช้รายการความเข้าใจเพื่อค้นหาองค์ประกอบทั้งหมดซึ่งผลรวมเท่ากับองค์ประกอบอื่น

ตัวแปร 38 ไบต์:

#(every? nil?(for[a % b %](%(+ a b))))

1
เนื่องจากในความท้าทายที่คุณกำลังกำหนดเป็นอินพุตของคุณคุณสามารถใช้ชุดเพื่อตรวจสอบการเป็นสมาชิก#(=(for[a % b % :when(%(+ a b))]a)[])ซึ่งสามารถบันทึก 10 ไบต์
ไมล์

@miles โอ้ว้าวขอบคุณฉันไม่สนใจความจริงที่ว่าและทำงานกับรายการ
หน้าผา

4

Perl 6 ,  24 21 20  19 ไบต์

{not any (@_ X+@_)X==@_}
{so all (@_ X+@_)X!==@_}
{not @_ (&)(@_ X+@_)}
{not @_∩(@_ X+@_)}

{!(@_∩(@_ X+@_))}

การป้อนข้อมูลใด ๆตำแหน่งค่าเช่นรายการ
( ชุดเป็นภาคีดังนั้นคุณจะต้องโทรหา.keysมัน)

ทดสอบ:

#! /usr/bin/env perl6
use v6.c;
use Test;

my @sum-free = (
  (),
  (4,),
  (1, 5, 7),
  (16, 1, 4, 9),
);

my @not-sum-free = (
  (0,),
  (1, 4, 5, 7),
  (3, 0),
  (16, 1, 4, 8),
);

my @tests = ( |(@sum-free X=> True), |(@not-sum-free X=> False) );

plan +@tests;

# store the lambda in lexical namespace for clarity
my &sum-free-set = {!(@_∩(@_ X+@_))}

for @tests -> $_ ( :key(@list), :value($expected) ) {
  is sum-free-set(@list), $expected, .gist
}
1..8
ok 1 - () => True
ok 2 - (4) => True
ok 3 - (1 5 7) => True
ok 4 - (16 1 4 9) => True
ok 5 - (0) => False
ok 6 - (1 4 5 7) => False
ok 7 - (3 0) => False
ok 8 - (16 1 4 8) => False

4

Mathematica 63 62 42 ไบต์

รุ่นที่สั้นกว่านี้ได้รับประโยชน์จากการส่งของ A Simmons ไม่จำเป็นต้องลบองค์ประกอบออกจากรายการก่อนIntegerPartitionsนำไปใช้

หากองค์ประกอบไม่สามารถแบ่งพาร์ติชันเป็นจำนวนเต็มสองจำนวน (แต่ละค่าจากรายการ) ให้IntegerPartitions[#,{2},#]=={}เก็บค่านั้นไว้ Andตรวจสอบว่าสิ่งนี้มีไว้สำหรับทุกองค์ประกอบในรายการหรือไม่ ถ้าเป็นเช่นนั้นรายการจะไม่มีผลรวม

And@@(IntegerPartitions[#,{2},#]=={}&/@#)&

ตัวอย่าง

 And@@(IntegerPartitions[#,{2},#]=={}&/@ #)&@{2, 4, 9, 13}

เท็จ


 And@@(IntegerPartitions[#,{2},#]=={}&/@ #)&@{1, 5, 7}

จริง


มี 2 ​​แต่ไม่มีเลขคี่ที่แตกต่างกัน 2

 And@@(IntegerPartitions[#,{2},#]=={}&/@#)&@{2, 3, 7, 11, 17, 23, 29, 37, 41, 47, 53, 59, 67, 71}

จริง


คุณaกำหนดที่อื่นในสมุดงานของคุณหรือไม่? การแสดงออกเหล่านี้ไม่ได้ให้ผลลัพธ์ที่ต้องการเมื่อฉันประเมินพวกเขา
Simmons

ขอบคุณ ที่ควรจะได้รับa #ฉันแก้ไขแล้วลบสิ่งที่ไม่จำเป็น@ออก
DavidC

3

Ruby, 36 ไบต์

สร้างผลิตภัณฑ์คาร์ทีเซียนของชุดกับตัวเองและค้นหาผลรวมขององค์ประกอบทั้งหมดจากนั้นตรวจสอบการแยกกับชุดเดิม อินพุตเป็นอาร์เรย์ แต่ใน Ruby พวกเขามีการตั้งค่าที่เพียงพอที่จะทำให้มันทำงานได้อย่างดี

-1 ไบต์เหนือโซลูชันดั้งเดิมของฉัน (ใช้&แทน-และเปรียบเทียบกับ[]) เนื่องจากแรงบันดาลใจจาก @feersum

ลองที่นี่!

->s{s-s.product(s).map{|x,y|x+y}==s}

3

Python ขนาด 40 ไบต์

lambda s:s^{a+b for a in s for b in s}>s

^ = ความแตกต่างแบบสมมาตรชุดใหม่ที่มีองค์ประกอบในชุดใดชุดหนึ่ง แต่ไม่ใช่ทั้งคู่

> True ถ้าเซ็ตซ้ายคือเซ็ตเซ็ตของเซ็ตขวา


มันใช้ไม่ได้กับเซตที่ว่างเปล่า แต่ฉันไม่รู้ว่ามันจำเป็นหรือไม่
xnor

1
ดีวิกิพีเดียบอกว่า (ในหมู่สิ่งอื่น ๆ ) A is sum-free if the equation a + b = c has no solution with a, b, c ∈ Aที่ ด้วยคำจำกัดความนี้ชุดที่ว่างเปล่าไม่รวมฟรีและคำตอบของฉันถูกต้อง แต่ฉันอาจจะลำเอียง
Lulhum

3
นั่นหมายถึงว่าเซตว่างคือผลรวมฟรีที่ไม่มี A, B และ C ในชุดที่ว่างเปล่าที่พอใจสม กรณีทดสอบที่เพิ่มใหม่ของ OP สนับสนุนสิ่งนี้
Dennis

3

Brachylogขนาด 13 ไบต์

'(p:?+L:?x'L)

คำอธิบาย

'(          )  True if what's in the parentheses is impossible, false otherwise
  p            Get a permutation of Input
   :?+L        L is the list of element-wise sums of the permutation with Input
       :?x'L   There is at least one element of Input in L

เป็น[2:2]ส่วนหนึ่งของ 2 องค์ประกอบของ[2:4:9]?
Leun Nun

@LeakyNun ไม่มีเพราะ 2 [2:4:9]จะปรากฏขึ้นครั้งเดียวใน
เสียชีวิต

3

R, 39 36 ไบต์

w<-function(s)!any(outer(s,s,'+')%in%s)

โทรฐานะw(s)ที่sเป็นชุด (ที่จริงเวกเตอร์) ของค่า นี่คือผลลัพธ์สำหรับบางกรณีทดสอบ:

> w(numeric(0)) # The empty set
[1] TRUE
> w(0)
[1] FALSE
> w(1)
[1] TRUE
> w(c(1, 5, 7))
[1] TRUE
> w(c(2, 4, 9, 13))
[1] FALSE

c()ฟังก์ชั่นการต่อเรียงอยู่ที่ไหนที่ใช้ค่าจำนวนมากและทำให้เป็นเวกเตอร์

แก้ไข: ทำให้มันเป็นฟังก์ชั่นที่ไม่ระบุชื่อเพื่อบันทึก 3 ไบต์ขอบคุณ @MickyT

function(s)!any(outer(s,s,'+')%in%s)

ดีมาก. คุณสามารถโพสต์สิ่งเหล่านี้เป็นฟังก์ชั่นที่ไม่มีชื่อหากคุณต้องการ นั่นจะช่วยให้คุณประหยัดได้ 3 ไบต์ เช่นfunction(s)!any(outer(s,s,'+')%in%s)
MickyT

3

แร็กเก็ต, 58 ไบต์

(λ(l)(andmap(λ(m)(andmap(λ(n)(not(memq(+ n m)l)))l))l))

คำอธิบาย:

(λ(l)(andmap(λ(m)(andmap(λ(n)(not(memq(+ n m)l)))l))l))
(λ(l)                                                 ) # Define a lambda function that takes in one parameter
     (andmap(λ(m)                                  )l)  # If for all m in l
                 (andmap(λ(n)                   )l)     # If for all n in l
                             (not(memq(+ n m)l))        # n + m is not in l

3

05AB1E , 9 5 ไบต์

บันทึกแล้ว 4 ไบต์ด้วยMagic Octopus Urn

ãOå_P

ลองออนไลน์!

คำอธิบาย

ã       # cartesian product
 O      # sum
  å     # check each if it exists in input
   _    # logical negation
    P   # product

เป็น0จริงๆ truthy ใน 05AB1E?
Dennis

@Dennis ฉันกำหนด 0 ว่าเป็นความจริงสำหรับความท้าทายนี้และสิ่งอื่นใดที่ผิดพลาด ปกติแล้วมันจะไม่เป็นไรตราบใดที่มันไม่คลุมเครือและ OP ไม่ได้ระบุรูปแบบเฉพาะหรือไม่
Emigna

นี่คือการตีความเริ่มต้นของเราเกี่ยวกับความจริง / เท็จ
Dennis

@Dennis: อ่าแย่เกินไป sum-free = 0 และ non-sum-free = "a sum" ได้รับการปรับให้เข้ากับความท้าทายของ IMO เห็นความท้าทายอื่น ๆ มากมายซึ่งกำหนดจำนวนเงินและค่าที่ไม่ได้มาตรฐานเหมือนกันว่าเป็นจริง / เท็จดังนั้นฉันจึงคิดว่าความไม่ชัดเจนนั้นเป็นค่าเริ่มต้น ฉันจะแก้ไขคำตอบแล้ว ขอบคุณสำหรับหัวขึ้น.
Emigna

1
@ MagicOctopusUrn: ขอบคุณ! ไม่แน่ใจว่าคำสั่งเหล่านี้ทำงานได้ด้วยวิธีนี้ แต่ตอนนี้พวกเขาทำเช่นนั้นเพื่อขอบคุณ :) (ฉันเพิ่งจะพลาดมันได้เช่นกันฉันก็ค่อนข้างใหม่กับ 05AB1E เมื่อฉันทำสิ่งนี้)
Emigna

2

APL, 8 ไบต์

⊢≡⊢~∘.+⍨

คำอธิบาย:

⊢         argument
 ≡        equals
  ⊢       argument
   ~      without 
    ∘.+⍨  sums of its elements

ทดสอบ:

      ( ⊢≡⊢~∘.+⍨ ) ¨ (1 5 7)(2 4 9 13)
1 0

2

Haskell ขนาด 30 ไบต์

f s=and[x+y/=z|x<-s,y<-s,z<-s]

ฉันคิดว่ามีวิธีแก้ปัญหาที่สั้นกว่าที่น่าสนใจกว่า แต่ฉันไม่พบมัน

เหล่านี้คือ 33 และ 34 ไบต์:

f s=and$((/=)<$>s<*>)$(+)<$>s<*>s
f s|q<-((-)<$>s<*>)=all(/=0)$q$q$s

การใช้ elem ในsและกำจัดส่วนสุดท้ายของงานความเข้าใจ?
Maltysen

@Maltysen ถ้าคุณหมายถึงf s=and[notElem(x+y)s|x<-s,y<-s]นั่นคือ 32. มีf s=all(`notElem`s)$(+)<$>s<*>sวันที่ 31.
xnor

2

ที่จริงแล้ว 7 ไบต์

;;∙♂Σ∩Y

ลองออนไลน์!

;;∙♂Σ∩Y              Stack: [1,5,7]
;         duplicate         [1,5,7] [1,5,7]
 ;        duplicate         [1,5,7] [1,5,7] [1,5,7]
  ∙       cartesian product [1,5,7] [[1,1],[1,5],[1,7],[5,1],[5,5],[5,7],[7,1],[7,5],[7,7]]
   ♂Σ     sum each          [1,5,7] [2,6,8,6,10,12,8,12,14]
     ∩    intersect         []
      Y   negate            1

อาจทำให้โค้ดของคุณมีความเหมือนกันทางเพศมากขึ้นใช่ไหม ( )
Erik the Outgolfer

1

TSQL, 47 ไบต์

CREATE table T(a int)
INSERT T values(1),(5),(7),(12)

SELECT min(iif(a.a+b.a<>T.a,1,0))FROM T a,T b,T

หมายเหตุ: สิ่งนี้จะทำงานเพียงครั้งเดียวจากนั้นตารางจะต้องถูกลบหรือลดลงเพื่อให้ทำงานได้อีกครั้ง เครื่องมือแก้ไขไม่อนุญาตให้สร้างตาราง ดังนั้นซอที่รวมอยู่ในคำตอบของฉันใช้ 2 ไบต์พิเศษเพื่อชดเชยสิ่งนี้ - เวอร์ชันซอไม่จำเป็นต้องทำการล้าง

ซอ


1

Perl, 46 ไบต์

รหัส 45 ไบต์ + 1 บรรทัดคำสั่งไบต์ (-p)

$_="$_ $_ $_"!~/(\b\d++.*)((?1))(??{$1+$2})/

ใช้การจับคู่ regex เดียวด้วยการสนับสนุนของ Perl สำหรับ 'การแสดงออกของรหัส' ภายใน regex เพื่อให้สามารถประเมินผลภายในการแข่งขัน

ในการหลีกเลี่ยงข้อกำหนดที่อินพุตไม่ได้เรียงเราจะทำซ้ำสตริงอินพุตสามครั้ง สิ่งนี้รับประกันว่าผลลัพธ์จะเกิดขึ้นหลังจากตัวถูกดำเนินการทั้งสองและอนุญาตให้จับคู่ตัวเลขเดียวกันอีกครั้ง (เช่นในกรณีของอินพุต2 4)

ตัวอย่างการใช้งาน:

echo "3 5 6 8" | perl -p entry.pl

1

ตัวคูณ 47 ไบต์

[ dup dup 2array [ Σ ] product-map ∩ { } = ]
  • ∩ { } =เทียบเท่ากับ intersects?แต่สั้นกว่า
  • Σสั้นกว่า sumแต่เทียบเท่ากับ

ขอบคุณmath.unicode !

รหัสการทดสอบ:

USING: arrays kernel math.unicode sequences sequences.product ;
IN: sum-free

: sum-free? ( seq -- ? )
  dup dup 2array [ Σ ] product-map ∩ { } = ;

USING: tools.test sum-free ;
IN: sum-free.tests

{ t } [ { 5 7 9 } sum-free? ] unit-test
{ f } [ { 2 4 9 13 } sum-free? ] unit-test
{ t } [ { } sum-free? ] unit-test
{ f } [ { 0 } sum-free? ] unit-test
{ t } [ { 1 } sum-free? ] unit-test
{ f } [ { 0 1 } sum-free? ] unit-test

ฉันแค่มั่นใจว่าสองคนแรกนั้นถูกต้อง มันไม่ชัดเจนจากคำถามว่าควรจะเหลืออะไรดังนั้นฉันคิดว่ามันดีสำหรับตอนนี้


1

PHP, 73 ไบต์

+8 เพื่อเปลี่ยนส่วนย่อยเป็นโปรแกรม -8 สำหรับตัวแปรล้าสมัยด้วยการแทรกชื่อผู้ใช้ที่นี่

<?foreach($argv as$p)foreach($argv as$q)if(in_array($p+$q,$argv))die;echo 1;

พิมพ์1สำหรับtrue, เอาต์พุตว่างเปล่าสำหรับfalse
การใช้งาน:php <filename> <value1> <value2> ...

ฟังก์ชั่นที่ผ่านการรับรองสำหรับการทดสอบ ( 94 86): ผลตอบแทน1หรือไม่มีอะไร

function f($a){foreach($a as$p)foreach($a as$q)if(in_array($p+$q,$a))return;return 1;}

การทดสอบ

function out($a){if(!is_array($a))return$a;$r=[];foreach($a as$v)$r[]=out($v);return'['.join(',',$r).']';}
function cmp($a,$b){if(is_numeric($a)&&is_numeric($b))return 1e-2<abs($a-$b);if(is_array($a)&&is_array($b)&&count($a)==count($b)){foreach($a as $v){$w = array_shift($b);if(cmp($v,$w))return true;}return false;}return strcmp($a,$b);}
function test($x,$e,$y){static $h='<table border=1><tr><th>input</th><th>output</th><th>expected</th><th>ok?</th></tr>';echo"$h<tr><td>",out($x),'</td><td>',out($y),'</td><td>',out($e),'</td><td>',cmp($e,$y)?'N':'Y',"</td></tr>";$h='';}
$samples = [
    [], 1,
    [0], false,
    [1], 1,
    [0,1], false,
    [2, 4, 9, 13], false,
    [1,5,7], 1
];
while($samples)
{
    $a=array_shift($samples);
    $e=array_shift($samples);
    test($a,$e,f($a));
}

1
ในขณะที่คุณไม่เคยใช้$iและ$jคุณสามารถทิ้ง$i=>เช่นเดียวกับ$j=>และประหยัด8 ไบต์ น่าเสียดายที่โค้ดขนาดสั้นนั้นไม่ใช่คำตอบที่ถูกต้อง ทำให้เป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบและรวมไว้ในการนับไบต์ของคุณและคุณพร้อมที่จะไป :)
insertusernamehere

1

Java, 67 ไบต์

s->!s.stream().anyMatch(p->s.stream().anyMatch(q->s.contains(p+q)))

Set<Integer>การป้อนข้อมูลเป็น แบบทดสอบ:

import java.util.Arrays;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

public class SumFree {
    public static void main(String[] args) {
        sumFree(s->!s.stream()
            .anyMatch(p->s.stream()
                .anyMatch(q->s.contains(p+q)))); // formatted to avoid wrapping
    }

    public static void sumFree(Function<Set<Integer>, Boolean> func) {
        test(func);
        test(func, 4);
        test(func, 1, 5, 7);
        test(func, 16, 1, 4, 9);
        test(func, 1, 4, 5, 7);
        test(func, 0);
        test(func, 3, 0);
        test(func, 16, 1, 4, 8);
    }

    public static void test(Function<Set<Integer>, Boolean> func, Integer... vals) {
        Set<Integer> set = Arrays.stream(vals).collect(Collectors.toSet());
        System.out.format("%b %s%n", func.apply(set), set);
    }
}

เอาท์พุท:

true []
true [4]
true [1, 5, 7]
true [16, 1, 4, 9]
false [0]
false [1, 4, 5, 7]
false [0, 3]
false [16, 1, 4, 8]

1

Clojure 34 ไบต์

#(not-any? %(for[i % j %](+ i j)))

ฉันเขียนสิ่งนี้ก่อนที่จะสังเกตเห็นวิธีแก้ปัญหา Clojure ก่อนหน้านี้ อย่างไรก็ตามคนนี้เป็นขนาดกะทัดรัดมากขึ้นในขณะที่มันใช้ชุดการป้อนข้อมูลที่เป็นฟังก์ชั่นสำหรับprednot-any?


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