Sıralanmamış diziye yarı sıralama ekle


14

PPCG Inc.'de ilk gününüze hoş geldiniz. En yeni genç yardımcısı belge sıralayıcısı olarak, size gönderdiğimiz tüm belgelerin alfabetik sırada arşivlenmesini sağlamaktan sorumlusunuz. Bir maymunun yapabileceği kadar kolaydır. Mecazi olarak, bunu yapmak için bir maymun kiraladığımız gibi. Bil bakalım ne oldu? Görünen o ki maymunlar alfabemizi anlamıyorlar. Her neyse, şu anda karışıklığı düzeltmek için zaman yok, bu yüzden durumu daha da kötüleştirmeye çalışmayın, tamam mı? O zaman alın! Acıkırsanız, su soğutucuda muzlar var. İyi şanslar!

İş tanımı

Giriş

  • Bir dizi (arşiv) listesi ve bu listeye (belge) eklenmesi gereken bir dize alırsınız.
  • Tüm dizeler yalnızca büyük harfler, küçük harfler ve boşluklar içerecektir
  • Dizeler her zaman bir harfle başlar ve biter

Görev

Belgenin hedef konumunu belirleyin: arşivde alması gereken konum. Hedef pozisyon aşağıdaki gibi belirlenebilir:

  • Her pozisyon için:
    • Arşivdeki dizeden, belgeden önce alfabetik olarak gelen konumdan önce sayın
    • Arşivdeki bu konumdan sonraki dizeden, belgeden sonra alfabetik olarak olan dize sayısını sayın
    • Pozisyonun skorunu yukarıdaki iki sayımın toplamı olarak tanımlayın
  • Belgenin hedef konumu en yüksek puana sahip konumdur
  • Beraberlik durumunda, en yüksek puana sahip tüm pozisyonlar, hedef konum olarak eşit derecede geçerlidir. Yalnızca bir tanesinin seçilmesi gerekir.

Sıralama yaparken:

  • Büyük ve küçük harfler aynıdır
  • Boşluklar harflerden önce gelir

Çıktı

  • Belgeye herhangi bir biçimde eklenmiş olan arşiv

VEYA

  • 0 veya 1 tabanlı bir dizinde belgenin hedef konumu

İş değerlendirmesi

Birkaç bayt kazanır!

Örnek G / Ç

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'ye hoş geldiniz, bu güzel bir ilk yazı gibi görünüyor! :) "Görev" bölümündeki talimatlarınızı okumak biraz zor. Yatay kaydırma rahatsız edici: Bunun yerine madde işaretli bir liste kullanmayı düşünürdüm. İsterseniz, topluluğun incelemesi için zorluklar gönderebileceğiniz kullanışlı bir Korumalı Alanımız var .
FryAmTheEggman

Dragonshy az önce anladım! Çok hoş :-D
Luis Mendo

@Lex Bir veya iki test senaryosuna sahip olmak iyi olur
Luis Mendo

Yanıtlar:


4

JavaScript (ES6), 81 bayt

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

Düzenleme: @ user81655 sayesinde çok bayt kaydetti.


Ayrıca indexOf, harita sırasında ayarlanan bir sonuç değişkeni ile değiştirilmesi de daha kısa olacaktır.
user81655

Kabul etti, ama artık benim çözümüm gibi
Neil

3

Pyth, 40 38 bayt

Temelde bana öğrettiği için @Katenkyo'ya verilen krediler . ( ayrıca )A xnor BA==BA xor BA!=B

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

Çevrimiçi deneyin!

Nasıl çalışır:

XNOR değerini girdinin belgeden daha küçük olup olmadığı ve girişin dizininin belgenin dizininden daha küçük olup olmadığını toplar.

Bu toplamın maksimum olduğu konumu bulur, sonra verir.


2

Python 3, 135 167 Bayt

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 bayt

Anonim işlev, hedef konumu döndürür.

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

Gerçekte arşive eklerken 110 bayt :

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

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

Beklenen girdi bir liste, ilk öğe dizelerin bir listesi (arşiv), ikinci öğe bir dize (belge)

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

Burada test edin

  • Giriş başlatma sırasında 5 bayt kaydedildi (teşekkürler @Kenny Lau)

Z 0kodunuzu doğru okuduğumda size bir yer kazandıracak olan otomatik olarak düzenlenir
Maltysen

["Applebuck Season","Friendship is Magic","The Ticket Master","Griffon the BrushOff","Boast Busters","Bridle Gossip"]\n "Dragonshy"Giriş olarak kullanmak ve Eyerine kullanmak @Q0ve @Q1dört bayt kaydedebilirsiniz.
Leaky Nun

Bunun AQyerine kullanabilirsiniz J@Q0K@Q1.
Leaky Nun

1

MATL , 32 bayt

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

Girdi, arşiv için bir dizi hücre dizisidir (boşluklarla ayrılmış ve küme parantezleri içine alınmış birkaç dize) ve belge için bir dizedir. Çıktı 1 tabanlıdır. Beraberlik durumunda ilk pozisyon geri döner.

Çevrimiçi deneyin!

açıklama

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.