(Com base neste problema Math.SE , que também fornece alguns gráficos)
Eu tenho um stick que fica assim:
Eu quero que fique assim:
No entanto, não sou um pintor especialista, portanto, antes de iniciar um projeto tão ambicioso de bricolage, quero ter certeza de que não estou enlouquecendo.
Seu programa deve me dizer quantas etapas estão envolvidas na pintura desse bastão. Cada etapa envolve pintar uma área contínua com uma cor sólida, que cobre as camadas anteriores de tinta. No exemplo acima, pude pintar a metade esquerda azul, a metade direita vermelha e as duas áreas verdes separadas por um total de 4 etapas (a verde não é pintada continuamente).
Aqui está em ASCII:
------
bbb---
bbbrrr
bgbrrr
bgbrgr
Existem algumas maneiras diferentes de pintar esse bastão e acabar com o mesmo resultado. No entanto, estou interessado apenas na estimativa de tempo, que é de quatro etapas.
Objetivo
Seu programa deve produzir o número mínimo de etapas necessárias para pintar um pedaço de pau com um determinado esquema de cores. O esquema de pintura será na forma de uma sequência de caracteres, enquanto a saída será um número. Isso é código de golfe. O programa mais curto vence.
Entrada
Seu programa receberá o esquema de cores para um bastão na forma de uma sequência de letras. Cada letra exclusiva (diferencia maiúsculas de minúsculas) representa uma cor única.
YRYGR
grG
GyRyGyG
pbgbrgrp
hyghgy
Resultado
Esses números são o menor número de etapas necessárias para pintar os palitos.
4
3
4
5
4
Explicações
Foi assim que cheguei aos números acima. Seu programa não precisa produzir isso:
-----
YYY--
YRY--
YRYG-
YRYGR
---
g--
gr-
grG
-------
GGGGGGG
GyyyGGG
GyRyGGG
GyRyGyG
--------
pppppppp
pbbbpppp
pbbbrrrp
pbgbrrrp
pbgbrgrp
------
-yyyyy
-ygggy
hygggy
hyghgy
Editar: adicionarei mais casos de teste se eles se revelarem mais difíceis.
Respostas:
GolfScript,
827267 caracteresRazoavelmente rápido para um programa GolfScript, exemplos:
O algoritmo usado funciona através das cores da esquerda para a direita recursivamente, de acordo com as seguintes instruções:
Caso contrário, pegue a cor alvo da parte agora mais à esquerda (ou seja, a primeira não na cor desejada).
...
Pegue o mínimo de todos esses números e adicione 1 (para a etapa atual). Retorne isso como o número ideal de etapas.
Esse algoritmo funciona, porque a parte mais à esquerda precisa ser pintada de uma só vez, então porque não fazê-lo imediatamente - de qualquer maneira possível.
fonte
n!
etapas;) (mas talvez essa seja a verdadeira complexidade, não sei).JavaScript:
187bytesSupondo que nos é permitido ter apenas a entrada e a saída de uma função (por favor)!
157 bytes, fazendo uma otimização ainda mais feia (que faz parte do ponto, e eu achei incrivelmente divertido):135 bytes Percebi que o comprimento da entrada é um limite superior e não preciso lidar com casos triviais separadamente agora.
Casos de teste:
Versão expandida:
Para cada caractere da entrada, calcule o comprimento do padrão se pintarmos essa cor primeiro. Isso é feito fingindo que pintamos essa cor e, em seguida, criando sub-seções com os bits que não são dessa cor e chamando recursivamente o método de pintura neles. O caminho mais curto é retornado.
Exemplo (
YRYGR
):Inicialmente, tente
R
. Isso nos dá os subgruposY
eYG
.Y
é trivialmente pintado de uma só vez.Para
YG
: TenteG
,Y
é trivial, comprimento2
. TenteY
,G
é trivial, o comprimento 2.YG
é, portanto, o comprimento2
.Pintar
R
primeiro, portanto, nos dá1 + 1 + 2 = 4
Então tente
G
. Isso nos dá os subgruposYRY
eR
.R
é trivial.Para
YRY
:Tente
Y
:R
é trivial, comprimento2
. TenteR
:Y
eY
são os dois grupos, comprimento3
.YRY
é comprimento2
.Pintura
G
primeiro dá1 + 1 + 2 = 4
Então tente
Y
. Isso fornece os subgruposR
eGR
.R
trivial,GR
é comprimento2
.Y
é comprimento4
Essa implementação verificaria R e Y novamente para reduzir o comprimento do código. O resultado para
YRYGR
é, portanto4
.fonte
m
algum lugar."abcacba"
.m
foi apenas uma abreviação deword.length
:) @ Howard Você está correto, terei que repensar isso.Python, 149 caracteres
Eu uso
?
para marcar uma área que pode ser de qualquer cor.D
seleciona uma região contígua do stick que contém apenas uma única cor (mais talvez alguns?
s), as cores dessa região por último, substitui a região por?
s e se repete para encontrar todas as etapas anteriores.Tempo de execução exponencial. Mal é rápido o suficiente para fazer os exemplos em um tempo razoável (alguns minutos). Aposto que com memorização poderia ser muito mais rápido.
fonte
Python 3-122
Parece funcionar, mas ainda não tenho 100% de certeza de que esse método sempre encontrará o número mínimo de etapas.
fonte
CoffeeScript -
183 247 224 215207Demo no JSFiddle.net
Versão não destruída, incluindo código de depuração e comentários:
fonte
hyghgy
. Diz 5, mas deve ser 4. (no entanto, retorna o resultado correto de 4 parahyghgyh
).Haskell, 143 caracteres
Isso tenta todas as reescritas possíveis até o comprimento da string e vai até encontrar uma que construa o padrão de entrada. Escusado será dizer que o tempo exponencial (e depois alguns).
fonte
Uma primeira pesquisa de largura simples. Não coloca nada na fila que já foi vista. Ele funciona em menos de um segundo para todos os exemplos, mas 'pbgbrgrp', que na verdade leva um minuto inteiro :(
Agora que tenho algo que funciona, trabalharei para encontrar algo mais rápido e mais curto.
Python -
300296fonte
Haskell,
11886 caracteresExecuções de teste:
Este método nem é tão ineficiente!
fonte