綴られたシリアル番号を並べ替える


17

2つ以上の等しい長さの2つ以上のスペルアウトされたシリアル番号のリストがある場合、たとえば

[[ "three" , "one"  , "four"  ],
 [ "one"   , "five" , "nine"  ],
 [ "two"   , "six"  , "five"  ],
 [ "three" , "five" , "eight" ]]

単語が表す数字でリストをソートします。

[[ "one"   , "five" , "nine"  ],
 [ "two"   , "six"  , "five"  ],
 [ "three" , "one"  , "four"  ],
 [ "three" , "five" , "eight" ]]

数字の大文字と小文字を区別する必要がありますが、大文字と小文字を混在させることはできません。

テストケース

[["three","one","four"],["one","five","nine"],["two","six","five"],["three","five","eight"]]
与える
[["one","five","nine"],["two","six","five"],["three","one","four"],["three","five","eight"]]

[["two","seven"],["one","eight"],["two","eight"],["one","eight"],["two","eight"],["four","five"]]
与える
[["one","eight"],["one","eight"],["two","seven"],["two","eight"],["two","eight"],["four","five"]]

[["one","four","one","four","two"],["one","three","five","six","two"],["three","seven","three","zero","nine"]]
与える
[["one","three","five","six","two"],["one","four","one","four","two"],["three","seven","three","zero","nine"]]

[["zero","six","one"],["eight","zero","three"],["three","nine","eight"],["eight","seven","four"],["nine","eight","nine"],["four","eight","four"]]
与える
[["zero","six","one"],["three","nine","eight"],["four","eight","four"],["eight","zero","three"],["eight","seven","four"],["nine","eight","nine"]]


これを正しく取得した["three","one","four"] === 314かどうかわかりませんか?
Nit

@Nitはい、そうです。
アダム

@Nit数字で綴ります。例えば[314,159,265,358][159,265,314,358]
アダム

数字の特定の任意の大文字を仮定できますか?
ディルナン

@dylnanYou may require the numbers to be spelled in lower or upper, but not mixed, case.
totallyhuman

回答:


14

9 8バイト

Ö†€¨tfṡn

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

再帰のStax回答に「触発された」アルゴリズム(検索文字列を少し変更しました)、彼に賛成票を投じてください!

トリックは、各文字を文字列内の位置にマッピングすることですtfsen(このプログラムの最後に圧縮されます)。ハスクリストは1から始まり、不足しているアイテムは0を返すため、次のマッピングを取得します。

"one"        [0,5,4]
"two"        [1,0,0]
"three"      [1,0,0,4,4]
"four"       [2,0,0,0]
"five"       [2,0,0,4]
"six"        [3,0,0]
"seven"      [3,4,0,4,5]
"eight"      [4,0,0,0,1]
"nine"       [5,0,5,4]

ご覧のとおり、リストは完全に並べられています。


明確にするために、Husk(および他の多くの言語)でリスト比較がどのように機能するかを以下に示します。

  1. 2つのリストのいずれかが空の場合、それは小さいリストです。
  2. 2つのリストの最初の要素が異なる場合、最初の要素が小さい方が小さいリストになります。
  3. それ以外の場合は、両方のリストの最初の要素を破棄し、ポイント1に戻ります。

間違っていなければ、「w」もドロップできます。「2」と「3」を比較するだけで便利ですが、すでに「h」があります。それがあなたを助けるかどうかわからない。私は、この事実を実際にはまだ小さいスタックスプログラムに統合する方法を理解していません。
再帰的

...もしそれがただの文字だったとしても、その中にあるtfrsenような言葉が圧縮に役立つwithと推測senしています。
ジョナサンアラン

皆さんありがとう、もっと短い弦を見つけるように私にインスピレーションを与えました:D
レオ

だから、それは最初のコンマの後の小数点でコンマを置き換えるようなものですか?
イチゴ

@Strawberry実際に[1,0,0]はそうではありませんが、より小さいと考えられています[1,0,0,0](ただし、このプログラムでは違いはありません)
レオ

10

スタックス24 22 17 16 14 バイト

▄Ωφ▐╧Kìg▄↕ñ▼!█

実行してデバッグする

このプログラムは、入力用に小文字のスペルの配列を取ります。出力は、そのように改行で区切られています。

one five nine
two six five
three one four
three five eight

このプログラムは、特定の変換で取得した順序を使用して入力をソートします。各単語の各文字は、文字列のインデックスに置き換えられます"wo thif sen"。元の配列はこの順序でソートされます。次に、スペースと結合した後、結果が印刷されます。

