usando DeleteCases com CoprimeQ
primeiro deixe-me mostrar o que estou funcionando corretamente
f = Permutations[Range[5], {3}]
Riffle[f, Apply[CoprimeQ, f, {1}]]
agora eu gostaria de automatizar a exclusão de uma lista {a, b, c} que retorna falso neste teste. Provavelmente posso fazer isso com Do [], mas queria aprender programação funcional da maneira certa, usando funções integradas e funções puras em uma linha de código.
Eu passei muito tempo tentando seguir este exemplo para DeleteCases [] aqui, mas parece que isso requer a construção de uma função personalizada. também não se correlaciona perfeitamente com meu exemplo porque naquele tutorial eles estão comparando duas listas. Tentei entender, mas passou pela minha cabeça.
aqui não está funcionando o exemplo # 1
f = Permutations[Range[5], {3}]
DeleteCases[f, CoprimeQ]
aqui não está funcionando o exemplo # 2
f = Permutations[Range[5], {3}]
DeleteCases[f, (CoprimeQ[_x] == False) -> x]
também prefiro não usar o atalho @@ @ / @@@. você pode ver que uso a forma completa de Apply [], que é preferível para mim enquanto ainda estou aprendendo. Posso converter entre eles se precisar postar o que você tem.
Respostas
DeleteCases[{x__ /; Not@CoprimeQ[x]}]@f
DeleteCases[Except[_List?(Apply[CoprimeQ])]]@f
ambos dão
{{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}}
Você também pode usar
Cases[{x__ /; CoprimeQ[x]}]@f
Cases[_List?(Apply[CoprimeQ])]@f
Select[Apply[CoprimeQ]]@f
Pick[f, Apply[CoprimeQ, f, 2]]
depois de ler e testar os excelentes exemplos fornecidos pelo kglr, encontrei uma solução com base nesta resposta que é mais adequada à minha escolha preferida de estilo de sintaxe.
Select[Subsets[Range[5], {3}], Apply[CoprimeQ]]
Eu estava cometendo vários erros. Eu estava usando permutações em vez de subconjuntos. foi difícil encontrar documentação em @ mas eu encontrei aqui . não é exatamente a melhor documentação de volfrâmio para mais de um argumento, mas me ajudou a entender o exemplo postado aqui. isto foi adaptado de
f = Permutations[Range[5], {3}]
Select[Apply[CoprimeQ]]@f
observe todos os @ / @? __ /; desaparece depois de reformulá-lo para minhas necessidades.
depois de consolidar tudo em uma única linha de código usando funções puras, fui capaz de fazer uma tabela. exemplo:
Table[
Length[Select[Subsets[Range[x], {3}], Apply[CoprimeQ]]], {x, 3, 100}
]
que dá
{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}
Então, encontrei uma correspondência no OEIS . com exemplo de código
a[n_] := Select[Subsets[Range[n], {3}], And @@ (GCD @@ # == 1 & /@ Subsets[#, {2}]) &] // Length;
a /@ Range[49]
você pode decidir quem tem o código mais limpo de todos os exemplos. muito obrigado a kglr por me ajudar quando estive preso.