Bandnamen sortieren

22

Herausforderungsbeschreibung

Sie haben eine Musikbibliothek mit vielen Spuren von vielen Bands aufgezeichnet, von denen jede einen Namen hat, wie Queen, Aerosmith, Sunny Day Real Estate, The Strokes. Wenn ein Audioplayer Ihre Bibliothek alphabetisch nach Bandnamen anzeigt, überspringt er normalerweise den TheTeil, da viele Bandnamen mit beginnen The, um die Navigation durch Ihre Mediensammlung zu erleichtern. Bei dieser Herausforderung müssen Sie eine Liste (Array) von Zeichenfolgen auf diese Weise sortieren (dh das TheWort am Anfang des Namens weglassen ). Sie können entweder eine Methode oder ein voll funktionsfähiges Programm schreiben.

Beispiel Ein- / Ausgänge

[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]

Notizen / Edge Fällen

  • Lexikografisch Sortierung Groß- und Kleinschreibung ist, so The Police, The policeund the policealle sind gleichwertig,

  • Ihr Algorithmus sollte nur das erste theWort weglassen , damit die Bänder nach dem zweiten benannt The Theoder The The Bandnormal sortiert werden the.

  • Ein Band namens The(ein Drei-Buchstaben-Wort) wird normal sortiert (kein Überspringen),

  • Die Reihenfolge zweier gleichnamiger Bands, von denen eine mit the(like The Policeund Police) beginnt, ist undefiniert.

  • Sie können davon ausgehen, dass ein Bandname, der aus mehr als einem Wort besteht, durch ein einzelnes Leerzeichen getrennt ist. Sie müssen keine führenden oder nachfolgenden Leerzeichen verarbeiten,

  • Alle Eingabezeichenfolgen stimmen überein [A-Za-z0-9 ]*, dh sie bestehen nur aus Klein- und Großbuchstaben des englischen Alphabets, Ziffern und Leerzeichen.

  • Denken Sie daran, dass dies eine Herausforderung ist, also machen Sie Ihren Code so kurz wie möglich!

shooqie
quelle
Kommen nur numerische Namen vor oder nach alphabetischen?
AdmBorkBork
Zeichenfolgen, die nur aus
Ziffern bestehen
1
Wie ist die Sortierreihenfolge von Theund The The? (Die meisten Antworten müssten wahrscheinlich geändert werden, wenn es etwas anderes als undefiniert ist)
Brad Gilbert b2gills
Wie wäre es mit Los Lobos?
njzk2
3
The The ist übrigens eine echte Band. (zusammen mit dem Wer, dem Was, dem Wo, dem Wann, dem Warum und dem Wie)
DanTheMan

Antworten:

7

Python, 56 62 64 Bytes

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

Versuch es

Vielen Dank an @Chris H für den Hinweis, dass dies lstrip()nicht The Therichtig gehandhabt wurde , da der Streifen alle übereinstimmenden Zeichen gesprengt und als leere Zeichenfolge sortiert hat replace(). Die neue Version sollte funktionieren.

Alte Version:

lambda b:sorted(b,key=lambda x:x.lower().lstrip('the '))
Atlasologe
quelle
1
Ich bin nicht überzeugt. Hinzufügen von "Die Tiere" zur letzten Liste gibt ['The The', 'The', 'The Animals', 'Thermodynamics', 'The They']. Der Fall mit der zweiten Kante schlägt vor, dass sit ['Die Tiere', 'Die', 'Die', 'Thermodynamik', 'Die Sie'] sein sollte (oder das zweite und dritte Element tauschen). Ein wenig Fummelei deutet darauf hin, dass der Platz im Inneren strip('the ')ignoriert wird - versuchen Sie esfor x in ['The The', 'The They', 'Thermodynamics', 'The', 'The Animals']: print (x.lower().strip('the '))
Chris H
Das replace()ist nicht viel besser: 'what the snake'.replace('the ','',1)Ergebnisse 'what snake'.
Handarbeit
5

V , 32 28 Bytes

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

Probieren Sie es online!

Hinweis für sich selbst: Machen Sie eine Abkürzung für, :sortdamit ich nicht 6 ganze Bytes für einen einzelnen Befehl benötige!

Erläuterung:

