Problema
Você recebe uma sequência de bolas coloridas (vermelho R
e verde G
). Uma dessas seqüências possíveis é:
RGGGRRGGRGRRRGGGRGRRRG
No menor número de movimentos possível, você deve fazer com que cada bola tenha uma cor diferente dos seus vizinhos (ou seja, a sequência se alterna).
RGRGRGRGRGRGRGRGRGRGRG
Você deve escrever um programa que possa converter uma sequência não ordenada (neste caso, uma sequência) com números iguais de "R" e "G" em uma sequência na qual os itens se alternam. Um exemplo de sessão está abaixo, para um algoritmo ingênuo ( <
é entrada no programa, >
é saída. Não é necessário incluir os pontos de intercalação na entrada ou saída).
< RGGGRRGGRGRRRGGGRGRRRG
> RGGRGRGGRGRRRGGGRGRRRG
> RGRGGRGGRGRRRGGGRGRRRG
> RGRGRGGGRGRRRGGGRGRRRG
> RGRGRGGRGGRRRGGGRGRRRG
> RGRGRGGRGRGRRGGGRGRRRG
> RGRGRGGRGRGRGRGRGGRRRG
> RGRGRGGRGRGRGRGRGRGRRG
> RGRGRGGRGRGRGRGRGRGRGR
> RGRGRGRGGRGRGRGRGRGRGR
> RGRGRGRGRGGRGRGRGRGRGR
> RGRGRGRGRGRGGRGRGRGRGR
> RGRGRGRGRGRGRGGRGRGRGR
> RGRGRGRGRGRGRGRGGRGRGR
> RGRGRGRGRGRGRGRGRGGRGR
> RGRGRGRGRGRGRGRGRGRGGR
> RGRGRGRGRGRGRGRGRGRGRG (15 moves)
Outra possibilidade é emitir "5,7", por exemplo, para indicar a troca das posições 5 e 7.
Você pode posicionar quer vermelho ou verde em primeiro lugar, e você não tem que ser consistente. Cada sequência terá o mesmo comprimento que qualquer outra sequência.
Você pode trocar apenas duas letras em cada movimento (elas não precisam ser adjacentes).
Critérios Vencedores
O programa deve mostrar cada etapa do processo de classificação. O programa que faz o menor número total de movimentos para todas as seqüências abaixo, vence. Se houver um empate, o código mais curto vencerá.
String de entrada
As seguintes seqüências de caracteres serão usadas para testar os programas:
GGGGGGGGGGRRRRRRRRRR
GGRRGGRRGGRRGGRRGGRR
RRGGGGRRRRGGGGRRRRGG
GRRGRGGGGRRRGGGGRRRR
GRGGGRRRRGGGRGRRGGRR
RGRGRGRGRGRGRGRGRGRG
A última sequência deve resultar em zero movimentos.
fonte
Respostas:
Python,
140122119115fonte
s
. Isso pouparia mais alguns personagens.APL 46
A execução dos casos de teste fornecidos gera:
A solução acima usa a origem do índice 1 com os swaps fornecidos nas colunas da matriz de resultados. Dois caracteres podem ser salvos se o vetor de entrada i for inicializado com a string de entrada antes da execução, em vez de ser inserido no momento da execução.
fonte
GolfScript (47 caracteres)
Por exemplo (usando um caso de teste muito mais fácil de verificar a exatidão do que qualquer um dos sugeridos, todos com muitas respostas corretas):
Saída é uma lista de pares indexados a zero para trocar.
fonte
Python, 213 caracteres
M
encontra os movimentos necessários para converterS
aT
. Isso é feito ao encontrar repetidamente umR
e umG
fora de posição e trocá-los. Em seguida, encontramos a sequência de movimento mais curta para chegar a umRGRG...RG
ou a umGRGR...GR
.Deve encontrar uma sequência ótima de movimentos para cada entrada.
fonte
Mathematica 238
Código
NB:
\[Transpose]
é um caractere único, um sobrescrito "t", no Mathematica ]Exemplos
fonte
Mathematica 134 ou 124
Dependendo de como você conta "Transpose []", que no Mathematica é apenas um caractere (sem representação aqui). Espaços adicionados para maior clareza
Amostra:
Resultado
fonte
PadLeft[{}, 20, {y}], #, 1]
pode ser comprimido um pouco maisJavascript - 173 caracteres
Um grande desafio me manteve ocupado por algum tempo.
Aqui os resultados dos códigos para os casos de teste:
fonte
PHP - 34 movimentos - 193 caracteres
Ainda pode tentar melhorar isso ...
fonte
$argv[0]
, economizando 2 bytes / cada. E será mais válido, uma vez que$argv
muitas vezes é usado para entrada via CMD