スペースには何の意味もありませんが、実際には文字列リテラルをさらに圧縮できます。


Staxはどのエンコーディングを使用しますか?これはUTF-8では32バイトです。
OldBunny2800

5
「バイト」ハイパーリンクが説明するように、CP437を修正しました。
再帰的

そのような文字列を思いつくための標準的なアルゴリズム/方法はありますか?コンセプトには名前がありますか?
板井

@Itai:それはそうのように思えますが、私はそれが何かを知りません。
再帰的

6

ゼリー、12 バイト

OḌ%⁽Т%147µÞ

モナドリンク。

オンラインでお試しください! ...またはテストスイートを見る

どうやって?

数字を序数に変換し、10を底から変換し、4752でモジュロを取得し、147で昇順を指定します。

 zero            , one         , two         , three               , four
[122,101,114,111],[111,110,101],[116,119,111],[116,104,114,101,101],[102,111,117,114]
 133351          , 12301       , 12901       , 1276511             , 114384
 295             , 2797        , 3397        , 2975                , 336
 1               , 4           , 16          , 35                  , 42

 five            , six         , seven               , eight               , nine
[102,105,118,101],[115,105,120],[115,101,118,101,110],[101,105,103,104,116],[110,105,110,101]
 113781          , 12670       , 1263920             , 1126456             , 121701
 4485            , 3166        , 4640                , 232                 , 2901
 75              , 79          , 83                  , 85                  , 108

これは、ソートするキー機能として使用できます。

OḌ%⁽Т%147µÞ - Link: list of lists of lists of characters
          µÞ - sort (Þ) by the mondadic chain to the left (µ):
O            -   ordinals of the characters
 Ḍ           -   convert from base 10
   ⁽Т       -   literal 4752
  %          -   modulo
      %147   -   modulo by 147

それはあなたがすぐに見つけた素晴らしいモジュールです。それは骨の折れる作業だったと思います。
エリックアウトゴルファー

それほど骨が折れるわけではありません-最初にバイナリを調べました。
ジョナサンアラン

モジュロをブルートフォースしたようにね
エリックアウトゴルファー

ええ、でも速かったです。
ジョナサンアラン

6

Python、62バイト

lambda m:sorted(m,key=lambda r:[int(s,36)%6779%531for s in r])

オンラインでお試しください!...またはテストスイートを見る

注意:

lambda m:sorted(m,key=lambda r:[map("trfsen".find,s)for s in r])

Python 2で機能します(3ではありません)は2バイト長くなります。


1
どのようにしてマジックナンバーを発見しましたか?
mbomb007

1
結果が厳密に増加するかどうかを確認するネストされたループ。私はおそらく外側を与えられた内側の桁の長さを制限しましたが。
ジョナサンアラン

5

APL(Dyalog Classic)、12バイト

'nesft'∘⍒⌷¨⊂

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

これは、ダイアディックの適切な左引数を見つける方法です最初に6 を試してみました)。

A←⊖a←↑'zero' 'one' 'two' 'three' 'four' 'five' 'six' 'seven' 'eight' 'nine'
{(aa[⍵⍒a;])∧Aa[⍵⍒A;]:⎕←⍵}¨,⊃∘.,/5⍴⊂∪∊a

3

Perl 6、37バイト

*.sort:{('digit 'X~$_)».parse-names}

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

拡張:

*\     # WhateverCode lambda (this is the parameter)
.sort:
{  # block with implicit parameter 「$_」
  (
    'digit ' X~ $_  # concatenate 'digit ' to each named digit
  )».parse-names    # call .parse-names on each
}

コードブロックはフォームの値を取得し、("three","one","four")それを簡単に使用できる("3","1","4")値に変換し.sortます。


3

APL(Dyalog)、38バイト

{⍵[⍋(531∘⊥⍤1)(531|6779|369+⎕A⍳⊢)¨↑⍵]}

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

ジョナサンアランの素晴らしいソリューションに基づいています


1
@JonathanAllan最初の変更時にクレジットを編集しました。なぜ変更されなかったのかわかりません。現在修正済み
Uriel

1
31:⊂⌷¨⍨∘⍋(531⊥531|6779|36⊥9+⎕A⍳⊢)¨ですが、現在のバイト数の半分以下でこれをはるかに簡単に行うことができます。
アダム

@Adámそれで、あなたは異なる形式(混合と非混合)の入力と出力を許容しますか?
ngn

