많은 색깔의 외투


22

도전

입력 한 고유 한 색상 이름 목록이 제공 되면 Joseph의 Amazing Technicolor Dreamcoat 에 처음 나타나는 순서대로 정렬하십시오 .


Input:  green, blue, red, brown
Output: red, green, brown, blue

전체 색상 목록은 다음과 같습니다.

 1. red
 2. yellow
 3. green
 4. brown
 5. scarlet
 6. black
 7. ochre
 8. peach
 9. ruby
10. olive
11. violet
12. fawn
13. lilac
14. gold
15. chocolate
16. mauve
17. cream
18. crimson
19. silver
20. rose
21. azure
22. lemon
23. russet
24. grey
25. purple
26. white
27. pink
28. orange
29. blue

또는 문자열 배열로 :

["red","yellow","green","brown","scarlet","black","ochre","peach","ruby","olive","violet","fawn","lilac","gold","chocolate","mauve","cream","crimson","silver","rose","azure","lemon","russet","grey","purple","white","pink","orange","blue"]

규칙

  • 표준 I / O 규칙 에서 허용하는 한 합리적이고 편리한 수단 (예 : 문자열 배열, 구분 된 문자열, 개별 문자열)을 사용하여 입력 할 수 있지만 답에 입력 방법을 지정하십시오.
  • 당신은 당신의 출력에 대해 동일한 작업을 수행 할 수 있습니다.
  • 입력에는 위 목록의 색상 만 포함됩니다.
  • 솔루션은 빈 입력을 처리 할 수 ​​있어야합니다.
  • 입력의 모든 단어가 대문자, 소문자 또는 제목인지 일관되게 선택할 수 있지만 출력의 대 / 소문자는 입력의 대 / 소문자 와 일치 해야합니다 .
  • 이것은 이므로 각 언어에서 가장 적은 바이트 수가 승리합니다.
  • 항상 그렇듯이 표준 허점 은 금지되어 있습니다.

테스트 사례

Input:  []
Output: []

Input:  ["green", "blue", "red", "brown"]
Output: ["red", "green", "brown", "blue"]

Input:  ["gold", "grey", "green"]
Output: ["green", "gold", "grey"]

Input:  ["ruby","yellow","red","grey"]
Output: ["red", "yellow", "ruby", "grey"]

Input:  ["gold", "green", "fawn", "white", "azure", "rose", "black", "purple", "orange", "silver", "ruby", "blue", "lilac", "crimson", "pink", "cream", "lemon", "russet", "grey", "olive", "violet", "mauve", "chocolate", "yellow", "peach", "brown", "ochre", "scarlet", "red"]
Output: ["red", "yellow", "green", "brown", "scarlet", "black", "ochre", "peach", "ruby", "olive", "violet", "fawn", "lilac", "gold", "chocolate", "mauve", "cream", "crimson", "silver", "rose", "azure", "lemon", "russet", "grey", "purple", "white", "pink", "orange", "blue"]

1
샌드 박스 (18 개월 동안 언어가 풀렸다 고 믿기 힘들다!)
Shaggy

답변:


11

PowerShell을 , 262 155 151 127 125 95 바이트

$args|sort{"rlyegwbrscbrocpyrvo lvnfaldgccvmacmcvseraolsrygpptwkpnoeb".indexof((-join$_[3,0]))}

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

순진한 접근. PowerShell sort-object은 모든 개체에 대해 실행되는 스크립트 블록을 기준으로 정렬 할 수 있습니다. 여기서는 단순히 .IndexOf()문자열에서 색상을 가져 와서 각 색상에 숫자 값을 할당 한 다음 해당 숫자를 기준으로 정렬합니다. 끈은 고유성을 보장하기 위해 각 색상의 네 번째와 첫 번째 문자로 구성됩니다. 출력은 암시 적입니다.

Shaggy 덕분에 -4 바이트
mazzy 덕분에 -2 바이트.
KGlasier 덕분에 무려 -30 바이트입니다.


이 작업을 효율적으로 (바이트 단위로) 수행 할 수 있는지 모르겠지만 길이가 3 개의 하위 문자열로 정렬 한 다음 원래 문자열의 보조 키로 정렬하면 유일한 green grey알파벳 순서로 충돌이 발생합니다.
HyperNeutrino

