등산 등급 정렬


33

내 첫 번째 코드 골프 게시물, 실수에 대한 사과 ...

문맥

암벽 등반 ( 구체적으로 볼더링 )에서 V / Vermin (미국) 등반 등급은 'VB'(가장 쉬운 등급)에서 시작한 다음 'V0', 'V0 +', 'V1', 'V2', 'V3'으로 이동합니다. , 'V4', 'V5'등 최대 'V17'(가장 어려운 등급).

태스크

등반 성적 목록 / 배열을 입력으로 받아 가장 쉬운 것부터 가장 어려운 등급으로 분류 한 성적 목록 / 배열을 반환하거나 인쇄해야합니다.

입력이 비어 있으면 빈 데이터 구조를 반환하십시오. 그렇지 않으면 입력은 항상 유효합니다.

테스트 사례

Input | Output
[] |  []
['V1'] |  ['V1']
['V7', 'V12', 'V1'] | ['V1', 'V7', 'V12']
['V13', 'V14', 'VB', 'V0'] |  ['VB', 'V0', 'V13', 'V14']
['V0+', 'V0', 'V16', 'V2', 'VB', 'V6'] | ['VB', 'V0', 'V0+', 'V2', 'V6', 'V16']

이것은 도전입니다.


다음에는 샌드 박스 에 게시하여 의견을 게시 한 후 게시하십시오. 둘째, 자신의 도전에 정말로 대답해야합니까?
Ian H.

입력에 중복 성적이 표시됩니까?
Mr. Xcoder

@ Mr.Xcoder 중복 없음
Chris_Rands

7
PPCG에 오신 것을 환영합니다! 첫 번째 질문에 대해 명확하고 훌륭합니다. (y)
officialaimm

3
아주 좋은 첫 번째 질문! 그에 대한 답변은 매우 다양하고 독창적입니다. :)
Lynn

답변:


23

파이썬 2 , 58 54 바이트

lambda x:sorted(x,key=lambda y,B10=0:eval(y[1:]+'10'))

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

작동 원리

y         y[1:]+'10'   eval(y[1:]+'10')
=======================================
VB        B10          0  (a variable we defined)
V0        010          8  (an octal literal)
V0+       0+10         10
V1        110          110
V2        210          210
...       ...          ...
V17       1710         1710

이것을 ES6으로 포팅하는 것이 Arnauld의 접근 방식을 능가하지 않는 것 같습니다 : a=>a.sort((a,b,B10=0)=>(g=s=>eval(s.slice(1)+10))(a)>g(b))58 바이트입니다.
Lynn

1
a=>a.sort((a,b)=>(g=s=>eval(s.slice(B10=1)+10))(a)-g(b))2 바이트가 짧지 만 여전히 너무 깁니다.
Arnauld

@GB 나는 그것이 타당하다고 생각하지만 지금은 분명히 유효합니다.
Lynn

왜 더 짧은 것이 아닌 '10'을 사용합니까? 예를 들어 '2'는 2 바이트를 저장합니다.
GB

1
@GB 트릭은 8 진수 표기법 "010"에서 "V0"에 대해 10 진수로 8로 변환하는 것입니다. 2를 사용하면 "02"= 2가되며 이는 "0 + 2"와 같습니다.
Arnauld

15

자바 스크립트 (ES6) / Firefox, 53 바이트

a=>a.sort((a,b)=>(g=s=>parseInt(s,32)%334+s)(a)>g(b))

테스트 사례

Firefox의 경우 :

Chrome 또는 Edge (+4 바이트)의 경우 :

방법?

사 전적으로 비교 가능한 문자열로 이어지는 3 개의 연속 변환을 적용합니다.

