철자가 표시된 일련 번호 정렬


17

둘 이상의 길이가 같은 철자 일련 번호가 둘 이상인 경우 (예 :

[[ "three" , "one"  , "four"  ],
 [ "one"   , "five" , "nine"  ],
 [ "two"   , "six"  , "five"  ],
 [ "three" , "five" , "eight" ]]

단어가 나타내는 숫자로 목록을 정렬하십시오.

[[ "one"   , "five" , "nine"  ],
 [ "two"   , "six"  , "five"  ],
 [ "three" , "one"  , "four"  ],
 [ "three" , "five" , "eight" ]]

숫자를 소문자 나 대문자로 표기해야하지만 대소 문자를 혼합하지 않아야합니다.

테스트 사례

[["three","one","four"],["one","five","nine"],["two","six","five"],["three","five","eight"]]
준다
[["one","five","nine"],["two","six","five"],["three","one","four"],["three","five","eight"]]

[["two","seven"],["one","eight"],["two","eight"],["one","eight"],["two","eight"],["four","five"]]
준다
[["one","eight"],["one","eight"],["two","seven"],["two","eight"],["two","eight"],["four","five"]]

[["one","four","one","four","two"],["one","three","five","six","two"],["three","seven","three","zero","nine"]]
준다
[["one","three","five","six","two"],["one","four","one","four","two"],["three","seven","three","zero","nine"]]

[["zero","six","one"],["eight","zero","three"],["three","nine","eight"],["eight","seven","four"],["nine","eight","nine"],["four","eight","four"]]
준다
[["zero","six","one"],["three","nine","eight"],["four","eight","four"],["eight","zero","three"],["eight","seven","four"],["nine","eight","nine"]]


내가 올바르게 얻었는지 확실하지 ["three","one","four"] === 314않습니까?
Nit

@Nit 예, 그렇습니다.
Adám

@Nit 숫자로 표시됩니다. 예를 들어 [314,159,265,358][159,265,314,358].
Adám

숫자의 임의의 대문자를 가정 할 수 있습니까?
dylnan

@dylnanYou may require the numbers to be spelled in lower or upper, but not mixed, case.
totallyhuman

답변:


14

껍질 , 9 8 바이트

Ö†€¨tfṡn

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

재귀의 Stax 답변에 의해 알고리즘에서 "영감을 얻었습니다" (방금 조회 문자열을 약간 변경했습니다), 그를 찬성하십시오!

트릭은 각 문자를 문자열의 위치에 매핑 tfsen하는 것입니다 (이 프로그램의 끝에서 압축 됨). Husks 목록은 1을 기반으로하며 누락 된 항목은 0을 반환하므로 다음과 같은 매핑을 얻습니다.

"one"        [0,5,4]
"two"        [1,0,0]
"three"      [1,0,0,4,4]
"four"       [2,0,0,0]
"five"       [2,0,0,4]
"six"        [3,0,0]
"seven"      [3,4,0,4,5]
"eight"      [4,0,0,0,1]
"nine"       [5,0,5,4]

보시다시피, 목록은 완벽하게 정렬되어 있습니다.


명확하게하기 위해 Husk (및 기타 여러 언어)에서 목록 비교가 작동하는 방식은 다음과 같습니다.

  1. 두 목록 중 하나가 비어 있으면 더 작은 것입니다.
  2. 두 목록의 첫 번째 요소가 다른 경우 첫 번째 요소가 작은 요소가 더 작은 목록입니다.
  3. 그렇지 않으면 두 목록에서 첫 번째 요소를 버리고 지점 1로 돌아갑니다.

내가 실수하지 않으면 "2"와 "3"을 비교하는 것만 유용하지만 이미 "h"를 가지고 있기 때문에 "w"도 삭제할 수 있습니다. 그것이 도움이되는지 확실하지 않습니다. 이 사실을 실제로 더 작은 stax 프로그램에 통합하는 방법을 알지 못했습니다.
재귀

... 단지 문자 일 수는 tfrsen있지만 압축 with과 같은 단어가 있다고 생각 sen합니다.
Jonathan Allan

D : 감사합니다 사람, 당신은 더 짧은 문자열 찾기 위해 나에게 영감을
레오

따라서 첫 번째 쉼표 뒤에 쉼표를 소수점으로 바꾸는 것과 같습니다.
딸기

@Strawberry 실제로는, [1,0,0]보다 작은 것으로 간주됩니다 [1,0,0,0](그러나이 프로그램에서는 차이가 없습니다)
Leo

10

Stax , 24 22 17 16 14 바이트

▄Ωφ▐╧Kìg▄↕ñ▼!█

실행 및 디버깅

이 프로그램은 입력을 위해 소문자 철자 배열을받습니다. 출력은 이렇게 줄 바꿈으로 구분됩니다.

one five nine
two six five
three one four
three five eight

이 프로그램은 특정 변환에서 얻은 순서를 사용하여 입력을 정렬합니다. 각 단어의 각 문자는 문자열의 색인으로 바뀝니다 "wo thif sen". 원래 배열은이 순서대로 정렬됩니다. 그런 다음 공백과 결합한 후 결과가 인쇄됩니다.

공백은 용도가 없지만 실제로 문자열 리터럴에서 더 큰 압축을 허용합니다.


Stax는 어떤 인코딩을 사용합니까? 이것은 UTF-8에서 32 바이트입니다.
OldBunny2800

5
"바이트"하이퍼 링크와 같이 수정 된 CP437이 설명합니다.
재귀

그런 문자열을 만드는 표준 알고리즘 / 방법이 있습니까? 컨셉의 이름이 있습니까?
Itai

@Itai : 그것은 것 같지만 그것이 무엇인지 알지 못합니다.
재귀

6

젤리 , 12 바이트

OḌ%⁽Т%147µÞ

모나 딕 링크.

온라인으로 사용해보십시오! ... 또는 테스트 슈트를보십시오

어떻게?

숫자를 서수로 변환 한 다음 밑이 10에서 변환 한 다음 모듈로를 4752, 147로 변경하면 오름차순이됩니다.

 zero            , one         , two         , three               , four
[122,101,114,111],[111,110,101],[116,119,111],[116,104,114,101,101],[102,111,117,114]
 133351          , 12301       , 12901       , 1276511             , 114384
 295             , 2797        , 3397        , 2975                , 336
 1               , 4           , 16          , 35                  , 42

 five            , six         , seven               , eight               , nine
[102,105,118,101],[115,105,120],[115,101,118,101,110],[101,105,103,104,116],[110,105,110,101]
 113781          , 12670       , 1263920             , 1126456             , 121701
 4485            , 3166        , 4640                , 232                 , 2901
 75              , 79          , 83                  , 85                  , 108

그런 다음이를 정렬하는 주요 기능으로 사용할 수 있습니다.

OḌ%⁽Т%147µÞ - Link: list of lists of lists of characters
          µÞ - sort (Þ) by the mondadic chain to the left (µ):
O            -   ordinals of the characters
 Ḍ           -   convert from base 10
   ⁽Т       -   literal 4752
  %          -   modulo
      %147   -   modulo by 147

그것은 바로 당신이 거기에서 찾은 훌륭한 모듈러스입니다.
Outgolfer Erik

그렇게 힘들지는 않습니다-나는 바이너리를 먼저 보았습니다.
Jonathan Allan

예를 들어, 당신은 모듈러스를 무차별 대입 했습니까?
Outgolfer Erik

예, 그러나 빠릅니다.
Jonathan Allan

6

파이썬 , 62 바이트

lambda m:sorted(m,key=lambda r:[int(s,36)%6779%531for s in r])

온라인으로 사용해보십시오! ... 또는 테스트 슈트를보십시오

노트 :

lambda m:sorted(m,key=lambda r:[map("trfsen".find,s)for s in r])

파이썬 2에서 작동하지만 (3 아님) 2 바이트 더 길다.


1
마법의 숫자를 어떻게 발견 했습니까?
mbomb007

1
결과에 대한 엄격한 증가를 검사하는 중첩 루프. 비록 외부에 주어진 내부의 숫자 길이를 제한 할 수는 있지만.
Jonathan Allan

5

APL (Dyalog Classic) , 12 바이트

'nesft'∘⍒⌷¨⊂

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

이것은 내가 이차원에 대한 적절한 왼쪽 주장을 찾은 방법입니다 (나는 먼저 시도 하고 길이는 6입니다).

A←⊖a←↑'zero' 'one' 'two' 'three' 'four' 'five' 'six' 'seven' 'eight' 'nine'
{(aa[⍵⍒a;])∧Aa[⍵⍒A;]:⎕←⍵}¨,⊃∘.,/5⍴⊂∪∊a

3

펄 6 , 37 바이트

*.sort:{('digit 'X~$_)».parse-names}

시도 해봐

넓히는:

*\     # WhateverCode lambda (this is the parameter)
.sort:
{  # block with implicit parameter 「$_」
  (
    'digit ' X~ $_  # concatenate 'digit ' to each named digit
  )».parse-names    # call .parse-names on each
}

코드 블록은 형식 값을 가져 와서 쉽게 사용할 수 있는 값으로 ("three","one","four")변환합니다 .("3","1","4").sort


3

APL (Dyalog) , 38 바이트

{⍵[⍋(531∘⊥⍤1)(531|6779|369+⎕A⍳⊢)¨↑⍵]}

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

Jonathan Allan의 멋진 솔루션을 기반으로 합니다 .


1
@JonathanAllan 초기 변경 시간 동안 크레딧을 편집했습니다. 왜 변경되지 않았는지 전혀 알 수 없습니다. 수정 됨
Uriel

1
31 : ⊂⌷¨⍨∘⍋(531⊥531|6779|36⊥9+⎕A⍳⊢)¨, 그러나 현재 바이트 수의 절반 미만 으로이 작업을 훨씬 간단하게 수행 할 수 있습니다.
Adám

@ Adám, 다른 형식 (혼합 대 비 혼합)의 입력 및 출력을 허용합니까?
ngn

@ngn 물론입니다. 그러나 내가 생각한 솔루션은 완전히 혼합 된 I / O입니다.
Adám

3

루비, 48 바이트

->x{x.sort_by{|y|y.map{|s|s.to_i(35)**2%47394}}}

"zero".to_i(35)0 이라는 사실을 남용합니다 ( 'z'는 35의 유효한 숫자가 아니기 때문에). 다른 9 자리에 대한 공식을 무차별 화하는 것이 훨씬 쉽습니다.







1

05AB1E , 27 바이트

Σ“¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“#skJ

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


Σ                           # Sort input by...
 “¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“     # "zero one two three four five size seven eight nine"
                       #    # Split on spaces.
                        sk  # Find index of each input...
                          J # Join up.


@ 칼도 아 ... 각각의 시작 두 글자를 인코딩? 나는 그것이 그 자신의 대답이어야한다고 생각합니다.
Magic Octopus Urn

1

하스켈 , 133 122 109 107 106 바이트

import Data.List
sortOn$abs.read.(>>=show.head.(`elemIndices`words"ze on tw th fo fi si se ei ni").take 2)

언 골프 드 :

import Data.List

nums = ["ze","on","tw","th","fo","fi","si","se","ei","ni"]

lookup' :: Eq a => a -> [a] -> Int
lookup' v = head . elemIndices v

wordToInt :: String -> Int
wordToInt (x:y:_) = lookup' [x,y] nums

wordsToInt :: [String] -> Int
wordsToInt = read . concatMap (show . wordToInt)

sortN :: [[String]] -> [[String]]
sortN = sortOn wordsToInt






0

젤리 , 30 28 27 바이트

w@€“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»µÞ

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

Jonathan Allan에게 -1 감사합니다.

문자열 'onetwo ... nine'에서 각 숫자의 색인을 찾은 다음이를 키 함수로 사용하여 정렬 Þ합니다. 'zero'처음 두 문자에 대한 검색 'zero'이 실패하고 0색인 대신 반환되어 'zero'사전 식으로 "초기"를 만들기 때문에 처음 에 포함하지 않아도됩니다 .


'one two ... nine'의 압축을 사용하는 것은 1 바이트가 적습니다
Jonathan Allan

@JonathanAllan 아, 감사합니다. 나는 그것을 확인 생각하지 않았다. 압축 'zeontw...ni'이 더 길어졌습니다.
dylnan

... 더 이상 "... 처음 두 글자"가 아닙니다.
Jonathan Allan


0

C (클랑) 229 바이트

y,j,k,t[9];char *s="zeontwthfofisiseeini";r(char **x){for(j=y=k=0;k+1<strlen(*x);k+=j,y=y*10+(strstr(s,t)-s)/2)sscanf(*x+k,"%2[^,]%*[^,]%*[,]%n",t,&j);return y;}c(*x,*y){return r(x)-r(y);}f(*x[],l){qsort(&x[0],l,sizeof(x[0]),c);}

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

문자열 배열 배열을 C 함수로 보내는 간단한 방법은 없으므로 코드 골프의 정신으로 입력 형식에서 약간의 자유를 얻었습니다.

f()문자열에 대한 포인터 배열을 받아들입니다. 각 문자열은 숫자이며 쉼표로 구분 된 소문자로 표시됩니다. 또한 두 번째 매개 변수의 배열에 문자열 수가 필요합니다. 이것이 허용되기를 바랍니다.

f()를 사용하여 정렬 된 순서대로 포인터를 바꿉니다 qsort().
r()쉼표로 구분 된 숫자 문자열에서 입력 숫자를 읽습니다. 숫자를 식별하기 위해 처음 두 문자 만 비교합니다.
c()비교 함수입니다



@ceilingcat 설명해 주 strstr("i"-19,t)-"zeontwthfofisiseeini"시겠습니까? 컴파일러 전용입니까, 표준입니까?
GPS

에 다른 패턴이 존재하지 않습니다에 즉 의존 .rodata같은 표정 0x69 0x00과의 주소를 배치 컴파일러 "i"의 끝에서"zeo..."
ceilingcat

그렇게 생각했습니다. 컴파일러가 그렇게 할 수있는 방법이 있습니까? 나는 여기의 규칙이 이것을 허용 할 것이라는 것을 알고 있지만, 이것에 진짜로 의존 할 수 있습니까?
GPS

내 본능은 "실제 세계"에서 이것을 피하는 것이지만 문자열 조각이 충분히 독창적이라면 아마도 잘 작동 할 것입니다. 실제로 스택 카나리아와 관련된 합법적 인 사용 사례가있을 수 있지만 환각을 일으킬 수도 있습니다.
ceilingcat 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.