PronunciationSort ™


24

우리는 모두 다른 멋진 정렬 알고리즘을 알고 있지만, 발음하기 쉬운 방식으로 숫자를 제공하지는 않습니다. 이를 해결하기 위해 숫자 목록을 정렬하는 가장 자연스러운 방법 인 PronunciationSort ™를 사용하는 것이 좋습니다.

발음

숫자를 발음하는 공식 규칙 (이 문제에서)은 숫자가 하나씩 발음되고 결과 문자열이 사전 순서대로 정렬됩니다. 예를 들어, 이것은 숫자 845가 발음 "eight four five"되고 그에 따라 정렬되어야 함을 의미합니다 .

음수

음수는 단어 앞에 붙임으로써 발음됩니다 "minus". 따라서 -23로 발음됩니다 "minus two three". 이로 인해 4(4)와 9(9)로 시작하는 숫자 사이에서 출력 중간에 음수가 종료됩니다 .

GuideSort ™의 공식 단어 순서는 다음과 같습니다.

  • 여덟
  • 다섯
  • 마이너스
  • 아홉
  • 하나
  • 일곱
  • 제로

그건,

8, 5, 4, -, 9, 1, 7, 6, 3, 2, 0

입력

최대 100 개의 요소를 포함하는 범위의 정수 목록입니다 . 문자열 목록으로 입력 할 수 없습니다. 언어가 목록으로 입력을 지원하지 않으면 입력을 별도의 정수로 제공 할 수 있습니다.[999,999]

입력에 유효하지 않은 숫자 또는 0으로 시작하는 숫자가 포함되지 않습니다 (숫자 0 자체 제외). 입력은 일반적으로 정렬되지 않으며 임의의 순서로 제공 될 수 있습니다.

산출

PronunciationSort ™ 순서의 동일한 정수. 정렬을 위해서는 숫자를 발음으로 만 변환해야하며 출력에는 문자열이 포함되어서는 안됩니다.

예를 들어, 중간 단계 (괄호로 묶음)는 가이드 역할 만하며 출력의 일부가 아닙니다.

[1, 2, 3] -> (['one', 'two', 'three']) -> [1, 3, 2]
[-1, 0, 1, 2] -> (['minus one', 'zero', 'one', 'two']) -> [-1, 1, 2, 0]
[-100, 45, 96] -> (['minus one zero zero', 'four five', 'nine six']) -> [45, -100, 96]
[11, 12, 13, 134, 135] -> (['one one', 'one two', 'one three', 'one three four', 'one three five']) -> [11, 13, 135, 134, 12]

결과를 확인 하는 스크립트 도 있습니다 .


5
왜 "하나"( "원"으로 발음)가 2와 0 이전에 오지 않습니까?
벤 밀러-복원 모니카

3
@BenMiller 샌드 박스에 댓글을 남긴 사람이라면 기억이 나지 않지만 그 의견은 deja vu를주었습니다. 여기에 대답하기 위해, 나는 그것을 고려했지만, 철자 토론을 피하기 위해 철자와 함께 갔다 (예 : "2"대 "너무", "원"또는 "완")
maxb

17
실제로 더 "발음에 정렬":-)보다 "일종의 철자"그래서
파울로 Ebermann

3
부머. 나는 그들이 발음 하기 가 얼마나 어려운지에 따라 분류되기를 바랐다
.

2
여기에서 정렬하는 것은 발음과 거의 관련 이 없으므로이 문제는 실제로 이름을 바꿔야합니다 . 발음 기반 인 경우 엄청나게 더 복잡 할 것입니다 (예를 들어, diphthong ⟨aɪ⟩ 전에 monophthong ⟨ɔː⟩을 정렬하면 45 보다 앞에 올 수 있지만 o 전에 a-derived ⟨a⟩를 정렬하면 45 보다 앞에 올 수 있습니다) -유도 된 ⟨ɔ⟩ – 내 지식으로는 발음에 대한 확립 된 정렬 순서가 없으며 IPA 나 다른 체계도 없다).
Janus Bahs Jacquet

답변:


8

05AB1E (레거시) , 15 바이트

