Faça um padrão alternativo

8

Problema

Você recebe uma sequência de bolas coloridas (vermelho Re 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.

Thomas O
fonte
"Você não pode trocar apenas dois pares em cada jogada" não deve ler "Você pode trocar apenas duas letras em cada jogada"?
26813 DavidC
@ cara muito bom, eu vou corrigir isso.
Thomas O
Algum requisito para que uma letra em particular inicie a sequência classificada?
dmckee --- gatinho ex-moderador
@dmckee Da pergunta - "Você pode posicionar vermelho ou verde primeiro e não precisa ser consistente."
Thomas O
2
Bom problema para trabalhar. Sugiro que você peça às pessoas que publiquem vários exemplos de suas entradas e saídas. Dessa forma, quem não programa no idioma escolhido pode fazer uma avaliação sobre a adequação das saídas para as respectivas entradas.
DavidC

Respostas:

5

Python, 140 122 119 115

r=raw_input()
f=lambda x:[i for i in range(x,len(r),2)if x-(r[i]!=max('RG',key=r[::2].count))]
print zip(f(0),f(1))
grc
fonte
1
Tecnicamente, você não precisa da atribuição de s. Isso pouparia mais alguns personagens.
Kojiro
Sim, de nada. Eu tive que fazer algo inteligente depois que você bateu no que eu estava trabalhando.
Kojiro
3

APL 46

((2|y)/y←(i≠↑i)/n),[.1](~2|y)/y←(i=↑i)/n←⍳⍴i←⍞

A execução dos casos de teste fornecidos gera:

GGGGGGGGGGRRRRRRRRRR
11 13 15 17 19
 2  4  6  8 10

GGRRGGRRGGRRGGRRGGRR
3 7 11 15 19
2 6 10 14 18

RRGGGGRRRRGGGGRRRRGG
3 5 11 13 19
2 8 10 16 18

GRRGRGGGGRRRGGGGRRRR
3 5 11 17 19
4 6  8 14 16

GRGGGRRRRGGGRGRRGGRR
7  9 13 15 19
4 10 12 14 18

RGRGRGRGRGRGRGRGRGRG

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.

Graham
fonte
3

GolfScript (47 caracteres)

:S;4,{S,,{.S=1&3*\1&2*^1$=},\;}%2/{zip}%{,}$0=`

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):

< RRGGRGRGRGRGRGRGRGRG
> [[1 2]]

Saída é uma lista de pares indexados a zero para trocar.

Peter Taylor
fonte
Se [[1 2]] significa trocar letras nas posições 1 e 2, o resultado parecerá idêntico à entrada. Por favor, esclareça.
DavidC
4
@ cara, que tipo de esquisito começa a contar em 1?
Peter Taylor
3
(Minha mão está levantada).
DavidC
2

Python, 213 caracteres

I=raw_input()
def M(S,T):
 S=list(S);m=[]
 while S!=list(T):z=zip(S,T);x=z.index(('R','G'));y=z.index(('G','R'));m+=[(x,y)];S[x],S[y]='GR'
 return m
N=len(I)/2
x=M(I,N*'RG')
y=M(I,N*'GR')
print[x,y][len(x)>len(y)]

Mencontra os movimentos necessários para converter Sa T. Isso é feito ao encontrar repetidamente um Re um Gfora de posição e trocá-los. Em seguida, encontramos a sequência de movimento mais curta para chegar a um RGRG...RGou a um GRGR...GR.

Deve encontrar uma sequência ótima de movimentos para cada entrada.

Keith Randall
fonte
2

Mathematica 238

Código

f[x_] := With[{g = "GRGRGRGRGRGRGRGRGRGR", c = Characters, p = Position},
y = c[x]; s = c[g]; {v = Equal @@@ ({s, y}\[Transpose]), 
w = Not /@ v}; {vv = Thread[{y, v}], ww = Thread[{y, w}]};
((Flatten /@ {p[#, {"R", False}], p[#, {"G", False}]}) &[If[Count[Equal @@@ 
({s, y}\[Transpose]), False] < 10, vv, ww]])\[Transpose]]

NB: \[Transpose]é um caractere único, um sobrescrito "t", no Mathematica ]

Exemplos

f@"GGGGGGGGGGRRRRRRRRRR"
f@"GGRRGGRRGGRRGGRRGGRR"
f@"RRGGGGRRRRGGGGRRRRGG"
f@"GRRGRGGGGRRRGGGGRRRR"
f@"GRGGGRRRRGGGRGRRGGRR"
f@"RGRGRGRGRGRGRGRGRGRG"
f@"GRGRGRGRGRGRGRGRGRGR"

{{12, 1}, {14, 3}, {16, 5}, {18, 7}, {20, 9}}
{{4, 1}, {8, 5}, {12, 9}, {16, 13}, {20, 17}}
{{2, 3}, {8, 5}, {10, 11}, {16, 13}, {18, 19}}
{{2, 1}, {10, 7}, {12, 9}, {18, 13}, {20, 15}}
{{2, 1}, {6, 3}, {8, 5}, {16, 11}, { 20, 17}}
{}
{}

DavidC
fonte
2

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

G = 0; R = 1; 
x_~ d ~ y__:= Transpose[Position[Symbol /@ Characters@x - PadLeft[{}, 20, {y}], #, 1] &
                                                                                 /@ {1, -1}]
f = SortBy[{d[#, 0, 1], d[#, 1, 0]}, Length][[1]] &

Amostra:

f@"GGGGGGGGGGRRRRRRRRRR"
f@"GGRRGGRRGGRRGGRRGGRR"
f@"RRGGGGRRRRGGGGRRRRGG"
f@"GRRGRGGGGRRRGGGGRRRR"
f@"GRGGGRRRRGGGRGRRGGRR"
f@"RGRGRGRGRGRGRGRGRGRG"
f@"GRGRGRGRGRGRGRGRGRGR"

Resultado

{{{11}, {2}}, {{13}, {4}}, {{15},  {6}}, {{17},  {8}}, {{19}, {10}}}
{{{3},  {2}}, {{7},  {6}}, {{11}, {10}}, {{15}, {14}}, {{19}, {18}}}
{{{1},  {4}}, {{7},  {6}}, {{9},  {12}}, {{15}, {14}}, {{17}, {20}}}
{{{2},  {1}}, {{10}, {7}}, {{12},  {9}}, {{18}, {13}}, {{20}, {15}}}
{{{2},  {1}}, {{6},  {3}}, {{8},   {5}}, {{16}, {11}}, {{20}, {17}}}
{}
{}
Dr. belisarius
fonte
Codificação muito econômica. Bom uso de funções puras.
DavidC
@ Cara Cara :). Tenho certeza que o PadLeft[{}, 20, {y}], #, 1]pode ser comprimido um pouco mais
Dr. belisarius
2

Javascript - 173 caracteres

a=prompt(w=[[],[]]).split('');for(i=a.length,f=a[0];i--;)if(i%2<1&&a[i]!=f)w[0].push(i);else if(i%2>0&&a[i]==f)w[1].push(i);for(i=w[0].length;i--;)alert(w[0][i]+','+w[1][i])

Um grande desafio me manteve ocupado por algum tempo.
Aqui os resultados dos códigos para os casos de teste:

GGGGGGGGGGRRRRRRRRRR: [10, 1] [12, 3] [14, 5] [16, 7] [18, 9]
GGRRGGRRGGRRGGRRGGRR: [ 2, 1] [ 6, 5] [10, 9] [14,13] [18,17]
RRGGGGRRRRGGGGRRRRGG: [ 2, 1] [ 4, 7] [10, 9] [12,15] [18,17]
GRRGRGGGGRRRGGGGRRRR: [ 2, 3] [ 4, 5] [10, 7] [16,13] [18,15]
GRGGGRRRRGGGRGRRGGRR: [ 6, 3] [ 8, 9] [12,11] [14,13] [18,17]
RGRGRGRGRGRGRGRGRGRG:
codeporn
fonte
1

PHP - 34 movimentos - 193 caracteres

$l=strlen($a=$_GET["a"]);$n=$a[0]=="R"?"G":"R";while($i<$l){if($a[++$i]!=$n){echo$o."
";$o=$a=substr($a,0,$i).$n.preg_replace("/".$n."/",$n=="R"?"G":"R",substr($a,$i+1),1);}$n=$n=="R"?"G":"R";}

Ainda pode tentar melhorar isso ...

red_green.php?a=GGGGGGGGGGRRRRRRRRRR

GRGGGGGGGGGRRRRRRRRR
GRGRGGGGGGGGRRRRRRRR
GRGRGRGGGGGGGRRRRRRR
GRGRGRGRGGGGGGRRRRRR
GRGRGRGRGRGGGGGRRRRR
GRGRGRGRGRGRGGGGRRRR
GRGRGRGRGRGRGRGGGRRR
GRGRGRGRGRGRGRGRGGRR
GRGRGRGRGRGRGRGRGRGR
Aurel300
fonte
seria melhor usá-lo $argv[0], economizando 2 bytes / cada. E será mais válido, uma vez que $argvmuitas vezes é usado para entrada via CMD
RedClover