줄리아에서 배열, 조합, 원형 배열, 염주 배열을 시도해 보세요!
개시하다
트위터에는 젠의 쥬리아와 관련된 내용이 떠돌고 있다.
이것은 모든 목록을 배열하고 조합해서 만드는 프로그램입니다.(Shuhei Ohno)
엔화와 염주로'누가 댓글을 달아주세요!'"이거 해야 돼!"그렇게 생각하고 했어요.
목록이 같은 내용을 포함한다면
Shuhei Ohno씨의 코드를 보고 생각했는데
[1,1,2,3,4]
등 같은 것을 포함하는 배열·조합 등이 지원되지 않아서 확인하고 싶었어요.정렬
우선 포장
Combinatorics.jl
을 사용합니다.정렬(동일 제외)
using Combinatorics
seq = [1, 2, 3, 4, 5]
p = union(permutations(seq, 3))
# 順列(同じものでもOK)この例は集合から3個とって1列に並べる。
60-element Vector{Vector{Int64}}:
[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
[1, 3, 2]
[1, 3, 4]
[1, 3, 5]
[1, 4, 2]
[1, 4, 3]
[1, 4, 5]
[1, 5, 2]
⋮
[5, 2, 1]
[5, 2, 3]
[5, 2, 4]
[5, 3, 1]
[5, 3, 2]
[5, 3, 4]
[5, 4, 1]
[5, 4, 2]
[5, 4, 3]
개수도 나와 60개!정렬(동일 포함)
같은 것을 포함하는 순서대로 해 보세요.
seq2 = [1, 1, 1, 2, 2, 3]
p2 = union(permutations(seq2, 3))
19-element Vector{Vector{Int64}}:
[1, 1, 1]
[1, 1, 2]
[1, 1, 3]
[1, 2, 1]
[1, 2, 2]
[1, 2, 3]
[1, 3, 1]
[1, 3, 2]
[2, 1, 1]
[2, 1, 2]
[2, 1, 3]
[2, 2, 1]
[2, 2, 3]
[2, 3, 1]
[2, 3, 2]
[3, 1, 1]
[3, 1, 2]
[3, 2, 1]
[3, 2, 2]
19개.콤비네이션
다음은 팀.
조합(동일 제외)
seq = [1, 2, 3, 4, 5]
c = union(combinations(seq, 3))
# 組み合わせ(同じものでもOK)この例は集合から3個とってくる組み合わせ。
10-element Vector{Any}:
[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
[1, 3, 4]
[1, 3, 5]
[1, 4, 5]
[2, 3, 4]
[2, 3, 5]
[2, 4, 5]
[3, 4, 5]
{}_5\text{C}_3 = 10개.조합(동일 포함)
그렇다면 같은 것을 포함하는 경우다.
seq2 = [1, 1, 1, 2, 2, 3]
c = union(combinations(seq2, 3))
# 組み合わせ(同じものでもOK)この例は集合から3個とってくる組み合わせ。
6-element Vector{Any}:
[1, 1, 1]
[1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 2, 3]
[2, 2, 3]
6개.고등학교 수학 교과서 등 예제는'나무그림으로 생각해라!'되다원형 배열
그럼 엔화로 배열해 주세요.나는 일찍이 공식을 운용하여 '같은 물건을 포함하는 엔화의 배열 총수' 를 계산한 적이 있다.
이번에 나는 실제적으로 그 명세서를 찾을 것이다.지난번 결과와 일치하는지 확인하고 싶습니다.
이번 방침은요.
!
대상 열의 경우 다음에 따라 이동하여 일치하는 항목을 제거합니다.
네.적당히
union
에서 중복을 제거하세요.원형 정렬(동일 제외)
# 円順列(同じものでもOK)この例は集合から3個とってくる円順列。
function circperm(seq, k)
p = union(permutations(seq, k))
n = length(p)
d = []
for i = 1:n-1, j = i+1:n, t = 1:k-1
if p[i] == circshift(p[j], t)
push!(d, j)
end
end
deleteat!(p, sort!(union!(d)))
end
circperm(seq, 3)
20-element Vector{Vector{Int64}}:
[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
[1, 3, 2]
[1, 3, 4]
[1, 3, 5]
[1, 4, 2]
[1, 4, 3]
[1, 4, 5]
[1, 5, 2]
[1, 5, 3]
[1, 5, 4]
[2, 3, 4]
[2, 3, 5]
[2, 4, 3]
[2, 4, 5]
[2, 5, 3]
[2, 5, 4]
[3, 4, 5]
[3, 5, 4]
{}_5\text{C}_3\times\dfrac{3!}{3}=20개는요.원형 배열(동일 포함)
seq2 = [1, 1, 1, 2, 2,3]
circperm(seq2, 3)
7-element Vector{Vector{Int64}}:
[1, 1, 1]
[1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 2, 3]
[1, 3, 2]
[2, 2, 3]
7개.신중을 기하기 위해서 전에 만든 것을 확인해 보겠습니다.
seq3 = [1, 1, 1, 1, 2,2,2,2,2,2]
circperm(seq3, 10)
22-element Vector{Vector{Int64}}:
[1, 1, 1, 1, 2, 2, 2, 2, 2, 2]
[1, 1, 1, 2, 1, 2, 2, 2, 2, 2]
[1, 1, 1, 2, 2, 1, 2, 2, 2, 2]
[1, 1, 1, 2, 2, 2, 1, 2, 2, 2]
[1, 1, 1, 2, 2, 2, 2, 1, 2, 2]
[1, 1, 1, 2, 2, 2, 2, 2, 1, 2]
[1, 1, 2, 1, 1, 2, 2, 2, 2, 2]
[1, 1, 2, 1, 2, 1, 2, 2, 2, 2]
[1, 1, 2, 1, 2, 2, 1, 2, 2, 2]
[1, 1, 2, 1, 2, 2, 2, 1, 2, 2]
⋮
[1, 1, 2, 2, 1, 2, 2, 1, 2, 2]
[1, 1, 2, 2, 1, 2, 2, 2, 1, 2]
[1, 1, 2, 2, 2, 1, 1, 2, 2, 2]
[1, 1, 2, 2, 2, 1, 2, 1, 2, 2]
[1, 1, 2, 2, 2, 1, 2, 2, 1, 2]
[1, 1, 2, 2, 2, 2, 1, 2, 1, 2]
[1, 2, 1, 2, 1, 2, 1, 2, 2, 2]
[1, 2, 1, 2, 1, 2, 2, 1, 2, 2]
[1, 2, 1, 2, 2, 1, 2, 1, 2, 2]
22개.예전에 만든 코드로 확인한 후,
using Combinatorics #multinomial(a)多項係数を求める
using Primes #totient(i) オイラーのトーシェント関数
function divisors(n) #約数のリストを求める関数
X=[]
for i=1:n
if n % i==0
X =push!(X,i)
end
end
X
end
function enkan(a)
l=gcd(a) #リスト(配列)aの最大公約数を求める。
N=sum(a) #aの総和
A=divisors(l)
p=0
for k in A
q=map(x -> x÷k,a)
p +=totient(k)*multinomial(q...)
end
p÷N
end
enkan([4 6])
22
회!염주 배열
요즘 젊은이들은 염주를 모르지.불교에서는 장례식 때 손에 든다.
이번 방침은요.
!
원형으로 배열된 목록을 만들고 목표의 열에 대해 아래의 열을 반전시켜 일치하는 내용을 제거한다.
네.이것도 적당히
union
에서 중복을 제거한다.염주 배열(동일하지 않음)
# 数珠順列(同じものでもOK)この例は集合から3個とってくる数珠順列。
function ringperm(seq, k)
p = circperm(seq, k)
n = length(p)
d = []
for i = 1:n-1, j = i+1:n, t = 1:k-1
if p[i] == circshift(reverse(p[j]),t)
push!(d, j)
end
end
deleteat!(p, sort!(union!(d)))
end
ringperm(seq, 3)
10-element Vector{Vector{Int64}}:
[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
[1, 3, 4]
[1, 3, 5]
[1, 4, 5]
[2, 3, 4]
[2, 3, 5]
[2, 4, 5]
[3, 4, 5]
{}_5\text{C}_3\times\dfrac{3!}{3}\times2=10개.염주 배열(동일 포함)
나는 별로 해 본 적이 없다.수량이 많다는 생각만 해도 쉽지 않다.
보통 반대로 똑같이 변하고 2로 나누는 것을 고려한다.같은 것이 포함되지 않으면 반드시 한 쌍이 존재하기 때문에 간단하게 2로 나누면 된다.
seq2 = [1, 1, 1, 2, 2,3]
ringperm(seq2, 3)
6-element Vector{Vector{Int64}}:
[1, 1, 1]
[1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 2, 3]
[2, 2, 3]
6개.엔화 배열은 7개였지만 전혀 줄어들지 않았다.7개 중 5개는 자기가 뒤집은 것이고,[1, 2, 3]
와 [1, 3, 2]
만 한 쌍이다.예를 하나 더 들겠습니다.
seq3 = [1, 1, 1, 1, 2,2,2,2,2,2]
ringperm(seq3, 10)
16-element Vector{Vector{Int64}}:
[1, 1, 1, 1, 2, 2, 2, 2, 2, 2]
[1, 1, 1, 2, 1, 2, 2, 2, 2, 2]
[1, 1, 1, 2, 2, 1, 2, 2, 2, 2]
[1, 1, 1, 2, 2, 2, 1, 2, 2, 2]
[1, 1, 2, 1, 1, 2, 2, 2, 2, 2]
[1, 1, 2, 1, 2, 1, 2, 2, 2, 2]
[1, 1, 2, 1, 2, 2, 1, 2, 2, 2]
[1, 1, 2, 1, 2, 2, 2, 1, 2, 2]
[1, 1, 2, 1, 2, 2, 2, 2, 1, 2]
[1, 1, 2, 2, 1, 1, 2, 2, 2, 2]
[1, 1, 2, 2, 1, 2, 1, 2, 2, 2]
[1, 1, 2, 2, 1, 2, 2, 1, 2, 2]
[1, 1, 2, 2, 2, 1, 1, 2, 2, 2]
[1, 2, 1, 2, 1, 2, 1, 2, 2, 2]
[1, 2, 1, 2, 1, 2, 2, 1, 2, 2]
[1, 2, 1, 2, 2, 1, 2, 1, 2, 2]
16개.엔화 배열은 22개다.
Reference
이 문제에 관하여(줄리아에서 배열, 조합, 원형 배열, 염주 배열을 시도해 보세요!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/dannchu/articles/4d35b5d2b4c94c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)