Đánh số hoán vị


9

Các thách thức

Đối với một tập hợp n số nguyên cho trước, hãy viết chương trình sẽ xuất ra chỉ số từ điển của nó.

Những quy định

  • Đầu vào chỉ phải là một tập hợp các số nguyên không âm duy nhất được phân tách bằng dấu cách.
  • Bạn nên xuất chỉ số từ vựng (bao gồm từ 0 đến n! -1) của hoán vị.
  • Không có thư viện hoán vị hoặc tích hợp hoán vị có thể được sử dụng.
  • Bạn không được tạo tập hợp hoán vị hoặc bất kỳ tập hợp hoán vị đầu vào nào để giúp bạn tìm chỉ mục.
  • Bạn cũng không thể tăng hoặc giảm hoán vị đã cho thành hoán vị tiếp theo / trước đó (theo từ vựng).
  • Điểm thưởng (-10 byte) nếu bạn tìm ra cách nào đó để hoàn thành việc này mà không cần sử dụng giai thừa.
  • Thời gian chạy nên ít hơn 1 phút cho n = 100
  • Mã ngắn nhất theo số byte thắng
  • Người chiến thắng được chọn vào thứ ba (ngày 22 tháng 7 năm 2014)

Thêm về hoán vị

Ví dụ

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
Chúng ta có thể có nhiều thời gian hơn cho đến khi một người chiến thắng được chọn? Ba ngày là quá ít thời gian.
xnor

Câu trả lời:


4

GolfScript, 12 (22 ký tự - 10 phần thưởng)

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

Điểm thưởng cho việc không sử dụng giai thừa. Đầu vào phải được đưa ra trên STDIN theo định dạng được đặt trong câu hỏi. Bạn có thể thử mã trực tuyến .


Haha không hoàn toàn những gì tôi đang tìm kiếm khi tôi nói "không sử dụng giai thừa" nhưng tôi cho rằng nó có giá trị. Kudos
Kyle McCormick

4

CJam, 31 tuổi, với giai thừa

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

Tại sao tôi vẫn nhận được upvote? Câu trả lời GolfScript có thể được viết lại trong CJam chỉ với 23 ký tự.
jimmy23013

6
Bởi vì mọi người thích câu trả lời của bạn.
xem

1

Con trăn 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

Có thể đọc được. Tích hợp nhiều. Ồ

Chúng tôi sử dụng thực tế là chỉ số từ vựng của một hoán vị là tổng của các phần tử hoán vị của số lượng nghịch đảo trên phần tử đó (các giá trị sau nó nhưng dưới nó) nhân với nhân tử của số phần tử sau nó. Thay vì đánh giá thuật ngữ biểu thức giống như đa thức này theo thuật ngữ, chúng tôi sử dụng một cái gì đó giống với phương pháp của Horner .

Thay vào đó sau đó lặp qua các chỉ số mảng, chúng tôi liên tục xóa phần tử đầu tiên của danh sách và xử lý các phần tử còn lại. Biểu thức sorted(p).index(p.pop(0))đếm số lần đảo qua chỉ mục đầu tiên bằng cách lấy vị trí của nó trong danh sách được sắp xếp, đồng thời thực hiện xóa.

Đáng buồn thay, tôi đã phải sử dụng Python 2 và lấy thêm 4 ký tự cho raw_input(mặc dù -1 cho print) vì trong Python 3, nó map(int,...)tạo ra một đối tượng bản đồ, không hỗ trợ các hoạt động danh sách,


1

Bình (13 = 23-10)

JVPwdWJ=Z+*ZlJXovNJ;J)Z

Một cổng của câu trả lời Python của tôi .

Bản dịch Python (với một số nội dung không liên quan được lọc ra):

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)

Các số đầu vào giữ nguyên chuỗi nhưng được sắp xếp dưới dạng int bằng cách sử dụng eval làm khóa. Danh sách được đảo ngược để popcó mặt trước chứ không phải mặt sau.


1

Rắn hổ mang - 202

Rõ ràng Cobra không thực sự cạnh tranh trong cái này.

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 byte (15 - 10)

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

Điều này chạy trong thời gian O ( n 2 ) và có thể xử lý n = 100 dễ dàng.

Sử dụng

   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

Giải trình

#\.#.+/@(<{.)\.  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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.