Problema
Te dan una secuencia de bolas de colores (rojo R
y verde G
). Una de esas posibles secuencias es:
RGGGRRGGRGRRRGGGRGRRRG
En el menor número de movimientos posible, debe hacerlo de modo que cada bola tenga un color diferente al de sus vecinos (es decir, la secuencia se alterna).
RGRGRGRGRGRGRGRGRGRGRG
Debe escribir un programa que pueda convertir una secuencia desordenada (en este caso, una cadena) con números iguales de "R" y "G" en una secuencia donde los elementos se alternan. A continuación se muestra una sesión de ejemplo, para un algoritmo ingenuo ( <
se ingresa al programa, >
se emite. No es necesario incluir los puntos en la entrada o salida).
< RGGGRRGGRGRRRGGGRGRRRG
> RGGRGRGGRGRRRGGGRGRRRG
> RGRGGRGGRGRRRGGGRGRRRG
> RGRGRGGGRGRRRGGGRGRRRG
> RGRGRGGRGGRRRGGGRGRRRG
> RGRGRGGRGRGRRGGGRGRRRG
> RGRGRGGRGRGRGRGRGGRRRG
> RGRGRGGRGRGRGRGRGRGRRG
> RGRGRGGRGRGRGRGRGRGRGR
> RGRGRGRGGRGRGRGRGRGRGR
> RGRGRGRGRGGRGRGRGRGRGR
> RGRGRGRGRGRGGRGRGRGRGR
> RGRGRGRGRGRGRGGRGRGRGR
> RGRGRGRGRGRGRGRGGRGRGR
> RGRGRGRGRGRGRGRGRGGRGR
> RGRGRGRGRGRGRGRGRGRGGR
> RGRGRGRGRGRGRGRGRGRGRG (15 moves)
Otra posibilidad es generar "5,7", por ejemplo, para indicar el intercambio de las posiciones 5 y 7.
Usted puede colocar ya sea rojo o verde en primer lugar, y usted no tiene que ser coherente. Cada secuencia tendrá la misma longitud que cualquier otra secuencia.
Solo puede intercambiar dos letras en cada movimiento (no es necesario que sean adyacentes).
Criterios ganadores
El programa debe mostrar cada paso del proceso de clasificación. El programa que realiza la menor cantidad de movimientos totales para todas las cadenas a continuación, gana. Si hay un empate, el código más corto ganará.
Cadenas de entrada
Las siguientes cadenas se utilizarán para probar los programas:
GGGGGGGGGGRRRRRRRRRR
GGRRGGRRGGRRGGRRGGRR
RRGGGGRRRRGGGGRRRRGG
GRRGRGGGGRRRGGGGRRRR
GRGGGRRRRGGGRGRRGGRR
RGRGRGRGRGRGRGRGRGRG
La última secuencia debería resultar en cero movimientos.
fuente
Respuestas:
Python,
140122119115fuente
s
. Te ahorraría un par de personajes más.APL 46
Ejecutar los casos de prueba dados produce:
La solución anterior utiliza el índice de origen 1 con los intercambios dados en las columnas de la matriz de resultados. Se pueden guardar dos caracteres si el vector de entrada i se inicializa con la cadena de entrada antes de la ejecución en lugar de ser ingresado en el momento de la ejecución.
fuente
GolfScript (47 caracteres)
Por ejemplo (usando un caso de prueba que es mucho más fácil verificar que sea correcto que cualquiera de los sugeridos, que tienen muchas respuestas correctas):
La salida es una lista de pares indexados a cero para intercambiar.
fuente
Python, 213 caracteres
M
descubre los movimientos necesarios para convertirS
aT
. Lo hace encontrando repetidamente unR
y unG
fuera de posición e intercambiándolos. Luego encontramos la secuencia de movimiento más corta para llegar a cualquieraRGRG...RG
oGRGR...GR
.Debe encontrar una secuencia óptima de movimientos para cada entrada.
fuente
Mathematica 238
Código
NB:
\[Transpose]
es un solo carácter, una "t" superíndice, en Mathematica ]Ejemplos
fuente
Mathematica 134 o 124
Dependiendo de cómo cuente "Transponer []", que en Mathematica es solo un carácter (sin representación aquí). Espacios añadidos para mayor claridad.
Muestra:
Salida
fuente
PadLeft[{}, 20, {y}], #, 1]
se puede comprimir un poco másJavascript - 173 caracteres
Un gran desafío, me mantuvo ocupado por algún tiempo.
Aquí los resultados de los códigos para los casos de prueba:
fuente
PHP - 34 movimientos - 193 caracteres
Todavía podría intentar mejorar esto ...
fuente
$argv[0]
, ahorrándote 2 bytes / cada uno. Y será más válido, ya$argv
que a menudo se usa para la entrada a través de CMD