정수를 알파벳순으로


19

정수를 알파벳순으로

주어진 숫자 집합에 대해 철자가 표시 될 때 알파벳 순서로 나열하십시오 (예 : 1 : 1, 2 : 2, 90 : 90, 19 : 19). 코드가 범위에서 작동해야합니다 [-999999, 999999]. 출력은 숫자 사이에 구분 기호가 있어야합니다. 아래 예에 표시된 것처럼 공백과 쉼표와 마찬가지로 공백이 작동합니다. 입력은 정수 배열, 구분 된 숫자의 문자열 또는 적합하다고 볼 수 있습니다. 모든 정수는 고유 한 것으로 가정합니다.

이 문제를 해결하기 위해 숫자는 하이픈으로 표시되지 않으며 다른 문자 앞에 공백이 사전 순으로 표시됩니다. 음수는 단어를 사용하여 표현 된 것으로 가정합니다 minus. 예를 들어, four선행 four thousand하고 숫자 -40는 문자열을 사용하여 정렬됩니다 minus forty. 모든 숫자는 숫자 단어로만 구성되고 연결은 없다고 가정합니다 (예 : two thousand forty two대신에 사용 two thousand and forty two).


테스트 사례

단일 숫자 정수 :

입력:

1, 2, 3, 4, 5

산출:

5, 4, 1, 3, 2

여러 자리 정수 :

입력:

-1002, 5, 435012, 4, 23, 81, 82

산출:

81, 82, 5, 4, 435012, -1002, 23

단어 사이에 공백이 있고 하이픈, 쉼표 또는 "and"는 없습니다.

입력:

6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804

산출:

6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204

이것은 이므로 바이트 수가 가장 적은 코드가 이깁니다. 허점은 허용되지 않습니다!


다음은 관련 샌드 박스 게시물에 대한 링크 입니다.
wubs

입력에 하나 이상의 정수가 포함됩니까?
ETHproductions

@ETHproductions 아니요, 그렇지 않습니다. 질문에 지정하겠습니다.
wubs

8
PPCG에 오신 것을 환영합니다. 멋진 아바타. : D 좋은 첫 질문입니다.
AdmBorkBork

@TimmyD 감사합니다! 여기에서 가능한 모든 것을 PowerShell에 기대하고 있습니다.
wubs

답변:


5

자바 스크립트 (ES6), 189 179 186 바이트

let f =

a=>a.sort((x,y)=>!x-!y||(X=q(x),Y=q(y),X>Y)-(X<Y),q=n=>n<0?"L"+q(-n):n>999?q(n/1e3)+"Z"+q(n%1e3):n>99?q(n/100)+"K"+q(n%100):n>19?"  cYHFVSCO"[n/10|0]+q(n%10):"0PdaIGTQAMWDbXJEURBN"[n|0])

let g = a => console.log(`[${f(a)}]`)

g([1,2,3,4,5])
g([-1002,5,435012,4,23,81,82])
g([0,1000,1100])
<input id=I value="1 2 3 4 5"><button onclick="g(I.value.match(/\d+/g)||[])">Run</button>

기본 아이디어는 각 입력 숫자를 다른 모든 숫자 문자열 쌍과 비교하여 올바른 사전 위치에있는 짧은 문자열로 변환하는 것입니다. 사용 된 사전은 다음과 같습니다. (스 니펫을 실행하지 마십시오. 긴 목록을 숨기는 데 사용됩니다.)

이것은 각 숫자를 사 전적으로 정확한 위치에 매핑하는 매우 간결한 방법을 만듭니다. 이것이 재귀 q함수의 기능입니다.

