Sắp xếp theo bảng chữ cái tùy chỉnh


9

Thách thức là tạo ra một chương trình sắp xếp danh sách các từ, chỉ có điều các từ cần phải theo thứ tự của một bảng chữ cái ngẫu nhiên.

Chương trình của bạn sẽ chấp nhận một chuỗi các từ được phân tách bằng dấu phẩy và một bảng chữ cái mới.
Chương trình của bạn sẽ xuất ra mọi từ theo cùng một cách theo thứ tự mới được sắp xếp.

Thí dụ:

Đầu vào:

home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxzaeiouy

Đầu ra:

cat,green,home,network,egg,oval

Đây là một , vì vậy người chiến thắng là người có chương trình ngắn nhất.

Đây là thử thách đầu tiên của tôi vì vậy mọi cải tiến cho câu hỏi / thử thách đều được đánh giá cao.


1. Tôi lấy từ ví dụ của bạn rằng bảng chữ cái sẽ được phân tách khỏi các từ bằng một khoảng trắng. Đúng không? 2. Các từ luôn luôn được viết thường?
Dennis

@Dennis có cho cả hai
Toán học

1
Đó là một sai lầm. Tôi sẽ chỉnh sửa nó.
Toán học

+1 câu hỏi OK (cho lần thử đầu tiên ;-)). Nhưng tôi không thấy sự liên quan của tiêu đề - có lẽ bạn có thể đổi tên nó thành Sort by custom alphabethoặc một cái gì đó sáng tạo hơn?
Chấn thương kỹ thuật số

@DigitalTrauma Vâng, điều đó có thể tốt hơn. Tôi đã cố gắng để chơi một chút với các từ. Tôi nhắm đến một tài liệu tham khảo về ascii và utf-8 và muốn hỏi nó là gì. Nhưng điều đó đã thất bại. Tôi sẽ thay đổi nó thành đề xuất của bạn tốt hơn.
Toán học

Câu trả lời:


2

CJam, 26 19 17 byte

rr:A;',/{Af#}$',*

Hãy thử trực tuyến.

Trường hợp thử nghiệm

$ cjam sort.cjam <<< 'home,oval,cat,egg,network,green bcdfghjklmnpqrstvwxzaeiouy'
cat,green,home,network,egg,oval

Làm thế nào nó hoạt động

rr                    " Read two whitespace-separated tokens from STDIN. ";
  :A;                 " Save the second token (the alphabet) in A.       ";
     ',/              " Split the remaining token at commas.             ";
        {Af#}$        " Sort by the chunks' characters' indexes in A.    ";
               ',*    " Join, separating by commas.                      ";

Chà, vì bạn cũng đã sử dụng cách tiếp cận tương tự, bây giờ tôi không thực sự có ý nghĩa gì.
Trình tối ưu hóa

@Optimizer: Bạn đánh tôi tám giây. Nếu bạn hủy bỏ câu trả lời của bạn, tôi sẽ quay lại.
Dennis

Không, tôi nghĩ rằng đó là một thay đổi tầm thường và rất obv. Tôi nên xem các cập nhật của bạn trước khi đăng câu trả lời của tôi ở vị trí đầu tiên :)
Trình tối ưu hóa

4

Bash + coreutils, 37 byte

tr ,$2 \\na-z<<<$1|sort|tr \\na-z ,$2

Đầu ra:

$ ./alphasort.sh home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxyzaeiouy
cat,green,home,network,egg,oval, $ 

1
Cách tốt đẹp để đối phó với dấu phẩy!
Dennis

2

Pyth , 19 ký tự

j\,o_mx_zdNchczd\,

Kiểm tra:

$ pyth -c "j\,o_mx_zdNchczd\," <<< 'home,oval,cat,egg,network,green bcdfghjklmnpqrstvwxzaeiouy'
cat,green,home,network,egg,oval

Giải trình:

                            Implicit: d=" "
                            Implicit: z=input()