2
@Shaggy 예, 문자열을 찾지 못하면 .IndexOf()반환 되므로 올바른 순서로 -1정렬 되므로 작동합니다 red. 감사!
AdmBorkBork

문자열 주위에 대괄호를 제거 할 수 있다고 생각합니다.
mazzy

@mazzy 정말 감사합니다!
AdmBorkBork

1
@KGlasier 와우, 그 문자열을 찾아 주셔서 감사합니다! 그것은 많은 바이트를 절약합니다.
AdmBorkBork

8

자바 스크립트 (의 SpiderMonkey) ,  106 (105)  104 바이트

"의심스러운 경우, 피의 입력을 해시하십시오."

a=>a.sort((a,b)=>(g=s=>'i0008bar5dj60007f3001p09mseqg0hk40cnl2o'[parseInt(s,36)*50%257%170%40])(a)>g(b))

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


이전에 이와 같은 해시 기반 솔루션을 보았습니다. 매직 스트링 / 멀티 플라이어 / 모드 값이 생성되는 방법에 대한 설명이 있습니까? 가능한 각 색상 입력에 대해 고유 한 출력을 제공하는 값 집합을 찾을 때까지 무차별적인 힘이 있습니까?
Jack Brounstein

1
@JackBrounstein 이것은 풀 체인의 길이를 고려하지 않고 임의의 값을 시도하고 최대 출력 (마지막 모듈로 후) 만 최소화하는 빠르고 더러운 무차별 강제 검색이었습니다 (예 : 이 접근법 %99%55보다 좋지 않습니다 %123%55). 따라서 그것은 차선책입니다. 그래도 나중에 조금 더 세련된 것을 시도해 볼 수 있습니다.
Arnauld

6

젤리 , 28 바이트

“½Ṗ©cƘʂẒẹMMỤẓHP’Œ?“ðÑþQ’,ḥµÞ

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

작동 원리

µ왼쪽에있는 모든 것을 모나 딕 체인으로 바꾸어 Þ입력 배열에 매핑하고 생성 된 값에 따라 입력을 정렬합니다.

“½Ṗ©cƘʂẒẹMMỤẓHP’ 반환 값을 176073885534954276199526358143331로 설정합니다.

Œ?[20,28,15,3,5,26,18,16,8,30,4,25,2,21,22,11,24,1,23,10,29,12,17,27,14,9,6,13,7,19]

“ðÑþQ’수율 391695582; ,순열 앞에 추가합니다. 그런 다음 Jelly의 391695582 번째 해시 함수를 계산하여 결과 버킷을 순열의 정수에 매핑합니다.

마법 상수 391695582는 Jelly 's utils에 의해 발견되었습니다 .

dennis-home:utils$ time ./findhash 30 29 <<< '["red","yellow","green","brown","scarlet","black","ochre","peach","ruby","olive","violet","fawn","lilac","gold","chocolate","mauve","cream","crimson","silver","rose","azure","lemon","russet","grey","purple","white","pink","orange","blue"]'
391695582

real    0m2.058s
user    0m15.077s
sys     0m0.023s

1
353690280752는 29 개의 버킷에서 29 개의 색상을 해시하지만 인코딩하는 데 1 바이트가 더 필요합니다. 대문자 (332849952364) 또는 제목 (862442225888)을 사용하면 28 바이트에서 나옵니다.
Dennis

5

파이썬 3 , 93 바이트

lambda r:sorted(r,key=lambda s:'iV^ZzwnFM@pYuOobXGAKyf[tUR]E'.find(chr(int(s,36)%127%60+64)))

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

각 색상을 기본 36으로 읽습니다 int. Brute-force는 moduli를 강제하고 탈출을 필요로하지 않는 19 개 중 임의의 오프셋을 선택했습니다.


4

파워 쉘, 124 120 124 119 118 102 바이트

$args|sort{$c=$_
'bluOrPiWPuG*yRusLeARoSiCriCrMCGoLFVOlRuPOBlSBGYR'-csplit'(?=[A-Z])'|%{$c-like"$_*"}}

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

