Permütasyon grubu işlemi


15

N elemanlarının permütasyonları ile 0 ila n! -1 sayıları arasında, permütasyonların ve ilgili sayıların sözlükbilimsel sıralaması aynı olacak şekilde iyi bilinen bir bijeksiyon vardır. Örneğin, n = 3 ile:

0 <-> (0, 1, 2)
1 <-> (0, 2, 1)
2 <-> (1, 0, 2)
3 <-> (1, 2, 0)
4 <-> (2, 0, 1)
5 <-> (2, 1, 0)

Ayrıca, n elementinin permütasyonlarının bir grup (n simetrik sıra n!) Grubu oluşturduğu iyi bilinmektedir - bu nedenle, özellikle, n elementin ikinci permütasyonuna uygulanan n elementin bir permütasyonunun n elementin permütasyonu sağladığı bilinmektedir. .

Örneğin, (a, b, c) 'ye uygulanan (1, 0, 2) verim (b, a, c)' yi verir, dolayısıyla (2, 1, 0) verimine (1, 2) uygulanan (1, 0, 2) , 0).

Üç tamsayı argümanı alan bir program yazın: n, p1 ve p2; p1 ve p2'yi n elementinin permütasyonu olarak yorumlar; birincisini ikinciye uygular; ve karşılık gelen tamsayıyı çıkarır. Örneğin:

$ ./perm.sh 3 2 5
3

Yanıtlar:


7

J, 30

Bunun zarafetini seviyorum:

[:A.[:{/]A.~/~i.@[

veya bu:

13 :'A.{/(i.x)(A.)~/y'

ama şu şekilde çalışırlar:

3 f 2 5
3
12 f 8 9
17

Bu geçerli giriş:

([:A.[:{/i.@{.A.~/}.)".}.>ARGV

Bazı açıklamalar:

  • 3 A. 0 1 2: 0 1 2(= 1 2 0) ' nin 3. permütasyonunu verir
  • 0 1 2 (A.)~ 3: aynı, ancak argümanlar tersine çevrildi
  • 0 1 2 (A.)~/ 3 4 5 ..."geçerlidir" (A.)~için 3 4 5 ...o 3'üncü, 4'üncü, 5'inci, ... permütasyon verir, böylece 0 1 2.
  • A. 1 2 0: 1 2 0(= 3) permütasyon sırasını verir
  • i. n: diziyi verir 0 1 2 ... n-1
  • 1 2 0 { 0 2 1düzenler 0 2 1tarafından 1 2 0(= 2 1 0)

Aferin. A.Dün belgelere bir göz attım , ancak O :-)
JB

@JB: Burada neden JB + J olmadığını merak ediyordum ... :)
Eelvex

4

Ruby - 77 karakter

n,a,b=$*.map &:to_i
l=[*[*0...n].permutation]
p l.index(l[b].values_at *l[a])

Son 3 satırı p l.index ile değiştirin (l [b] .values_at (* l [a]))
steenslag

Kulağa kaba geldiğim için üzgünüm. Tavsiye vermek istedim, ama biçimlendirme problemlerinde kayboldum ve görünüşe göre düzenleme sürem bitti.
steenslag

ARGV.map{|x|x.to_i}-> $*.map &:to_ibirkaç karakter daha kaydeder. Ve ikinci satırı ile değiştirebilirsiniz l=[*[*0...n].permutation].
Ventero

Sorun değil, tavsiye için teşekkürler.
david4dev

@Ventero: Bunları seviyorum. [* [* 0 ... n]. Nüfuz] beni güldürdü.
steenslag

2

Python 2.6, 144 karakter

import sys
from itertools import*
n,p,q=map(int,sys.argv[1:])
R=range(n)
P=list(permutations(R))
print P.index(tuple(P[q][P[p][i]] for i in R))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.