Permütasyon Numaralandırma


9

Meydan okuma

Belirli bir n tamsayı kümesi için, sözlükbilim dizinini çıkaracak bir program yazın.

Kurallar

  • Giriş yalnızca boşluklarla ayrılmış benzersiz negatif olmayan tamsayılar kümesi olmalıdır.
  • Permütasyonun sözlükbilimsel indeksini (0 ila n! -1 dahil) çıkarmalısınız.
  • Permütasyon kütüphaneleri veya permütasyon yerleşikleri kullanılamaz.
  • Dizini bulmanıza yardımcı olması için permütasyonlar kümesini veya girdinin herhangi bir permütasyon alt kümesini oluşturamazsınız.
  • Ayrıca verilen permütasyonu sonraki / önceki (sözlükbilimsel) permütasyona artıramaz veya azaltamazsınız.
  • Faktörleri kullanmadan bunu tamamlamanın bir yolunu bulursanız bonus puanları (-10 bayt).
  • N = 100 için çalışma süresi 1 dakikadan az olmalıdır
  • En kısa kod bayt sayısı kazanır
  • Kazanan 22 Temmuz 2014 Salı günü seçildi

Permütasyonlar Hakkında Daha Fazla Bilgi

Örnekler

0 1 2 --> 0
0 2 1 --> 1
1 0 2 --> 2
1 2 0 --> 3
2 0 1 --> 4
2 1 0 --> 5
0 1 2 3 4 5 6 7 --> 0
0 1 2 3 4 5 7 6 --> 1
0 1 2 3 4 6 5 7 --> 2
1 3 5 17        --> 0
781 780 779 13  --> 23
81 62 19 12 11 8 2 0 --> 40319
195 124 719 1 51 6 3 --> 4181

1
Bir kazanan seçilene kadar daha fazla zamanımız olabilir mi? Üç gün çok az zaman.
xnor

Yanıtlar:


4

GolfScript, 12 (22 karakter - 10 bonus)

~]0\.,{.,@*\.(@$?@+\}*

Faktöriyelleri kullanmamanız için bonus puan. Giriş STDIN'de soruda belirtilen formatta verilmelidir. Kodu çevrimiçi deneyebilirsiniz .


Haha "faktöriyelerini kullanmadan" dediğimde aradığım şey tam olarak değil ama sanırım önemli. Kudos
Kyle McCormick

4

CJam, 31, faktöriyellerle

q~]{__(f<0+:+\,,(;1+:**\(;}h]:+

Neden hala oy alıyorum? GolfScript yanıtı CJam'de sadece 23 karakterle yeniden yazılabilir.
jimmy23013

6
Çünkü insanlar cevabınızı seviyor.
seequ

1

Python 2 (77 = 87-10)

p=map(int,raw_input().split())
s=0
while p:s=s*len(p)+sorted(p).index(p.pop(0))
print s

Böyle okunabilir. Çok yerleşik. Vay.

Bir permütasyonun sözlükbilimsel indeksinin, o elementin üstündeki (ondan sonraki değerler ancak onun altındaki değerler) permütasyonların elementleri üzerindeki toplamı, ondan sonraki eleman sayısının faktöriyeli ile çarpması olarak kullanırız. Bu polinom benzeri ifadeyi terime göre değerlendirmek yerine Horner'ın yöntemine benzer bir şey kullanıyoruz .

Daha sonra dizi indeksleri arasında geçiş yapmak yerine, listenin ilk öğesini tekrar tekrar kaldırır ve kalan öğeleri işleriz. İfade sorted(p).index(p.pop(0)), sıralı listedeki konumunu alarak ve aynı zamanda kaldırma işlemini gerçekleştirerek ilk dizinden önceki ters çevirme sayısını sayar.

Ne yazık ki, Python 2 kullanmak ve raw_input(-1 için olsa da print) için 4 karakter daha almak zorunda kaldı çünkü Python 3'te map(int,...)liste işlemlerini desteklemeyen bir harita nesnesi üretir,


1

Pyth (13 = 23-10)

JVPwdWJ=Z+*ZlJXovNJ;J)Z

Python cevabımın bir limanı .

Python çevirisi (bazı alakasız şeyler filtrelendi):

Z=0
J=rev(split(input()," "))
while J:
 Z=plus(times(Z,len(J)),index(order(lambda N:eval(N),J),J.pop()))
print(Z)

Girdi sayıları dizgide kalır ancak anahtar olarak eval kullanılarak ints olarak sıralanır. Liste tersine çevrilir, böylece poparkadan ziyade ön taraf alınır.


1

Kobra - 202

Açıkçası Cobra bu konuda gerçekten rekabet etmiyor.

class P
    var n=0
    var t=CobraCore.commandLineArgs[1:]
    def main
        .f(.t[0:0])
    def f(l as List<of String>)
        if.t.count==l.count,print if(.t<>l,'',.n+=1)
        else,for i in.t.sorted,if i not in l,.f(l+[i])

0

J, 5 bayt (15-10)

#\.#.+/@(<{.)\.

Bu O ( n 2 ) sürede çalışır ve n = 100'ü kolayca idare edebilir .

kullanım

   f =: #\.#.+/@(<{.)\.
   f 0 1 2
0
   f 0 2 1
1
   f 1 0 2
2
   f 1 2 0
3
   f 2 0 1
4
   f 2 1 0
5
   f 0 1 2 3 4 5 6 7
0
   f 0 1 2 3 4 5 7 6
1
   f 0 1 2 3 4 6 5 7
2
   f 1 3 5 17
0
   f 781 780 779 13
23
   f 81 62 19 12 11 8 2 0
40319
   f 195 124 719 1 51 6 3
4181
   NB. A. is the builtin for permutation indexing
   timex 'r =: f 927 A. i. 100'
0.000161
   r
927

açıklama

#\.#.+/@(<{.)\.  Input: array P
             \.  For each suffix of P
          {.       Take the head
         <         Test if it is greater than each of that suffix
     +/@           Sum, count the number of times it is greater
#\.              Get the length of each suffix of P
   #.            Convert to decimal using a mixed radix
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.