s     | Base32 -> dec. | MOD 334 | +s
------+----------------+---------+---------
"VB"  |           1003 |       1 | "1VB"
"V0"  |            992 |     324 | "324V0"
"V0+" |            992 |     324 | "324V0+"
"V1"  |            993 |     325 | "325V1"
"V2"  |            994 |     326 | "326V2"
"V3"  |            995 |     327 | "327V3"
"V4"  |            996 |     328 | "328V4"
"V5"  |            997 |     329 | "329V5"
"V6"  |            998 |     330 | "330V6"
"V7"  |            999 |     331 | "331V7"
"V8"  |           1000 |     332 | "332V8"
"V9"  |           1001 |     333 | "333V9"
"V10" |          31776 |      46 | "46V10"
"V11" |          31777 |      47 | "47V11"
"V12" |          31778 |      48 | "48V12"
"V13" |          31779 |      49 | "49V13"
"V14" |          31780 |      50 | "50V14"
"V15" |          31781 |      51 | "51V15"
"V16" |          31782 |      52 | "52V16"
"V17" |          31783 |      53 | "53V17"

기본 변환 / 모듈로 아이디어를 생각해 보셨습니까? 훌륭한!
kamoroso94

1
@ kamoroso94 FWIW, 여기 에 기본과 모듈러스를 찾기 위해 작성한 코드 가 있습니다. 다른 가능한 답변을 제공합니다 (m <1000).
Arnauld

a=>a.sort((a,b)=>(g=s=>parseInt(s,32)%334+s)(a)>g(b))Chrome에서 시도했지만 f(["VB","V0","V0+","V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","V11","V12","V13","V14","V15","V16","V17"])왜 그런지 잘 모르겠습니다. 가장자리 호환 버전은 크롬에서 잘 작동합니다.
Ra8

1
@ Ra8 아, 그렇습니다. Chrome에서도 불안정한 것으로 보입니다. sort () 콜백에서 부울을 반환하는 것은 Firefox에서 작동하는 해킹 일 뿐이지 만 실제로 서명 된 값을 반환해야합니다. 의견 주셔서 감사합니다!
Arnauld

12

껍질 , 5 바이트

ÖiÖm±

온라인으로 사용해보십시오! 결과는 한 줄에 하나씩 인쇄되지만 내부적으로는 문자열 목록을 가져 와서 반환하는 함수입니다.

설명

이것은 놀랍게도 Martin의 Retina 답변 과 유사합니다 . 먼저 Öm±"매핑 순서는 숫자입니다"를 의미합니다. 이 풋은 VB, V0그리고 V0+, 올바른 순서로 그들은으로 비교되기 때문에 [0,0], [0,1]하고 [0,1,0]. 다음으로 Öi"정수 값 순서"를 의미합니다. 문자열이 주어진 경우 문자열 i에서 첫 번째 숫자 시퀀스를 정수로 반환하거나 찾지 못한 경우 0을 반환합니다. 위의 세 문자열은 모두 0에 매핑되고 정렬이 안정적이므로 출력에서 ​​올바른 순서로 정렬됩니다.


11

레티 나 , 14 바이트

B
!
O`
!
B
O#`

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

설명

B
!

교체 B와 함께 !그래서 성적 풋의 사전 식 순서 VB(다음 또는 V!모든 숫자 등급 앞).

O`

모든 입력 행을 사전 식으로 정렬하십시오. 이것은 올바른 결과를 제공하지 않지만 V! < V0 < V0+올바르게 주문 합니다.

!
B

V!돌아갑니다 VB.

O#`

줄을 숫자로 정렬하십시오. Retina는 단순히 정렬 키를 결정하기 위해 문자열에서 첫 번째 십진수를 찾습니다. (와 같은 VB) 숫자가 없으면 값을로 설정합니다 0. 즉, 모든 수단 VB, V0그리고 V0+같은 종류의 키가 있습니다. 그러나 Retina의 분류는 안정적이며 이미 올바른 상대 순서로 배치했습니다.


6

V , 3 바이트

Úún

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

어떻게 작동합니까?

