Birçok Boyutun Dansı


19

Meydan okuma

Bir nboyutlu tamsayı dizisi ve ilk ndoğal sayıların bir permütasyonu göz önüne alındığında , dizi boyutlarına uygun şekilde izin verin.

ayrıntılar

Bu meydan okuma MATLAB'lardan esinlenmiştir permute. gösteri Permütasyon bir tamsayı listesi olarak verilir, örneğin [1,3,2], 1, 1 ile eşleştirilir, 2, 3 ile eşlenir ve 3, 2 ile eşlenir (burada, igiriş, ieşleştirilir). Ancak, örneğin döngü veya işlev olarak uygun olan diğer biçimleri kullanabilirsiniz. Daha uygunsa, 0 tabanlı indeksleme de kullanabilirsiniz.

Dizinin tam bir "dikdörtgen" dizisi olduğu varsayılabilir m1 x m2 x ... x mn(yani düzensiz / tırtıklı olmadığını varsayabilirsiniz ).

nBirçok dilin iç içe dizideki boyut sayısı sınırına sahip olduğundan , bunun çok büyük olmadığını varsayabilirsiniz .

Diliniz çok boyutlu dizileri desteklemiyorsa, diziyi girdi olarak temsil eden bir dize de alabilirsiniz.

Örnekler

  • nKimlik permütasyonuna sahip herhangi bir boyutlu dizi [1,2,3,...,n]değişmeyecektir.
  • [[10,20,30],[40,50,60]]Permütasyona sahip dizi [2,1]eşlenir [[10,40],[20,50],[30,60]].
  • [[[1,2],[3,4]],[[5,6],[7,8]]]Permütasyona sahip dizi [2,3,1]eşlenir [[[1,3],[5,7]],[[2,4],[6,8]]].

Yanıtlar:



9

Haskell , 168 bayt

pInts'nin bir permütasyonu ve çok boyutlu bir Ints dizisini temsil eden iç içe bir liste alan bir (tip sınıf polimorfik) fonksiyonudur .

Olarak Çağrı p [2,1] [[10,20,30],[40,50,60]]başarılı olmazsa varsaymak tipi, şöyle bir tür not eklemek gerekebilir ancak eğer :: [[Int]]sonuç türünü veren (uygun şekilde iç içe).

import Data.List
class P a where p::[Int]->[a]->[a]
instance P Int where p _=id
instance P a=>P[a]where p(x:r)m|n<-p r<$>m,y:z<-sort r=last$n:[p(x:z)<$>transpose n|x>y]

Çevrimiçi deneyin!

Haskell'de iç içe yerleştirilmiş keyfi derinlikli dizilerle yapılan golf zorlukları Haskell'de biraz gariptir, çünkü statik yazım yoluna girme eğilimindedir. Haskell listeleri (meydan okuma açıklamasındakiyle aynı sözdizimiyle) iyi yuvalanmış olsa da, farklı yuvalama derinliğindeki listeler uyumsuz türdedir. Ayrıca, standart Haskell ayrıştırma işlevleri, ayrıştırmaya çalıştığınız değerin türünü bilmenizi gerektirir.

Sonuç olarak, programın nispeten ayrıntılı olan türle ilgili bildirimleri içermesi kaçınılmaz görünmektedir. Golf edilmiş kısım için, bir dizi sınıfı tanımlamaya karar verdim P, öyle ki pdizi türü üzerinde polimorfik olabilir.

Bu arada, TIO'nun test donanımı, ayrıştırma sorununu çözmenin bir yolunu gösterir.

Nasıl çalışır

  • Bu algoritmanın özünü özetlemek için: Permütasyon listesinde bir kabarcık sıralaması yapar ve karşılık gelen permütasyon endeksleri değiştiğinde komşu boyutları aktarır.

  • Tarafından verildiği gibi class P abeyan, herhangi bir durumda, piki bağımsız (her zaman tipte bir permütasyon alır [Int]) ve bir dizi.

  • Permütasyon, meydan okuma açıklamasındaki formda verilebilir, ancak algoritmanın çalışma şekli, endekslerin seçimi, göreceli sıraları hariç, isteğe bağlıdır. (Yani hem 0- hem de 1- tabanlı çalışma.)
  • Taban , tek boyut yalnızca kendisine eşleştirilebildiğinden, basitçe değişmeden dönen instance P Intboyut 1 dizilerini işler p.
  • Diğeri instance P a => P [a]özyinelemeli olarak tanımlanır pve n + 1 dizileri için tanımlamak amacıyla n boyut alt dizileriyle çağrılır.
    • p(x:r)milkinin p rtüm öğelerinde özyinelemeli olarak arama yapar , ilkinin dışındaki tüm boyutların birbirine göreceli olarak doğru şekilde izin mverildiği bir sonuç dizisi verir n.
    • Gerçekleştirilmesi gereken kalan permütasyon ntarafından verilir x:y:z = x:sort r.
    • Eğer x<yöyleyse, ilk boyutu nzaten doğru yerleştirilmiş ve nsadece döndürülür.
    • Eğer x>y, o zaman fonksiyon ile yapılan birinci ve ikinci boyutun ndeğiştirilmesi gerekir transpose. Son olarak p(x:z), orijinal birinci boyutun doğru konuma aktarılmasını sağlayarak, sonucun her öğesine tekrar tekrar uygulanır.

3

Python 2 , 312 bayt

Bu permütasyon için 0-endeksleme kullanır

from numpy import*
from itertools import*
z=range
def f(i,r):
	l=array(i).shape;R={b:a for a,b in enumerate(r)};r=len(r);m=eval('['*r+'0'+q('for k in z(l[R[%s]])]',r-1,-1,-1))
	for d in product(*[z(p) for p in l]):exec'm'+q('[d[R[%s]]]',r)+'=i'+q('[d[%s]]',r)
	return m
q=lambda s,*j:''.join(s%(j)for j in z(*j))

Çevrimiçi deneyin!

@Jonathan Frech sayesinde -2 bayt.


Python 2'de bir ifade olduğu için exec (iki bayt kaydetme) çağırmak için parantezlere ihtiyacınız yoktur
Jonathan Frech

İçinde gereksiz bir alan da var z(p) for.
Jonathan Frech

1
Kullanılmış map(z,l), s%jve print301 byte için - Online Deneyin!
Bay Xcoder

3

Python 2 , 41 25 bayt

import numpy
numpy.einsum

Çevrimiçi deneyin!

Permütasyon vektörü pbir harf dizisi olarak verilir. Yani [2,3,1]olarak verilebilir 'bca'.

@EriktheOutgolfer sayesinde 16 bayt kurtardı!


Bu 26'dan fazla boyutu destekliyor mu?
Outgolfer Erik

Aslında 52'den fazla boyut yok: büyük harf + küçük harf.
rahnema1

2

JavaScript (ES6), 136 132 bayt

(a,p,v=[],r=[],g=(a,[d,...p],_,h=(r,[i,...v])=>1/v[0]?h(r[i]=r[i]||[],v):r[i]=a)=>1/d?a.map((e,i)=>g(e,p,v[d]=i)):h(r,v))=>g(a,p)&&r

0 endeksli. Açıklama: permütasyon kullanılarak yeniden sıralanan bir dizi indeks oluşturan gdiziyi yinelemeli olarak yineler . Bir kez tükendi, sonra izin verilen dizinleri kullanarak öğeyi özyinelemeli olarak sonuç dizisine ekler .avpphr

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.