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.


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

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.


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.


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.


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


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

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:

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.