@ngnもちろん。しかし、私が念頭に置いているソリューションは、完全に混合されたI / Oです。
アダム

3

ルビー、48バイト

->x{x.sort_by{|y|y.map{|s|s.to_i(35)**2%47394}}}

"zero".to_i(35)0であるという事実を悪用します(「z」は35を底とする有効な数字ではないため)、他の9桁のフォーミュラをブルートフォースする方がはるかに簡単です。





2

パイソン285の 81 80バイト

各単語の最初の2文字を使用して番号を決定し、そのインデックス機能をキーとして各リストを並べ替えます。

lambda _:sorted(_,key=lambda L:['zeontwthfofisiseeini'.find(s[:2])/2for s in L])

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

ジョナサンアランのおかげで4バイト節約


キー関数のforループリストの理解は4バイト短くなります。
ジョナサンアラン


1

05AB1E、27バイト

Σ“¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“#skJ

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


Σ                           # Sort input by...
 “¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“     # "zero one two three four five size seven eight nine"
                       #    # Split on spaces.
                        sk  # Find index of each input...
                          J # Join up.


@Kaldo ah ...それぞれの開始2文字をエンコードしていますか?それはそれ自身の答えであると思う。
魔法のタコ

1

Haskell133 122 109 107 106バイト

import Data.List
sortOn$abs.read.(>>=show.head.(`elemIndices`words"ze on tw th fo fi si se ei ni").take 2)

ゴルフをしていない:

import Data.List

nums = ["ze","on","tw","th","fo","fi","si","se","ei","ni"]

lookup' :: Eq a => a -> [a] -> Int
lookup' v = head . elemIndices v

wordToInt :: String -> Int
wordToInt (x:y:_) = lookup' [x,y] nums

wordsToInt :: [String] -> Int
wordsToInt = read . concatMap (show . wordToInt)

sortN :: [[String]] -> [[String]]
sortN = sortOn wordsToInt






0

ゼリー30 28 27バイト

w@€“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»µÞ

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

-1ジョナサンアランに感謝します。

文字列 'onetwo ... nine'の各桁のインデックスを検索し、これをキー関数として使用してソートしÞます。'zero'最初に含める必要はありません。最初の2文字の検索'zero'が失敗し0、インデックスの代わりに返され、'zero'辞書編集的に「早い」ためです。


'one two ... nine'の圧縮を使用すると1バイト少なくなります
ジョナサンアラン

@ジョナサンアランああ、ありがとう。私はそれをチェックするつもりはなかった。圧縮'zeontw...ni'は長くなりました。
ディルナン

...「...最初の2文字」ではなくなりました。
ジョナサンアラン


0

C(clang)、229バイト

y,j,k,t[9];char *s="zeontwthfofisiseeini";r(char **x){for(j=y=k=0;k+1<strlen(*x);k+=j,y=y*10+(strstr(s,t)-s)/2)sscanf(*x+k,"%2[^,]%*[^,]%*[,]%n",t,&j);return y;}c(*x,*y){return r(x)-r(y);}f(*x[],l){qsort(&x[0],l,sizeof(x[0]),c);}

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

文字列の配列をC関数に送信する簡単な方法はないため、code-golfの精神で、入力形式を少し自由にしました。

f()文字列へのポインタの配列を受け入れます。各文字列は数字で、小文字のコンマ区切りの数字で表されます。また、2番目のパラメーターには配列内の文字列の数が必要です。これが受け入れられることを願っています。

f()は、を使用してソートされた順序で所定の位置にあるポインターを置き換えますqsort()
r()コンマ区切りの数値文字列から入力数値を読み取ります。最初の2文字のみを比較して番号を識別します。
c()比較機能です



@ceilingcat説明してくださいstrstr("i"-19,t)-"zeontwthfofisiseeini"。コンパイラ固有ですか、それとも標準ですか?
GPS

その.rodataように見える他のパターンがなく0x69 0x00、コンパイラがアドレスを"i"最後に配置することに依存しています"zeo..."
ceilingcat

そう考えた..コンパイラがそれを確実にする方法はありますか?私はここの規則がこれを許すことを知っていますが、本当にこれに頼ることができますか?
GPS

私の本能は「現実の世界」でこれを避けることですが、文字列の断片が十分に一意であればおそらくこれはうまくいくでしょう。実際には、おそらくスタックカナリアに関連する正当なユースケースがあるかもしれませんが、私は幻覚を感じているかもしれません。
ceilingcat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.