utilisation de DeleteCases avec CoprimeQ
permettez-moi d'abord de montrer ce que j'ai fonctionné correctement
f = Permutations[Range[5], {3}]
Riffle[f, Apply[CoprimeQ, f, {1}]]
maintenant je voudrais automatiser la suppression d'une liste {a, b, c} qui renvoie false à partir de ce test. Je peux probablement le faire avec Do [] mais je voulais apprendre la programmation fonctionnelle de la bonne manière en utilisant des fonctions intégrées et des fonctions pures sur une seule ligne de code.
J'avais passé beaucoup de temps à essayer de suivre cet exemple pour DeleteCases [] ici mais il semble que cela nécessite la construction d'une fonction personnalisée. cela ne correspond pas non plus parfaitement à mon exemple car dans ce tutoriel, ils comparent deux listes. J'ai essayé de le comprendre mais ça m'a dépassé la tête.
ici ne fonctionne pas l'exemple n ° 1
f = Permutations[Range[5], {3}]
DeleteCases[f, CoprimeQ]
ici ne fonctionne pas exemple # 2
f = Permutations[Range[5], {3}]
DeleteCases[f, (CoprimeQ[_x] == False) -> x]
aussi je préfère ne pas utiliser de raccourci @@ @ / @@@. vous pouvez voir que j'utilise le formulaire complet de Apply [] qui m'est préférable pendant que j'apprends encore. Je peux convertir entre eux si j'ai besoin de publier ce que vous avez.
Réponses
DeleteCases[{x__ /; Not@CoprimeQ[x]}]@f
DeleteCases[Except[_List?(Apply[CoprimeQ])]]@f
les deux donnent
{{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}}
Vous utilisez également
Cases[{x__ /; CoprimeQ[x]}]@f
Cases[_List?(Apply[CoprimeQ])]@f
Select[Apply[CoprimeQ]]@f
Pick[f, Apply[CoprimeQ, f, 2]]
après avoir lu et testé les excellents exemples fournis par kglr, j'ai trouvé une solution basée sur cette réponse qui est mieux adaptée à mon choix préféré de style de syntaxe.
Select[Subsets[Range[5], {3}], Apply[CoprimeQ]]
Je faisais plusieurs erreurs. J'utilisais des permutations au lieu de sous-ensembles. il était difficile de trouver de la documentation sur @ mais je l'ai trouvée ici . pas exactement la meilleure documentation wolfram pour plus d'un argument, mais cela m'a permis de surmonter mon incompréhension de l'exemple posté ici. ceci a été adapté de
f = Permutations[Range[5], {3}]
Select[Apply[CoprimeQ]]@f
remarquez tous les @ / @? __ /; est parti après que je l'ai retravaillé pour mes besoins.
après avoir tout consolidé en une seule ligne de code en utilisant des fonctions pures, j'ai pu créer un tableau. Exemple:
Table[
Length[Select[Subsets[Range[x], {3}], Apply[CoprimeQ]]], {x, 3, 100}
]
qui donne
{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}
J'ai ensuite trouvé une correspondance dans OEIS . avec exemple de code
a[n_] := Select[Subsets[Range[n], {3}], And @@ (GCD @@ # == 1 & /@ Subsets[#, {2}]) &] // Length;
a /@ Range[49]
vous pouvez décider qui a le code le plus propre parmi tous les exemples. un grand merci à kglr pour m'avoir aidé quand j'étais coincé.