Вставить полусортированный в несортированный массив

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
Dragonshy Я только что получил это! Очень приятно :-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

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 байт

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
источник
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может сэкономить четыре байта.
Утренняя монахиня
Вы могли бы использовать 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
Луис Мендо
источник