発音並べ替え™


24

さまざまな派手な並べ替えアルゴリズムを知っていますが、これらのどれも発音しやすい方法で数字を提供しません。これを改善するために、私は発音リストを並べ替える最も自然な方法である発音ソート™の使用を提案します。

発音

(このチャレンジで)数字を発音するための公式ルールは、数字が1つずつ発音され、結果の文字列が辞書式順序でソートされるということです。例として、これは番号845が発音されることを意味し、"eight four five"それに応じてソートする必要があります。

負の数

負の数は、単語の前に付けて発音し"minus"ます。したがって、-23と発音され"minus two three"ます。これにより、4(4)と9(9)で始まる数字の間の負の数が出力の途中で終わることに注意してください。

GuideSoとしての発音並べ順の公式の順序は次のとおりです。

  • 8
  • マイナス
  • 1
  • セブン
  • ゼロ

あれは、

8, 5, 4, -, 9, 1, 7, 6, 3, 2, 0

入力

範囲の整数のリストで、最大100個の要素が含まれます。文字列のリストとしての入力は許可されていません。ご使用の言語がリストとしての入力をサポートしていない場合、入力を個別の整数として許可することができます。[999999]

入力には、無効な数字や0で始まる数字(数字0自体を除く)は含まれません。通常、入力はソートされず、任意の順序で指定できます。

出力

同じ整数、発音Sort™順。数字は、ソートを取得するために発音に変換するだけであり、出力には文字列を含めないでください。

例では、中間のステップ(括弧で囲まれた)はガイドとしてのみ機能し、出力の一部ではありません。

[1, 2, 3] -> (['one', 'two', 'three']) -> [1, 3, 2]
[-1, 0, 1, 2] -> (['minus one', 'zero', 'one', 'two']) -> [-1, 1, 2, 0]
[-100, 45, 96] -> (['minus one zero zero', 'four five', 'nine six']) -> [45, -100, 96]
[11, 12, 13, 134, 135] -> (['one one', 'one two', 'one three', 'one three four', 'one three five']) -> [11, 13, 135, 134, 12]

結果を確認するためスクリプトもあります


5
「1」(「勝った」と発音)が2の後、ゼロの前に来ないのはなぜですか?
ベンミラー-復帰モニカ

3
@BenMillerサンドボックスでコメントしたのはあなたかどうかは思い出せませんが、そのコメントはdeja vuを与えてくれました。ここで答えるために、私はそれを熟考しましたが、スペルディスカッションを避けるためにスペルを使用しました(たとえば、 "two" vs "too"、 "won"、または "wan")
maxb

17
実際にはより多くの「発音がソート」よりも「スペルソート」です:-)それはとても
サンパウロEbermann

3
残念。私は彼らが発音がどれだけ難しいかでソートされることを望んでいた...
NH。

