맞춤 알파벳순으로 정렬


9

문제는 단어 목록을 정렬하는 프로그램을 만드는 것입니다. 단어가 임의의 주어진 알파벳 순서로되어 있어야합니다.

프로그램은 쉼표로 구분 된 문자열과 새로운 알파벳을 허용합니다.
프로그램은 새로운 정렬 순서로 모든 단어를 동일한 방식으로 출력합니다.

예:

입력:

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

산출:

cat,green,home,network,egg,oval

이것은 우승자는 가장 짧은 프로그램을 가진 사람입니다.

이것은 나의 첫 번째 도전이므로 질문 / 도전에 대한 개선점은 높이 평가됩니다.


1. 나는 당신의 예에서 알파벳이 단어들과 공백으로 분리 될 것이라고 생각합니다. 그 맞습니까? 2. 단어는 항상 소문자입니까?
Dennis


1
그건 실수 야 편집하겠습니다.
Mathetic

+1 OK 질문 (첫 번째 시도 ;-)). 그러나 제목의 관련성을 보지 못합니다. 제목 Sort by custom alphabet이나 더 창의적인 이름으로 바꿀 수 있습니까?
Digital Trauma

@DigitalTrauma 그래, 더 나을지도 모른다. 나는 단어들과 조금 놀아 보았습니다. 나는 ascii와 utf-8 등에 대한 참조를 목표로했습니다. 그러나 그것은 실패했다. 나는 당신의 제안으로 바꿨습니다.
Mathetic

답변:


2

CJam, 26 19 17 바이트

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

온라인으로 사용해보십시오.

테스트 사례

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

작동 원리

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.                      ";

글쎄, 당신도 같은 접근 방식을 사용했기 때문에, 지금은 실제로 이해가되지 않습니다.
Optimizer

@Optimizer : 당신은 8 초나 나를 때렸습니다. 답변을 삭제 취소하면 다시 롤백합니다.
Dennis

아니요, 사소하고 매우 명백한 변화라고 생각합니다. 첫 번째 장소에 답변을 게시하기 전에 업데이트 내용을 살펴
Optimizer

4

Bash + coreutils, 37 바이트

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

산출:

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

1
쉼표를 다루는 좋은 방법!
Dennis

2

Pyth , 19 자

j\,o_mx_zdNchczd\,

테스트:

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

설명:

                            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(",")

본질적으로 문자열의 문자 색인 목록 키를 사용하여 청크를 정렬 한 다음 쉼표로 조인합니다. 반전 사업은 현을 다시 나누는 것보다 짧습니다.


18 바이트 :j\,_omx_zdNchczd\,
Dennis

@Dennis는 매우 영리합니다. 감사합니다.
isaacg

1

루비, 53 50 바이트

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

정렬하기 전에 Ruby를 사용 tr하여 사용자 정의 알파벳을 a-z바꿉니다. 입력은 명령 행 인수를 통해 이루어집니다.


$><<화면에 인쇄하는 데 사용하면 바이트 를 줄일 수 있습니다 (공간을 제거 할 수 있음). 당신은 할당하여 다른 2 바이트를 면도 할 수 있습니다 $*:과 같이 변수 a,b=$*와 사용하는 #sort_by대신 #sort_by!.
britishtea

트윗 담아 가기 나는 내가 필요할 것이라고 생각 *$*했다 (처음에는 가지고 있었고 길이는 동일 함).
Martin Ender

0

파이썬, 131

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

개선의 여지가 충분해야합니다.


정렬 기능으로 키를 사용할 필요는 없습니다 a.find(c). 직접 목록을 사용하십시오 .
isaacg

0

자바 스크립트 (E6) 102119

변수 'a'의 알파벳을 기준으로 매핑 기능 'M'으로 정렬
팝업을 사용하는 IO (프롬프트 + 경고)

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)))

문자열 매개 변수가 1 인 (테스트 가능) 함수로서, 문자열 배열을 리턴 함 (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))
)

FireFox / FireBug 콘솔에서 테스트

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

산출

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

1
정렬 기능을 다음과 같이 (M(a)>M(b))-(M(a)<M(b))
바꾸면

@DocMax 아주 좋은. 그것보다 훨씬 더 간단하다는 것이 밝혀졌습니다 ( stackoverflow.com/a/7232172/3640407 )
edc65

입력 및 출력 및 별명에 대한 프롬프트를 재사용하면 입력을 별도로 취함으로써 스플릿 호출을 피할 수 있습니다. 나는 그것이 몇 개의 문자를 저장해야한다고 생각합니다.
Ingo Bürk

또한 지금은 휴대 전화에만 있지만 M이 왜 그렇게 복잡한가요? 사용하지 M=w=>[...a].indexOf(w)않습니까? 안타깝게도 지금은 테스트 할 수 없습니다.
Ingo Bürk

@ IngoBürk w는 문자가 아닌 단어입니다. M은 w의 각 문자를 a의 위치로 바꿉니다.
edc65

0

클로저, 115 바이트

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

와우, 이것은 잘 시작 (sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))되었지만 vec문자열과 같은 방식으로 정렬되지 않으며 쉼표를 인터리빙하는 데 많은 양의 코드가 필요 하다는 것을 알았습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.