Вставте напівсортироване в несортований масив


14

Ласкаво просимо на ваш перший день в PPCG Inc. Як наш найновіший сортувальник документів для молодших помічників, ви несете відповідальність за те, щоб усі документи, які ми надсилали вам, були заархівовані в алфавітному порядку. Це так просто, що мавпа може це зробити. Ну, метафорично кажучи, як ми найняли мавпу, щоб це зробити. Вгадай що? Виявляється, мавпи не мають розуміння нашого алфавіту. У всякому разі, зараз немає часу, щоб виправити безлад, тому просто постарайтеся не погіршити ситуацію, гаразд? Тоді діставайся до цього! Якщо ви зголодніли, банани охолоджують воду. Удачі!

Описання роботи

Вхідні дані

  • Ви отримаєте список рядків (архів) та рядок, який потрібно додати до цього списку (документ)
  • Усі рядки містять лише великі літери, малі літери та пробіли
  • Рядки завжди починатимуться і закінчуються буквою

Завдання

Визначте цільове положення документа: позицію, яку він повинен отримати в архіві. Цільове положення можна визначити наступним чином:

  • Для кожної позиції:
    • Порахуйте кількість рядків в архіві до цієї позиції, які в алфавіті є перед документом
    • Порахуйте кількість рядків в архіві після цієї позиції, які в алфавіті після документа
    • Визначте бал позиції як суму вищезгаданих двох підрахунків
  • Цільова позиція документа - це позиція з найвищим балом
  • У разі вирівнювання всі позиції з найвищим балом однаково справедливі як цільова. Вибирати потрібно лише одну.

При сортуванні:

  • Великі і малі літери рівнозначні
  • Проміжки бувають перед літерами

Вихідні дані

  • Архів із доданим до нього документом у будь-якій формі

АБО

  • Цільове положення документа в індексі на основі 0 або 1

Оцінка роботи

Найменше байт виграє!

Приклад вводу / виводу

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, це здається приємним першим повідомленням! :) Ваші вказівки в розділі "Завдання" начебто важко читати. Горизонтальне прокручування дратує: я б подумав про використання списку куль. У нас є зручна пісочниця, де ви можете розмістити виклики перед громадськістю для перегляду, якщо хочете.
FryAmTheEggman

Драгоньши, я щойно це отримав! Дуже приємно :-D
Луїс Мендо

@Lex Було б добре мати ще один або два тестові справи
Луїс Мендо

Відповіді:


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

Безголівки:

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змінної результату, встановленої під час карти, також буде коротшою.
користувач81655

Погодився, але навряд чи більше схоже на моє рішення ...
Ніл

3

Піта, 40 38 байт

Подяки до @Katenkyo за те, що я навчаю це, A xnor Bв основному A==B. ( A xor Bє також A!=B)

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

Спробуйте в Інтернеті!

Як це працює:

Він підсумовує XNOR про те, чи є запис меншим за документ та чи індекс запису менший за індекс документа.

Він знаходить позицію, в якій ця сума є максимальною, а потім виводить її.


2

Пітон 3, 135 167 байт

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

Рубін, 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 автозапущено, і 0якщо я правильно прочитаю ваш код, ви зможете заощадити місце
Maltysen

Використання ["Applebuck Season","Friendship is Magic","The Ticket Master","Griffon the BrushOff","Boast Busters","Bridle Gossip"]\n "Dragonshy"як введення та використання Eзамість, @Q0а @Q1може заощадити чотири байти.
Leaky Nun

Ви можете використовувати AQзамість цього J@Q0K@Q1.
Leaky Nun

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.