整数のアルファベット化


19

整数のアルファベット化

与えられた数字のセットについて、それらが綴られるときにアルファベット順に並べます(すなわち、1:1、2:2、90:90、19:19)。コードは範囲で機能するはずです[-999999, 999999]。出力には、数字の間に区切り文字が必要です。以下の例に示すように、スペースとカンマが機能するように、スペースが機能します。入力は、整数の配列、区切られた数字の文字列、または適切と思われる文字列です。すべての整数は一意であると見なされます。

このチャレンジのために数字はハイフネーションされず、スペースは他の文字の前にアルファベット順になります。負の数は、単語を使用して表現されると想定されますminus。たとえば、four前に、文字列を使用してfour thousand番号-40がソートされますminus forty。すべての数字は数字の単語のみで構成され、接続詞は含まれないと仮定します(例:のtwo thousand forty two代わりに使用two thousand and forty two


テストケース

1桁の整数:

入力:

1, 2, 3, 4, 5

出力:

5, 4, 1, 3, 2

複数桁の整数:

入力:

-1002, 5, 435012, 4, 23, 81, 82

出力:

81, 82, 5, 4, 435012, -1002, 23

単語間のスペース、ハイフンなし、コンマまたは「and」:

入力:

6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804

出力:

6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204

これはであるため、バイト数が最も少ないコードが優先されることに注意してください。抜け穴はありません!


関連するサンドボックスの投稿へのリンクはこちらです。
wubs

入力には単一の整数が複数含まれますか?
ETHproductions 16

@ETHproductionsいいえ、そうではありません。質問でそれを指定します。
wubs 16

8
PPCGへようこそ。素敵なアバター。:D素敵な最初の質問。
AdmBorkBork 16

@TimmyDありがとう!PowerShellを使用して、ここでできることをすべて楽しみにしています。
wubs

回答:


5

JavaScript(ES6)、189 179 186バイト

let f =

a=>a.sort((x,y)=>!x-!y||(X=q(x),Y=q(y),X>Y)-(X<Y),q=n=>n<0?"L"+q(-n):n>999?q(n/1e3)+"Z"+q(n%1e3):n>99?q(n/100)+"K"+q(n%100):n>19?"  cYHFVSCO"[n/10|0]+q(n%10):"0PdaIGTQAMWDbXJEURBN"[n|0])

let g = a => console.log(`[${f(a)}]`)

g([1,2,3,4,5])
g([-1002,5,435012,4,23,81,82])
g([0,1000,1100])
<input id=I value="1 2 3 4 5"><button onclick="g(I.value.match(/\d+/g)||[])">Run</button>

基本的な考え方は、各入力数値を、他のすべての数値と文字列のペアと比較して正しい辞書順の位置にある短い文字列に変換することです。使用する辞書は次のとおりです(スニペットを実行しないでください。長いリストを非表示にするためだけに使用されます)。

これにより、各数字を辞書的に正しい位置にマッピングする非常に簡潔な方法が作成されます。それが再帰q関数の機能です:

q(-X)        => "L" + q(X)
q(XYYY)      => q(X) + "Z" + q(YYY)
q(XYY)       => q(X) + "K" + q(YY)
q(XY >= 20)` => "  cYHFVSCO"[X] + q(Y)
q(X)         => "0PdaIGTQAMWDbXJEURBN"[X]

0文字列の先頭には、その例えば100を確保することである(one hundredに変換PK0)の前にソートされている101one hundred oneに変換PKP)。これにより、0(zero)が配列の前にソートされるという奇妙なシナリオが作成されるため、これを回避するには、ソート関数でまず0を右にソートし!x-!y||(...ます。


動作しないようです[1100, 1000]。出力はになるはず1000 (one thousand), 1100 (one thousand one hundred)ですが、出力は入力と同じ順序です。
ミルク

@milkうーん...なぜこれが起こるのかわかりませんが、調べてみます。
ETHproductions 16

@milk Ah、1000として解析されていone thousand zeroます; これを一時的に修正します。0ただし、独自にサポートする必要がありますか?私のコードに15バイトかそこらを追加するユニークなケースです。
ETHproductions 16

11

図7に示すように、通知214 201 118バイト

Inform 7はゴルフにとって非常に恐ろしい言語なので、ここでチャンスを与えたいと思いました。

インデントにはタブ(\t)文字を使用する必要がありますが、HTMLはそれらを好みません。逆に、Informはインデント用のスペースを好まないため、ここからコードをコピーして貼り付けてテストする場合、スペースをタブに置き換える必要があります。または、代わりにMarkdownソースからコピーアンドペーストするだけです。

ゴルフ:

Xへ:
    表1を繰り返します。
        現在、Qエントリは「[単語のRエントリ]」です。
    表1をQ順に並べ替えます。
    「[R in Table 1]」と言います。

入力は、次のようなInformテーブルである必要があります(\t列間):

表1
R(数値)Q(テキスト)
-1002
5
435012
4
23
81
82

出力:

81、82、5、4、435012、-1002、23

この関数はテーブルを1回実行し、新しい列の各数値のテキスト表現を追加します。次に、テキスト列に従ってテーブルの行を並べ替えます。Informでは、文字列は辞書式にソートされます。最後に、元の列を新しい順序で印刷します。便利なことに、Inform 7の表列を印刷するための「粗いが時には役立つ」形式は、要求どおりにカンマ区切りになっています。

Ungolfed、ボイラープレートは関数の呼び出し方法を示しています:

数字をアルファベット順に印刷するには:
    ソート可能な数字の表を繰り返します。
        現在、名前エントリは「[単語のインデックスエントリ]」です。
    ソート可能な数値のテーブルを名前順にソートします。
    「[ソート可能な数字のテーブルのインデックス列]」と言います。

ソート可能な数字の表
インデックス(番号)名前(テキスト)
-1002
5
435012
4
23
81
82

部屋があります。
プレイが始まるとき:アルファベット順に数字を印刷します。

1
私はこれに少し混乱しています。あるwords知らせ7に組み込まれている数字のスペルアウトのバージョンの参照は、?
パベル

1
@Pavel確かに!「(number)in words」は、数値のテキスト表現を含む文字列を返します。負の数に「マイナス」を使用すると便利で、単語間にハイフンを挿入しますが、すべての文字の前にハイフンを一貫してアルファベット順に並べます(したがって、最終結果は同じです)。
ドラコニス

2
言語選択の場合は+1。確認する必要がありますが、ゴルフの機会はまだ残っていると思います。たとえば、パーサーはこれらすべての「the」記事を本当に必要としますか?そして、OPに尋ねる必要がありますが、「および」が有効な区切り文字ではない明白な理由はわかりません。たとえそうでなくても、単一のスペースが明示的に許可されているので、それでsay "[R entry] "十分です。
イルマリカロネン16

最後の「and」は問題ありません。区切り文字は均一でなければならないとは言わなかったので、これは完全に受け入れられる答えです。最も興味深い答えにポイントを与えることができれば、私はあなたにそれを与えるでしょう。私はこの言語の読みやすさを本当に楽しんでいます。良くやった!
wubs

私はついにInform7を少し試してみる機会を得て、なんとかわずか118バイトまでエントリーを再ゴルフすることができました。Informコードをコメントに投稿することはうまく機能しないため、先に進み、直接あなたの回答に編集しました。あなたが気にしないでください、あなたが好きなら、私の編集を元に戻したり、微調整したりしてください。
イルマリカロネン16

4

Mathematica、67バイト

SortBy[#,#~IntegerName~"Words"~StringReplace~{","->"","-"->""}&]&

引数として整数のリストを取り、値として整数のリストを返す名前のない関数。#~IntegerName~"Words"は、整数を英語の名前に変更するビルトインです。IntegerName出力にコンマとハイフンが含まれている場合があるため、StringReplace呼び出しはそれらを取り除きます。(残念ながら、ハイフンは実際にはUTF-8の8208の3バイト文字です。)次にSortBy、変更された整数名の値に従って元のリストをアルファベット順にソートします。

偶然の一致:出力でIntegerNamenegativeなくを使用minusします。ただし、これら2つの単語の間に許可された数字の名前に含まれる単語はアルファベット順ではないため、置換する必要はありません。

(私に思い出させるためのngenisisのヒントSortby


称賛!私はこの解決策に非常に近づきましたが、そのダッシュは私に頭痛を与えていました!
ngenisis

ここでの答えは、実際には正しいハイフンを使用していますか?ここにあるものをMathematicaにコピーしても、のハイフンは置き換えられませんIntegerName。Wolframのドキュメントには、それがUnicode文字2010であると書かれています。
ngenisis 16

おそらくそうではありません。この答えで正しいハイフンを取得しようとしましたが、成功しなかったようです。
グレッグマーティン

私はあなたの答えを半分にカットしました;)
J.アントニオ・ペレス

そして、いくつか...文字列に不要な変更を加えます。
J.アントニオペレス

4

Bash + GNU utils + bsdgames、52

  • @izaberaのおかげで4バイト節約されました。
sed 's/.*/echo `echo &|number`:&/e'|sort|sed s/.*://

I / Oは改行で区切られた行です。

  • 最初のsed式は、各数値を(bsdgamesで指定された)数値の単語形式を出力するシェルコマンドで置き換えますnumberユーティリティで指定)、:その後に数値形式の数値を続けます。
  • これは sort編集されます。
  • 次に、2番目sed:、を含む先頭の文字を削除し、必要に応じて数値形式をソートします。

number 「マイナス」を正しく処理し、その出力は特定のフォーマットに十分近いため、 sort、必要に応じ機能です。「44」の代わりに「44」を出力しますが、これはソートの観点からは問題ではありません。

bsdgamesパッケージのインストールが必要な場合があります。

sudo apt-get install bsdgames

ユーティリティは、お使いのディストリビューションではすでにほぼ確実です。sedsort


-t:役に立たず、使用することができますnumber<<<&
izabera

@izaberaはい-ありがとう- -t:。ただし、sedのeval機能はを使用してコマンドを実行するshため、bash機能は機能し<<<ません。
デジタル外傷

shがbashである限り正常に動作します:P
izabera

@izabera Nope- shPosix shを可能な限りエミュレートしようとしてbashが開始された場合、これはbashism <<<がオフになっていることを意味します。GNU sedeヴァル機能では、とコマンドを起動/bin/sh -c ...していません/bin/bash -c ...。これを試しましたか?
デジタル外傷

bashはオフになりません<<<ではないとしても、POSIXモードでは、
izabera

1

Python +活用、97 91 89バイト

from inflect import*
a={x:engine().number_to_words(x)for x in words}
sorted(a,key=a.get)

を使用しました inflectライブラリをwords、整数の配列を音声/文字列表現に変換しました。キーが数値表現で、値が文字列表現であるk / vペアの辞書に格納されます。値でソートされたキーのリストを返しました。

編集:ETHproductionsとAlex.Sのおかげで、5バイトと3バイトを節約しました!


PPCGへようこそ!スペース削除することでこれをゴルフできます。たとえば、2行目はですa={x:inflect.engine().number_to_words(x)for x in words}
ETHproductions 16

2行目を使用from inflect import*して2バイトを捨てることができますinflect.
Alex.S 16

残念ながら、これもリスト40、44、40000、40804、40004、40204を正しく並べ替えることができないようです(この順序のままである必要があります)。
イルマリカロネン16

0

Mathematica、30バイト

以下の答えは、整数のリストを入力として受け取り、それらをアルファベット名でソートする純粋な関数を出力します。ちょうど医者が注文したもの;)

SortBy[#~IntegerName~"Words"&]

以下は、バージョン化されていないバージョンです。

SortBy[IntegerName[#, "Words"]&]

次に、使用例を示します。

SortBy[#~IntegerName~"Words"&][{0,1,2,3,4,5,6,7,8,9,10}]

次のように書くこともできます

SortBy[#~IntegerName~"Words"&]@{0,1,2,3,4,5,6,7,8,9,10}

それらは同一の出力を生成します-数学でf[x]は、と同等f@xです。

Outputs: {8, 5, 4, 9, 1, 7, 6, 10, 3, 2}

別のユーザーがMathematicaに投稿した回答がはるかに長い。その答えは、数学が代数化する方法のいくつかの小さな違いを修正しようとしていますが、OPが述べた数を代数化する方法によりよく一致しますが、修正するものはソート順に影響せず、私の答えはそれらと同じように出力します:

MyF = SortBy[#~IntegerName~"Words"&];
TheirF = SortBy[#, #~IntegerName~"Words"~ StringReplace~{"," -> "", "-" -> ""} &] &;
MyF[Range[-999999, 999999]] == TheirF[Range[-999999, 999999]]
(*Outputs True*)

すばらしい調査です!—残念ながら、彼らは実際には同じ命令をしません。TheirF888を880,000の前に正しくソートしますが、ソートしMyFません。おそらく、問題は奇妙なハイフンのコピーと貼り付けにあります:あなたのバージョンTheirFはおそらく通常のハイフン(ないもの)を置き換えているのに対して、実際のバージョンは奇妙な3バイトUnicodeハイフンを置き換えています。(コンマを削除する必要があるかどうかを確認することはまだ興味深いでしょう。)
グレッグマーティン

Range [999999]でテストしました。カンマを削除する必要はないようですが、「[Hyphen]」を「」に置き換える必要があります。
ngenisis

0

Common Lisp、113バイト

外部ライブラリは必要ありません。

(print(mapcar #'cdr(sort(loop for i in x collect(cons(format()"~r"i)i))(lambda(y z)(string-lessp(car y)(car z))))))

出力場合xです'(1 2 3 4 5)

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