Wstaw częściowo posortowane do nieposortowanej tablicy

14

Witamy w pierwszym dniu w PPCG Inc. Jako nasz najnowszy młodszy asystent sortownika dokumentów, jesteś odpowiedzialny za to, aby wszystkie dokumenty, które do ciebie wysłaliśmy, były archiwizowane w kolejności alfabetycznej. To takie proste, że małpa może to zrobić. Cóż, mówiąc metaforycznie, ponieważ wynajęliśmy do tego małpę. Zgadnij co? Okazuje się, że małpy nie rozumieją naszego alfabetu. W każdym razie nie ma czasu, aby naprawić bałagan, który jest teraz, więc po prostu staraj się nie pogarszać sytuacji, dobrze? Więc przejdź do tego! Jeśli zgłodniejesz, przy chłodziarce są banany. Powodzenia!

Opis pracy

Wejście

  • Otrzymasz listę ciągów (archiwum) i ciąg, który należy dodać do tej listy (dokumentu)
  • Wszystkie ciągi będą zawierać tylko wielkie litery, małe litery i spacje
  • Ciągi znaków zawsze zaczynają się i kończą literą

Zadanie

Określ pozycję docelową dokumentu: pozycję, którą powinna otrzymać w archiwum. Miejsce docelowe można określić w następujący sposób:

  • Dla każdej pozycji:
    • Policz liczbę ciągów w archiwum przed tą pozycją, które są alfabetycznie przed dokumentem
    • Policz liczbę ciągów w archiwum po tej pozycji, które są alfabetycznie po dokumencie
    • Zdefiniuj wynik pozycji jako sumę powyższych dwóch liczb
  • Pozycja docelowa dokumentu to pozycja z najwyższym wynikiem
  • W przypadku remisu wszystkie pozycje z najwyższym wynikiem są równie ważne jak pozycja docelowa. Należy wybrać tylko jeden.

Podczas sortowania:

  • Wielkie i małe litery są równoważne
  • Spacje pojawiają się przed literami

Wynik

  • Archiwum z dokumentem dodanym do niego w dowolnej formie

LUB

  • Pozycja docelowa dokumentu w indeksie 0 lub 1

Ocena pracy

Wygrywa najmniej bajtów!

Przykład 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
źródło
5
Witamy w PPCG, to wydaje się miły pierwszy post! :) Twoje instrukcje w sekcji „Zadanie” są jednak trochę trudne do odczytania. Przewijanie w poziomie jest denerwujące: Zastanowiłbym się zamiast tego nad listą wypunktowaną. Mamy przydatną piaskownicę, w której możesz publikować wyzwania, które społeczność może przejrzeć, jeśli chcesz.
FryAmTheEggman
Dragonshy , właśnie to dostałem! Bardzo fajnie :-D
Luis Mendo
@Lex Dobrze byłoby mieć jeden lub dwa kolejne przypadki testowe
Luis Mendo

Odpowiedzi:

4

JavaScript (ES6), 81 bajtów

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

Nie golfowany:

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

Edycja: Zapisano wiele bajtów dzięki @ user81655.

Neil
źródło
Zastąpienie również indexOfzmienną wynikową ustawioną podczas mapy również byłoby krótsze.
user81655,
Zgadzam się, ale już nie wygląda na to, żeby moje rozwiązanie ...
Neil,
3

Pyth, 40 38 bajtów

Podziękowania dla @Katenkyo za nauczenie mnie, że w A xnor Bzasadzie A==B. ( A xor Bjest również A!=B)

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

Wypróbuj online!

Jak to działa:

Sumuje XNOR tego, czy pozycja jest mniejsza niż dokument i czy indeks pozycji jest mniejszy niż indeks dokumentu.

Znajduje pozycję, w której ta suma jest wartością maksymalną, a następnie wyprowadza ją.

Leaky Nun
źródło
2

Python 3, 135 167 bajtów

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
źródło
1

Ruby, 97 bajtów

Funkcja anonimowa zwraca pozycję docelową.

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

Podczas wstawiania do archiwum 110 bajtów :

->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}
Wartość tuszu
źródło
1

Pyth, 54 52 47 45 bajtów

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

Oczekuj, że dane wejściowe to lista, pierwszy element to lista ciągów (archiwum), drugi element to ciąg (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

Przetestuj tutaj

  • Zapisano 5 bajtów przy inicjalizacji wejścia (dzięki @Kenny Lau)
Pręt
źródło
Z jest automatycznie inicjowane, do 0którego jeśli poprawnie czytam Twój kod, możesz zaoszczędzić miejsce
Maltysen
Używanie ["Applebuck Season","Friendship is Magic","The Ticket Master","Griffon the BrushOff","Boast Busters","Bridle Gossip"]\n "Dragonshy"jako danych wejściowych i używanie Ezamiast @Q0i @Q1może zaoszczędzić cztery bajty.
Leaky Nun
Możesz użyć AQzamiast J@Q0K@Q1.
Leaky Nun
1

MATL , 32 bajty

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

Dane wejściowe to tablica komórek ciągów (kilka ciągów oddzielonych spacjami i ujętych w nawiasy klamrowe) dla archiwum oraz ciąg dla dokumentu. Wyjście jest oparte na 1. W przypadku remisu zwracana jest pierwsza pozycja.

Wypróbuj online!

Wyjaśnienie

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
źródło