Inserir semi-classificado em uma matriz não classificada

14

Bem-vindo ao seu primeiro dia na PPCG Inc. Como nosso mais novo classificador assistente de documentos juniores, você é responsável por garantir que todos os documentos que lhe enviamos sejam arquivados em ordem alfabética. É tão fácil que um macaco pode fazer isso. Metaforicamente falando, como contratamos um macaco para fazê-lo. Adivinha? Acontece que os macacos não entendem nosso alfabeto. De qualquer forma, não há tempo para consertar a bagunça que existe agora, então tente não piorar a situação, ok? Então chegue lá! Se você sentir fome, há bananas perto do bebedouro. Boa sorte!

Descrição do trabalho

Entrada

  • Você receberá uma lista de cadeias (o arquivo morto) e uma cadeia que precisa ser adicionada a essa lista (o documento)
  • Todas as strings conterão apenas letras maiúsculas, minúsculas e espaços
  • As strings sempre começam e terminam com uma letra

Tarefa

Determine a posição de destino do documento: a posição que ele deve receber no arquivo morto. A posição de destino pode ser determinada da seguinte maneira:

  • Para cada posição:
    • Contar a quantidade de seqüências de caracteres no arquivo morto antes dessa posição, em ordem alfabética antes do documento
    • Contar a quantidade de seqüências de caracteres no arquivo morto depois dessa posição que estão em ordem alfabética após o documento
    • Defina a pontuação da posição como a soma das duas contagens acima
  • A posição de destino do documento é a posição com a pontuação mais alta
  • Em caso de empate, todas as posições com a pontuação mais alta são igualmente válidas como posição de destino. Apenas um precisa ser selecionado.

Ao classificar:

  • Letras maiúsculas e minúsculas são equivalentes
  • Os espaços vêm antes das letras

Resultado

  • O arquivo com o documento adicionado a ele de qualquer forma

OU

  • A posição de destino do documento, em um índice com base em 0 ou em 1

Avaliação de emprego

Menos bytes ganha!

Exemplo de E / S

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
fonte
5
Bem-vindo ao PPCG, este parece ser um bom primeiro post! :) Suas instruções na seção "Tarefa" são meio difíceis de ler. A rolagem horizontal é irritante: eu consideraria usar uma lista de marcadores. Temos uma caixa de areia prática, na qual você pode publicar desafios para a comunidade revisar, se desejar.
FryAmTheEggman
Dragonshy , acabei de entender! Very nice :-D
Luis Mendo
@Lex Seria bom ter mais um ou dois casos de teste
Luis Mendo

Respostas:

4

JavaScript (ES6), 81 bytes

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

Editar: salvou muitos bytes graças a @ user81655.

Neil
fonte
Também substituir a indexOfvariável de resultado definida durante o mapa também seria mais curta.
user81655
Concordou, mas dificilmente se parece com a minha solução mais ...
Neil
3

Pitão, 40 38 bytes

Créditos ao @Katenkyo por me ensinar isso A xnor Bbasicamente A==B. ( A xor Bé também A!=B)

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

Experimente online!

Como funciona:

Soma ao XNOR se a entrada é menor que o documento e se o índice da entrada é menor que o índice do documento.

Ele encontra a posição em que essa soma é máxima e depois a gera.

Freira Furada
fonte
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
fonte
1

Ruby, 97 bytes

Função anônima, retorna a posição de destino.

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

Ao realmente inserir no arquivo morto, 110 bytes :

->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}
Value Ink
fonte
1

Pitão, 54 52 47 45 bytes

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

A entrada esperada é uma lista, o primeiro elemento é uma lista de cadeias (arquivo morto), o segundo elemento é uma cadeia (documento)

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

Teste aqui

  • Economizou 5 bytes na inicialização da entrada (obrigado @Kenny Lau)
Cajado
fonte
Z é autoinited para 0que se eu estou lendo o seu código corretamente você pode economizar espaço
Maltysen
Usar ["Applebuck Season","Friendship is Magic","The Ticket Master","Griffon the BrushOff","Boast Busters","Bridle Gossip"]\n "Dragonshy"como entrada e usar em Evez de @Q0e @Q1pode economizar quatro bytes.
Leaky Nun #
Você poderia usar em AQvez de J@Q0K@Q1.
Leaky Nun
1

MATL , 32 bytes

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

Input é uma matriz de células de seqüências de caracteres (várias sequências separadas por espaços e colocadas entre chaves) para o arquivo morto e uma sequência para o documento. A saída é baseada em 1. Em caso de empate, a primeira posição é retornada.

Experimente online!

Explicação

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
fonte