(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 subgruposY
yYG
.Y
está pintado trivialmente de una vez.Para
YG
: IntentarG
,Y
es trivial, longitud2
. IntentaY
,G
es trivial, la longitud 2.YG
es, por lo tanto, longitud2
.Pintar
R
primero por lo tanto nos da1 + 1 + 2 = 4
Entonces inténtalo
G
. Esto nos da los subgruposYRY
yR
.R
es trivialPara
YRY
:Probar
Y
:R
es trivial, longitud2
. PruebaR
:Y
yY
son los dos grupos, longitud3
.YRY
es la longitud2
.Pintar
G
primero da1 + 1 + 2 = 4
Entonces inténtalo
Y
. Esto le da a los subgruposR
yGR
.R
trivial,GR
es longitud2
.Y
es longitud4
Esta implementación luego verificaría R e Y nuevamente para reducir la longitud del código. El resultado para
YRYGR
es por lo tanto4
.fuente
m
alguna parte."abcacba"
.m
fue 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.D
selecciona 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