introduction
Sisyphe éprouvait récemment des problèmes au travail. Il semble qu'il n'obtienne jamais rien et il aimerait trouver une solution à ce problème.
Son emploi actuel nécessite de faire rouler un rocher sur une colline. Il fait généralement bien son travail, mais chaque fois qu'il est près du sommet de la colline, il redescend.
Il devient vraiment frustré par son travail et veut résoudre le problème scientifiquement en ayant un ordinateur simulant le rocher qui roule sur la colline.
Il se trouve que Sisyphe n'est pas particulièrement bon en programmation, alors peut-être pourriez-vous l'aider?
Le défi
Après cette introduction stupide, passons aux affaires. Votre programme recevra une illustration de la colline et du rocher qui ressemble à ceci:
#o
##
###
######
########
Où #
représente une partie de la colline et o
représente le rocher.
Vous devez maintenant implémenter un programme qui déplace la couche de roche 1 vers le bas. Par exemple, la sortie de ce qui précède devrait être:
#
##o
###
######
########
S'il y a une zone horizontale uniforme, la colline roule simplement horizontalement, alors ...
o
########
... cela ferait juste rouler la pierre sur le côté.
o
########
S'il y a une zone verticale, le rocher tombe d'un pas, alors ...
#o
#
#
#####
... céderait ...
#
#o
#
#####
Vous recevrez également la largeur et la hauteur de l'image respectivement sur une ligne au-dessus de l'image. Donc, au complet, notre exemple d'entrée ressemblerait à ceci:
10 5
#o
##
###
######
#########
(Notez que les espaces blancs ici sont des espaces. Sélectionnez le texte et voyez ce que je veux dire.)
Quelques détails
- Lorsque la roche est déjà dans la dernière ligne lors de l'exécution du programme, vous pouvez choisir de terminer le programme ou de sortir l'entrée inchangée
- La colline ne descend que vers le bas
Votre programme doit formater la sortie exactement la même que l'entrée (y compris les dimensions), donc si vous dirigez la sortie du programme vers lui-même, il calcule l'étape suivante.
Vous pouvez supposer qu'il y a toujours un chemin vers le bas, donc l'entrée où le chemin est "bloqué" peut provoquer un comportement indéfini
Vous pouvez supposer qu'il y a toujours un espace dans la dernière ligne. La roche doit "reposer" là-bas, donc après avoir appelé le programme plusieurs fois, en dirigeant toujours sa sortie en elle-même, vous devriez vous retrouver avec la roche dans la dernière ligne, en posant où l'espace était auparavant.
Vous pouvez accepter des entrées sous n'importe quelle forme que vous souhaitez (stdin, fichier, ...). Vous devez publier le programme ENTIER (donc toutes les variables pré-initialisées comptent comme du code).
Les lignes se terminent par
\n
.Vous pouvez obtenir des exemples d'entrées ici (assurez-vous de bien copier les espaces!)
C'est du code-golf , donc la soumission de travail avec le moins d' octets est gagnante.
Le gagnant sera choisi le 26 juillet 2014. Vous pouvez poster des solutions après cela, mais vous ne pouvez pas gagner
Si vous avez des questions, faites-le moi savoir dans les commentaires.
Bon golf!
#
s, donc il y a un espace à la fin car la largeur est de 10. Dans ce cas (après quelques itérations), la roche reposerait là où se trouve l'espace (donc en bas) -le coin droit).Réponses:
Regex (.NET, Perl, PCRE, JavaScript, ... saveurs), 25 octets
Oui, cela créera à nouveau un débat, si une expression régulière est un programme valide, mais je vais anticiper cela et dire que cette soumission est juste pour le plaisir et n'a pas besoin d'être considérée pour le gagnant. (Par opposition à la variante Perl de 31 octets en bas;).)
Voici donc une solution de remplacement pure regex.
Modèle (notez l'espace de fin):
Remplacement (notez l'espace de tête):
Le nombre d'octets correspond à la somme des deux.
Vous pouvez le tester sur http://regexhero.net/tester/ . Assurez-vous de choisir des fins de ligne de style Unix et de "conserver la mise en forme collée" lors du collage. Si cela ne fonctionne toujours pas, vous avez toujours collé des fins de ligne de style Windows. La solution la plus simple dans ce cas est de remplacer
\n
par\r\n
dans le modèle pour voir si cela fonctionne.Voici une fonction ECMAScript 6 de 48 octets utilisant ce
Enfin, j'ai également un programme réel. C'est 31 octets de Perl (dont deux octets pour
p
et0
drapeaux; merci à Ventero pour la suggestion!).Si vous voulez le tester, ne l’enregistrez même pas dans un fichier, faites
la source
\n
par\r\n
)Python - 190
Horreur de découpage et de concaténation, avec beaucoup trop de variables. Je suis certain que cela peut être joué plus, mais je ne peux penser à aucune fonction intelligente de python pour le moment. L'entrée est stockée dans une chaîne
s
.Étant donné que les chaînes de python sont immuables, je remplace un caractère en concaténant tous les caractères avant, mon nouveau caractère et tous les caractères après. J'utilise la largeur de la colline et l'indexation pour déterminer où la roche doit rouler.
la source
Ruby, 65/55 caractères
Je pensais que je verrais combien de temps est une solution qui ne se contente pas de jeter une expression rationnelle sur le problème.
Comme prévu, ce n'est pas aussi court que la solution regex de m.buettner - mais pas beaucoup plus non plus.
Lorsque vous utilisez des drapeaux d'interpréteur, cela peut être raccourci à 55 caractères (53 pour le code, 2 pour les drapeaux):
Exécutez le code comme ceci:
la source
HTML JavaScript - 251 caractères
( 251 si vous comptez le code entre guillemets simples qui lit l'entrée et renvoie la sortie. 359 si vous comptez la zone de saisie, la chaîne d'entrée, le bouton, etc. 192 si vous comptez juste cela fait le travail.)
Code de golf:
http://goo.gl/R8nOIK
Cliquez sur "Aller" encore et encore.
Méthode
J'utilise String.match () pour diviser la colline en 5 parties, puis je change une ou deux parties. J'apprends JavaScript, donc toute suggestion serait appréciée.
Code lisible
la source
Python 2 -
289252 octetsJ'ai fait des améliorations importantes mais c'est toujours terrible. Quelques octets supplémentaires peuvent être enregistrés en les convertissant en Python 3 mais je ne peux pas être arsé.
Tout d'abord, je trouve le rocher. Si le caractère juste en dessous se trouve
'#'
, remplacez chaque instance de'o '
par' o'
. Puisqu'il est garanti qu'il y aura un espace supplémentaire à la fin, cela déplacera toujours le rocher vers la droite.Peu importe si je viens de le faire ou non, je transpose toute la grille avec
zip(*m)
. Ensuite, je fais un autre remplacement de'o '
avec' o'
. S'il y a un espace à droite du rocher, cela signifie que dans la vraie grille, il y a un espace en dessous, donc il est déplacé. Ensuite, je transpose en arrière et j'imprime.la source
#
, et je vérifie avant de vérifier verticalement.Python (201)
la source
awk, 152
Plus lisible
la source
php
485484 caractèresJe sais que c'est énorme par rapport à l'entrée de m.buettner mais c'est mieux que je puisse faire pour l'instant. Je pense qu'il doit y avoir un moyen plus rapide de transformer la chaîne d'entrée en un tableau multidimensionnel, mais il est très tard maintenant.
Et bien qu'il ne soit pas compétitif, j'ai aimé ce puzzle. Souhaiterait que l'extension montre où la balle se termine, ou après un nombre défini d'étapes, peut-être ajouté après la largeur et la hauteur sur la ligne d'entrée. Pourrait l'ajouter très facilement à cette version.
Voici mon code: l'entrée est dans la première variable.
Vous pouvez le voir ici en action sur codepad
Edit: le codepad et le code ci-dessus ont été modifiés, comme la sortie 0 au lieu de o, ce qui a causé un problème lorsque j'ai essayé de réinjecter la sortie dans le programme. Fixé maintenant et enregistré un caractère!
la source
Groovy -
263261256 caractèresGolfé. Lisez le fichier dans une chaîne et utilisez une fonction
p
pour émuler une fonctionString.putAtIndex(index,value)
:Non golfé (un peu):
la source
try{
place detry {
etcatch(Exception
au lieu decatch (Exception
.R, 234
La manipulation de chaînes n'est pas le point fort de R.
Plus lisible:
la source
C (182)
Ou, si vous voulez réellement lire le code:
la source
Clojure - 366 caractères
Sans regex. Fichier d'entrée requis nommé "d". Golfé:
Non golfé:
Exemple d'exécution (un seul cas, par souci de concision):
Je suis débutant. Suggestions bienvenues.
la source
MATLAB, 160
La partie douloureuse est l'entrée de fichier. Le calcul réel ne serait que de 114 octets:
la source