バンド名を並べ替える


22

チャレンジの説明

あなたのような、名前をそれぞれ有する多くのバンドによって記録された多くのトラック、との音楽ライブラリを持ってQueenAerosmithSunny Day Real EstateThe Strokes。オーディオプレーヤーがライブラリをバンド名のアルファベット順に表示する場合、The多くのバンド名がで始まるため、通常はその部分をスキップTheします。これにより、メディアコレクションを簡単にナビゲートできます。この課題では、文字列のリスト(配列)を指定して、そのようにソートする必要があります(つまりThe、名前の先頭の単語を省略します)。メソッドまたは完全な作業プログラムを作成できます。

サンプル入力/出力

[Queen, Aerosmith, Sunny Day Real Estate, The Strokes] -> [Aerosmith, Queen, The Strokes, Sunny Day Real Estate]
[The Ramones, The Cure, The Pixies, The Roots, The Animals, Enrique Iglesias] -> [The Animals, The Cure, Enrique Iglesias, The Pixies, The Ramones, The Roots]
[The The, The They, Thermodynamics] -> [The The, Thermodynamics, The They]

メモ/エッジケース

  • 辞書順にソートする場合は大文字と小文字が区別されないためThe PoliceThe policethe policeはすべて同等であり、

  • アルゴリズムでは最初のthe単語のみを省略する必要があるため、名前の付いたバンドThe TheまたはThe The Band通常は2番目の単語でソートされますthe

  • The(3文字の単語)という名前のバンドは、通常(スキップなし)にソートされます。

  • 同じ名前を持つ2つのバンドの順序。そのうちの1つtheThe PoliceおよびなどPolice)で始まるものは未定義です。

  • バンドの名前が複数の単語で構成されている場合、それらは単一のスペース文字で区切られていると想定できます。先頭または末尾の空白を処理する必要はありませんが、

  • 入力文字列はすべて一致します[A-Za-z0-9 ]*。つまり、英語のアルファベットの小文字と大文字、数字、スペース文字のみで構成されます。

  • これはチャレンジであることを忘れないでください。可能な限りコードを短くしてください。


数字のみの名前はアルファベットの前または後ろに来ますか?
AdmBorkBork

数字のみの文字列が最初に来る
-shooqie

1
Theand のソート順は何The Theですか?(未定義以外の場合、ほとんどの回答はおそらく変更する必要があります)
ブラッドギルバートb2gills

ロスロボスはどうですか?
-njzk2

3
ちなみに本物のバンドです。(と一緒に、何を、ときに、なぜ、そしてどのように)
DanTheMan

回答:


7

Python、56 62 64バイト

lambda b:sorted(b,key=lambda x:(x,x[4:])[x.lower()[:4]=='the '])

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

ストリップは一致するすべての文字をブラストして空白文字列としてソートしていたため、正しくlstrip()処理していなかったことを指摘してくれた@Chris HとThe The、使用中の欠陥を見つけるための@manatworkに感謝しreplace()ます。新しいバージョンが動作するはずです。

古いバージョン:

lambda b:sorted(b,key=lambda x:x.lower().lstrip('the '))

1
私は確信していません。最後のリストに「動物」を追加すると、が得られ['The The', 'The', 'The Animals', 'Thermodynamics', 'The They']ます。2番目のエッジケースは、座っていることを示唆します['動物'、 'The'、 'The'、 'Thermodynamics'、 'The They'](または2番目と3番目のアイテムを交換)。少しいじることは、内部のスペースstrip('the ')が無視されていることを示唆しています-試してみてくださいfor x in ['The The', 'The They', 'Thermodynamics', 'The', 'The Animals']: print (x.lower().strip('the '))
クリスH

それreplace()はあまり良くありません:'what the snake'.replace('the ','',1)results 'what snake'
マナトワーク

5

V32 28バイト

ç^The /dwA_
:sort
ç_/$xIThe 

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

自己への注意::sort単一のコマンドで6バイト全体を必要としないように、略語を作成してください!