ç^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 '
DJMcMayhem
quelle
Nicht vertraut mit V, aber es scheint, dass dieses ohne die Sternchen gut funktioniert. Ist das Zufall mit der Eingabe oder eigentlich nicht nötig?
Kirkpatt
1
@ kirkpatt Gute Idee! Das funktioniert fast , aber nicht ganz. Bei dieser Eingabe wird beispielsweise fälschlicherweise "Radiohead" nach "The Ramones" und "The Roots" eingefügt. Aber das gibt mir eine Idee ...
DJMcMayhem
Was passiert, wenn thenur Kleinbuchstaben verwendet werden the pAper chAse?
AdmBorkBork
4

Retina , 34 Bytes

Der Zeilenvorschub am Ende ist signifikant.

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

O`
.+;

I / O ist ein Band pro Zeile.

Probieren Sie es online!

Erläuterung

%`^
$';

Duplizieren jede Zeile unter Verwendung ;als Separator.

T`L`l`.+;

Drehen Sie alles vor einem ;zu Kleinbuchstaben.

m`^the 

Entfernen Sie alle thes, die am Anfang einer Zeile erscheinen.

O`

Sortieren Sie die Zeilen.

.+;

Entfernen Sie die Anfänge der Zeilen, die wir zum Sortieren verwendet haben.

Martin Ender
quelle
Könnten Sie nicht die ersten 3 Schritte in einem einzigen Schritt packen? Wie in PCRE: s / (?i:the )?(.*)/ \L$1\E;$0/
Falco
@Falco .NET unterstützt keine Falländerungen in Ersetzungszeichenfolgen und ich habe sie auch noch nicht zu Retinas benutzerdefiniertem Ersetzer hinzugefügt.
Martin Ender
4

Pyke, 16 Bytes

.#l1D"the ".^4*>

Probieren Sie es hier aus!

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

Perl, 52 Bytes

-13 Byte dank @manatwork
-1 Byte dank @msh210

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

Ein Band pro Zeile als Eingang, ebenso wie der Ausgang.

Die Implementierung ist sehr einfach: Das Programm druckt die Liste der Bänder, sortiert mit Hilfe einer benutzerdefinierten Funktion ( f), die den Bandnamen in Kleinbuchstaben ohne den eventuellen Zeilenabstand zurückgibt the.

Dada
quelle
Ist kürzer mit Substitution statt: Passend zu sub f{lc$_[0]=~s/^the //ir}.
Manatwork
1 Byte kürzer, danke.
Dada
Eigentlich habe ich entweder 2 oder 3 Bytes kürzer gezählt: weder die Klammer um lcden Parameter noch das iFlag für die Ersetzung sind erforderlich . Oder haben Sie einen Testfall getroffen, bei dem das nicht funktioniert?
Manatwork
Denken wieder, könnte die Menge der Befehlszeilenoptionen auch verringert werden , wenn Sie jeden Namen auf separate Zeile Band nehmen: 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
1
Sparen Sie drei Bytes: lc popanstelle von lc$_[0]und sayanstelle von print. (Letzteres erfordert -M5.01, was kostenlos ist.) Getestet in Strawberry 5.20.2 nur mit dem ersten Testfall aus der Frage.
msh210
2

Python, 66 72 69 Bytes

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

Verwendet Pythons sortedMethode mit dem keySchlüsselwortargument, um nach dem Namen abzüglich "The" zu sortieren. Dies ist ein Lambda; Um es zu nennen, geben Sie ihm einen Namen, indem Sie ihn voranstellen f=.

Jetzt mit zusätzlicher Groß- / Kleinschreibung!

Kupfer
quelle
2
Es erfüllt jedoch nicht die Anforderung der Groß- / Kleinschreibung. Ein Bandname kann mit beginnen the . In diesem Fall funktioniert diese Methode nicht ordnungsgemäß.
Shooqie
@shooqie Oh, ich habe diese Anforderung nicht gesehen. Ich werde es reparieren.
Kupfer
2

Perl 6 , 26 Bytes

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

Erläuterung:

# 「*」 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
      //
  }
)

Prüfung:

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")
Brad Gilbert b2gills
quelle
2

PowerShell v2 +, 33 32 29 Bytes

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

3 Bytes gespart dank @MathiasRJessen

Die Eingabe erfolgt über Befehlszeilenargumente. Sortiert die ursprünglichen Namen basierend auf den Ergebnissen des {...}Skriptblocks, der einen regulären Ausdruck ausführt -replace, um den führenden auszublenden (ohne Berücksichtigung der Groß- / Kleinschreibung) "the ".

Beispiele

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
AdmBorkBork
quelle
-replaceStandardmäßig wird die Groß- / Kleinschreibung nicht beachtet, '^the 'für das Muster wird ausreichen
Mathias R. Jessen
@ MathiasR.Jessen Ja, danke für die Erinnerung.
AdmBorkBork
@ValueInk Siehe Mathias 'Kommentar zur Unempfindlichkeit gegen Groß- und Kleinschreibung und das letzte Beispiel, das ich hinzugefügt habe.
AdmBorkBork
2

JavaScript / ECMAScript 6 93 70 Bytes

70 Danke an Neil und Downgoat für den Rat

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

Lesbare Version für die 70-Byte-Variante

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

Lesbare Version für die 93-Byte-Variante

let sortBandNames = (bandNames) => {
    let stripThe = (name) => name.toLowerCase().replace(/the /, '');
    let compareFunc = (a, b) => stripThe(a).localeCompare(stripThe(b));
    return bandNames.sort(compareFunc)
};
Pandacoder
quelle
Sollte das nicht ein regulärer Ausdruck sein ^? Außerdem unterscheidet localeCompare auf meinem System nicht zwischen Groß- und Kleinschreibung, sodass ich das nicht benötigte toLowerCase, sondern nur ein /iFlag auf dem regulären Ausdruck. Zum Schluss können Sie dies wie folgt tun : B=>B.sort((a,b)=>...,R=s=>...)- sortIgnoriert den zusätzlichen Parameter, der gesetzt wird R.
Neil
Wo in der Regex würde ^ gehen? Das wäre eine Negation, und der Ausdruck soll mit "dem" übereinstimmen und "das" löschen. Ich werde versuchen, locale compare ohne die Konvertierung in Kleinbuchstaben zu verwenden.
Pandacoder
@ Pandacoder die ^Shuold gehen am Anfang der Regex
Downgoat
@Downgoat Aus dem Testen aller angegebenen Fälle und einigen Fällen, die ich speziell mit der Absicht entwickelt habe, den RegEx zu brechen, mit oder ohne das ^ bekomme ich keine Verhaltensänderung, nur ein zusätzliches Zeichen, das nichts bewirkt.
Pandacoder
@Pandacoder, der es nicht gültig macht. Das ^ ist ein Anker, für den das "the" gemäß der Spezifikation am Anfang stehen muss
Downgoat
1

Java 8, 178 Bytes

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

Ungolfed-Version:

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

Als solches anrufen:

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));
}
Justin
quelle
Ich weiß, dass Sie dies vor fast einem Jahr beantwortet haben, aber Sie können ein paar Dinge Golf spielen. Da Sie angeben , verwenden Sie Java 8, können Sie ändern void q(String[]s){...}zu s->{...}. Und Sie können beide ändern (x.toLowerCase().startsWith("the ")?x.substring(4):x)mit x.replaceFirst("(?i)the ",""). So wird die Summe: s->{java.util.Arrays.sort(s,(a,b)->a.replaceFirst("(?i)the ","").compareToIgnoreCase(b.replaceFirst("(?i)the ","")));}- 118 Bytes
Kevin Cruijssen
Ordentlicher Trick mit dem replaceFirst. Als ich darauf antwortete, wurde ich einige Male auf andere Antworten s->{ ... }hingewiesen , die nicht erlaubt waren, und ich musste eine vollständige Methodensignatur mit Typen und so weiter haben. Ich weiß nicht, ob sich das seitdem geändert hat.
Justin
Ich bin mir damals nicht sicher, aber heutzutage ist es erlaubt und wird von nahezu jedem verwendet, der in Java oder C # .NET Golf spielt.
Kevin Cruijssen
0

Nim , 96 Bytes

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

Diese importbelegen so viele Bytes:|

Eine Übersetzung meiner Python-Antwort .

Dies ist ein anonymes Verfahren. Um es zu verwenden, muss es einem Testverfahren unterzogen werden. Hier ist ein vollständiges Programm, das Sie zum Testen verwenden können:

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])
Kupfer
quelle
0

Haskell, 84 Bytes

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

Mit anrufen

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

Testfall:

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"]]
Laikoni
quelle
0

MATL , 16 Bytes

tk'^the '[]YX2$S

Eingabeformat ist (jede Zeile entspricht einem Testfall)

{'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'}

Probieren Sie es online!

Erläuterung

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
Luis Mendo
quelle
0

139 Bytes

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

Online versuchen!

Ohne die Verwendung zu zählen, wäre die Antwort 102 Bytes.

Rasnagul
quelle
Ich glaube, Sie können das Finale ToLower()aufgrund der Groß- und Kleinschreibung ignorieren
TheLethalCoder
Sie können es auch zu einer anonymen Funktion machen, die einige Bytes speichern soll:
TheLethalCoder
l=>l.OrderBy(b=>(b.ToLower().StartsWith("the ")?b.Substring(4):b));Für 67 Bytes und dann müssen Sie auf dem hinzufügen using System.Linq;zu
TheLethalCoder
@TheLethalCoder: Ich brauche den zweiten, ToLowerda die Groß- / Kleinschreibung nicht berücksichtigt wird. Andernfalls wird bei der Bestellung zwischen Groß- und Kleinschreibung unterschieden.
Raznagul
Okay, der Punkt über die Konvertierung in eine anonyme Funktion bleibt jedoch bestehen
TheLethalCoder
0

BASH, 64 Bytes

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

Eingabe: stdin, ein Band pro Zeile. Ausgabe: stdout

Hinweis: Die zweiten Ersetzungen (s / ^ The / / und s / ^ / The /) verwenden das Tabulatorzeichen, sodass sie nicht immer korrekt kopiert / eingefügt werden.

Riley
quelle
0

Bash + Coreutils, 44 Bytes

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

Erläuterung: Das Eingabe- und Ausgabeformat ist ein Band pro Zeile

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

Testlauf (mit einem Here-Dokument mit EOF als Endemarker):

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

Ausgabe:

Aerosmith
Queen
The Strokes
Sunny Day Real Estate
Seshoumara
quelle
0

Vim, 18 Bytes

Nun, da mir klar wurde, dass dies möglich ist, schäme ich mich ein bisschen für meine 26-Byte-V-Antwort, zumal V kürzer als vim sein soll. Aber das ist so ziemlich ein eingebautes.

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

Erklärung (direkt aus der vim-Hilfe):

                            *: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.
DJMcMayhem
quelle
0

C, 216 212 135 + 5 ( qsort) = 221 217 140 Bytes

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

Nun, ich habe es endlich geschafft C. Golftipps werden sehr geschätzt.

In dieser Übermittlung Mwird die Vergleichsfunktion bereitgestellt qsort. Daher ist diese aufzurufen, müssen Sie verwenden qsortim Format qsort(argv++,argc--,8,M)wo argventhält die Befehlszeilenargumente undargc ist die Anzahl der Argumente zur Verfügung gestellt.

Probieren Sie es online!

R. Kap
quelle
0

05AB1E , 27 Bytes (nicht konkurrierend)

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

Probieren Sie es online!

Erläuterung

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
kalsowerus
quelle
0

Groovy, 34 Bytes

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

41% meine Antwort ist .toLowerCase(), töte mich jetzt.


Ausgabe

Beim Laufen ...

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

Das Ergebnis ist...

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

Ohne Debug- oder Fehlerausgabe.

Magische Kraken-Urne
quelle
0

q / kdb +, 36 33 Bytes

Lösung:

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

Beispiel:

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"

Erläuterung:

Entfernen Sie "[Tt] he" aus jeder Eingabezeichenfolge, sortieren Sie diese Liste und sortieren Sie dann die ursprüngliche Liste basierend auf der Indizierung der sortierten Liste.

{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
Streetster
quelle
-2

Java 176 158 Bytes

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

Hauptfunktion

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]))

); }

Golf Sortierfunktion:

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

Vielen Dank an @raznagul für das Speichern von 18 Bytes

Roman Gräf
quelle
Funktioniert nicht, wenn ein Name mit beginnt the . Bei der Sortierung sollte die Groß- und Kleinschreibung nicht berücksichtigt werden.
Shooqie
Das geht gar nicht ... Strings sind unveränderlich. Sie möchten 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); }Da das und Das funktionieren soll, und eine unveränderliche Zeichenfolge
Socratic Phoenix
Das wurde behoben, aber ich finde eine Band, die mit einem kleinen "the" beginnt
Roman Gräf
2
Arrays.sortgibt type void zurück
user902383
1
@ RomanGräfthe pAper chAse
AdmBorkBork