(Basé sur ce problème Math.SE , qui fournit également des graphiques)
J'ai un bâton qui ressemble un peu à ceci:
Je veux que ça ressemble un peu à ceci:
Je ne suis pas un peintre expert, cependant, avant de commencer un projet de bricolage aussi ambitieux, je veux m'assurer que je ne suis pas au-dessus de ma tête.
Votre programme devrait me dire combien d'étapes sont nécessaires pour peindre ce bâton. Chaque étape consiste à peindre une zone continue avec une couleur unie, qui recouvre les couches précédentes de peinture. Pour l'exemple ci-dessus, je pourrais peindre la moitié gauche bleue, la moitié droite rouge, puis les deux zones vertes séparées pour un total de 4 étapes (le vert n'est pas continuellement peint).
Le voici en ASCII:
------
bbb---
bbbrrr
bgbrrr
bgbrgr
Il y a deux façons différentes de peindre ce bâton et de se retrouver avec le même résultat. Cependant, je ne m'intéresse qu'à l'estimation du temps, qui est en quatre étapes.
Objectif
Votre programme doit produire le nombre minimum d'étapes nécessaires pour peindre un bâton avec une palette de couleurs donnée. Le schéma de peinture sera sous la forme d'une chaîne de caractères, tandis que la sortie sera un nombre. C'est le golf de code. Le programme le plus court gagne.
Contribution
Votre programme recevra le schéma de coloration d'un bâton sous la forme d'une chaîne de lettres. Chaque lettre unique (sensible à la casse) représente une couleur unique.
YRYGR
grG
GyRyGyG
pbgbrgrp
hyghgy
Production
Ces nombres sont le moins d'étapes nécessaires pour peindre les bâtons.
4
3
4
5
4
Explications
C'est ainsi que je suis arrivé aux chiffres ci-dessus. Votre programme n'a pas besoin de produire ceci:
-----
YYY--
YRY--
YRYG-
YRYGR
---
g--
gr-
grG
-------
GGGGGGG
GyyyGGG
GyRyGGG
GyRyGyG
--------
pppppppp
pbbbpppp
pbbbrrrp
pbgbrrrp
pbgbrgrp
------
-yyyyy
-ygggy
hygggy
hyghgy
Edit: je vais ajouter plus de cas de test s'ils s'avèrent être des cas de test plus difficiles.
Réponses:
GolfScript,
827267 caractèresRaisonnablement rapide pour un programme GolfScript, exemples:
L'algorithme utilisé fonctionne à travers les couleurs de gauche à droite de manière récursive, selon les instructions suivantes:
Sinon, prenez la couleur cible de la partie maintenant la plus à gauche (c'est-à-dire la première pas dans la couleur souhaitée).
...
Prenez le minimum de tous ces nombres et ajoutez 1 (pour l'étape en cours). Renvoyez-le comme le nombre optimal d'étapes.
Cet algorithme fonctionne, car la partie la plus à gauche doit être peinte à tout moment, alors pourquoi ne pas le faire immédiatement - de toute façon possible.
la source
n!
étapes;) (mais c'est peut-être la vraie complexité, je ne sais pas).JavaScript:
187octetsEn supposant que nous sommes autorisés à avoir juste l'entrée et la sortie d'une fonction (s'il vous plaît)!
157 octetsen faisant une optimisation plus laide (ce qui fait partie du point, et j'ai trouvé incroyablement amusant):135 octets J'ai réalisé que la longueur de l'entrée est une limite supérieure et je n'ai plus besoin de gérer les cas triviaux séparément maintenant.
Cas de test:
Version étendue:
Pour chaque caractère de l'entrée, calculez la longueur du motif si nous peignons cette couleur en premier. Cela se fait en prétendant que nous peignons cette couleur, puis en créant des sous-sections à partir des bits qui ne sont pas de cette couleur, et en appelant récursivement la méthode de peinture sur eux. Le chemin le plus court est renvoyé.
Exemple (
YRYGR
):Au départ, essayez
R
. Cela nous donne les sous-groupesY
etYG
.Y
est trivialement peint en une seule fois.Pour
YG
: EssayezG
,Y
c'est trivial, la longueur2
. EssayezY
,G
est trivial, la longueur 2.YG
est donc la longueur2
.La peinture
R
nous donne donc d'abord1 + 1 + 2 = 4
Alors essayez
G
. Cela nous donne les sous-groupesYRY
etR
.R
est trivial.Pour
YRY
:Essayez
Y
:R
est trivial, la longueur2
. EssayezR
:Y
etY
sont les deux groupes, la longueur3
.YRY
est la longueur2
.La peinture
G
donne d'abord1 + 1 + 2 = 4
Alors essayez
Y
. Cela donne les sous-groupesR
etGR
.R
trivial,GR
c'est la longueur2
.Y
est la longueur4
Cette implémentation vérifierait alors à nouveau R et Y pour réduire la longueur du code. Le résultat pour
YRYGR
est donc4
.la source
m
quelque part."abcacba"
.m
était juste un raccourci pourword.length
:) @Howard Vous avez raison, je vais devoir repenser cela.Python, 149 caractères
J'utilise
?
pour marquer une zone qui peut être de n'importe quelle couleur.D
sélectionne une région contiguë du bâton qui ne contient qu'une seule couleur (plus peut-être quelques?
s), les couleurs de cette région en dernier, remplace cette région par?
s et revient pour trouver toutes les étapes précédentes.Durée de fonctionnement exponentielle. À peine assez rapide pour faire les exemples dans un délai raisonnable (quelques minutes). Je parie que la mémorisation pourrait être beaucoup plus rapide.
la source
Python 3 - 122
Cela semble fonctionner, mais je ne suis toujours pas sûr à 100% que cette méthode trouvera toujours le nombre minimum d'étapes.
la source
CoffeeScript -
183 247 224 215207Démo sur JSFiddle.net
Version non golfée incluant le code de débogage et les commentaires:
la source
hyghgy
. Il indique 5 mais il devrait être 4. (cependant, il renvoie le résultat correct de 4 pourhyghgyh
).Haskell, 143 caractères
Cela essaie toutes les réécritures possibles jusqu'à la longueur de la chaîne et va jusqu'à ce qu'il en trouve une qui construit le modèle d'entrée. Inutile de dire le temps exponentiel (et puis certains).
la source
Une première recherche simple. Il ne met rien dans la file d'attente qui a déjà été vu. Cela fonctionne en moins d'une seconde pour tous les exemples, mais 'pbgbrgrp' qui prend en fait une minute entière :(
Maintenant que j'ai quelque chose qui fonctionne, je vais essayer de trouver quelque chose de plus rapide et de plus court.
Python -
300296la source
Haskell,
11886 caractèresEssais:
Cette méthode n'est même pas si inefficace!
la source