Σε•Koéa₃•'-3ǝsk

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

설명

Σ                 # sort by
 ε                # apply to each
             sk   # index of the element in
  •Koéa₃•         # "85409176320"
         '-3ǝ     # with "-" inserted at index 3

압축 된 정수에 버그가있는 것 같습니다 •ĆU‘•. 어떤 이유로 든 맵핑 / 정렬 중에 개행을 추가합니다. Σ•ĆU‘•"54-ÿ"sSk그 이상한 버그가 아니라면 내가 작업하고있는 15 바이트 대안 일 수있었습니다. •ĆU‘•리터럴로 변경 하면 9176320 정상적으로 작동합니다 ..
Kevin Cruijssen

1
@ KevinCruijssen : 이상합니다. 당신의 …54-ì짝수 는 14 일 것입니다
Emigna

@KevinCruijssen : 당신은 Σ•RT‹•Á…54-ìsSk15
Emigna를

•t∍ýJ•'-ìÁÁ작동합니다
Emigna


8

젤리 ,  15  13 바이트

ṾV€ị“Þ⁽3Z6»µÞ

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

정수 목록을 허용하는 정수 목록을 허용하는 모나드 링크.

방법?

-매직 문자열 "murgeon lix"의 1 기반 및 모듈 형 인덱스의 문자를 사용하여 문자열로 변환 된 정수의 자릿수 ( -1의 "숫자")의 서수 값을 기준으로 정렬합니다 .

공백이 문자보다 작을 경우 정렬은 사실상 알파벳 순서입니다.

압축에 사용 된 Jelly의 사전을 검사하여 "murgeon lix"라는 마법 문자열을 찾았습니다. 요구 사항을 충족시키는 11 글자의 단어는 없습니다 (중복 제거시에는 더 이상 단어가 없습니다). 공백이 문자보다 먼저 정렬되므로 다음으로 가장 눈에 띄는 선택은 길이가 7 인 단어 뒤에 공백이 있고 길이가 3 인 단어입니다. "murgeon"과 "lix"는 유일하게 만족스러운 조합이지만 다른 공간도 없을 수 있습니다 (예 : “£Py:ƥ»동일한 바이트 수에 대해 작동하는 "murgeonalix")

ṾV€ị“Þ⁽3Z6»µÞ - Link: list of integers
            Þ - sort by:
           µ  -   the monadic link: -- i.e. do this for each integer, then sort by that