설명:

  1. 데이터 문자열에는 색상 레이블의 첫 번째 유효 문자가 내림차순으로 포함됩니다. Grey라벨을 제외하고 G*y는 짧습니다.

  2. -csplit'(?=[A-Z])' 데이터 문자열을 배열로 분할 (blu,Or,Pi,W,Pu,G*y,Rus,Le,A,Ro,Si,Cri,Cr,M,C,Go,L,F,V,Ol,Ru,P,O,Bl,S,B,G,Y,R)

  3. |%{$c-like"$_*"}문자열 배열을 부울 배열에 매핑합니다. 여기서 True"이 문자열에서 색상 레이블이 시작됨"을 의미합니다 (대소 문자 구분없는 연산자, csplit-대소 문자 구분, doc 참조 ).

  4. sort{}boolean 배열을 기준 으로 오름차순으로 색상 lables를 정렬합니다 .

배열 별 정렬은 Powershell에서 매우 흥미로운 기능입니다. 이 스크립트에서 모든 배열의 길이는 동일하며 부울 값만 포함합니다. 이 정렬은 부울 배열의 사전 순으로 수행됩니다.

따라서 문자열에는 마지막 레이블에 대한 한 글자 약어가 포함될 수 있습니다. 배열의 시작 부분에 일치하는 항목이 있으면 끝의 일치 항목이 적용되지 않습니다.

       blu Or Pi W Pu G*y Rus Le A Ro Si Cri Cr M C Go L F V Ol Ru P O Bl S B G Y R
green: -   -  -  - -  -   -   -  - -  -  -   -  - - -  - - - -  -  - - -  - - T - -
gold : -   -  -  - -  -   -   -  - -  -  -   -  - - T  - - - -  -  - - -  - - T - -
grey : -   -  -  - -  T   -   -  - -  -  -   -  - - -  - - - -  -  - - -  - - T - -

     : green < gold < grey

어디 T있다 true하고 -있다 false.


테스트 스크립트 :

$f = {

$args|sort{$c=$_
'bluOrPiWPuG*yRusLeARoSiCriCrMCGoLFVOlRuPOBlSBGYR'-csplit'(?=[A-Z])'|%{$c-like"$_*"}}

}

@(
    ,( @(), @() )
    ,( ('green', 'blue', 'red', 'brown'), ('red', 'green', 'brown', 'blue') )
    ,( ("gold", "grey", "green"), ("green", "gold", "grey") )
    ,( ("ruby","yellow","red","grey"), ("red", "yellow", "ruby", "grey") )
    ,( ("gold", "green", "fawn", "white", "azure", "rose", "black", "purple", "orange", "silver", "ruby", "blue", "lilac", "crimson", "pink", "cream", "lemon", "russet", "grey", "olive", "violet", "mauve", "chocolate", "yellow", "peach", "brown", "ochre", "scarlet", "red"),
       ("red", "yellow", "green", "brown", "scarlet", "black", "ochre", "peach", "ruby", "olive", "violet", "fawn", "lilac", "gold", "chocolate", "mauve", "cream", "crimson", "silver", "rose", "azure", "lemon", "russet", "grey", "purple", "white", "pink", "orange", "blue") )
) | % {
    $inp,$expected = $_
    $result = &$f @inp  # splatting
    "$("$result"-eq"$expected"): $result"
}

산출:

True:
True: red green brown blue
True: green gold grey
True: red yellow ruby grey
True: red yellow green brown scarlet black ochre peach ruby olive violet fawn lilac gold chocolate mauve cream crimson silver rose azure lemon
russet grey purple white pink orange blue

나는이 This site can’t be reached오류가 발생했습니다. 죄송합니다.
mazzy December

1
수정 된 TIO가 추가되었습니다.
Shaggy

1
오늘 TIO를위한 새로운 IP를 얻었습니다. 여전히 차단되어 있습니까?
데니스

살아있어!!! 시원한! 그리고 감사합니다!
mazzy


3

Wolfram Language 255213 199 바이트

Dennis가 저장 한 14 바이트는 문자열 대신 기호를 사용하여 "표시를 피했습니다.

