เรียงชื่อวงดนตรี


22

คำอธิบายการท้าทาย

คุณมีคลังเพลงที่มีหลายแทร็คที่บันทึกโดยหลาย ๆ วงแต่ละที่มีชื่อเช่นQueen, Aerosmith, ,Sunny Day Real Estate The 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]

เคส Notes / Edge

  • เรียงลำดับ lexicographically เป็นกรณีตายดังนั้นThe Police, The policeและthe policeเทียบเท่าทุก

  • อัลกอริทึมของคุณควรละเว้นคนแรกที่theคำพูดและวงดนตรีที่ชื่อThe TheหรือThe The Bandจะเรียงตามปกติโดยที่สองthe,

  • วงดนตรีชื่อThe(คำสามตัวอักษร) จะถูกจัดเรียงตามปกติ (ไม่ข้าม)

  • ลำดับของสองวงดนตรีที่มีชื่อเหมือนกันหนึ่งในนั้นเริ่มต้นด้วยthe(ชอบThe PoliceและPolice) ไม่ได้กำหนด

  • คุณสามารถสมมติได้ว่าถ้าชื่อของวงดนตรีประกอบด้วยมากกว่าหนึ่งคำพวกเขาจะถูกคั่นด้วยอักขระช่องว่างเดียว คุณไม่จำเป็นต้องจัดการกับช่องว่างนำหน้าหรือตามหลัง

  • การจับคู่สตริงทั้งหมด[A-Za-z0-9 ]*นั้นจะประกอบด้วยตัวอักษรตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ของตัวอักษรภาษาอังกฤษตัวเลขและตัวอักษรเว้นวรรค

  • โปรดจำไว้ว่านี่เป็นความท้าทายของการดังนั้นลองสร้างรหัสของคุณให้สั้นที่สุด!


ชื่อที่เป็นตัวเลขเท่านั้นมาก่อนหรือหลังตัวอักษร?
AdmBorkBork

สตริงเฉพาะตัวเลขมาก่อน
shooqie

1
ลำดับการจัดเรียงของคืออะไรTheและ The The(คำตอบส่วนใหญ่อาจจะต้องมีการเปลี่ยนแปลงถ้ามันเป็นสิ่งอื่นนอกเหนือจากที่ไม่ได้กำหนด)
แบรดกิลเบิร์ b2gills

แล้วลอสโลบอสล่ะ?
njzk2

3
The The เป็นวงดนตรีจริงโดยวิธี (พร้อมกับใครอะไรที่ไหนที่ไหนเมื่อไหร่ทำไมและอย่างไร)
DanTheMan

คำตอบ:


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', 'The', 'อุณหพลศาสตร์', 'พวกเขา'] (หรือสลับรายการที่ 2 และ 3) เล่นซอเล็ก ๆ น้อย ๆ แสดงให้เห็นว่าพื้นที่ภายในstrip('the ')ถูกละเว้น - ลองfor x in ['The The', 'The They', 'Thermodynamics', 'The', 'The Animals']: print (x.lower().strip('the '))
Chris H

ที่replace()ไม่ได้ดีมาก: ผลการ'what the snake'.replace('the ','',1) 'what snake'
จัดการ

5

V , 32 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 ความคิดที่ดี! ที่เกือบจะทำงาน แต่ไม่มาก ตัวอย่างเช่นด้วยอินพุตนี้มันจะใส่ "Radiohead" หลังจาก "The Ramones" และ "The Roots" อย่างไม่ถูกต้อง อย่างไรก็ตามนั่นทำให้ฉันมีความคิด ...
DJMcMayhem

จะเกิดอะไรขึ้นถ้าtheเป็นตัวพิมพ์เล็กทั้งหมดเช่นthe pAper chAseอะไร
AdmBorkBork

4

เรติน่า 34 ไบต์

ตัวป้อนบรรทัดต่อท้ายมีความสำคัญ

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

O`
.+;

I / O คือหนึ่งวงต่อบรรทัด

ลองออนไลน์!

คำอธิบาย

%`^
$';

ทำซ้ำแต่ละบรรทัดโดยใช้;เป็นตัวคั่น

T`L`l`.+;

หมุนทุกอย่างที่อยู่ด้านหน้าของ a เป็น;ตัวเล็ก

m`^the 

ลบใด ๆ the sที่ปรากฏที่จุดเริ่มต้นของบรรทัด

