Com uma janela semelhante à mostrada abaixo, você recebe uma lista de strings, que deseja colocar em ordem alfabética.
Como mostrado, você tem cinco operações:
- Mover para cima [U] - move a corda selecionada para cima um lugar
- Mover para baixo [D] - move a corda selecionada para baixo um lugar
- Mover primeiro [F] - move a sequência selecionada para o topo da lista
- Mover último [L] - move a sequência selecionada para o final da lista
- Inverter [R] - inverte a ordem da lista
Usando STDIN, aceite um número (quantas strings), seguido pela lista não ordenada de strings. Cada sequência consiste em 2-99 letras em minúsculas em inglês. (O exemplo acima não seria uma entrada válida.)
Usando STDOUT, imprima o caminho para colocar a lista em ordem. Primeiro, mencione um item a ser selecionado e, em seguida, as operações a serem executadas para colocar a lista em ordem alfabética.
Por exemplo: February U December F May D D June D R D...
Explicação: Clique em fevereiro, mova-o para cima 1. Selecione Dezembro, mova-o para o topo. Pode movê-lo para baixo duas vezes. Junho, desça uma vez, inverta a lista, desça novamente ...
Como existem obviamente muitas soluções válidas, você deve escolher a menor possível. Ou seja, escolha o método com o menor número de operações (7 no exemplo acima).
Se houver um empate entre as saídas corretas na entrada, resolva-o na seguinte ordem.
Escolha a que tiver menos seleções de sequência (4 no exemplo acima).
Escolha aquela com menos operações, contando operações idênticas consecutivas (em uma sequência) como uma (6 no exemplo acima).
Escolha aquele com saída mais curta (menor número de caracteres totais, espaços de contagem).
Escolha aquele com a saída que vem primeiro em ordem alfabética.
Isso é código-golfe; o envio mais curto que sempre produz a saída correta vence.
Exemplos
- NO
2 zz abc
- FORA
zz D
- FORA
- NO
3 cc bb aa
- FORA
aa R
- FORA
- NO
4 abc def cd ccc
- FORA
abc L R
- FORA
- NO
6 rr mm nn oo qq pp
- FORA
pp U rr L
- FORA
Exemplos adicionais (fornecidos por Scott Leadley, qualquer erro é meu e não do ypnypn)
Alguns casos difíceis:
- IN => OUT
6 xx aa dd bb ee cc
=>dd L ee L xx L
7 aa bb ee cc dd ff gg
=>ee D D
8 dd ww aa bb cc xx yy zz
=>ww D D D dd D D D
- ( não o número mínimo de movimentos, o que seria
cc F bb F aa F
)
- ( não o número mínimo de movimentos, o que seria
Permutações de 4 itens aa bb cc dd
com caminhos de classificação de comprimento> 1:
- IN => OUT
4 aa cc dd bb
=>bb F D
4 aa dd cc bb
=>aa L R
4 bb aa dd cc
=>aa F cc U
4 bb dd aa cc
=>aa F cc U
4 bb dd cc aa
=>bb D D R
4 cc aa bb dd
=>cc D D
4 cc aa dd bb
=>bb F aa F
4 cc bb aa dd
=>dd F R
4 cc bb dd aa
=>dd F R
4 cc dd aa bb
=>bb F aa F
4 cc dd bb aa
=>cc D R
4 dd aa cc bb
=>aa L R
4 dd bb aa cc
=>cc F D R
4 dd bb cc aa
=>bb D R
4 dd cc aa bb
=>aa D R
Variações em um tema, 4 itens em aaaaa bbbb ccc dd
que o comprimento da string faz a diferença:
- IN => OUT
4 ccc dd aaaaa bbbb
=>ccc L dd L
4 bbbb aaaaa dd ccc
=>bbbb D dd D
4 bbbb dd aaaaa ccc
=>dd L bbbb D
4 ccc aaaaa dd bbbb
=>ccc L dd L
4 ccc dd bbbb aaaaa
=>dd F R
4 dd bbbb ccc aaaaa
=>ccc R D
4 dd ccc aaaaa bbbb
=>bbbb R D
A
que não existe.ddkP
, D =ddp
, F =ddggP
, L =ddGp
, R =:g/^/m0
. : PRespostas:
Python 2 -
593521É uma força bruta com algumas eficiências, para que realmente termine. A lista de 6 itens com os quais estou testando leva cerca de 5 segundos no meu laptop.
Observe que estou ignorando o número na entrada. Acho inútil.
Ugh, acabei de perceber que não estou lidando com várias operações com o mesmo valor corretamente. Vou tentar consertar isso.
fonte
Ruby 2.0
Com o conjunto de operadores [U, D, F, L], o menor número de seqüências selecionado para classificar a lista é o número de itens na lista menos a subsequência comum mais longa. Para adicionar o operador R, basta inverter a string e aplicar a mesma regra. Infelizmente, minimizar a seleção de cadeias não é o mesmo que minimizar o número de operações. Por exemplo, para uma entrada de
8 dd ww aa bb cc xx yy zz
, a resposta correta éww D D D dd D D D
, mas o menor número de operações (que atende aos outros critérios da pergunta) seriacc F bb F aa F
. Isso significa que uma porção muito maior do conjunto de possíveis caminhos de classificação precisa ser explorada.Esta solução usa uma estratégia de pesquisa profunda e poda alfa-beta. É importante diminuir o valor alfa rapidamente para minimizar a profundidade da pesquisa, caso contrário, a árvore de pesquisa explode exponencialmente. Por exemplo, para determinar o caminho de classificação com a pontuação mínima para o exemplo introdutório do OP, classificando os meses em ordem de calendário para ordem lexical, provavelmente levará algumas décadas com o método de pontuação atual deste programa. O programa encontra o número mínimo de seleções de string, 8, muito rapidamente. Infelizmente, isso ainda deixa uma árvore enorme para atravessar.
Estou usando a classificação gnome como minha função de pontuação porque:
O número 4 seria suficiente. Tudo além é um bônus.
Para uma pesquisa profunda, a ordem na qual as operações são exploradas tem um impacto significativo no tempo de pesquisa. Como qualquer conjunto não vazio de N itens pode ser classificado com operações ≤ N-1 F (primeiro) ou L (ast), essas operações são tentadas primeiro.
Ele passa neste conjunto de testes perl TAP :
fonte