Semisortiert in unsortiertes Array einfügen

14

Willkommen zu Ihrem ersten Tag bei PPCG Inc. Als unser neuester Junior Assistant Document Sorter sind Sie dafür verantwortlich, dass alle an Sie gesendeten Dokumente in alphabetischer Reihenfolge archiviert werden. Es ist so einfach, dass ein Affe das kann. Nun, bildlich gesprochen, da wir dafür einen Affen engagiert haben. Erraten Sie, was? Es stellte sich heraus, dass Affen unser Alphabet nicht verstehen. Wie auch immer, es gibt keine Zeit, das Chaos zu beheben, das es gerade gibt. Versuchen Sie also, die Situation nicht noch schlimmer zu machen, okay? Dann machen Sie sich daran! Wenn Sie hungrig werden, stehen Bananen neben dem Wasserkühler. Viel Glück!

Jobbeschreibung

Eingang

  • Sie erhalten eine Liste mit Zeichenfolgen (das Archiv) und eine Zeichenfolge, die dieser Liste (dem Dokument) hinzugefügt werden muss.
  • Alle Zeichenfolgen enthalten nur Großbuchstaben, Kleinbuchstaben und Leerzeichen
  • Zeichenfolgen beginnen und enden immer mit einem Buchstaben

Aufgabe

Bestimmen Sie die Zielposition des Dokuments: die Position, die es im Archiv erhalten soll. Die Zielposition kann wie folgt bestimmt werden:

  • Für jede Position:
    • Zählen Sie die Anzahl der Zeichenfolgen im Archiv vor dieser Position, die alphabetisch vor dem Dokument stehen
    • Zählen Sie die Anzahl der Zeichenfolgen im Archiv nach dieser Position, die alphabetisch nach dem Dokument stehen
    • Definieren Sie die Punktzahl der Position als die Summe der beiden obigen Zählungen
  • Die Zielposition des Dokuments ist die Position mit der höchsten Punktzahl
  • Bei einem Gleichstand gelten alle Positionen mit der höchsten Punktzahl gleichermaßen als Zielposition. Es muss nur eine ausgewählt werden.

Beim Sortieren:

  • Groß- und Kleinbuchstaben sind gleichwertig
  • Leerzeichen kommen vor Buchstaben

Ausgabe

  • Das Archiv mit dem hinzugefügten Dokument in beliebiger Form

ODER

  • Die Zielposition des Dokuments in einem 0-basierten oder einem 1-basierten Index

Arbeitsbewertung

Wenigste Bytes gewinnt!

Beispiel 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
Lex
quelle
5
Willkommen bei PPCG, dies scheint ein schöner erster Beitrag zu sein! :) Ihre Anweisungen im Abschnitt "Aufgabe" sind allerdings schwer zu lesen. Das horizontale Scrollen ist ärgerlich: Ich würde stattdessen die Verwendung einer Aufzählungsliste in Betracht ziehen. Wir haben eine praktische Sandbox, in der Sie Herausforderungen veröffentlichen können, die die Community überprüfen kann, wenn Sie möchten.
FryAmTheEggman
Dragonshy Ich habe es gerade verstanden! Sehr schön :-D
Luis Mendo
@ Lex Es wäre gut, ein oder zwei weitere Testfälle zu haben
Luis Mendo

Antworten:

4

JavaScript (ES6), 81 Byte

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

Bearbeiten: Dank @ user81655 wurden viele Bytes gespeichert.

Neil
quelle
Das Ersetzen der indexOfVariable durch eine Ergebnisvariable, die während der Zuordnung festgelegt wird, wäre ebenfalls kürzer.
user81655
Einverstanden, aber es sieht kaum mehr nach meiner Lösung aus ...
Neil
3

Pyth, 40 38 Bytes

Credits @Katenkyo für mich lehren , dass A xnor Bim Grunde ist A==B. ( A xor Bist auch A!=B)

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

Probieren Sie es online!

Wie es funktioniert:

Es summiert das XNOR, ob der Eintrag kleiner als das Dokument ist und ob der Index des Eintrags kleiner als der Index des Dokuments ist.

Es findet die Position, an der diese Summe maximal ist, und gibt sie dann aus.

Undichte Nonne
quelle
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)
Haydenridd
quelle
1

Ruby, 97 Bytes

Anonyme Funktion, gibt die Zielposition zurück.

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

Beim Einfügen in das Archiv werden 110 Bytes benötigt :

->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}
Wert Tinte
quelle
1

Pyth, 54 52 47 45 Bytes

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

Expect-Eingabe ist eine Liste, erstes Element ist eine Liste von Zeichenfolgen (Archiv), zweites Element ist eine Zeichenfolge (Dokument)

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

Hier testen

  • 5 Bytes bei der Initialisierung der Eingabe gespart (danke @Kenny Lau)
Stange
quelle
Z ist autoinited, zu 0dem, wenn ich Ihren Code richtig lese, Sie ein Leerzeichen sparen kann
Maltysen
Verwenden Sie ["Applebuck Season","Friendship is Magic","The Ticket Master","Griffon the BrushOff","Boast Busters","Bridle Gossip"]\n "Dragonshy"als Eingabe und verwenden Sie Eanstelle von @Q0und, @Q1um vier Byte zu sparen.
Undichte Nonne
Sie könnten AQanstelle von verwenden J@Q0K@Q1.
Undichte Nonne
1

MATL , 32 Bytes

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

Die Eingabe ist ein Zellenarray von Zeichenfolgen (mehrere Zeichenfolgen, die durch Leerzeichen getrennt und in geschweiften Klammern eingeschlossen sind) für das Archiv und eine Zeichenfolge für das Dokument. Die Ausgabe ist 1-basiert. Im Falle eines Gleichstands wird die erste Position zurückgegeben.

Probieren Sie es online!

Erläuterung

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