แยกจำนวนเต็มของฉัน


21

บทนำ

ในสาขาคณิตศาสตร์ที่รู้จักกันเป็นโครงสร้างมีสิ่งที่เรียกว่าหลักการแยก โดยสังเขปคุณมีชุดXและชุดย่อยของXซึ่งเราสามารถคิดว่าเป็นคุณสมบัติ ระบบจะถูกแยกออกจากกันอย่างดีหากสามารถแยกแยะความแตกต่างระหว่างรายการทั้งหมดของXคุณสมบัติของพวกเขา สัจพจน์ที่แยกกันทำให้ความคิดนี้เป็นทางการ ในความท้าทายนี้งานของคุณคือการตรวจสอบสัจพจน์สามแยกที่กำหนดXและรายการของคุณสมบัติ

อินพุต

อินพุตของคุณเป็นจำนวนเต็มn ≥ 2และรายการTของจำนวนเต็ม จำนวนเต็มในถูกดึงมาจากT X = [0, 1, ..., n-1]รายการในTอาจว่างเปล่าและไม่เรียงลำดับ แต่ไม่มีรายการที่ซ้ำกัน

เอาท์พุต

เอาต์พุตของคุณคือหนึ่งในสี่สายกำหนดโดยหลักการแยกสามอันแต่ละอันแข็งแกร่งกว่าอันสุดท้าย มีสัจพจน์อื่น ๆ แต่เรายึดติดกับสิ่งเหล่านี้เพื่อความเรียบง่าย

  • สมมติว่าสำหรับทั้งหมดที่แตกต่างxและyในXมีรายการTที่มีหนึ่งในนั้น แล้วXและTตอบสนองความจริง T0
  • สมมติว่าทุกที่แตกต่างกันxและyในการXมีอยู่สองรายการในTหนึ่งซึ่งมีxแต่ไม่ได้yและอื่น ๆ ที่มีแต่ไม่y xแล้วXและTตอบสนองความจริง T1
  • สมมติว่าทั้งสองรายการด้านบนไม่มีองค์ประกอบที่เหมือนกัน แล้วXและTตอบสนองความจริง T2

การส่งออกของคุณเป็นหนึ่งT2, T1, T0หรือTSขึ้นอยู่กับเงื่อนไขดังกล่าวข้างต้นถือ ( TSหมายถึงไม่มีของพวกเขาทำ) โปรดทราบว่า T2 นั้นแข็งแกร่งกว่า T1 ซึ่งแข็งแกร่งกว่า T0 และคุณควรส่งออกสัจพจน์ที่แข็งแกร่งที่สุดที่เป็นไปได้เสมอ

กฎและการให้คะแนน

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

กรณีทดสอบ

2 [] -> TS
2 [[],[1]] -> T0
2 [[0],[1]] -> T2
3 [[0],[0,1,2],[1,2]] -> TS
3 [[],[0],[0,1],[2]] -> T0
3 [[0],[0,1],[2,1],[0,1,2]] -> T0
3 [[0],[0,1],[2,1],[2,0]] -> T1
6 [[0,2,4],[0,3,5],[1,2],[3,4,5]] -> TS
6 [[0,2,4],[0,3,5],[1,2],[2,5],[3,4,5]] -> T0
6 [[0,2,4],[0,3,5],[1,2],[2,5],[3,1],[3,4,5]] -> T1
6 [[0,1],[0,2,3],[1,4],[2,4],[2,3,5],[1,3],[4,5]] -> T2

อินพุตnฟุ่มเฟือยหรือไม่ ในส่วนที่เหลือของความท้าทายฉันไม่ได้เห็นมันใช้นอกเหนือจากการกำหนดองค์ประกอบที่สามารถอยู่ในTนั้นดังนั้นมันเป็นเพียงทางลัดที่ให้ไว้สำหรับT.Maximum()?
AdmBorkBork

@ TimmyD ไม่ ดูกรณีทดสอบแรก ควรให้0 [] T2
Peter Taylor

@PeterTaylor Aaaahhhhhhhh ขอบคุณที่ช่วยอย่างมาก
AdmBorkBork

คำอธิบายที่ยอดเยี่ยมเกี่ยวกับความสามารถในการแบ่งแยกได้!
Luis Mendo

@ LuisMendo การแจ้งเตือนคำศัพท์แปลก ๆ : นี่คือสัจพจน์การแยกและพื้นที่ทอพอโลยีที่ T2 ตอบสนองบางครั้งเรียกว่าการแยก แต่การแยกเป็นอย่างอื่น
Dennis

คำตอบ:


9

Haskell, 317 209 174 168 ไบต์

ฟังก์ชัน f ทำงานได้

(#)=elem
x?y=[1|a<-x,b<-y,not$any(#a)b]
f n l|t(++)="TS"|t zip="T0"|t(?)="T1"|1>0="T2"where
    t p=any null[p(x%y)(y%x)|x<-[0..n-1],y<-[0..x-1]]
    x%y=[z|z<-l,x#z,not$y#z]

การทดสอบ:

main=do
    putStrLn $ f 2 []
    putStrLn $ f 2 [[],[1]]
    putStrLn $ f 2 [[0],[1]]
    putStrLn $ f 3 [[0],[0,1,2],[1,2]]
    putStrLn $ f 3 [[],[0],[0,1],[2]]
    putStrLn $ f 3 [[0],[0,1],[2,1],[0,1,2]]
    putStrLn $ f 3 [[0],[0,1],[2,1],[2,0]]
    putStrLn $ f 6 [[0,2,4],[0,3,5],[1,2],[3,4,5]]
    putStrLn $ f 6 [[0,2,4],[0,3,5],[1,2],[2,5],[3,4,5]]
    putStrLn $ f 6 [[0,2,4],[0,3,5],[1,2],[2,5],[3,1],[3,4,5]]
    putStrLn $ f 6 [[0,1],[0,2,3],[1,4],[2,4],[2,3,5],[1,3],[4,5]]

เอาท์พุท:

TS
T0
T2
TS
T0
T0
T1
TS
T0
T1
T2

การให้tฟังก์ชั่นเป็นอินพุตเป็นกลลวงที่ฉลาด!
Zgarb

ในกรณีที่ไม่มีการแข่งขันรางวัลนี้จะตอบคุณ ขอแสดงความยินดี!
Zgarb

บางไบต์ฟรี - แทนที่fโดยชื่อผู้ประกอบการและแทนที่โดยp(x%y)(x%y) p(x%y)$x%yและโดยวิธีการทำงานที่ดี!
ภูมิใจ haskeller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.