q(-X)        => "L" + q(X)
q(XYYY)      => q(X) + "Z" + q(YYY)
q(XYY)       => q(X) + "K" + q(YY)
q(XY >= 20)` => "  cYHFVSCO"[X] + q(Y)
q(X)         => "0PdaIGTQAMWDbXJEURBN"[X]

0문자열의 시작 부분에서 100 (즉, 예를 보장하는 것입니다 one hundred,에 변환을 PK0하기 전에 정렬됩니다) 101( one hundred one로 변환 PKP). 이것은 zero배열의 앞면에 0 ( )이 정렬 되는 이상한 시나리오를 만들어 냅니다.이를 해결하기 위해 정렬 기능에서 먼저 오른쪽으로 0을 정렬합니다 !x-!y||(....


작동하지 않는 것 같습니다 [1100, 1000]. 출력이 될 것으로 예상 1000 (one thousand), 1100 (one thousand one hundred)하지만 출력은 입력과 동일한 순서입니다.
우유

@milk Hmm ... 왜 이런 일이 발생하는지 잘 모르겠지만 조사해 보겠습니다.
ETHproductions

@milk Ah 1000는 다음과 같이 구문 분석됩니다 one thousand zero. 이 문제를 잠시 해결하겠습니다. 0그래도 스스로 지원해야 합니까? 내 코드에 15 바이트 정도를 추가하는 독특한 경우입니다.
ETHproductions

11

7 알리 214 201 118 바이트

Inform 7 은 골프에있어 절대적으로 끔찍한 언어이므로 여기에 기회를주고 싶었습니다.

들여 쓰기는 탭 ( \t) 문자를 사용해야 하지만 HTML은 그 문자를 좋아하지 않습니다. 반대로, Inform은 들여 쓰기를위한 공백을 좋아하지 않으므로 테스트를 위해 여기에서 코드를 복사하여 붙여 넣으면 공백을 탭으로 바꿔야합니다. 또는 마크 다운 소스에서 복사하여 붙여 넣기 만하면됩니다.

골프 :

X로 :
    표 1을 반복하십시오.
        이제 Q 항목은 "[R 항목 단어]";
    Q 순서로 표 1을 정렬하십시오.
    "[표 1의 R]"이라고 말합니다.

입력은 다음과 같이 정보 테이블이어야합니다 ( \t열 사이).

1 번 테이블
R (숫자) Q (텍스트)
-1002
5
435012
4
23
81
82

산출:

81, 82, 5, 4, 435012, -1002, 23

이 함수는 테이블을 한 번 실행하여 새 열에 각 숫자의 텍스트 표현을 추가합니다. 그런 다음 텍스트 열에 따라 테이블 행을 정렬합니다. Inform에서 문자열은 사전 식으로 정렬됩니다. 마지막으로 원본 열을 새로운 순서로 인쇄합니다. 편리하게도 테이블 열을 인쇄하기 위해 Inform 7의 "조잡하지만 때로는 유용한" 형식은 요청한대로 쉼표로 구분됩니다.

기능을 호출하는 방법을 보여주는 상용구가있는 언 골프 드 :

알파벳 순서로 숫자를 인쇄하려면 :
    정렬 가능한 숫자 표를 반복하십시오.
        이제 이름 항목은 "[색인 항목 (단어)]"입니다.
    정렬 가능한 숫자 표를 이름 순서대로 정렬하십시오.
    "[정렬 가능한 숫자 표의 색인 열]"이라고 말합니다.

정렬 가능한 숫자 표
색인 (번호) 이름 (텍스트)
-1002
5
435012
4
23
81
82

방이 있습니다.
재생이 시작될 때 : 알파벳 순서로 숫자를 인쇄하십시오.

1
나는 이것으로 약간 혼란 스럽다. 인가 words에 내장 된 번호의 철자 버전의 참조가 7 알린다?
Pavel

1
@Pavel 참으로! "(숫자)"는 숫자를 텍스트로 표현한 문자열을 반환합니다. 음수에는 "빼기"를 사용하는 것이 편리하고 단어 사이에 하이픈을 넣는 동안 모든 문자 앞에 하이픈을 일관되게 알파벳순으로 표시합니다 (따라서 최종 결과는 동일 함).
Draconis

2
언어 선택 +1 확인해야하지만 골프 기회가 남아있을 것 같습니다. 예를 들어 파서는 실제로 모든 "the"기사를 필요로합니까? OP에 문의해야하지만 "및"가 유효한 구분 기호가 아닌 분명한 이유는 없습니다. 그렇지 않은 경우에도 단일 공간이 명시 적으로 허용되므로 say "[R entry] "충분합니다.
Ilmari Karonen

마지막에 "and"는 괜찮습니다. 구분 기호가 균일해야한다고 말하지 않았으므로 완벽하게 받아 들일 수있는 대답입니다. 내가 가장 흥미로운 답변에 대한 포인트를 줄 수 있다면, 나는 그것을 당신에게 줄 것입니다. 나는 골프를하면서도이 언어의 가독성을 정말 좋아합니다. 좋은 작업!
wubs

나는 마침내 Inform7과 약간의 게임을 할 기회를 얻었고 엔트리를 118 바이트로 다시 골라 낼 수있었습니다. 주석에 정보 코드를 게시하는 것은 잘 작동하지 않으므로 계속 진행하여 답변에 직접 편집했습니다. 마음에 들지 않기를 바랍니다. 원할 경우 원하는 방식으로 편집 내용을 되돌 리거나 조정할 수 있습니다.
Ilmari Karonen

4

수학, 67 바이트

SortBy[#,#~IntegerName~"Words"~StringReplace~{","->"","-"->""}&]&

명명되지 않은 함수는 인수로 정수 목록을 가져 와서 정수 목록을 값으로 리턴합니다. #~IntegerName~"Words"정수는 영어로 이름을 변경하는 내장입니다. IntegerName때로는 출력에 쉼표와 하이픈이 있으므로 StringReplace호출에서 제거됩니다. (하이픈은 실제로 UTF-8의 3 바이트 문자 인 8208입니다.) 그런 다음 SortBy수정 된 정수 이름 값에 따라 알파벳순으로 원래 목록을 정렬합니다.

좋은 우연의 일치 : 출력 대신에 IntegerName사용 하지만 허용되는 숫자의 이름에 나타나는 단어는 두 단어 사이에 알파벳순으로 표시되지 않으므로 대체 할 필요가 없습니다!negativeminus

(나를 상기시키기 위해 ngenisis에 대한 팁이 Sortby있습니다.)


명성! 나는이 솔루션을 얻는 것에 매우 가까워졌지만 그 대시는 나에게 두통을 주었다!
ngenisis

귀하의 답변이 실제로 올바른 하이픈을 사용합니까? 여기에있는 것을 Mathematica에 복사하면의 하이픈을 대체하지 않습니다 IntegerName. Wolfram 문서에 따르면 유니 코드 문자 2010이라고 합니다.
ngenisis

아마도 그렇지 않을 것입니다.이 답변에서 올바른 하이픈을 얻으려고했지만 성공하지 못한 것 같습니다.
Greg Martin

나는 당신의 답을 반으로 삭감했습니다.)
J. Antonio Perez

그리고 일부는 ... 문자열을 불필요하게 수정합니다.
J. Antonio Perez

4

배쉬 + GNU 유틸리티 + bsdgames, 52

  • @izabera 덕분에 4 바이트가 절약되었습니다.
sed 's/.*/echo `echo &|number`:&/e'|sort|sed s/.*://

I / O는 줄 바꿈으로 구분 된 줄입니다.

  • 첫 번째 sed 표현식은 각 숫자를 bsdgamesnumber 유틸리티에서 제공 한 숫자 형식의 단어를 출력하는 쉘 명령으로 대체 한 :다음 숫자의 숫자 형식을 대체 합니다 .
  • 그런 다음 sorted입니다.
  • 그런 다음 두 번째 sed문자는을 포함하여 앞의 문자를 제거 :하고 숫자 형식은 필요에 따라 정렬합니다.

number"빼기"를 올바르게 처리하고 출력은 sort필요한대로 작동 하는 특정 형식에 충분히 가깝습니다 . "fourty four"대신 "fourtyfour"를 출력하지만 정렬 관점에서는 중요하지 않습니다.

bsdgames 패키지는 설치가 필요할 수 있습니다 :

sudo apt-get install bsdgames

sedsort유틸리티는 배포판에 이미 거의 확실하다.


-t:쓸모없는 당신은 사용할 수 있습니다number<<<&
izabera

@izabera 그렇습니다. 고마워요 -t:. 그러나 sed의 eval 기능은을 사용하여 명령을 실행 sh하므로 bash 기능 <<<은 작동하지 않습니다.
디지털 외상

P : 그것은 오래 당신의 쉬 bash는만큼 잘 작동
izabera가

@izabera Nope-bash가 시작되면 shPosix sh를 가능한 한 많이 모방하려고 시도 하면 bashism과 같은 bashism <<<이 해제됩니다. GNU sede발 기능과 명령을 시작 /bin/sh -c ...하지 /bin/bash -c .... 이것을 시도 했습니까?
Digital Trauma

bash <<<는 posix 모드에서도 켜지지 않습니다.
izabera 0시 13 분

1

파이썬 + 활용, 97 91 89 바이트

from inflect import*
a={x:engine().number_to_words(x)for x in words}
sorted(a,key=a.get)

inflect라이브러리를 사용하여 words정수 배열을 음성 / 문자열 표현으로 변환했습니다 . 키가 숫자 표현이고 값이 문자열 표현 인 k / v 쌍의 사전에 저장됩니다. 키 목록을 값별로 정렬하여 반환했습니다.

편집 : ETHproductions와 Alex.S 덕분에 5 바이트와 3 바이트를 절약했습니다!


PPCG에 오신 것을 환영합니다! 당신은 공백제거하여 이것을 골프 수 있습니다 ; 예를 들어 두 번째 줄은입니다 a={x:inflect.engine().number_to_words(x)for x in words}.
ETHproductions

두 번째 줄을 사용 from inflect import*하여 버리고 두 바이트를 절약 할 수 있습니다 inflect..
Alex.S

아아, 이것도 목록 40, 44, 40000, 40804, 40004, 40204 (정확히 정렬해야 함)를 올바르게 정렬하지 못하는 것처럼 보입니다.
Ilmari Karonen

0

Mathematica, 30 바이트

아래의 답변은 정수 목록을 입력으로 받아 알파벳 이름으로 정렬하는 순수한 함수를 출력합니다. 의사가 주문한 것;)

SortBy[#~IntegerName~"Words"&]

ungolfed 버전은 다음과 같습니다.

SortBy[IntegerName[#, "Words"]&]

다음은 사용법 예입니다.

SortBy[#~IntegerName~"Words"&][{0,1,2,3,4,5,6,7,8,9,10}]

어느 것으로도 쓸 수 있습니다

SortBy[#~IntegerName~"Words"&]@{0,1,2,3,4,5,6,7,8,9,10}

그들은 동일한 출력을 생성 - 티카에 f[x]에 equivilant이다 f@x.

Outputs: {8, 5, 4, 9, 1, 7, 6, 10, 3, 2}

다른 사용자가 Mathematica에 게시 한 답변이 훨씬 더 길었습니다. 이 답변은 수학이 숫자를 알펜 화하는 방법과 OP가 명시한 숫자가 알펜 화되는 방법을 더 잘 준수하는 방법 사이의 약간의 차이점을 수정하려고 시도하지만, 수정 된 것은 정렬 순서에 영향을 미치지 않으며 내 답변은 결과와 동일합니다.

MyF = SortBy[#~IntegerName~"Words"&];
TheirF = SortBy[#, #~IntegerName~"Words"~ StringReplace~{"," -> "", "-" -> ""} &] &;
MyF[Range[-999999, 999999]] == TheirF[Range[-999999, 999999]]
(*Outputs True*)

대단한 조사! — 불행히도 그들은 실제로 같은 명령을 내리지 않습니다. TheirF880,000 전에 888을 올바르게 정렬하지만 MyF그렇지 않습니다. 아마도 문제는 이상한 하이픈을 복사하여 붙여 넣는 TheirF것입니다. 실제 버전은 이상한 3 바이트 유니 코드 하이픈을 대체하지만 실제 하이픈은 (아무 것도없는) 하이픈을 대체합니다. (쉼표를 제거해야하는지 여부는 여전히 흥미로울 것입니다.)
Greg Martin

Range [999999]에서 테스트했습니다. 쉼표를 제거 할 필요는 없지만 "[Hyphen]"을 ""로 바꾸어야합니다.
ngenisis

0

공통 리스프, 113 바이트

외부 라이브러리가 필요하지 않습니다.

(print(mapcar #'cdr(sort(loop for i in x collect(cons(format()"~r"i)i))(lambda(y z)(string-lessp(car y)(car z))))))

출력 경우 x입니다 '(1 2 3 4 5):

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