j\,                         ",".join(
   o                                 order_by(lambda N:
    _                                                  rev(
     m                                                     map(lambda d:
      x_zd                                                              rev(z).index(d),
      N                                                                 N),
    chczd\,                                            z.split(" "[0].split(",")

Về cơ bản, nó sắp xếp các khối, với một khóa của danh sách các chỉ mục của các ký tự trong chuỗi, sau đó nối chúng trên dấu phẩy. Các doanh nghiệp đảo ngược ngắn hơn so với việc tách chuỗi một lần nữa.


18 byte:j\,_omx_zdNchczd\,
Dennis

@Dennis rất thông minh, cảm ơn bạn.
isaacg

1

Ruby, 53 50 byte

a,b=$*
$><<a.split(?,).sort_by{|w|w.tr b,'a-z'}*?,

Tôi đang sử dụng Ruby trđể thay thế bảng chữ cái tùy chỉnh a-ztrước khi sắp xếp. Đầu vào là thông qua đối số dòng lệnh.


Bạn có thể tắt một byte nếu bạn sử dụng $><<để in ra màn hình (sau đó bạn có thể xóa khoảng trống). Bạn có thể tắt hai byte khác bằng cách gán $*cho các biến như vậy: a,b=$*và sử dụng #sort_bythay vì #sort_by!.
Anh

@britishtea Cảm ơn. Tôi nghĩ rằng tôi sẽ cần *$*(mà tôi đã có lúc đầu và có cùng độ dài).
Martin Ender

0

Con trăn

w,a=input().split()
print(",".join(sorted(w.split(","),key=lambda s:"".join(["abcdefghijklmnopqrstuvwxyz"[a.find(c)]for c in s]))))

Cần có nhiều chỗ để cải thiện.


Bạn không phải sử dụng khóa làm chức năng sắp xếp - chỉ cần sử dụng danh sách a.find(c)trực tiếp.
isaacg

0

JavaScript (E6) 102 119

Sắp xếp với chức năng ánh xạ 'M' dựa trên bảng chữ cái trong biến 'a'
Với IO sử dụng cửa sổ bật lên (prompt + alert)

x=prompt().split(/[ ,]/),
a=x.pop(),
M=w=>[10+a.search(c)for(c of w)]+'',
alert(x.sort((a,b)=>M(a)>M(b)))

Là hàm (có thể kiểm tra) với tham số 1 chuỗi, trả về mảng chuỗi (92)

F=x=>(
  M=w=>[10+a.search(c)for(c of w)],
  x=x.split(/[ ,]/),
  a=x.pop(),
  x.sort((a,b)=>M(a)>M(b))
)

Kiểm tra trong bảng điều khiển FireFox / FireBug

F('home,oval,cat,egg,network,green zyxwvtsrqpnmlkjhgfdcbaeiou')

Đầu ra

["network", "home", "green", "cat", "egg", "oval"]

1
-4 nếu bạn thay thế chức năng sắp xếp của mình bằng(M(a)>M(b))-(M(a)<M(b))
DocMax

@DocMax rất hay. Nó chỉ ra rằng nó thậm chí còn đơn giản hơn thế ( stackoverflow.com/a/7232172/3640407 )
edc65

Nếu bạn sử dụng lại lời nhắc cho đầu vào và đầu ra và bí danh, bạn có thể tránh cuộc gọi tách bằng cách tách riêng các đầu vào. Tôi nghĩ rằng nên lưu một vài nhân vật.
Ingo Bürk

Ngoài ra tôi chỉ có trên điện thoại của tôi ngay bây giờ nhưng tại sao M lại phức tạp như vậy? Nó sẽ không hoạt động để sử dụng M=w=>[...a].indexOf(w)? Thật không may, tôi không thể kiểm tra nó ngay bây giờ.
Ingo Bürk

@ IngoBürk w là một từ, không phải là một nhân vật. M thay thế mỗi ký tự trong w bằng vị trí của nó trong a.
edc65

0

Clojure, 115 byte

#(apply str(butlast(interleave(sort-by(fn[w](apply str(map(zipmap(sort %2)%2)w)))(re-seq #"[a-z]+"%))(repeat \,))))

Ồ, điều này bắt đầu rất tốt với (sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))nhưng sau đó tôi nhận ra rằng veckhông được sắp xếp giống như các chuỗi và việc xen kẽ các dấu phẩy đó cũng cần một lượng mã đáng kể.

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.