J'ai un problème grave. J'ai des fichiers texte où je garde mes numéros très importants - tous les plus importants! Et deux et trois ..
Ces nombres étaient si importants que je ne pouvais pas les confier à ces nouveaux systèmes de nombres décimaux ou binaires. J'ai gardé chaque numéro codé en unaire, comme suit:
+--+
| |
+---+ +----+ |
| | | |
+---+ +-------+
~/two.txt
Simple et fiable: deux boucles ASCII pour le numéro 2. Malheureusement, ces choses ont tendance à s'emmêler au fil du temps et maintenant j'ai du mal à déterminer le nombre de boucles dans chaque fichier. Voici quelques exemples que j'ai élaborés à la main:
Une:
+---+
| |
+--+ |
| |
+--+ |
| |
| |
| |
+--+ +--+
| |
+---------+
Trois:
+---------+
| +-----+ |
| | +-+ | |
| | | | | |
| | +-+ | |
| +-----+ |
+---------+
Quatre:
+--------------+
| +--+ +--+ |
| | | | | |
+-|-----|-----|----+
| | | | | | | |
| +--+ +--+ +--+ |
+------------------+
+------------+
| |
+-----+ +-----+ |
| | | |
+-----|-----------+ | |
| | +--+ | | | |
+-+ +--|--|--+ +---------+
| | +-+ | | |
+------+ | | | |
+-------+ | |
|| | |
|+-----+
| |
+---+
Cinq:
+--------+ +--------+ +--------+
| | | | | |
| +--|-----+ +--|-----+ |
| | | | | | | | | |
+-----|--+ +-----|--+ +--------+
| | | |
+--------+ +--------+
Pouvez-vous m'aider à compter mes boucles?
Voici les règles:
- Comme je stocke tout dans unaire codé ASCII, l'efficacité de l'espace est très importante pour moi. Par conséquent, c'est le golf de code. Le plus petit programme en octets gagne.
- Les boucles sont dessinées avec les caractères +, -, |. Chaque coin de la boucle est dessiné sans ambiguïté: exactement l'un des caractères au-dessus et en dessous du + sera |, et exactement un à droite ou à gauche sera -. Deux marques + ne sont jamais adjacentes.
- Les brins peuvent passer les uns sur les autres. Lorsque les brins se croisent, vous pourrez voir le brin "sous" immédiatement des deux côtés du brin "au-dessus".
- Votre programme doit prendre une représentation sous forme de chaîne de la boucle (à partir de stdin ou en tant que paramètre de fonction) et produire un nombre (soit à stdout, soit comme valeur de retour).
- Les longueurs de ligne peuvent ne pas être uniformes dans le dessin de la boucle et il peut y avoir des espaces de fin sur chaque ligne.
- Vous pouvez supposer qu'il y a au moins une boucle dans l'entrée.
Je compte sur vous!
+
?Réponses:
SnakeEx - 98 octets avec Javascript, 44 sans
Cela ressemblait à un bon problème pour essayer ma langue du Défi Quinzaine sur:
Le meilleur endroit pour l'essayer est mon interprète en ligne .
SnakeEx fait correspondre les motifs dans le texte en utilisant des "serpents" qui se déplacent autour des expressions rationnelles correspondant au texte. Le code se lit un peu comme une expression régulière, sauf:
<T>
instruction. C'est une commande de direction qui dérive le serpent à gauche et à droite de sa direction actuelle.{e<>PE}
est comme un appel de sous-programme. Celui qui engendre un serpent dont la définition vae
de l'avant (<>
) et avec des paramètresP
(ferroutage - le serpent reproducteur suit le nouveau serpent) etE
(exclusif - ne correspond à rien de ce qui a déjà été apparié). Cette vérification exclusive est la seule chose qui empêche le serpent de boucler indéfiniment.`
à la fin indique que ce qui suit ne doit être mis en correspondance que s'il a déjà été mis en correspondance, ce que nous pouvons utiliser pour forcer la boucle à se fermer.Parce que SnakeEx est comme regex et ne produit pas techniquement les résultats comme souhaité par lui-même, je suppose que nous devons l'envelopper dans du Javascript appelant l'interpréteur:
Edit : corrigé pour fonctionner avec les cas de test supplémentaires de blutorange
la source
[^ ]
par[|\-]
;)C # - 338
388433octetsEnregistré un tas d'octets en passant à un tableau à 1 dimension.
D'abord, il lit dans l'entrée, et le rend agréable et rectangulaire, avec une bordure "" afin que nous n'ayons pas à faire de vérification des limites sur l'horizontale (moins cher pour faire la vérification sur la verticale que pour mettre la ligne supplémentaire) . Ensuite, il regarde à travers le rectangle, donc il frappe toujours un coin inférieur droit. Quand il frappe l'un de ces derniers, il se dirige vers le haut, suivant tous les + qu'il rencontre, et les efface au fur et à mesure (avec un espace). Il cesse de suivre lorsqu'il rencontre un espace. Testé sur les cinq exemples donnés.
la source
Slip ,
5141 + 2 = 43 octets(Maintenant mis à jour pour fonctionner avec le cas de test de @ blutorange à un coût majeur)
Puisque @BMac a utilisé SnakeEx pour ce défi, j'ai pensé essayer d'utiliser ma soumission de langage de correspondance de motifs 2D , Slip. Mais parce que Slip n'avait pas les fonctionnalités nécessaires pour résoudre ce problème, je les ai ajoutées au cours des derniers jours. En d'autres termes, cette soumission n'est pas admissible à gagner .
Courez avec le
n
drapeau pour le nombre de matchs, par exempleEssayez-le en ligne .
Explication
En raison de la pléthore de nouvelles fonctionnalités dans cette soumission, c'est une bonne occasion de les présenter.
Slip essaie de faire correspondre à partir de chaque position et ne renvoie que des correspondances uniques. Notez que nous utilisons
[^ +]
- alors que l'utilisation[-|]
sauverait théoriquement deux octets, non échappé-
au début / fin des classes de caractères n'est pas encore implémenté dans Slip.la source
three
également des+
s qui ne sont pas un-
, un|
et 2 espaces, donc je suppose que ce n'est pas une erreurRubis 295
Essayez en ligne: http://ideone.com/kIKELi (j'ai ajouté un
#to_a
appel sur la première ligne, car ideone.com utilise Ruby 1.9.3, qui ne supporte pas#size
pourEnumerable
s Dans Ruby 2.1.5+ le code fonctionne OK. . )L'approche est la suivante:
+
signes dans l'entrée et considérer chacun d'eux comme une forme distincte+
signes et combiner leurs formes en une seuleVoici une version plus lisible:
la source
JavaScript (ES6) 190
197 202 215 235 289 570Modifier un tableau à une dimension au lieu de 2 dimensions, taille de ligne maximale 999 caractères (mais peut être plus gratuit, par exemple 1e5 au lieu de 999)
Modifier l' extrait de code animé ajouté, voir ci-dessous
Ungolfed premier essai
Extrait animé
Afficher l'extrait de code
Tester dans la console Firefox / FireBug
la source
Rubis, 178
187199212 212Meilleure version rubis, crée une fonction F. Maintenant avec des avertissements d'interprètes toujours plus délicieux.
Testez-le en ligne: ideone
Fondamentalement, la fonction
b
démarre à n'importe quel moment+
, passe récursivement dans la boucle et définit tout+
suru
. Ainsi, une boucle est supprimée à chaqueb
appel. La fonctionF
essaie simplement la fréquence à laquelle nous devons appelerb
jusqu'à ce qu'il ne reste plus de boucles.la source
Python 2 - 390
Prend une chaîne avec des sauts de ligne de stdin. C'est une méthode assez simple pour jouer au golf un peu, mais je ne suis certainement pas autant que cela pourrait être compte tenu de sa durée.
la source
Python 2 - 346 octets
Implémenté comme une fonction
c
qui prend les données du fichier en entrée et renvoie le nombre de boucles.Premièrement, la fonction décompose les données en un mappage des emplacements des éléments de boucle avec le type d'élément à cet emplacement (par exemple
{(0,0): '+'}
). Ensuite, il utilise deux fonctions internes mutuellement récursives. Le premier supprime un segment de boucle du mappage et décide des emplacements à vérifier pour le segment suivant. Le second vérifie le type d'élément de boucle dans les emplacements sélectionnés et, s'il est compatible avec ce qui est attendu, appelle le premier pour supprimer la section nouvellement trouvée.la source