แทรก semi-sort ลงในอาร์เรย์ที่ไม่เรียงลำดับ


14

ยินดีต้อนรับสู่วันแรกของคุณที่ PPCG Inc. ในฐานะผู้ช่วยตัวเรียงลำดับเอกสารรุ่นใหม่ล่าสุดของเราคุณมีหน้าที่ตรวจสอบให้แน่ใจว่าเอกสารทั้งหมดที่เราส่งถึงคุณถูกเก็บถาวรตามลำดับตัวอักษร มันง่ายมากที่ลิงสามารถทำได้ พูดเปรียบเทียบเชิงเปรียบเทียบในขณะที่เราจ้างลิงเพื่อทำมัน คาดเดาอะไร ปรากฎว่าลิงขาดความเข้าใจในตัวอักษรของเรา อย่างไรก็ตามไม่มีเวลาที่จะแก้ไขความยุ่งเหยิงที่มีอยู่ในขณะนี้ดังนั้นเพียงแค่พยายามไม่ทำให้สถานการณ์แย่ลงโอเคไหม จากนั้นไปที่มัน! ถ้าคุณหิวก็จะมีกล้วยอยู่ข้างๆเครื่องทำน้ำเย็น โชคดี!

รายละเอียดงาน

อินพุต

  • คุณจะได้รับรายการของสตริง (ไฟล์เก็บถาวร) และสตริงที่ต้องเพิ่มลงในรายการนั้น (เอกสาร)
  • สตริงทั้งหมดจะมีตัวอักษรตัวพิมพ์ใหญ่ตัวอักษรตัวพิมพ์เล็กและช่องว่าง
  • เงื่อนไขจะเริ่มต้นและสิ้นสุดด้วยตัวอักษรเสมอ

งาน

กำหนดตำแหน่งเป้าหมายของเอกสาร: ตำแหน่งที่ควรได้รับในไฟล์เก็บถาวร ตำแหน่งเป้าหมายสามารถกำหนดได้ดังนี้:

  • สำหรับแต่ละตำแหน่ง:
    • นับจำนวนสตริงในไฟล์เก็บถาวรก่อนตำแหน่งที่เป็นตัวอักษรก่อนหน้าเอกสาร
    • นับจำนวนสตริงในไฟล์เก็บถาวรหลังจากตำแหน่งนั้นเรียงตามตัวอักษรหลังเอกสาร
    • กำหนดคะแนนของตำแหน่งเป็นผลรวมของทั้งสองข้างต้นนับ
  • ตำแหน่งเป้าหมายของเอกสารคือตำแหน่งที่มีคะแนนสูงสุด
  • ในกรณีที่เสมอกันตำแหน่งทั้งหมดที่มีคะแนนสูงสุดจะมีผลเหมือนกันกับตำแหน่งเป้าหมาย ต้องเลือกหนึ่งรายการเท่านั้น

เมื่อเรียงลำดับ:

  • ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กจะเทียบเท่ากัน
  • ช่องว่างมาก่อนตัวอักษร

เอาท์พุต

  • การเก็บถาวรพร้อมเอกสารที่เพิ่มเข้าไปในรูปแบบใด

หรือ

  • ตำแหน่งเป้าหมายของเอกสารในดัชนีที่ใช้ 0 หรือ 1 ตาม

การประเมินผลงาน

ไบต์ที่น้อยที่สุดจะชนะ!

ตัวอย่าง I / O

Archive:
    Applebuck Season
    Friendship is Magic
    The Ticket Master
    Griffon the BrushOff
    Boast Busters
    Bridle Gossip

Document: Dragonshy

Position scores (0-based index):
0: 0 + 3 = 3
1: 1 + 3 = 4
2: 1 + 2 = 3
3: 1 + 1 = 2
4: 1 + 0 = 1
5: 2 + 0 = 2
6: 3 + 0 = 3

Target position: 1

5
ยินดีต้อนรับสู่ PPCG ดูเหมือนว่าโพสต์แรกที่ดี! :) คำแนะนำของคุณในส่วน "งาน" นั้นเป็นประเภทที่อ่านยาก การเลื่อนในแนวนอนนั้นน่ารำคาญ: ฉันจะลองใช้รายการหัวข้อย่อยแทน เรามีSandboxที่มีประโยชน์ซึ่งคุณสามารถโพสต์ความท้าทายสำหรับชุมชนเพื่อตรวจสอบหากคุณต้องการ
FryAmTheEggman

Dragonshyฉันเพิ่งได้รับมัน! ดีมาก :-D
หลุยส์เมนโด

@Lex มันจะดีถ้ามีกรณีทดสอบอีกหนึ่งหรือสองกรณี
Luis Mendo

คำตอบ:


4

JavaScript (ES6), 81 ไบต์

(a,d)=>a.map((e,i)=>d[l="toLowerCase"]()<e[l]()?s--:++s>m&&(++m,p=++i),m=s=p=0)|p

Ungolfed:

function position(archive, document) {
    var score = 0;
    var max = 0;
    var pos = 0;
    var i = 0;
    while (i < archive.length) {
        if (archive[i++].toLowerCase() > document.toLowerCase()) {
            score--;
        } else {
            score++;
            if (score > max) {
                max++;
                pos = i;
            }
        }
    }
    return pos;
}