ú   # Sort on...
 n  #   the first decimal number on the line

이 명령은 숫자로 정렬 할 수없는 모든 행 (AKA, )이 순서가 변경되지 않고 처음에 배치 되므로이 명령은 거의 유효한 솔루션 입니다. 그러나 숫자 만보고 있기 때문에 와를 구분할 수 없습니다 . Vim은 안정적인 정렬을 사용하기 때문에이 중 가장 먼저 정렬 된 항목이 먼저 정렬됩니다. 그래서...VBV0V0+

Ú   # Sort lexicographically (will place 'V0' before 'V0+')
 ú  # Sort by...
  n #   The first number on the line

2
V가이 도전에 잘 맞는지는 : P
Business Cat

5

C #, 121 83 82 83 바이트

저장된 39 TheLethalCoder 및 LiefdeWen 덕분 바이트

a=>a.OrderBy(x=>x[1]>65?-1:x=="V0+"?0.5:int.Parse(x.Remove(0,1)))

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

바이트 수에는가 포함됩니다 using System.Linq.


방법?

  • 문자열 배열을 입력으로 가져옵니다.
  • 입력이와 같으면 VB값을 -1로 VB0+설정하고 같으면 값을 0으로 설정하십시오.
  • 뒤에 나오는 숫자 값을 기준으로 입력을 정렬하십시오 V.

약간의 해킹 일 수도 있지만 작동합니다! :)



당신은 필요가 없습니다 @LiefdeWen ToArray()IOrderedEnumerable잘되어야합니다.
TheLethalCoder

죄송합니다. 실수로 System.Linq 참조를 제거하고 수정했습니다
LiefdeWen

@TheLethalCoder 당신은 항상
그렇습니다

.Remove(0,1)추가 -1 바이트에 대한 @LiefdeWen :)
Ian H.

4

루비 , 52 42 41 바이트

->x{[?B,0,"0+",*1..17].map{|a|"V#{a}"}&x}

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

작동 방식 :

문제를 해결하고 전체 정렬 목록을 작성한 다음 입력과 교차점을 찾으십시오.

1 바이트를 절약 해 준 Lynn에게 감사합니다.


영리한! ->x{[?B,0,"0+",*1..17].map{|a|"V#{a}"}&x}바이트를 저장합니다.
Lynn



2

젤리 , 9 바이트

Ḋv-.F+LµÞ

문자 목록을 가져와 정렬 된 목록을 반환하는 모나드 링크.

온라인으로 사용해보십시오! (바닥 글은 결과를 멋지게 형식화합니다)

방법?

Ḋv-.F+LµÞ - Link: list of lists of characters
       µÞ - sort by key:
Ḋ         -   dequeue (remove the 'V' from the item)
  -.      -   literal -0.5
 v        -   evaluate as Jelly code with argument -0.5
          -   ...this means `VB` and `V0+` become -0.5
          -      (to binary and addition respectively)
          -      while others become their literal numbers
    F     -   flatten
     +L   -   add the length of the item
          -   ...'VB', 'V0', 'V0+', 'V1', 'V2'... -> 1.5, 2, 2.5, 3, 4, ...


2

여기서 파이썬 3 솔루션이 시작됩니다 ... 사과, 컨벤션에 너무 빨리 게시, 이제 다시 게시 ...

파이썬 3 , 69 67 바이트

lambda l:sorted(l,key=lambda x:'B00+'.find(x[1:])+1or int(x[1:])+3)

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


5
자신의 도전에 즉시 응답하지 않는 것이 좋습니다. 다른 사람들이 적어도 48 시간 이상 응답 할 시간을주십시오.
TheLethalCoder

@TheLethalCoder 아 맞아, 스택 오버플로에서 그러한 행동이 권장됩니다! 답변을 삭제해야합니까?
Chris_Rands

@Chris_Rands 예, 삭제하는 것이 좋습니다.
Mr. Xcoder