Ṿ             -     unevaluate  (e.g. -803 -> ['-','8','0','3'])
 V€           -     evaluate each as Jelly code  (e.g. ['-','8','0','3'] -> [-1,8,0,3])
    “Þ⁽3Z6»   -     "murgeon lix" (compression of words in Jelly's dictionary plus a space)
   ị          -     index into (1-indexed & modular) (e.g. [-1,8,0,3] -> "i xr")

이전 @ 15 바이트 :

ṾV€ị“¡Zo⁶’Œ?¤µÞ

여기 “¡Zo⁶’Œ?¤에서 숫자의 모든 순열이 사전 식으로 정렬 될 때 인덱스 21,340,635에있는 자연수의 첫 순열을 찾습니다 [6,10,9,3,2,8,7,1,5,4,11]. ( “¡Zo⁶’21340635의 기본 250 표현이며 Œ?계산을 수행하고 ¤이러한 명령을 그룹화합니다)


설명이 있어도 나는 영리하지 않습니다. 멋진 해결책!
maxb

더 짧은 버전은 아마 이해하기 더 쉽습니다!
Jonathan Allan


6

자바 스크립트 (SpiderMonkey) , 69 바이트

a=>a.sort((a,b)=>(g=n=>[...n+''].map(c=>':598217604'[c]||3))(a)>g(b))

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


+''입력을 문자열 배열로 가져 오는 것처럼 보이는을 제거 할 수있는 것처럼 보입니다 .
얽히고 설킨

@ Shaggy 더 이상 문자열을 사용하지 않습니다. 여기에서 허용되는지 확실하지 않습니다.
Arnauld

아 ... 네 말이 맞아. 내 솔루션에 몇 바이트를 추가 할 것입니다.
얽히고 설킨


6

파이썬 3, 68 바이트 67 바이트 64 바이트

lambda x:sorted(x,key=lambda y:[*map('54-9176320'.find,str(y))])

sorted익명 람다와 함께 내장 함수를 키에 사용합니다. 정렬 순서를 하드 코딩하고 입력 목록의 각 값에있는 각 숫자를 정렬 순서 목록의 위치와 비교하십시오.

편집 : 매개 변수를 찾을 수없는 경우 반환 8을 활용하기 위해 정렬 목록에서 제거하여 1 바이트를 저장했습니다 . maxb에게 감사합니다.str.find-1

Edit2 : 생성자 list대신 리터럴로 별표 포장 풀기 구문을 사용하여 3 바이트 절약list

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


1
문자열에서 처음 8 개를 제거 할 수 있습니까? 부분 문자열을 찾지 못하면 Python은 -1을 반환합니다.
maxb

@maxb 잘 잡습니다. 편집했습니다.
mypetlion


5

Pyth, 17 16 바이트

oxL"54-9176320"`

여기 에서 온라인으로 시도 하거나 모든 테스트 사례를 한 번에 확인 하십시오 .

oxL"54-9176320"`NQ   Implicit: Q=eval(input())
                     Trailing N, Q inferred
o                Q   Order the elements of Q, as N, using...
               `N      Convert N to string
 xL                    Get the index of each character of that string...
   "54-9176320"        ... in the lookup ordering
                       (if character missing, returns -1, so 8 is still sorted before 5)

사전 문자열의 시작 부분에서 8을 생략 하여 @ngn과 K answer 덕분에 1 바이트를 절약 했습니다.


4

apt, 19 바이트

ñ_s ®n"54-9176320

시도 해봐


좋은 해결책! 불행히도 문자열 목록으로 입력 할 수 없습니다.
maxb

당신은 악용하여 일부를 저장할 수 있습니다 S.n(s): ñ_s ®n"54-9176320(분명히 S.n(s)정확히 동일하다 s.b(S)을위한 S길이가 1, 그것은 반환을 제외하고 0대신에 -1)
ETHproductions

멋진 트릭, @ETHproductions, 고마워요 :) 나는 미래를 위해 그것을 기억해야 할 것입니다.
얽히고 설킨

3

레티 나 0.8.2 , 36 바이트

T`-d`3:598217604
O`
T`3:598217604`-d

온라인으로 사용해보십시오! 링크에는 테스트 스위트가 포함되어 있습니다. 설명:

T`-d`3:598217604

:10 번째 위치를 사용하여 빼기 부호와 숫자를 발음 순서대로 해당 위치로 변환합니다 .

O`

발음 순서대로 정렬하십시오.

T`3:598217604`-d

순서를 원래 빼기 부호와 숫자로 다시 변환하십시오.



3

R , 58 바이트

function(x)x[order(mapply(chartr,"-0-9","dkfjicbhgae",x))]

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

입력은를 사용하여 암시 적으로 문자열로 변환되는 숫자 목록입니다 chartr. order그런 다음 사전 순서를 사용하여 원본 목록을 정렬해야하는 순서를 검색합니다.


3

자바 (JDK 10) 123 바이트

l->l.sort(java.util.Comparator.comparing(n->{var r="";for(var c:(""+n).split(""))r+=11+"54-9176320".indexOf(c);return r;}))

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

이것은 순진한 Java 구현입니다. 골프를 많이 타야합니다.

크레딧


1
.chars-IntStream 및 .reduce일반 루프로 변경 하면 2 바이트가 절약됩니다 n->{var r="";for(var c:(""+n).split(""))r+=10+"854-9176320".indexOf(c);return r;}. 또한 for 숫자 는 -1이 되므로 로 변경 10+"85하여 하나 이상의 바이트를 저장할 수 있습니다 . 온라인으로 시도 123 바이트20+"5.indexOf8
케빈 Cruijssen


2

빨강 , 114 바이트

func[n][g: func[a][collect[foreach c form a[keep index? find"854-9176320"c]]]sort/compare n func[x y][(g x)< g y]]

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

더 읽기 쉬운 :

f: func [ n ] [
    g: func [ a ] [
        collect [ 
            foreach c form a [ 
                keep index? find "854-9176320" c
            ]
        ]
    ]
    sort/compare n func [ x y ] [ (g x) < g y ]
]

2

C ++, 353 바이트

이것은 일종의 코미디 작품이지만 시간을 낭비하고 썼기 때문에 게시 할 수 없습니다 ... 처글을 즐기고 누락 된 공간 절약기가 있는지 알려주십시오!

#include<algorithm>
#include<iostream>
#include<iterator>
#include<numeric>
#include<string>
using namespace std;auto f(int i){auto s=to_string(i);for(auto&c:s)c='A'+"854-9176320"s.find(c);return s;}int main(){int a[100];auto b=begin(a);auto e=end(a);iota(b,e,-50);sort(b,e,[](int l,int r){return f(l)<f(r);});copy(b,e,ostream_iterator<int>(cout," "));}

산출:

8 48 48 45 44 49 41 47 46 43 42 40-8-5-5-50-4-4-45-44-49-41-47-46-43-42-40-9-91-118-15- 14-19-11-11-16-16-13-12-12-10-7-6-6-38-35-34-39-31-37-36-33-32-30-30-28-25-25-24- 29-21-27-26-23-22-2011 18 15 14 19 11 17 16 13 12 10 7 6 3 38 35 34 39 31 37 36 33 32 30 2 28 25 24 29 21 27 26 23 22 20 0


"엔터를 누르지 않으면 디버그 할 줄이 더 적습니다."라는 모토로 살아가는 것을 알 수 있습니다.
maxb

1
이 언어로 난폭 한 공백을 감당할 수 없습니다! 나머지 시간으로 보아서 다른 사람들의 코드를 여는 것만 큼 화를내는 일이 거의 없다는 것은 재밌습니다. 줄 바꿈마다 입력합니다.
underscore_d

1
안녕하세요! 에 솔루션을 압착 195 개 문자
최대 Yekhlakov

@MaxYekhlakov Cool, 숙고 해 주셔서 감사합니다! 조금 더 읽은 후에 깨달았습니다. 필연적으로 전체 컴파일 가능한 프로그램을 제공 할 필요는 없지만 지정된 입력 및 출력을 처리하는 함수 만 제공해야합니다. 도!
underscore_d

2

Mathematica, 68 바이트

SortBy[If[# < 0,"m ",""]<>StringRiffle@IntegerName@IntegerDigits@#&]

기능. 정수 목록을 입력으로 취하고 정렬 된 목록을 출력으로 리턴합니다. 로 각 숫자의 숫자를 구분하고 IntegerDigits로 각 숫자를 "zero", "one"등으로 IntegerName변환하고 with 를 사용하여 목록을 공백으로 구분 된 문자열로 변환 하고 숫자가 음수 인 경우 StringRiffle앞에 추가 "m "하고이 문자열을 기준으로 정렬합니다. 실제로 Mathematica는 기본적으로 같은 길이의 목록에 대해 사전 식 정렬 만 사용하기 때문에 내가 찾은 가장 짧은 방법이었습니다. 따라서 854-9176320문자열 함수가 너무 비싸기 때문에 기반으로 한 접근 방식으로 더 많은 바이트를 사용합니다.


항상 수학을 신뢰하여 내장 된 조합을 갖습니다. 영리한 솔루션!
maxb

1

05AB1E , 15 14 바이트

Σ•ĆU‘•…54-ìsSk

@Emigna 덕분에 -1 바이트 .

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

Σ                 # Sort by:
 •ĆU‘•            #  Push the compressed integer 9176320
      54-        #  Push the string "54-"
          ì       #  Prepend this string before the integer: "54-9176320"
           s      #  Swap so the current number to sort is at the top of the stack
            S     #  Convert it to a list of characters
             k    #  Check for each its index in the string (resulting in -1 for '8')

내 (섹션이 05AB1E 팁을 참조하십시오 어떻게 큰 정수를 압축하는 이유를 이해하는 방법) •ĆU‘•입니다 9176320.

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