O`

เรียงลำดับบรรทัด

.+;

ลบจุดเริ่มต้นของบรรทัดที่เราใช้สำหรับการเรียงลำดับ


คุณไม่สามารถบรรจุ 3 ขั้นตอนแรกไว้ในขั้นตอนเดียวได้หรือไม่ เช่นเดียวกับใน PCRE: s / (?i:the )?(.*)/ \L$1\E;$0/
Falco

@Falco .NET ไม่สนับสนุนการเปลี่ยนแปลงเคสในสตริงการแทนที่และฉันยังไม่ได้เพิ่มพวกเขาไปยังเรเซอร์ที่กำหนดเองของ Retina
Martin Ender


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}สั้นทดแทนแทนการจับคู่:
จัดการ

1 ไบต์สั้นลงขอบคุณจริงๆ
Dada

ที่จริงฉันนับว่าสั้นกว่า 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 print(ต้องการหลัง-M5.01ซึ่งฟรี) ทดสอบในสตรอเบอร์รี่ 5.20.2 โดยมีเพียงกรณีทดสอบแรกจากคำถาม
msh210

2

Python, 66 72 69 ไบต์

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

ใช้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 '}

บันทึกแล้ว 3 ไบต์ขอบคุณ @MathiasRJessen

อินพุตคือผ่านอาร์กิวเมนต์บรรทัดคำสั่ง เรียงลำดับชื่อดั้งเดิมตามผลลัพธ์ของบล็อกสคริปต์{...}ที่ดำเนินการ regex -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 เกี่ยวกับ case insensitivity และตัวอย่างสุดท้ายที่ฉันเพิ่ม
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)
};

ไม่ควร regexp ที่มี^ในหรือไม่ นอกจากนี้ localeCompare ยังไม่คำนึงถึงขนาดตัวพิมพ์ในระบบของฉันดังนั้นฉันจึงไม่จำเป็นต้องใช้toLowerCaseเพียงแค่/iตั้งค่าสถานะบน regexp ในที่สุดคุณสามารถกอล์ฟดังต่อไปนี้: B=>B.sort((a,b)=>...,R=s=>...)- ละเว้นพารามิเตอร์พิเศษที่ชุดsort R
Neil

จะไปที่ไหนใน regex ^ นั่นจะเป็นการปฏิเสธและการแสดงออกควรจะจับคู่และลบ "the" ฉันจะลองใช้ภาษาเปรียบเทียบโดยไม่มีการแปลงเป็นกรณีเล็ก
Pandacoder

@Pandacoder ^shuold ไปที่จุดเริ่มต้นของ regex
Downgoat

@Downgoat จากการทดสอบทุกกรณีที่ได้รับและมีบางกรณีที่ฉันตั้งใจจะทำลาย RegEx เป็นพิเศษโดยมีหรือไม่มี ^ ฉันไม่ได้เปลี่ยนแปลงพฤติกรรมเลยมีเพียงตัวละครพิเศษที่ไม่สามารถทำอะไรได้เลย
Pandacoder

@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 ไบต์
Kevin Cruijssen

เคล็ดลับเรียบร้อยด้วย replaceFirst เมื่อฉันตอบคำถามนี้ฉันได้รับคำตอบสองสามครั้งจากคำตอบอื่น ๆ ที่s->{ ... }ไม่ได้รับอนุญาตและฉันต้องมีลายเซ็นวิธีการแบบเต็มรูปแบบกับประเภทและอะไรก็ตาม ฉันไม่รู้ว่ามันเปลี่ยนไปหรือไม่
จัสติน

ไม่แน่ใจเกี่ยวกับย้อนกลับไป แต่วันนี้มันได้รับอนุญาตและใช้โดยใกล้กับทุกคนที่เล่นกอล์ฟใน Java หรือ C # .NET
Kevin Cruijssen

0

นิมิต , 96 ไบต์

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

importไบต์เหล่านั้นมีจำนวนมาก:|

คำแปลของฉันคำตอบหลาม

นี่เป็นขั้นตอนที่ไม่ระบุชื่อ ในการใช้มันจะต้องถูกส่งไปยังกระบวนการทดสอบ นี่คือโปรแกรมเต็มรูปแบบที่คุณสามารถใช้สำหรับการทดสอบ:

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

TestCase:

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เพราะข้อกำหนดตัวพิมพ์เล็กและใหญ่ มิฉะนั้นคำสั่งจะเป็นแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก
raznagul

เอาล่ะประเด็นเกี่ยวกับการแปลงเป็นฟังก์ชั่นนิรนามยังคงอยู่
TheLethalCoder

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

เป็นกลุ่ม, 18 ไบต์

ทีนี้เมื่อฉันรู้ว่ามันเป็นไปได้ฉันก็อายด้วยคำตอบ 26 byte V ของฉันโดยเฉพาะอย่างยิ่งเนื่องจาก V ควรสั้นกว่าเสียงเรียกเข้า แต่นี่เป็นแบบในตัว

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

คำอธิบาย (ตรงจากความช่วยเหลือเป็นกลุ่ม):

                            *: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] เขา" ออกจากแต่ละสตริงอินพุตเรียงลำดับรายการนี้จากนั้นเรียงลำดับรายการดั้งเดิมตามการจัดทำดัชนีของรายการที่เรียงลำดับ

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

); }

ฟังก์ชั่นการเรียงลำดับ golfed:

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); }ตั้งแต่และควรจะทำงานและสายไม่เปลี่ยนรูป
Socratic ฟีนิกซ์

แก้ไขได้ แต่หาฉันหนึ่งวงดนตรีที่เริ่มต้นด้วย "the" เล็ก ๆ
Roman Gräf

2
Arrays.sortส่งคืนประเภทเป็นโมฆะ
902383

1
@ RomanGräfthe pAper chAse
AdmBorkBork
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.