ใช้ DeleteCases กับ CoprimeQ

Oct 19 2020

ก่อนอื่นให้ฉันแสดงสิ่งที่ฉันทำงานได้อย่างถูกต้อง

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 [] ซึ่งเป็นที่นิยมสำหรับฉันในขณะที่ฉันยังเรียนรู้อยู่ ฉันสามารถแปลงระหว่างพวกเขาได้หากต้องการโพสต์สิ่งที่คุณมี

คำตอบ

6 kglr Oct 19 2020 at 21:52
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]]
acacia Oct 19 2020 at 23:50

หลังจากอ่านและทดสอบตัวอย่างที่ยอดเยี่ยมจาก 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 ที่ช่วยฉันผ่านตอนที่ฉันติดอยู่