แก้ไข: บันทึกจำนวนมากด้วย @ user81655


นอกจากนี้การแทนที่indexOfด้วยตัวแปรผลลัพธ์ที่ตั้งไว้ในแผนที่จะสั้นลงเช่นกัน
user81655

เห็นด้วย แต่ดูเหมือนว่าโซลูชันของฉันจะยากกว่านี้อีกแล้ว ...
นีล

3

Pyth, 40 38 ไบต์

ให้เครดิตกับ@Katenkyoสำหรับการสอนฉันซึ่งA xnor Bโดยพื้นฐานA==Bแล้ว ( A xor Bยังเป็นA!=B)

AQJ+],k0.e,rb0hkGteh.Msmq<hdrH0<edeZJJ

ลองออนไลน์!

มันทำงานอย่างไร:

มันสรุป XNOR ว่ารายการมีขนาดเล็กกว่าเอกสารหรือไม่และดัชนีของรายการนั้นเล็กกว่าดัชนีของเอกสารหรือไม่

พบตำแหน่งที่ผลรวมนี้เป็นจำนวนสูงสุดแล้วส่งออก


2

Python 3, 135 167 Bytes

def a(b,c):a=[sum(map(lambda x:x.lower()>c.lower(),b[i:]))+sum(map(lambda x:x.lower()<c.lower(),b[:i]))for i in range(0,len(b)+1)];b.insert(a.index(max(a)),c);print(b)

1

Ruby, 97 ไบต์

ฟังก์ชั่นไม่ระบุชื่อส่งคืนตำแหน่งเป้าหมาย

->a,d{d.upcase!;(0...a.size).max_by{|i|a[0,i].count{|s|s.upcase<d}+a[i..-1].count{|s|s.upcase>d}}}

เมื่อแทรกลงในไฟล์เก็บถาวรจริง ๆ แล้ว110 ไบต์ :

->a,d{t=d.upcase;a.insert (0...a.size).max_by{|i|a[0,i].count{|s|s.upcase<d}+a[i..-1].count{|s|s.upcase>d}},d}

1

Pyth, 54 52 47 45 ไบต์

AQVhlG=Ys+m>rH0rd0:G0Nm<rH0rd0gGNI>YZ=ZY=kN;k

การป้อนข้อมูลที่คาดหวังเป็นรายการองค์ประกอบแรกคือรายการของสตริง (เก็บถาวร) องค์ประกอบที่สองคือสตริง (เอกสาร)

AQ                                            # initialize G and H with the archive and the document
  VhlG                                        # iterate over the indexes on archive
      =Ys+                                    # concatenate and sum the following scores
          m>rH0rd0:G0N                        # map a string comparison between the document and the archives up to the index, returning true(1) for lower, and false(0) for higher
                      m<rH0rd0gGN             # same as above, but starts at the index and goes up to the end of the archive, returning false(0) for lower, and true(1) for higher
                                 I>YZ         # Check if score is higher than highest
                                     =ZY      # update highest score
                                        =kN;  # update index
                                            k # print index

ทดสอบที่นี่

  • บันทึก 5 ไบต์สำหรับการเริ่มต้นอินพุต (ขอบคุณ @Kenny Lau)

Z ถูก autoinited 0ซึ่งถ้าฉันอ่านรหัสของคุณอย่างถูกต้องสามารถช่วยคุณประหยัดพื้นที่
Maltysen

การใช้["Applebuck Season","Friendship is Magic","The Ticket Master","Griffon the BrushOff","Boast Busters","Bridle Gossip"]\n "Dragonshy"เป็นอินพุตและใช้Eแทน@Q0และ@Q1สามารถช่วยให้คุณประหยัดสี่ไบต์
Leun Nun

คุณสามารถใช้แทนAQ J@Q0K@Q1
แม่ชีที่รั่ว

1

MATL , 32 ไบต์

hk4#S4#S%2#0)>t0whYsw~0hPYsP+K#X>

อินพุตเป็นอาร์เรย์เซลล์ของสตริง (หลายสตริงคั่นด้วยช่องว่างและล้อมรอบด้วยเครื่องหมายปีกกา) สำหรับการเก็บถาวรและสตริงสำหรับเอกสาร ผลลัพธ์เป็นแบบ 1 ในกรณีที่เสมอกันตำแหน่งแรกจะถูกส่งกลับ

ลองออนไลน์!

คำอธิบาย

h      % Concatenate archive and document as a cell array of strings
k      % Convert all strings to lowercase
4#S    % Sort and output the indices of the sorting
4#S    % Again. This gives the indices that applied to the concatenated
       % array would make it sorted
2#0)   % Separate last index (document) from the others (archive)
>      % Is it greater? Gives zero/one array the size of the archive
t      % Duplicate that array
0wh    % Prepend a 0
Ys     % Cumulative sum. This is first part of the score
w~     % Swap. Negate zero/one array
0h     % Postpend a 0
PYsP   % Reverse, cumulative sum, reverse. Second part of the score
+      % Add. This is the score of each position
K#X>   % Arg max
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.