2
ここでのソートは実質的に発音とは関係がないため、この課題は実際に名前を変更する必要があります。それは発音に基づく(例えば、だったらそれは非常に、より複雑になり、4つの前に来るかもしれない5もしあなたがソートmonophthong⟨ɔː⟩二重母音の⟨aɪ⟩前に、しかし54ソートOの前に⟨a⟩由来の場合-derived⟨ɔ⟩–私の知る限り、IPAでも他のスキームでも、発音のソート順序は確立されていません。
ヤヌスバズジャケ

回答:


8

05AB1E(レガシー)、15バイト

Σε•Koéa₃•'-3ǝsk

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

説明

Σ                 # sort by
 ε                # apply to each
             sk   # index of the element in
  •Koéa₃•         # "85409176320"
         '-3ǝ     # with "-" inserted at index 3

圧縮整数にバグがあるよう•ĆU‘•です。何らかの理由でマッピング/ソート中に改行が追加されます。Σ•ĆU‘•"54-ÿ"sSkその奇妙なバグがなければ、私が取り組んでいた15バイトの代替品だったかもしれません。. •ĆU‘•リテラルに変更した場合、9176320 それはうまく動作します ..
Kevin Cruijssen

1
@KevinCruijssen:それは奇妙です。あなたのものは…54-ì偶数で14
エミナ

@KevinCruijssen:Σ•RT‹•Á…54-ìsSk15でできること
エミグナ

•t∍ýJ•'-ìÁÁまた動作します
エミグナ


8

ゼリー 15  13 バイト

ṾV€ị“Þ⁽3Z6»µÞ

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

整数のリストを受け取る単項リンクは、整数のリストを生成します。

どうやって?

-マジックストリング「murgeon lix」の1ベースのモジュラーインデックスの文字を使用して、文字列に変換された整数の桁の順序値(-1は「桁」)でソートします。

ソートは、スペースがどの文字よりも小さいと見なされる場合、事実上アルファベット順になります。

魔法の文字列「murgeon lix」は、圧縮で使用されるJellyの辞書を調べることで発見されました。要件を満たす11文字の単語はありません(重複排除ではそれ以上のものはありません)。スペースは文字の前にソートされるため、次に最も明白な選択は、長さ7の語の後にスペースが続き、長さ3の語が続くことです。「murgeon」と「lix」は唯一の満足できる組み合わせですが、スペースがなければ他の組み合わせも可能です(たとえば“£Py:ƥ»、同じバイト数で機能する「murgeonalix」)

ṾV€ị“Þ⁽3Z6»µÞ - Link: list of integers
            Þ - sort by:
           µ  -   the monadic link: -- i.e. do this for each integer, then sort by that
Ṿ             -     unevaluate  (e.g. -803 -> ['-','8','0','3'])
 V€           -     evaluate each as Jelly code  (e.g. ['-','8','0','3'] -> [-1,8,0,3])
    “Þ⁽3Z6»   -     "murgeon lix" (compression of words in Jelly's dictionary plus a space)
   ị          -     index into (1-indexed & modular) (e.g. [-1,8,0,3] -> "i xr")

前@ 15バイト

ṾV€ị“¡Zo⁶’Œ?¤µÞ

ここで“¡Zo⁶’Œ?¤は、数値のすべての順列が辞書式にソートされるときに、インデックス21,340,635に存在する自然数の最初の順列を見つけます[6,10,9,3,2,8,7,1,5,4,11]。(“¡Zo⁶’21340635のベース250表現ですŒ?が、計算を行い、¤これらの命令をグループ化します)


説明があっても、私はあまり賢く感じません。素晴らしい解決策!
maxb

短いバージョンの方がおそらく理解しやすいでしょう!
ジョナサンアラン


6

JavaScript(SpiderMonkey)、69バイト

a=>a.sort((a,b)=>(g=n=>[...n+''].map(c=>':598217604'[c]||3))(a)>g(b))

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


を削除できるように見え+''ますが、入力を文字列の配列として受け取っているように見えます。
シャギー

@Shaggyここで許可されているかどうかわからないので、もう文字列を取得していません。
アーナルド

ああ...そうです。それは私のソリューションに数バイトを追加するつもりです。
シャギー


6

Python 3、68バイト 67バイト 64バイト

lambda x:sorted(x,key=lambda y:[*map('54-9176320'.find,str(y))])

sortedキーに匿名ラムダを備えた組み込み関数を使用します。ソート順をハードコーディングし、入力リストの各値の各桁をソート順リストの位置と比較します。

編集:パラメータが見つからないとき8str.find戻ることを利用するためにソートリストから削除することにより1バイトを保存し-1ました。maxbに感謝します。

Edit2:コンストラクターのlist代わりにリテラルでスター付きアンパック構文を使用して3バイトを保存しましたlist

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


1
文字列の最初の8つを削除してもらえますか?サブストリングが見つからない場合、Pythonは-1を返します。
maxb

@maxb良いキャッチ。編集済み。
-mypetlion


5

Pyth、17 16バイト

oxL"54-9176320"`

ここでオンライン試すか、ここですべてのテストケースを一度に確認してください

oxL"54-9176320"`NQ   Implicit: Q=eval(input())
                     Trailing N, Q inferred
o                Q   Order the elements of Q, as N, using...
               `N      Convert N to string
 xL                    Get the index of each character of that string...
   "54-9176320"        ... in the lookup ordering
                       (if character missing, returns -1, so 8 is still sorted before 5)

辞書文字列の先頭から8を省略することで、@ ngnとそのK回答のおかげで1バイトを節約しました


4

Japt、19バイト

ñ_s ®n"54-9176320

それを試してみてください


いい解決策!残念ながら、文字列のリストとしての入力は許可されていません。
maxb

あなたは悪用により、一部を保存することができますS.n(s)ñ_s ®n"54-9176320(明らかにS.n(s)正確に同じであるs.b(S)ためS、それは返すことを除いて、長さ1の0代わりに-1
ETHproductions

ナイストリック、@ ETHproductions、ありがとう:)将来のために覚えておく必要があります。
シャギー

3

Retina 0.8.2、36バイト

T`-d`3:598217604
O`
T`3:598217604`-d

オンラインでお試しください!リンクにはテストスイートが含まれます。説明:

T`-d`3:598217604

:10番目の位置を使用して、マイナス記号と数字を発音順にその位置に変換します。

O`

発音順に並べ替えます。

T`3:598217604`-d

注文を元のマイナス記号と数字に戻します。



3

R、58バイト

function(x)x[order(mapply(chartr,"-0-9","dkfjicbhgae",x))]

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

入力は、を使用して文字列として暗黙的に変換される数値のリストですchartrorder次に、辞書式順序を使用して、元のリストを並べ替える順序を取得します。


3

Java(JDK 10)、123バイト

l->l.sort(java.util.Comparator.comparing(n->{var r="";for(var c:(""+n).split(""))r+=11+"54-9176320".indexOf(c);return r;}))

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

これは単純なJava実装です。ゴルフができるはずです。

クレジット


1
.chars-IntStreamを.reduce通常のループに変更すると、2バイト節約されますn->{var r="";for(var c:(""+n).split(""))r+=10+"854-9176320".indexOf(c);return r;}。さらに、に変更10+"85する20+"5と、.indexOfforの数字8が-1になるため、もう1バイト節約できます。オンラインで123バイトを
ケビンクルーイッセン



2

C ++、353バイト

これは一種のコメディエントリですが、時間を無駄にして書きましたので、投稿することはできません...笑い声をお楽しみください。

#include<algorithm>
#include<iostream>
#include<iterator>
#include<numeric>
#include<string>
using namespace std;auto f(int i){auto s=to_string(i);for(auto&c:s)c='A'+"854-9176320"s.find(c);return s;}int main(){int a[100];auto b=begin(a);auto e=end(a);iota(b,e,-50);sort(b,e,[](int l,int r){return f(l)<f(r);});copy(b,e,ostream_iterator<int>(cout," "));}

出力:

8 5 4 48 45 44 49 41 47 46 43 42 40 -8 -5 -50 -4 -48 -45 -44 -49 -41 -47 -46 -43 -42 -40 -9 -1 -18 -15- 14-19-11-17-16-16-13-12-10-7-6-6-3-38-35-34-39-31-37-36-33-32-30-2-2-28-25-24- 29-21-27-26-23-22-20 9 1 18 15 14 19 11 17 16 13 12 10 7 6 3 38 35 34 39 31 37 36 33 32 30 2 28 25 24 29 21 27 26 23 22 20 0


「Enterを押さないとデバッグする行が減る」というモットーであなたも生きていることがわかります
-maxb

1
ねえ、私はこの言語で軽薄な空白を買う余裕はありません!これをしなければならないのは面白いです、他の時間を見て、他の人のコードを開くほど怒っていることはほとんどありません入力するすべての改行に対して。
underscore_d

1
こんにちは!ソリューションを195文字に
絞りました

@MaxYekhlakovクール、熟考してくれてありがとう!もう少し読んだ後、気づきました。私は必ずしも完全なコンパイル可能なプログラムを提供する必要はないようですが、代わりに指定された入力と出力を処理する機能のみを提供しました。ど!
underscore_d

2

Mathematica、68バイト

SortBy[If[# < 0,"m ",""]<>StringRiffle@IntegerName@IntegerDigits@#&]

関数。整数のリストを入力として受け取り、ソートされたリストを出力として返します。各数字の数字をで区切るだけでIntegerDigits、各数字を"zero""one"などにIntegerName変換し、で、リストをスペース区切りの文字列に変換し、数字が負の場合StringRiffleに先頭に追加し、"m "この文字列に基づいてソートします。実際、これはMathematicaが同じ長さのリストに対して辞書式ソートのみをネイティブに使用するため、私が見つけることができる最短のアプローチでした。したがって、854-9176320文字列関数は非常に高価であるため、最終的にはより多くのバイトを使用することになります。


組み込みの組み合わせを持つ数学を常に信頼します。賢い解決策!
maxb

1

05AB1E15 14 バイト

Σ•ĆU‘•…54-ìsSk

@Emignaのおかげで-1バイト。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

Σ                 # Sort by:
 •ĆU‘•            #  Push the compressed integer 9176320
      54-        #  Push the string "54-"
          ì       #  Prepend this string before the integer: "54-9176320"
           s      #  Swap so the current number to sort is at the top of the stack
            S     #  Convert it to a list of characters
             k    #  Check for each its index in the string (resulting in -1 for '8')

この05AB1Eのヒント(大きな整数を圧縮する方法のセクション)を参照して、その理由を理解し•ĆU‘•てください9176320

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.