การเปลี่ยนหมายเลข


9

ความท้าทาย

สำหรับชุดจำนวนเต็ม n จำนวนที่กำหนดให้เขียนโปรแกรมที่จะส่งออกดัชนี lexicographic

กฎระเบียบ

  • อินพุตจะต้องเป็นชุดของจำนวนเต็มที่ไม่เป็นลบเท่านั้นคั่นด้วยช่องว่าง
  • คุณควรส่งออกดัชนี lexicographic (ช่วง 0 ถึง n! -1 รวม) ของการเปลี่ยนแปลง
  • ไม่สามารถใช้ไลบรารีการเปลี่ยนแปลงหรือการแปลงร่างภายในได้
  • คุณไม่สามารถสร้างชุดการเรียงสับเปลี่ยนหรือชุดย่อยของการเรียงสับเปลี่ยนของอินพุตเพื่อช่วยคุณค้นหาดัชนี
  • นอกจากนี้คุณยังไม่สามารถเพิ่มหรือลดการเปลี่ยนแปลงที่ให้กับการเปลี่ยนลำดับถัดไป / ก่อนหน้า (การทำพจนานุกรม)
  • คะแนนโบนัส (-10 ไบต์) หากคุณพบวิธีที่จะทำให้เสร็จโดยไม่ต้องใช้แฟกทอเรียล
  • รันไทม์ควรน้อยกว่า 1 นาทีสำหรับ n = 100
  • รหัสที่สั้นที่สุดนับเป็นไบต์ชนะ
  • ผู้ชนะที่ได้รับเลือกวันอังคาร (22 กรกฎาคม 2014)

เพิ่มเติมเกี่ยวกับการเรียงสับเปลี่ยน

ตัวอย่าง

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
เราจะมีเวลามากขึ้นจนกว่าจะมีการเลือกผู้ชนะ สามวันเป็นเวลาน้อยเกินไป
xnor

คำตอบ:


4

GolfScript, 12 (22 ตัวอักษร - 10 โบนัส)

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

คะแนนโบนัสสำหรับการไม่ใช้แฟกทอเรียล ต้องป้อนข้อมูลใน STDIN ในรูปแบบที่ desriped ในคำถาม คุณสามารถลองรหัสออนไลน์


ฮ่าฮ่าไม่ใช่สิ่งที่ฉันกำลังมองหาเมื่อฉันพูดว่า "ไม่ใช้แฟคทอเรียล" แต่ฉันคิดว่ามันนับ Kudos
Kyle McCormick

4

CJam, 31, กับแฟ็กทอเรียล

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

ทำไมฉันยังได้รับการโหวต? คำตอบ GolfScript สามารถเขียนใหม่ใน CJam โดยมีเพียง 23 ตัวอักษร
jimmy23013

6
เพราะคนชอบคำตอบของคุณ
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

อ่านได้ ในตัวมาก ว้าว.

เราใช้ความจริงที่ว่าดัชนี lexicographic ของการเปลี่ยนแปลงคือผลรวมขององค์ประกอบของพีชคณิตของจำนวนการรุกรานเหนือองค์ประกอบนั้น (ค่าหลังจาก แต่ต่ำกว่ามัน) คูณด้วยจำนวนขององค์ประกอบหลังจากนั้น แทนที่จะประเมินนี้เป็นพหุนามเหมือนระยะแสดงออกโดยระยะเราจะใช้สิ่งที่คล้ายกับวิธีการที่ฮอร์เนอร์

แทนที่จะวนลูปมากกว่าดัชนีอาเรย์เราจะลบองค์ประกอบแรกของรายการและประมวลผลองค์ประกอบที่เหลืออยู่ซ้ำ ๆ นิพจน์sorted(p).index(p.pop(0))นับจำนวนผู้รุกรานที่ผ่านดัชนีแรกโดยรับตำแหน่งในรายการที่เรียงลำดับขณะเดียวกันก็ทำการลบออก

น่าเศร้าที่ฉันต้องใช้ Python 2 และใช้อักขระเพิ่มอีก 4 ตัวสำหรับraw_input(แม้ว่า -1 ถึงprint) เพราะใน Python 3 การmap(int,...)สร้างวัตถุแผนที่ซึ่งไม่รองรับการทำงานของรายการ


1

Pyth (13 = 23-10)

JVPwdWJ=Z+*ZlJXovNJ;J)Z

พอร์ตของคำตอบหลามของฉัน

การแปลภาษาไพ ธ อน (ที่กรองสิ่งที่ไม่เกี่ยวข้องออกไป):

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)

หมายเลขอินพุตยังคงสตริงไว้ แต่เรียงเป็น int โดยใช้ eval เป็นคีย์ รายการจะถูกกลับรายการเพื่อให้ได้popด้านหน้ามากกว่าด้านหลัง


1

คอบร้า - 202

เห็นได้ชัดว่าคอบร้าไม่ได้แข่งขันในเกมนี้

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 ไบต์ (15 - 10)

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

สิ่งนี้ทำงานในเวลาO ( n 2 ) และสามารถจัดการn = 100 ได้อย่างง่ายดาย

การใช้

   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

คำอธิบาย

#\.#.+/@(<{.)\.  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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.