説明:

ç^The /     "On every line starting with 'The ',
       dw   "Delete a word
         A_ "And (A)ppend an underscore '_'

:sort       "Sort all lines alphabetically

ç_/         "On every line containing an underscore,
   $x       "Delete the last character
     IThe   "And prepened 'The '

Vには慣れていませんが、アスタリスクがなくても正常に機能するようです。これは入力と一致するのですか、それとも実際には不要ですか?
kirkpatt

1
@kirkpattいいね!それはほとんど機能しますが、完全ではありません。たとえば、この入力では、「The Ramones」および「The Roots」の後に誤って「Radiohead」が配置されます。しかし、それは私にアイデアを与えてくれます...
DJMcMayhem

theすべて小文字の場合、the pAper chAseどうなりますか?
AdmBorkBork

4

網膜、34バイト

後続の改行は重要です。

%`^
$';
T`L`l`.+;
m`^the 

O`
.+;

I / Oはラインごとに1バンドです。

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

説明

%`^
$';

;セパレータとして使用して、各行を複製します。

T`L`l`.+;

aの前のすべてを;小文字にします。

m`^the 

the行の先頭にあるsを削除します。

O`

行を並べ替えます。

.+;

ソートに使用した行の先頭を削除します。


最初の3つのステップを1つのステップにまとめませんでしたか?PCREのように:s / (?i:the )?(.*)/ \L$1\E;$0/
ファルコ

@Falco .NETは置換文字列の大文字と小文字の変更をサポートしておらず、Retinaのカスタムリプレースメントにもまだ追加していません。
マーティンエンダー


3

Perl、52バイト

@manatworkのおかげで-13バイト
@ msh210のおかげで-1バイト

