登山グレードを並べ替える


33

私の最初のコードのゴルフ投稿、間違いをおologiesびします...

コンテキスト

ロッククライミング(特にボルダリング)では、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']

これは挑戦です。


次回は、これをサンドボックスに投稿しますに投稿して、投稿する前にフィードバックを取得します。第二に、あなたは本当にあなた自身の挑戦に答えるべきですか?
イアンH.

入力に重複した成績が表示されますか?
ミスターXcoder

@ Mr.Xcoder重複なし
-Chris_Rands

7
PPCGへようこそ!最初の質問にはかなり明確でいい。(y)
officialaimm

3
とてもいい最初の質問!それがもたらした答えは非常に多様で創造的です。:)
リン

回答:


23

Pythonの258の 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バイトです。
リン

1
a=>a.sort((a,b)=>(g=s=>eval(s.slice(B10=1)+10))(a)-g(b))は2バイト短くなりますが、それでも長すぎます。
アーナウルド

@GBそれは有効だったと思いますが、今では間違いなく有効です。
リン

なぜ短い「10」を使用しないのですか?たとえば、「2」は2バイトを節約します。
GB

1
@GBトリックは、8進数表記「010」から「V0」の10進数として8への変換をトリガーすることです。2では、「02」= 2になります。これは「0 + 2」と同じです。
アルノー

15

JavaScript(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)。
アーナルド

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で機能するハックですが、実際には符号付きの値を返すことになっています。ご意見ありがとうございます!
アーナルド

12

、5バイト

ÖiÖm±

オンラインでお試しください! 結果は1行に1つずつ出力されますが、内部的にはこれは文字列のリストを受け取って返す関数です。

説明

これは、MartinのRetina answerと驚くほど似ています。最初にÖm±、「マッピングによるIS桁による順序付け」を意味します。これはプットVBV0そしてV0+正しい順序で、彼らは次のように比較されているため[0,0][0,1][0,1,0]。次にÖi、「整数値で並べ替える」という意味です。文字列を指定すると、iその中にある最初の数字列を整数として返します。見つからない場合は0を返します。上記の3つの文字列はすべて0にマッピングされ、ソートは安定しているため、出力では正しい順序になります。


11

網膜、14バイト

B
!
O`
!
B
O#`

オンラインでお試しください!

説明

B
!

置き換えるB!グレードプットのように辞書式順序VB(又は、その後V!すべての数値等級の前に)。

O`

すべての入力行を辞書式にソートします。これは正しい結果を与えませんが、V! < V0 < V0+正しく順序付けします。

!
B

V!戻りVBます。

O#`

行を数値順に並べ替えます。Retinaは、文字列内の最初の10進数を検索して、ソートキーを決定します。番号がない場合(forなどVB)、値をに設定します0。つまりVB、すべてのを意味し、同じソートキーV0V0+持ちます。しかし、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()an IOrderedEnumerableが必要である必要はありません。
TheLethalCoder

申し訳ありませんが誤ってSystem.Linqの参照を削除し、修正しました
LiefdeWen

@TheLethalCoderあなたはいつものように正しい、84バイト
-LiefdeWen

@LiefdeWen .Remove(0,1)の追加-1バイト:)
イアン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}バイトを保存します。
リン



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

ここで物事を始めるのが私のPython 3ソリューションです...謝罪、これは慣習に反してあまりにも早く投稿し、今は再投稿しています...

Pythonの369の 67バイト

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

オンラインでお試しください!


5
すぐに自分の課題に答えることはお勧めしません。他の人が回答するために少なくとも48時間、おそらくもっと長い時間を与えてください。
TheLethalCoder

@TheLethalCoderそうそう、Stack Overflowではこのような振る舞いが奨励されています!回答を削除する必要がありますか?
Chris_Rands

@Chris_Randsはい、削除することをお勧めします。
ミスターXcoder

9
@Downvoter:クールではないことに眉をひそめられていると知らなかった何かをするために新しいメンバーをダウン投票する。Lethalがやったように、すべきではないことを単に指摘する方がはるかに良い。
シャギー

ただし、誰かがあなたのソリューションを投稿しない場合は、歓迎します。もちろん待った後
-TheLethalCoder

1

Swift 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)-各文字列をbase-32数値から10進数に変換します。値が「V0 +」の場合、への呼び出しInt(_:radix:)はnilを返し、「V0」の値992を取得します。さらに、の結果を取得し、mod 334最終的にStringに変換します。

  • +$0-上記で作成した文字列に現在の値を追加します。たとえば、文字列がの場合、V9上記の関数が返され333、を追加V9して結果がになり333V9ます。

  • var r={...}-変数rを匿名のクロージャーに宣言します。これは、変数が2回使用されるため、多くのバイトを節約できるためです。

  • 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="","",~)null入力を修正します。これがない#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必要なのはそれだけですが、正しく並べ替えることを確実にするために余分な2倍にするために、もうバイトはかかりません。
    • IfError(Find(~),Value(~)) を返します Find文字列が見つかった場合値を(つまり、グレードはVB、V0、またはV0 +です)。見つからない場合は、成績に9を加えた数値を返します。
    • Transpose(IfError(~))再びそれを列に変えてSort使用できるようにします。
  • Sort(Transpose(Split(~)),Transpose(IfError(Find(~),Value(~)+9)),1) カスタムソート順の昇順を使用して分割入力をソートすることにより、すべてをまとめます。
  • ArrayFormula(~)配列全体の最初の値を返すのではなく、結果を配列として返すように全体をラップします。これが、1つのセルの数式がその下のセルを埋める原因となります。

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ます。残りについては何もしません。

我々が使用するリストソートするData.ListsのをsortOn(リンにより示唆されるように)ポイントフリー機能を作成する機能を。


それだけでg=sortOn f、これもにありData.Listます。
リン

1
また、f(_:'1':a)='X':a4バイト節約できます!
リン

1
@Lynn最初の提案は機能しますが、2番目の提案は機能しません。[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 nicetry。V0+がV0より前の場合は機能しません。
セトップ


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.