ใช้ DeleteCases กับ CoprimeQ
ก่อนอื่นให้ฉันแสดงสิ่งที่ฉันทำงานได้อย่างถูกต้อง
f = Permutations[Range[5], {3}]
Riffle[f, Apply[CoprimeQ, f, {1}]]
ตอนนี้ฉันต้องการลบรายการ {a, b, c} โดยอัตโนมัติที่ส่งคืนค่าเท็จจากการทดสอบนี้ ฉันสามารถทำได้ด้วย Do [] แต่ฉันต้องการเรียนรู้การเขียนโปรแกรมเชิงฟังก์ชันด้วยวิธีที่ถูกต้องโดยใช้ฟังก์ชันในตัวและฟังก์ชันบริสุทธิ์ในโค้ดหนึ่งบรรทัด
ฉันใช้เวลามากในการพยายามทำตามตัวอย่างนี้สำหรับ DeleteCases [] ที่นี่แต่ดูเหมือนว่าจะต้องสร้างฟังก์ชันที่กำหนดเอง มันไม่ได้มีความสัมพันธ์อย่างสมบูรณ์กับตัวอย่างของฉันเพราะในบทช่วยสอนนั้นพวกเขากำลังเปรียบเทียบสองรายการ ฉันพยายามที่จะเข้าใจมัน แต่มันกลับหัวไปแล้ว
นี่ไม่ใช่ตัวอย่างที่ใช้งานได้ # 1
f = Permutations[Range[5], {3}]
DeleteCases[f, CoprimeQ]
นี่ไม่ใช่ตัวอย่างที่ใช้งานได้ # 2
f = Permutations[Range[5], {3}]
DeleteCases[f, (CoprimeQ[_x] == False) -> x]
นอกจากนี้ฉันไม่ต้องการใช้ชวเลข @@ @ / @@@ คุณจะเห็นว่าฉันใช้รูปแบบเต็มของ Apply [] ซึ่งเป็นที่นิยมสำหรับฉันในขณะที่ฉันยังเรียนรู้อยู่ ฉันสามารถแปลงระหว่างพวกเขาได้หากต้องการโพสต์สิ่งที่คุณมี
คำตอบ
DeleteCases[{x__ /; Not@CoprimeQ[x]}]@f
DeleteCases[Except[_List?(Apply[CoprimeQ])]]@f
ทั้งสองให้
{{1, 2, 3}, {1, 2, 5}, {1, 3, 2}, {1, 3, 4}, {1, 3, 5}, {1, 4, 3}, {1, 4, 5}, {1, 5, 2}, {1, 5, 3}, {1, 5, 4}, {2, 1, 3}, {2, 1, 5}, {2, 3, 1}, {2, 3, 5}, {2, 5, 1}, {2, 5, 3}, {3, 1, 2}, {3, 1, 4}, {3, 1, 5}, {3, 2, 1}, {3, 2, 5}, {3, 4, 1}, {3, 4, 5}, {3, 5, 1}, {3, 5, 2}, {3, 5, 4}, {4, 1, 3}, {4, 1, 5}, {4, 3, 1}, {4, 3, 5}, {4, 5, 1}, {4, 5, 3}, {5, 1, 2}, {5, 1, 3}, {5, 1, 4}, {5, 2, 1}, {5, 2, 3}, {5, 3, 1}, {5, 3, 2}, {5, 3, 4}, {5, 4, 1}, {5, 4, 3}}
คุณยังใช้
Cases[{x__ /; CoprimeQ[x]}]@f
Cases[_List?(Apply[CoprimeQ])]@f
Select[Apply[CoprimeQ]]@f
Pick[f, Apply[CoprimeQ, f, 2]]
หลังจากอ่านและทดสอบตัวอย่างที่ยอดเยี่ยมจาก kglr ฉันพบวิธีแก้ปัญหาตามคำตอบนี้ซึ่งเหมาะกับรูปแบบไวยากรณ์ที่ฉันต้องการมากกว่า
Select[Subsets[Range[5], {3}], Apply[CoprimeQ]]
ฉันทำผิดพลาดหลายครั้ง ฉันใช้ Permutations แทน Subsets มันเป็นเรื่องยากที่จะหาเอกสารเกี่ยวกับ @ แต่ผมพบว่ามันนี่ ไม่ใช่เอกสารวุลแฟรมที่ดีที่สุดสำหรับข้อโต้แย้งมากกว่าหนึ่งข้อ แต่ทำให้ฉันเข้าใจผิดเกี่ยวกับตัวอย่างที่โพสต์ไว้ที่นี่ สิ่งนี้ดัดแปลงมาจาก
f = Permutations[Range[5], {3}]
Select[Apply[CoprimeQ]]@f
สังเกต @ / @ ทั้งหมด? __ /; หายไปหลังจากที่ฉันปรับปรุงใหม่ตามความต้องการของฉัน
หลังจากที่ฉันรวมทุกอย่างไว้ในโค้ดบรรทัดเดียวโดยใช้ฟังก์ชันบริสุทธิ์ฉันก็สามารถสร้างตารางได้ ตัวอย่าง:
Table[
Length[Select[Subsets[Range[x], {3}], Apply[CoprimeQ]]], {x, 3, 100}
]
ซึ่งจะช่วยให้
{1, 2, 7, 8, 19, 25, 37, 42, 73, 79, 124, 138, 159, 183, 262, 277,
378, 405, 454, 491, 640, 668, 794, 850, 959 , 1016, 1257, 1285, 1562,
1668, 1805, 1905, 2088, 2150, 2545, 2673, 2866, 2968, 3457, 3522,
4063, 4228, 4431, 4620, 5269, 5385, 5936, 6106, 6453, 6684 , 7513,
7660, 8166, 8400, 8834, 9141, 10168, 10287, 11388, 11752, 12202,
12614, 13341, 13521, 14848, 15263, 15921, 16164, 17657, 17918, 19505,
20031, 20603, 21125, 22248 , 22509, 24364, 24799, 25796, 26434, 28493,
28761, 30057, 30766, 31830, 32476, 34843, 35115, 36728, 37513, 38734,
39577, 41208, 41665, 44470, 45192, 46424, 47086}
จากนั้นผมก็พบว่ามีการแข่งขันใน OEIS ด้วยตัวอย่างรหัส
a[n_] := Select[Subsets[Range[n], {3}], And @@ (GCD @@ # == 1 & /@ Subsets[#, {2}]) &] // Length;
a /@ Range[49]
คุณสามารถตัดสินใจได้ว่าใครมีรหัสที่ชัดเจนที่สุดจากตัวอย่างทั้งหมด ขอบคุณมากสำหรับ kglr ที่ช่วยฉันผ่านตอนที่ฉันติดอยู่