9
@Downvoter : 모르는 일을하도록 새로운 회원을 다운 보팅하는 것은 쿨하지 않았습니다. 치명적인 경우처럼하지 말아야한다는 것을 간단히 지적하는 것이 훨씬 낫습니다.
Shaggy

누군가가 솔루션을 게시하지 않으면 언제든지 환영합니다. 물론 기다린 후
TheLethalCoder

1

스위프트 3 , 102 바이트

var r={String((Int($0,radix:32) ?? 992)%334)+$0};func f(l:[String]){print(l.sorted(by:{r($0)<r($1)}))}

이것은 기능입니다. 다음과 같이 호출 할 수 있습니다.

f(l:["V0","VB","V13","V0+"])

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


어떻게 작동합니까?

이것은 기본적으로 @Arnauld놀라운 Javascript 답변 포트 이지만 Swift에 최적화되어 있습니다.

아래 표와 같이 각 값을 사전 순으로 정렬 가능한 문자열에 매핑합니다.

초기 문자열-> 결과

V1-> 325V1
V10-> 46V10
V11-> 47V11
V12-> 48V12
V13-> 49V13
V14-> 50V14
V15-> 51V15
V16-> 52V16
V17-> 53V17
V2-> 326V2
V3-> 327V3
V4-> 328V4
V5-> 329V5
V6-> 330V6
V7-> 331V7
V8-> 332V8
V9-> 333V9
V0 +-> 324V0 +
V0-> 324V0
VB-> 1VB

코드 설명

  • String((Int($0,radix:32) ?? 992)%334)-각 문자열을 기수 32의 숫자에서 10 진수로 변환합니다. 값이 "V0 +"인 경우을 호출하면 Int(_:radix:)nil을 반환하고 값은 "V0"인 992를 가져옵니다. 결과를 추가로 가져 와서 mod 334최종적으로 문자열로 변환합니다.

  • +$0-위에서 만든 문자열에 현재 값을 추가합니다. 예를 들어 String이 V9인 경우 위의 함수가 반환 333되고을 추가 V9하여 결과를 얻습니다 333V9.

  • var r={...}-변수 r를 두 번 사용하기 때문에 많은 바이트를 절약하기 때문에 변수 를 익명 클로저로 선언합니다 .

  • func f(l:[String])- 문자열 목록 인 f매개 변수 로 함수 를 정의합니다 l.

  • print(l.sorted(by:{r($0)<r($1)}))-키가 r위에 정의 된 변수를 사용하여 주어진 목록을 정렬 한 결과를 인쇄합니다 .



1

Google 스프레드 시트, 142 바이트

=ArrayFormula(If(A1="","",Sort(Transpose(Split(A1,",")),Transpose(IfError(Find(Split(A1,","),"VBV0V0+"),Value(Mid(Split(A1,","),2,3))+9)),1)))

입력은 A1각 항목이 쉼표로 구분 된 문자열입니다 .
출력은 수식의 셀에 그 n-1아래 의 셀을 더한 값 n입니다 A1.

Result