sub f{lc pop=~s/^the //ri}print sort{f($a)cmp f$b}<>

入力として行ごとに1つのバンドがあり、出力も同様です。

実装は非常に簡単です。プログラムはバンドのリストを出力しf、最終的な先行なしで小文字のバンド名を返すカスタム関数()の助けを借りてソートしますthe


一致する代わりに置換を使用して短くなりsub f{lc$_[0]=~s/^the //ir}ます:。
マナトワーク

確かに1バイト短くなりました。ありがとう。
ダダ

実際には、2バイトまたは3バイト短くカウントしました:lcのパラメーターの周りの括弧とi置換のフラグの両方は必要ありません。または、それが機能しないテストケースに遭遇しましたか?
マナトワーク

もう一度考えてみると、各バンド名を別々の行に入力すると、コマンドラインオプションの量を減らすこともできますperl -e 'sub f{lc$_[0]=~s/^the //ri}print sort{f($a)cmp f$b}<>' <<< $'Queen\nAerosmith\nSunny Day Real Estate\nThe Strokes'
マナトワーク

1
lc pop代わりにlc$_[0]、およびのsay代わりに3バイトを保存しますprint。(後者にはが必要-M5.01です。これは無料です。)質問の最初のテストケースのみを使用してStrawberry 5.20.2でテストしました。
msh210

2

Python、66 72 69バイト

lambda x:sorted(x,key=lambda a:a[4*(a.lower()[:4]=='the '):].lower())

Pythonのsortedメソッドとkeyキーワード引数を使用して、名前から「The」を引いたものでソートします。これはラムダです。呼び出すには、f=先頭に配置して名前を付けます。

大文字と小文字を区別しないようになりました!


2
ただし、大文字と小文字を区別しないという要件を満たしていません...バンド名はで始まることができthe ます。
shooqie

@shooqieああ、私はその要件を見ませんでした。直します。


2

Perl 6、26バイト

*.sort({fc S:i/^'the '//})

説明:

# 「*」 is the input to this Whatever lambda
*.sort(

  # sort based on the return value of this Block lambda
  {
    fc # foldcase the following

    # string replace but not in-place
    S
      :ignorecase
      /
        # at the start of the string
        ^

        # match 「the 」
        'the '

      # replace with nothing
      //
  }
)

テスト:

use v6.c;
use Test;

my @tests = (
  « Queen Aerosmith 'Sunny Day Real Estate' 'The Strokes' »
    => « Aerosmith Queen 'The Strokes' 'Sunny Day Real Estate' »,
  « 'The Ramones' 'The Cure' 'The Pixies' 'The Roots' 'The Animals' 'Enrique Iglesias' »
    => « 'The Animals' 'The Cure' 'Enrique Iglesias' 'The Pixies' 'The Ramones' 'The Roots' »,
  « 'The The' 'The They' Thermodynamics »
    => « 'The The' Thermodynamics 'The They' »,
);

# give it a lexical name for clarity
my &band-sort = *.sort({fc S:i/^'the '//});

plan +@tests;

for @tests -> ( :key(@input), :value(@expected) ) {
  is-deeply band-sort(@input), @expected, @expected.perl;
}
1..3
ok 1 - ("Aerosmith", "Queen", "The Strokes", "Sunny Day Real Estate")
ok 2 - ("The Animals", "The Cure", "Enrique Iglesias", "The Pixies", "The Ramones", "The Roots")
ok 3 - ("The The", "Thermodynamics", "The They")

2

PowerShell v2 +、33 32 29バイト

$args|sort{$_-replace'^the '}

@MathiasRJessenのおかげで3バイト節約

入力はコマンドライン引数を介して行われます。{...}正規表現-replaceを実行して先頭(大文字と小文字を区別しない)を取り除くスクリプトブロックの結果に基づいて、元の名前を並べ替え"the "ます。

PS C:\Tools\Scripts\golfing> .\sort-band-names.ps1 'the Ramones' 'The cure' 'The Pixies' 'The Roots' 'the Animals' 'Enrique Iglesias'
the Animals
The cure
Enrique Iglesias
The Pixies
the Ramones
The Roots

PS C:\Tools\Scripts\golfing> .\sort-band-names.ps1 'The The' 'The They' 'Thermodynamics'
The The
Thermodynamics
The They

PS C:\Tools\Scripts\golfing> .\sort-band-names.ps1 'THE STOOGES' 'The Strokes' 'The The' 'the they' 'the band' 'STP'
the band
THE STOOGES
STP
The Strokes
The The
the they

-replaceデフォルトでは大文字と小文字を区別しないで、'^the 'パターンのために十分であろう
マティアスR.ジェッセン

@ MathiasR.Jessenはい、リマインダーをありがとう。
AdmBorkBork

@ValueInk大文字と小文字を区別しないことと最後に追加した例についてのMathiasのコメントを参照してください。
AdmBorkBork

2

JavaScript / ECMAScript 6 93 70バイト

70 アドバイスをくれたニールとダウンゴートに感謝

B=>B.sort((a,b)=>R(a).localeCompare(R(b)),R=s=>s.replace(/^the /i,''))

70バイトのバリアントの読み取り可能なバージョン

let sortBandNames = (bandNames) => {
    let stripThe = (name) => name.replace(/^the /i, '');
    let compareFunc = (a, b) => stripThe(a).localeCompare(stripThe(b));
    return bandNames.sort(compareFunc)
};

93

f=B=>{R=s=>s.toLowerCase().replace(/the /,'');return B.sort((a,b)=>R(a).localeCompare(R(b)))}

93バイトのバリアントの読み取り可能なバージョン

let sortBandNames = (bandNames) => {
    let stripThe = (name) => name.toLowerCase().replace(/the /, '');
    let compareFunc = (a, b) => stripThe(a).localeCompare(stripThe(b));
    return bandNames.sort(compareFunc)
};

その正規表現に含まれるべきではありません^か?また、localCompareはシステム上で大文字と小文字を区別しないため、正規表現のフラグtoLowerCaseだけを必要としませんでした/i。最後にあなたにゴルフこれは、次のことができます:B=>B.sort((a,b)=>...,R=s=>...)- sortセットという余分なパラメータを無視しますR
ニール

正規表現のどこに行きますか?それは否定であり、表現は「the」に一致して消去することになっています。小文字変換なしでロケール比較を使用してみます。
パンダコーダー

@Pandacoder shuoldは^正規表現の最初に行く
-Downgoat

@Downgoat与えられたすべてのケースといくつかのケースをテストして、RegExの有無に関係なく、具体的にRegExを破ろうと思いついたのですが、動作に変化はありません。
パンダコーダー

有効にしない@Pandacoder ^「」スペックごとに先頭にする必要がアンカーである
Downgoat

1

Java 8、178バイト

void q(String[]s){java.util.Arrays.sort(s,(a,b)->(a.toLowerCase().startsWith("the ")?a.substring(4):a).compareToIgnoreCase(b.toLowerCase().startsWith("the ")?b.substring(4):b));}

ゴルフされていないバージョン:

void sort(String[] bands) {
    java.util.Arrays.sort(bands, (a, b) -> 
        (a.toLowerCase().startsWith("the ") ? a.substring(4) : a).compareToIgnoreCase(
            b.toLowerCase().startsWith("the ") ? b.substring(4) : b
        )
    );
}

そのような呼び出し:

public static void main(String[] args) {
    String[] bands = {"The Strokes", "Queen", "AC/DC", "The Band", "Cage the Elephant", "cage the elephant"};
    sort(bands); // or q(bands) in the golfed version
    System.out.println(java.util.Arrays.toString(bands));
}

ほぼ1年前にこれに答えたことがわかりますが、いくつかのことをゴルフにかけることができます。あなたは、Java 8を使用状態ので、あなたは変更することができますvoid q(String[]s){...}s->{...}。そして、(x.toLowerCase().startsWith("the ")?x.substring(4):x)で両方を変更できますx.replaceFirst("(?i)the ","")。したがって、合計は次のようになります。s->{java.util.Arrays.sort(s,(a,b)->a.replaceFirst("(?i)the ","").compareToIgnoreCase(b.replaceFirst("(?i)the ","")));}- 118バイト
ケビンクルーッセン

replaceFirstによるきちんとしたトリック。私がこれに答えたとき、私s->{ ... }は許可されていない他の答えについて数回言われました、そして、私は型と他のもので完全なメソッド署名を持っていなければなりませんでした。それ以来、それが変わったかどうかはわかりません。
ジャスティン

当時は定かではありませんでしたが、最近ではJavaまたはC#.NETでゴルフをしているすべての人に許可され、使用されています。
ケビンCruijssen

0

Nim、96バイト

import algorithm,strutils,future
x=>x.sortedByIt toLower it[4*int(it.toLower[0..3]=="the ")..^0]

それらはimport非常に多くのバイトを占有します:|

私のPythonの答えの翻訳。

これは匿名の手順です。使用するには、テスト手順に渡す必要があります。テストに使用できる完全なプログラムは次のとおりです。

import algorithm,strutils,future
proc test(x: seq[string] -> seq[string]) =
 echo x(@["The The", "The They", "Thermodynamics"]) # Substitute your input here
test(x=>x.sortedByIt toLower it[4*int(it.toLower[0..3]=="the ")..^0])

0

Haskell、84バイト

import Data.List
p(t:'h':'e':' ':s)|elem t"Tt"=s
p s=s
sortBy(\a b->p a`compare`p b)

で呼び出す

sortBy(\a b->p a`compare`p b)["The The", "The They", "Thermodynamics"]

テストケース:

let s = sortBy(\a b->p a`compare`p b)
and[s["Queen", "Aerosmith", "Sunny Day Real Estate", "The Strokes"]==["Aerosmith", "Queen", "The Strokes", "Sunny Day Real Estate"],s["The Ramones", "The Cure", "The Pixies", "The Roots", "The Animals", "Enrique Iglesias"]==["The Animals", "The Cure", "Enrique Iglesias", "The Pixies", "The Ramones", "The Roots"],s["The The", "The They", "Thermodynamics"]==["The The", "Thermodynamics", "The They"]]

0

MATL、16バイト

tk'^the '[]YX2$S

入力形式は(各行がテストケースに対応)

{'Queen', 'Aerosmith', 'Sunny Day Real Estate', 'The Strokes'} 
{'The Ramones', 'The Cure', 'The Pixies', 'The Roots', 'The Animals', 'Enrique Iglesias'}
{'The The', 'The They', 'Thermodynamics'}

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

説明

t        % Implicitly input cell array of strings. Push another copy
k        % Convert to lowercase
'^the '  % String to be used as regex pattern: matches initial 'the '
[]       % Empty array
YX       % Regex replacement: replace initial 'the ' in each string by empty array
2$S      % Sort input according to the modified cell array. Implicitly display

0

C#、139バイト

using System.Linq;System.Collections.IEnumerable S(string[] l)=> l.OrderBy(b=>(b.ToLower().StartsWith("the ")?b.Substring(4):b).ToLower());

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

用途をカウントしないと、答えは102バイトになります。


ToLower()大文字と小文字を区別しない要件により、最終版を無視できると思います
-TheLethalCoder

また、いくつかのバイトを節約する匿名関数にすることもできます
。– TheLethalCoder

l=>l.OrderBy(b=>(b.ToLower().StartsWith("the ")?b.Substring(4):b));67バイトの場合、その後、あなたは上で追加する必要がusing System.Linq;あまりにも
TheLethalCoder

@TheLethalCoder:ToLower大文字と小文字を区別しない要件があるため、2番目が必要です。それ以外の場合、順序では大文字と小文字が区別されます。
raznagul

わかりましたが、匿名関数に変換することについてのポイントはまだあります
-TheLethalCoder

0

BASH、64バイト

sed 's/^the / /;s/^The /    /'|sort -fb|sed 's/^ /the /;s/^ /The /'

入力:stdin、1行に1バンド。出力:標準出力

注:2番目の置換(s / ^ The / /およびs / ^ / The /)はタブ文字を使用するため、常に正しくコピー/貼り付けされるとは限りません。


0

Bash + coreutils、44バイト

sed '/^the /I!s,^,@ ,'|sort -dk2|sed s,@\ ,,

説明:入力および出力形式は1行につき1バンドです

sed '/^the /I!s,^,@ ,'   # prepend '@ ' to each line not starting with 'the ', case
                         #insensitive. This adds a temporary field needed by sort.
sort -dk2                # sort in ascending dictionary order by 2nd field onward
sed s,@\ ,,              # remove the temporary field

テスト実行(終了マーカーとしてEOFを使用したヒアドキュメントを使用):

./sort_bands.sh << EOF
> Queen
> Aerosmith
> Sunny Day Real Estate
> The Strokes
> EOF

出力:

Aerosmith
Queen
The Strokes
Sunny Day Real Estate

0

Vim、18バイト

これが可能であることに気付いた今、私は26バ​​イトのVの答えにちょっと戸惑っています。特に、Vはvimより短いはずだからです。しかし、これはほとんどビルトインです。

:sor i/\(The \)*/<CR>

説明(vimヘルプからのストレート):

                            *:sor* *:sort*
:[range]sor[t][!] [b][f][i][n][o][r][u][x] [/{pattern}/]
            Sort lines in [range].  When no range is given all
            lines are sorted.

            With [i] case is ignored.

            When /{pattern}/ is specified and there is no [r] flag
            the text matched with {pattern} is skipped, so that
            you sort on what comes after the match.
            Instead of the slash any non-letter can be used.

0

C、216 212 135 + 5(qsort)= 221 217 140バイト

M(void*a,void*b){char*A,*B;A=*(char**)a;B=*(char**)b;A=strcasestr(A,"The ")?A+4:A;B=strcasestr(B,"The ")?B+4:B;return strcasecmp(A,B);}

さて、ようやくこれでフィニッシュしましたC。ゴルフのヒントは大歓迎です。

この提出物Mは、に提供される比較関数qsortです。したがって、これを呼び出すには、コマンドライン引数が含まれ、指定された引数の数でqsortある形式qsort(argv++,argc--,8,M)で使用する必要があります。argvargc

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


0

05AB1E、27バイト(非競合)

vyð¡RD¤…TheQsgα£Rðý})‚øí{ø¤

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

説明

vyð¡RD¤…TheQsgα£Rðý})‚øí{ø¤   Argument l
v                 }           For each y in l, do:
 yð¡                            Split y on space
    RD                          Reverse and duplicate
      ¤…TheQ                    Last element equals "The" (true = 1, false = 0)
            sgα                 Absolute difference with length of array
               £                Get elements from index 0 to calculated difference
                R               Reverse
                 ðý             Join on space
                    )‚øí      Pair each element with original
                        {ø¤   Sort and get the original band name

0

Groovy、34バイト

{it.sort{it.toLowerCase()-'the '}}

41%私の答えは.toLowerCase()、今私を殺します。


出力

実行中...

({it.sort{it.toLowerCase()-'the '}})(['The ramones','The Cure','The Pixies','The Roots','The Animals','Enrique Iglesias'])

結果は...

[The Animals, The Cure, Enrique Iglesias, The Pixies, The ramones, The Roots]

デバッグまたはエラー出力なし。


0

q / kdb +、36 33バイト

溶液:

{x(<)@[x;(&)x like"[Tt]he *";4_]}

例:

q){x(<)@[x;(&)x like"[Tt]he *";4_]}("Queen";"Aerosmith";"Sunny Day Real Estate";"The Strokes";"the Eagles")
"Aerosmith"
"the Eagles"
"Queen"
"The Strokes"
"Sunny Day Real Estate"

説明:

各入力文字列から「[Tt] he」を削除し、このリストをソートしてから、ソートされたリストのインデックスに基づいて元のリストをソートします。

{x iasc @[x;where x like "[Tt]he *";4_]} / ungolfed solution
{                                      } / lambda function
        @[x;                       ;  ]  / apply function to x at indices
                                    4_   / 4 drop, remove first 4 items
            where x like "[Tt]he *"      / where the input matches 'The ...' or 'the ...'
   iasc                                  / returns sorted indices
 x                                       / index into original list at these indices


-2

Java 176 158バイト

public String[]sort(String[]names){
  for(int i=-1;++i<names.length;)
    if(names[i].startsWith("(The |the )"))
      names[i]=names[i].substring(4);
  return Arrays.sort(names,String.CASE_INSENSITIVE_ORDER);
  }

主な機能

public static void main(String[]args){
  Scanner s = new Scanner(System.in);
  List<String> list= new ArrayList<>();
  while(!(String h = s.nextLine).equalsIgnoreCase("~")){
    list.add(h);
  }
System.out.println(sort(list.toArray(newString[0]))

); }

ゴルフソート機能:

String[]s(String[]n){for(int i=-1;++i<n.length;)if(n[i].startsWith("(The |the )"))n[i]=n[i].substring(4);return Arrays.sort(n,String.CASE_INSENSITIVE_ORDER);}

18バイトを節約してくれた@raznagulに感謝


名前がで始まる場合は機能しませんthe 。ソートでは大文字と小文字を区別しないでください。
shooqie

これはまったく機能しません...文字列は不変です。あなたがやりたいのpublic String[]sort(String[]names){ for(int i=-1;++i<names.length;) names[i]=names[i].replaceFirst("(the|The)", ""); return Arrays.sort(names,String.CASE_INSENSITIVE_ORDER); }は、TheとTheが動作するはずであり、不変の文字列である
ソクラティックフェニックス

ことが、開始「」小さなを持つことを一つのバンド私を見つける固定
ローマグラーフ

2
Arrays.sort型voidを返します
-user902383

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