排序乐队名称


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 TheThe The Band由第二正常排序the

  • 名为The(三个字母的单词)的乐队通常会被排序(不跳过),

  • 具有相同名称的两个频段的顺序是不确定的,其中一个以the(like The PolicePolice)开头

  • 您可以假定,如果乐队的名称包含多个单词,则它们之间用一个空格字符分隔。您无需处理前导或尾随空格,

  • 所有输入字符串都匹配[A-Za-z0-9 ]*,也就是说,它们仅包含英文字母的小写和大写字母,数字和空格字符,

  • 请记住,这是对挑战,因此,请使代码尽可能短!


仅数字名称出现在字母之前还是之后?
AdmBorkBork,2016年

数字只串是第一位的
shooqie

1
The和的排序顺序是The The什么?(如果答案未定义,则大多数答案可能需要更改)
布拉德·吉尔伯特b2gills '16

洛斯罗伯斯怎么样?
njzk2'8

3
顺便说一句,The乐队是一支真正的乐队。(以及“谁,什么,什么地方,什么时候,为什么以及如何”)
DanTheMan

Answers:


7

Python,56 62 64字节

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

试试吧

感谢@Chris H指出这lstrip()不能The The正确处理,因为该测试条将所有匹配的字符都炸掉并将其排序为空白字符串,并感谢@manatwork来发现使用中的缺陷replace()。新版本应该可以使用。

旧版:

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

1
我不相信。将“动物”添加到最后一个列表中会得到['The The', 'The', 'The Animals', 'Thermodynamics', 'The They']。第二个边缘情况建议坐姿应为['The Animals','The The','The','Thermodynamics','The他们'](或交换第二和第三项)。有点摆弄表明里面的空间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)结果'what snake'
manatwork '16

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'8

1
@kirkpatt好主意!那几乎可行,但不完全可行。例如,使用此输入,会将“ Radiohead”错误地放在“ The Ramones”和“ The Roots”之后。但是,这给了我一个主意...
DJMcMayhem

如果the全部是小写,会发生什么the pAper chAse
AdmBorkBork,

4

视网膜,34字节

尾随换行很重要。

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

O`
.+;

I / O是每条线一个频带。

在线尝试!

说明

%`^
$';

复制每行,;用作分隔符。

T`L`l`.+;

将前面的所有内容都转换;为小写。

m`^the 

删除the行首出现的所有。

O`

排序行。

.+;

删除我们用于排序的行的开头。


您不能将前三个步骤打包成一个步骤吗?像PCRE:S / (?i:the )?(.*)/ \L$1\E;$0/
法尔科

@Falco .NET不支持替换字符串中的大小写更改,我也没有将它们添加到Retina的自定义替换器中。
马丁·恩德

4

Pyke,16个字节

.#l1D"the ".^4*>

在这里尝试!

.#                - sort_by(V, input)
  l1              -  i = i.lower()
      "the ".^    -   i.startswith("the ")
              I   -  if ^:
               4> -   i[4:]

3

Perl,52个字节

-13字节感谢@manatwork
-1字节感谢@ msh210

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

每行一个频带作为输入,输出也是如此。

实现非常简单:该程序将打印乐队列表,并借助自定义函数(f)进行排序,该函数返回小写的乐队名称,而最终不使用前导the


通过替换而不是匹配来缩短:sub f{lc$_[0]=~s/^the //ir}
manatwork '16

的确少了1个字节,谢谢。
达达

实际上,我计算的时间要短2或3个字节:既不需要围绕lc参数的括号也不需要i替换标志。还是遇到了无法解决的测试案例?
manatwork'8/08/

再想一想,如果将每个乐队的名称放在单独的行中,也可以减少命令行选项的数量perl -e 'sub f{lc$_[0]=~s/^the //ri}print sort{f($a)cmp f$b}<>' <<< $'Queen\nAerosmith\nSunny Day Real Estate\nThe Strokes'
manatwork'8/08/

1
保存三个字节:lc pop代替lc$_[0],而say代替print。(后者需要-M5.01,这是免费的。)仅在问题中的第一个测试用例中在Strawberry 5.20.2中进行了测试。
msh210 '16

2

Python,66 72 69字节

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

使用sortedkey关键字参数的Python 方法按名称减“ The”排序。这是一个lambda。称呼它,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 '将足以满足该模式
Mathias R. Jessen

@ MathiasR.Jessen是的,谢谢您的提醒。
AdmBorkBork,

@ValueInk请参阅Mathias关于不区分大小写的评论以及我添加的最后一个示例。
AdmBorkBork,

2

JavaScript / ECMAScript 6 93 70字节

70 感谢Neil和Downgoat的建议

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)
};

那个正则表达式不应该包含^吗?另外,localeCompare在系统上不区分大小写,因此我不需要toLowerCase,而只需/i在正则表达式上加一个标志。最后,您可以如下进行打高尔夫球:B=>B.sort((a,b)=>...,R=s=>...)- sort忽略设置的额外参数R
尼尔

^会在正则表达式中移到哪里?那将是一个否定,并且该表达式应该匹配并删除“ the”。我将尝试使用区域设置比较而不进行小写转换。
Pandacoder

@Pandacoder ^shuold在正则表达式的开头
Downgoat '16

@Downgoat通过测试所有给定的案例以及一些案例,我想出了专门打破RegEx的意图,无论是否使用^,我的行为都没有改变,只是一个多余的字符无法完成任何事情。
Pandacoder '16

@Pandacoder无效。^是锚,根据规格要求“ the”必须在开头
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));
}

我知道您差不多在一年前就已经回答了,但是您可以打几件事。由于您声明使用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个字节
凯文Cruijssen

用replaceFirst的巧妙技巧。当我回答这个问题时,我被告知过几次其他s->{ ... }不允许的回答,而且我必须拥有完整的方法签名,包括类型和其他内容。从那以后,我不知道这是否改变了。
贾斯汀

当时还不确定,但是现在,几乎所有使用Java或C#.NET的人都允许并使用它。
Kevin 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 '16

您也可以使其成为一个匿名函数,该函数应该节省一些字节:
TheLethalCoder '16

l=>l.OrderBy(b=>(b.ToLower().StartsWith("the ")?b.Substring(4):b));对于67个字节,那么你需要在加using System.Linq;
TheLethalCoder

@TheLethalCoder:ToLower由于不区分大小写,我需要第二个。否则顺序将区分大小写。
raznagul

好的,但是仍然可以将其转换为匿名函数
TheLethalCoder '16

0

BASH,64字节

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

输入:stdin,每行一个频段。输出:stdout

注意:第二个替换(s / ^ The / /和s / ^ / The /)使用制表符,因此它们并不总是正确地复制/粘贴。


0

Bash + coreutils,44个字节

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

说明:输入和输出格式是每行一个带

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),其中argv包含命令行参数,并且argc是提供的参数数量。

在线尝试!


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 176158字节

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);}

感谢@raznagul节省了18个字节


如果名称以开头,则无效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”开头的乐队
RomanGräf16年

2
Arrays.sort返回类型为void
user902383,2013年

1
@RomanGräf– the pAper chAse
AdmBorkBork
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.