길고 지저분한 공식이므로 압축을 풀자.

  • If(A1="","",~)널 입력을 수정합니다. 이 기능이 없으면 빈 입력 #VALUE!에서 Split함수가 작동하지 않으므로 빈 입력에서 오류를 반환합니다 .
  • Transpose(Split(A1,",")) 분할 A1쉼표로 하여 열로 바꿉니다.Sort함수 에서만 작동 하여 열로 바꿉니다.
  • Transpose(IfError(Find(),Value()+9)) 이 조각으로 나뉩니다.
    • Find(Split(A1,","),"VBV0V0+")해당 문자열에서 각 매개 변수를 찾으려고합니다. 처음 3 개는 문자열로 정렬해야하는 유일한 것이므로Find 정렬 순서를 가져옵니다.
    • Value(Mid(Split(A1,","),2,3))+9등급의 숫자 값을 가져옵니다. 이것은 V1 이상에서만 중요하므로 숫자 순으로 정렬됩니다. +9끝에 그 이후 V1이 V0 + 뒤에 오는 보장하는 것입니다 Find값이 될 것이다 5. 기술적 +5으로 필요한 경우에만 필요하지만 더 이상 정확하게 정렬하는 데 두 배의 바이트가 필요하지 않습니다.
    • IfError(Find(~),Value(~))Find문자열을 찾은 경우 값을 반환합니다 (예 : 등급이 VB, V0 또는 V0 +). 찾을 수 없으면 등급의 숫자 값에 9를 더한 값을 반환합니다.
    • Transpose(IfError(~))다시 열로 변환하여 Sort사용할 수 있습니다.
  • Sort(Transpose(Split(~)),Transpose(IfError(Find(~),Value(~)+9)),1) 사용자 정의 정렬 순서 오름차순을 사용하여 분할 입력을 정렬하여 모두 마무리합니다.
  • ArrayFormula(~)전체를 감싸서 배열의 첫 번째 값을 반환하는 대신 결과를 배열로 반환합니다. 이것이 한 셀의 수식이 그 아래의 셀도 채우게하는 이유입니다.

Google 스프레드 시트를 사용한 것을 본 것은 이번이 처음이라고 생각합니다. 당신에게, 그리고 +1!
헤더


1

하스켈 , 90 84 83 61 바이트

import Data.List
f"VB"=[]
f(_:'1':[a])='X':[a]
f x=x
sortOn f

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

f등반 등급을 비교할 수있는 문자열로 변환하는 기능입니다. VB빈 문자열 로 변환 하여 가장 높은 우선 순위를 가지면 대체합니다.V1X 가 3보다 긴 문자열 되어 V10-V17 . 나머지는 아무것도하지 않습니다.

목록을 정렬 하기 위해 Lynn이 제안한 Data.ListssortOn함수를 사용하여 포인트없는 함수를 만듭니다.


그것은 단지 g=sortOn f입니다 Data.List.
Lynn

1
또한 f(_:'1':a)='X':a4 바이트를 절약합니다!
Lynn

1
@Lynn 첫 번째 제안은 효과가 있지만 두 번째 제안은 [a]그렇지 않습니다. 그렇지 않으면 V1우회하려는 문제인 패턴 일치가 필요 합니다 .
밀 마법사

1

R , 45 바이트

l=paste0('V',c('B','0','0+',1:17));l[l%in%x]

어떻게 작동합니까?

  • 올바르게 정렬 된 성적 벡터를 'l'에 할당하십시오.
    • 'sep = ""'인수를 만들지 않으려면 'paste'대신 'paste0'을 사용하십시오.
  • 분류되지 않은 혼합 등급의 입력 벡터에서 'l'의 일치를 기반으로하는 'l'지수.

0

Python2, 77 바이트

sorted(input(),key=lambda s:float(s[1:].replace("B","-1").replace("+",".5")))

나는 이것이 발췌 문장으로 간주된다고 생각합니다! 결과를 인쇄하거나 함수 정의가 아니기 때문입니다. 람다로 만들거나 결과를 인쇄 할 수 있습니다.
officialaimm

1
@officialaimm 시도는 좋지만 V0 +가 V0 앞에 있으면 작동하지 않습니다.
Setop


0

TXR Lisp : 45 바이트

(op sort @1 :(ret`@(mod(toint @1 32)334)@1`))

운영:

1> (op sort @1 :(ret`@(mod(toint @1 32)334)@1`))
#<interpreted fun: lambda (#:arg-01-0168 . #:rest-0167)>
2> [*1 ()]
nil
3> [*1 (list "V0+" "V0" "V16" "V2" "VB" "V6")]
("VB" "V0" "V0+" "V2" "V6" "V16")

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