SortBy[#,{yellow,green,brown,scarlet,black,ochre,peach,ruby,olive,violet,fawn,lilac,gold,chocolate,mauve,cream,crimson,silver,rose,azure,lemon,russet,grey,purple,white,pink,orange,blue}~Position~#&]&

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


2

파이썬 2 , 186 바이트

lambda a:[y for x,y in sorted((max(" y gree br sc bla oc pe rub ol v f li go ch m cre cri si ro a le rus grey pu w pi or blu ".find(" %s "%c[:i+1])for i,j in enumerate(c)),c)for c in a)]

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

식별자 문자열에서 점진적 문자 하위 문자열 (예 : "green"은 "g", "gr", "gre", "gree"및 "green"을 확인)과 일치하는 모든 항목을 찾고 최대 색인을 유지합니다. "red"는 항상 첫 번째이고, anf find ()는 누락 된 일치에 대해 -1을 리턴하므로 특별히 red에 대한 식별자가 없습니다.

색상이 (색인, 색상) 쌍으로 바뀌면 쌍의 첫 번째 항목에서 배열을 정렬 한 다음 각 쌍의 첫 번째 항목을 버립니다.


2

파이썬 3 , 130 바이트

lambda*a:sorted(a,key=lambda c:("r,ylgebwsrtbcorpcryovvlfnlagdccamvca cmnsvrearlorsgyppwtpkonbe".find(c[::3]+" "*(c=="cream")),c))

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


@Shaggy 그렇게 생각하지 않아? 당신은 나에게 입력과 의도 된 출력을 제공 할 수 있습니다
HyperNeutrino

@AdmBorkBork 고마워, Shaggy의 의미를 깨달았습니다. 나는 녹색과 회색을 서로 비교했습니다. lol
HyperNeutrino

Shaggy와 AdmBorkBork의 의견에 추가하기 위해 "green"과 "grey"는 모두 "gre"로 시작합니다.
DavidC

@Shaggy 내가 생각하는 고정
HyperNeutrino

1
@Shaggy 고마워요. 초콜릿 oof ca의 하위 문자열 이므로 크림에 대한 약간의 핵이 필요했습니다 cca.
HyperNeutrino

2

C 번호 (카메라 C 번호 인터랙티브 컴파일러) , 321 (219) 210 161 159 138 바이트

n=>n.OrderBy(a=>a!="grey"?"yelgrebroscablaochperuboliviofawlilgolchomaucrecrisilrosazulemruspurwhipinorablu".IndexOf(a.Substring(0,3)):65)

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

Shaggy 덕분에 -3 바이트, TheLethalCoder 덕분에 -18 바이트

A와 입력을 받아 List<string>, 반환하는IOrderedEnumerable<string>

이것이 작동하는 방법은 원래 문자열에서 각 문자열의 색인별로 목록을 정렬한다는 것입니다. 원래 문자열은 회색을 제외한 모든 색상이 처음 세 글자로 바뀝니다. 녹색과 회색이 모호성을 유발할 수 있으므로 회색이 없습니다. IndexOf문자열이 표시되지 않으면 -1을 반환 하므로 빨간색도 없습니다 .

IOrderedEnumerable을 입력으로 사용하는 짧은 버전, 137 바이트

n=>n.ThenBy(a=>a!="grey"?"yelgrebroscablaochperuboliviofawlilgolchomaucrecrisilrosazulemruspurwhipinorablu".IndexOf(a.Substring(0,3)):65)

ThenBy1 바이트보다 짧은 사실을 이용 OrderBy하지만 s ThenBy에서만 작동합니다 IOrderedEnumerable.

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


내가 생각하는 당신이 제거 할 수 있습니다 red귀하의 조회 문자열 및 교체 68와 함께 653 저장 바이트. 내 휴대 전화에서 완전히 테스트하지 않았습니다.
Shaggy

142 바이트에 대한 암시 적 리턴과 함께 문자열을 인라인으로 사용할 수 있지만 실행에 필요한 바이트 수에 s n=>n.OrderBy(a=>a!="grey"?"redyelgrebroscablaochperuboliviofawlilgolchomaucrecrisilrosazulemruspurwhipinorablu".IndexOf(a.Substring(0,3)):68);를 포함시켜야합니다 using. 네임 스페이스 트릭 을 사용하여 필요한 수를 줄일 수 있습니다 .
TheLethalCoder

네임 스페이스 트릭을 사용하는 경우 네임 스페이스를 바이트 수에 추가해야합니까?
무지의 구현

컴파일러를 Visual C # Interactive Compiler로 변경 한 다음 용도를 추가 할 필요가 없습니다
무지의 실시 예

대화 형으로 변경하는 것이 좋지만 네임 스페이스 트릭을 수행 한 경우 바이트 수에 포함시켜야합니다. 본질적으로 추가namespace System.Linq{} 하거나 원하는 것을 선택하십시오.
TheLethalCoder

1

, 69 68 63 56 바이트

F⪪”E$↥l∧_∧K⁰RY⸿h⊕ψVG⌕gbW⟧⁼″5/²H✳<◨A³?ω↗⊘‴⭆1”²Φθ№κ⎇Σιlilι

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

F⪪”E$↥l∧_∧K⁰RY⸿h⊕ψVG⌕gbW⟧⁼″5/²H✳<◨A³?ω↗⊘‴⭆1”²

압축 된 문자열을 가져 와서 edyeeebrscckhrpeubivvifa99gohomaamrisiosazemuseypuwhpiorlu길이 2의 각 하위 문자열 을 반복합니다.

Φθ№κ⎇Σιlilι

각 문자열의 경우 문자열이 아닌 경우, 그 문자열을 포함하는 입력 문자열을 인쇄 99,이 경우보기에 대한 lil대신. ( lilac고유 두 글자 문자열을하지 않는 유일한 색상입니다 olive포함 li;silver 포함 ilblack포함 lac. fawn그리고 azure단 하나의 문자를 사용 검출 할 수 있지만, 여기서는 그 도움이되지 않습니다.)


1

피시스, 66 바이트

oxc."ayÇæ£ðÐ¥~@iF[2BÍÐ:Yë)^ksTTã"2s@LN,03

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

목록의 색상은 고유 인덱스에있는 문자를 복용하여 식별 할 수 있습니다 03모듈 형 인덱싱을 가정. 결과는 다음과 같습니다.

rr -> red
yl -> yellow
ge -> green
bw -> brown
sr -> scarlet
bc -> black
or -> ochre
pc -> peach
ry -> ruby
ov -> olive
vl -> violet
fn -> fawn
la -> lilac
gd -> gold
cc -> chocolate
mv -> mauve
ca -> cream
cm -> crimson
sv -> silver
re -> rose
ar -> azure
lo -> lemon
rs -> russet
gy -> grey
pp -> purple
wt -> white
pk -> pink
on -> orange
be -> blue

전체 설명 :

oxc."..."2s@LN,03Q   Implicit: Q=eval(input())
                     Trailing Q inferred, dictionary string replaced with ... for brevity
o                Q   Order the elements of Q, as N, using:
              ,03      [0,3]
           @LN         Get the characters at the above indices in N
          s            Concatenate into a string
                         The above is result {1}
   ."..."              The compressed dictionary string
  c      2             Split into chunks of length 2
 x                     Get the index of {1} in the above
                       Implicit print of sorted list

1

05AB1E , 48 바이트

Σ.•Aå₂мÕh∊þèmvƶ\kΛ1YŠíJ>J#θ₁2©€,Ù{η¦ù-•2ôy¬s3è«k

대부분의 다른 답변과 동일한 솔루션입니다. 나중에 여기에서 골프를 치려고합니다.

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

설명:

Σ          # Sort the (implicit) input-list by:
 .•Aå₂мÕh∊þèmvƶ\kΛ1YŠíJ>J#θ₁2©€,Ù{η¦ù-•
           #  Push compressed string "rrylgebwsrbcorpcryovvlfnlagdccmvcacmsvrearlorsgyppwtpkonbe"
  2ô       #  Split into parts of size 2
 y         #  Push the current string of the list we're sorting
  ¬        #  Push its head (without popping)
   s       #  Swap so the string is at the top of the stack again
    3è     #  Get the character at index 3 (with automatic wraparound)
      «    #  Merge both characters together
       k   #  And get the index in the compressed string to sort on

이 05AB1E 팁을 참조하십시오 (섹션 압축 문자열 사전의 일부에 어떻게? ) 방법을 이해하는 .•Aå₂мÕh∊þèmvƶ\kΛ1YŠíJ>J#θ₁2©€,Ù{η¦ù-•것입니다 "rrylgebwsrbcorpcryovvlfnlagdccmvcacmsvrearlorsgyppwtpkonbe".

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