(Basado en este problema de Math.SE , que también proporciona algunos gráficos)
Tengo un palo que se parece a esto:

Quiero que se vea así:

Sin embargo, no soy una pintora experta, así que antes de comenzar un proyecto de bricolaje tan ambicioso, quiero asegurarme de que no me sobrepase.
Su programa debería decirme cuántos pasos implican pintar este palo. Cada paso implica pintar un área continua con un color sólido, que cubre capas anteriores de pintura. Para el ejemplo anterior, podría pintar la mitad izquierda azul, la mitad derecha roja y luego las dos áreas verdes separadas para un total de 4 pasos (el verde no se pinta continuamente).

Aquí está en ASCII:
------
bbb---
bbbrrr
bgbrrr
bgbrgr
Hay un par de formas diferentes de pintar este palo y terminar con el mismo resultado. Sin embargo, solo me interesa el tiempo estimado, que son cuatro pasos.
Objetivo
Su programa debe generar el número mínimo de pasos necesarios para pintar un palo con un esquema de color dado. El esquema de pintura tendrá la forma de una cadena de caracteres, mientras que la salida será un número. Este es el código de golf. El programa más corto gana.
Entrada
Su programa recibirá el esquema de color para un palo en forma de una cadena de letras. Cada letra única (mayúsculas y minúsculas) representa un color único.
YRYGR
grG
GyRyGyG
pbgbrgrp
hyghgy
Salida
Estos números son el menor número de pasos necesarios para pintar los palos.
4
3
4
5
4
Explicaciones
Así es como llegué a los números anteriores. Su programa no necesita generar esto:
-----
YYY--
YRY--
YRYG-
YRYGR
---
g--
gr-
grG
-------
GGGGGGG
GyyyGGG
GyRyGGG
GyRyGyG
--------
pppppppp
pbbbpppp
pbbbrrrp
pbgbrrrp
pbgbrgrp
------
-yyyyy
-ygggy
hygggy
hyghgy
Editar: agregaré más casos de prueba si resultan ser casos de prueba más difíciles.

Respuestas:
GolfScript,
827267 caracteresRazonablemente rápido para un programa GolfScript, ejemplos:
El algoritmo utilizado funciona a través de los colores de izquierda a derecha de forma recursiva, de acuerdo con las siguientes afirmaciones:
De lo contrario, tome el color objetivo de la parte más a la izquierda (es decir, la primera que no esté en el color deseado).
...
Tome el mínimo de todos esos números y agregue 1 (para el paso actual). Devuelva esto como el número óptimo de pasos.
Este algoritmo funciona, porque la parte más a la izquierda tiene que pintarse de una vez de todos modos, entonces, ¿por qué no hacerlo de inmediato?
fuente
n!pasos;) (pero tal vez esta es la verdadera complejidad, no sé).JavaScript:
187bytes¡Asumiendo que se nos permita tener solo la entrada y salida de una función (por favor)!
157 Byteshaciendo una optimización fea adicional (que es parte del punto, y me pareció increíblemente divertido):135 Bytes Me di cuenta de que la longitud de la entrada es un límite superior y ahora no necesito manejar casos triviales por separado.
Casos de prueba:
Versión ampliada:
Para cada carácter de la entrada, calcule la longitud del patrón si primero pintamos ese color. Esto se hace fingiendo que pintamos ese color y luego haciendo subsecciones de los bits que no son de ese color, y recurriendo recursivamente al método de pintura en ellos. Se devuelve el camino más corto.
Ejemplo (
YRYGR):Inicialmente, inténtalo
R. Esto nos da los subgruposYyYG.Yestá pintado trivialmente de una vez.Para
YG: IntentarG,Yes trivial, longitud2. IntentaY,Ges trivial, la longitud 2.YGes, por lo tanto, longitud2.Pintar
Rprimero por lo tanto nos da1 + 1 + 2 = 4Entonces inténtalo
G. Esto nos da los subgruposYRYyR.Res trivialPara
YRY:Probar
Y:Res trivial, longitud2. PruebaR:YyYson los dos grupos, longitud3.YRYes la longitud2.Pintar
Gprimero da1 + 1 + 2 = 4Entonces inténtalo
Y. Esto le da a los subgruposRyGR.Rtrivial,GRes longitud2.Yes longitud4Esta implementación luego verificaría R e Y nuevamente para reducir la longitud del código. El resultado para
YRYGRes por lo tanto4.fuente
malguna parte."abcacba".mfue solo una abreviatura deword.length:) @Howard Tienes razón, tendré que repensar esto.Python, 149 caracteres
Yo uso
?para marcar un área que puede ser de cualquier color.Dselecciona una región contigua del palo que contiene solo un color (más tal vez algunos?s), colorea esa región al final, reemplaza esa región con?sy vuelve a buscar todos los pasos anteriores.Tiempo de ejecución exponencial. Apenas lo suficientemente rápido como para hacer los ejemplos en un tiempo razonable (unos minutos). Apuesto a que con la memorización podría ser mucho más rápido.
fuente
Python 3 - 122
Parece funcionar, pero todavía no estoy 100% seguro de que este método siempre encuentre el número mínimo de pasos.
fuente
CoffeeScript -
183 247 224 215207Demo en JSFiddle.net
Versión sin golf que incluye código de depuración y comentarios:
fuente
hyghgy. Dice 5 pero debería ser 4. (sin embargo, devuelve el resultado correcto de 4 parahyghgyh).Haskell, 143 caracteres
Esto intenta todas las reescrituras posibles hasta la longitud de la cadena, y continúa hasta que encuentra una que construya el patrón de entrada. No hace falta decir, tiempo exponencial (y algo más).
fuente
Una primera búsqueda de amplitud simple. No pone nada en la cola que ya se haya visto. Funciona en menos de un segundo para todos los ejemplos, pero 'pbgbrgrp', que en realidad lleva un minuto completo :(
Ahora que tengo algo que funciona , estaré trabajando para encontrar algo más rápido y más corto.
Python -
300296fuente
Haskell,
11886 caracteresPruebas de funcionamiento:
¡Este método ni siquiera es tan ineficiente!
fuente