Quand j'écris de la documentation, des commentaires, etc. J'adore créer des tableaux ASCII. Ils finissent généralement par être assez beaux, mais j'ai toujours l'impression qu'ils pourraient être encore meilleurs - d'autant plus que UTF-8 / Unicode inclut les personnages de dessin de boîte . Cependant, ces caractères sont très lourds à utiliser, nécessitant plusieurs appuis sur les touches pour être insérés. Ta tâche? Écrivez un programme ou une fonction qui peut convertir automatiquement les tables ASCII en équivalent UTF-8 / Unicode.
Ce défi a été mis en bac à sable .
Défi
Écrire un programme, qui, étant donné une table ASCII en tant que chaîne d'entrée, génère la table redessinée avec les caractères de dessin de boîte Unicode / UTF-8. Plus précisément, les caractères qui font partie du tableau doivent être traduits comme suit:
(Unicode, 3 bytes each in UTF-8)
- to ─ (\u2500)
| to │ (\u2502)
= to ═ (\u2550)
and + to one of:
┌ (\u250C), ┐ (\u2510), └ (\u2514), ┘ (\u2518),
├ (\u251C), ┤ (\u2524), ┬ (\u252C), ┴ (\u2534),
┼ (\u253C)
or, if '=' on either side:
╒ (\u2552), ╕ (\u2555), ╘ (\u2558), ╛ (\u255D),
╞ (\u255E), ╡ (\u2561), ╤ (\u2564), ╧ (\u2567),
╪ (\u256A)
Détails
E / S:
- Les E / S par défaut sont autorisées
- Vous pouvez prendre des entrées dans n'importe quel format raisonnable, y compris la table sous forme de chaîne ou un chemin d'accès à un fichier contenant la table.
- Vous pouvez exporter vers un fichier et prendre le nom de fichier comme argument supplémentaire.
- Cependant, vous ne pouvez pas modifier le fichier d'entrée . (Il doit être conservé pour faciliter la modification future)
Contribution:
- Vous pouvez supposer que chaque ligne d'entrée a été complétée pour avoir la même longueur avec
.
- Vous ne pouvez pas supposer que le premier caractère après une nouvelle ligne fait partie des bordures du tableau (car il peut s'agir d'espaces).
- L'entrée est considérée comme une table valide si tous les caractères (qui font partie de la table)
-=|
sont connectés à exactement deux caractères et+
sont connectés à au moins un caractère à la fois horizontalement et verticalement. - Votre programme peut ne produire aucune erreur avec des entrées valides.
- Si l'entrée n'est pas valide, le comportement n'est pas défini et vous pouvez produire n'importe quelle sortie.
- L'entrée peut contenir tous les caractères UTF-8, y compris les caractères de dessin de boîte.
Production:
- N'importe lequel des personnages
-=|+
qui ne font pas partie du tableau doivent être laissés tels quels. - De même, tous les autres caractères doivent être laissés tels quels.
- Une seule nouvelle ligne de début et / ou de fin est autorisée.
Autre:
- Failles standard sont interdites, comme d'habitude.
- Si votre langue préférée a une fonction intégrée qui résout ce problème, vous ne pouvez pas l'utiliser.
- Cela signifie des programmes, des fonctions, des sous-programmes ou des instructions qui seraient des soumissions valides pour ce défi sans ajouts.
- Chacun des caractères nécessaires à ce défi fait trois octets de long lorsqu'ils sont encodés en UTF-8.
Personnages connectés :
Un personnage est connecté à un autre si:
- Il est
|
et est directement au-dessus ou en dessous+
ou|
; - Il est
-
et est directement avant ou après+
ou-
; - Il est
=
et est directement avant ou après+
ou=
; - Il est
+
et est directement au-dessus ou au-dessous de|
ou+
, ou est directement avant ou après-
,=
ou+
.
Un caractère est considéré comme faisant partie de la table s'il est connecté à n'importe quel caractère faisant partie de la table. Par définition, le premier +
de l'entrée fait partie du tableau.
Exemples
Exemples disponibles ici en version copiable-collable.
Input: Output:
+------------------+ ┌──────────────────┐
| Hello+World! | │ Hello+World! │
+==================+ ╞══════════════════╡
| This is+my first | -> │ This is+my first │
|+-+ code|golf +-+| │+-+ code|golf +-+│
|+-+chall|enge! +-+| │+-+chall|enge! +-+│
+------------------+ └──────────────────┘
+===+===+===+ ╒═══╤═══╤═══╕
| 1 | 2 | 3 | │ 1 │ 2 │ 3 │
+---+===+===+===+ ┌───╪═══╪═══╪═══╡
| 1 | 1 | 2 | 3 | │ 1 │ 1 │ 2 │ 3 │
+---+---+---+---+ -> ├───┼───┼───┼───┤
| 2 | 2 | 4 | 6 | │ 2 │ 2 │ 4 │ 6 │
+---+---+---+---+ ├───┼───┼───┼───┤
|-3 |-3 |-6 |-9 | │-3 │-3 │-6 │-9 │
+===+---+---+---+ ╘═══╧───┴───┴───┘
+-----+ -> <Undefined>
+-----+ -> ┌─────┐
+-----+ └─────┘
+-----------------+
| Hello, World! |
| This is invalid | -> <Undefined>
| input |
-----------------+
++++ ┌┬┬┐
++++ -> ├┼┼┤
++++ └┴┴┘
+--+
++++ -> <Undefined>
+--+
Finalement...
Il s'agit de code-golf , donc le moins d'octets gagne. Bon golf!
+-+
extraits consécutifs ne sont-ils pas considérés comme formant une table connectée?Hello World
tableau, les tableaux intérieurs ne sont pas considérés comme formant un tableau car le texte à l'intérieur du tableau doit rester inchangé et ils ne sont pas considérés comme faisant partie des bordures extérieures du tableau car ils ne sont pas correctement connectés.+----+
exemple, ce serait parce que la direction des coins serait ambiguë.Réponses:
Python 3,
392281 octetsIl l'a joué un peu plus et converti en une solution récursive au lieu d'une solution itérative:
Prend une chaîne de lignes de longueur égale séparées par des retours à la ligne et renvoie une chaîne au même format. Peut lever une exception sur une entrée non valide.
Solution précédente:
Version non golfée:
la source
Python 3 ,
914898827823594587569540469 octetsEdit: stratégie considérablement modifiée, créant désormais un champ de bits de voisins (similaire à la réponse de Dead-Possum). J'ai laissé la version précédente ci-dessous.
Essayez-le en ligne!
L'entrée se présente sous la forme d'une liste de listes de caractères, qui est modifiée sur place. Récursif du premier + qu'il trouve.
Essayez-le en ligne!
Voici la chose la plus proche que j'ai à une version non golfée:
la source
JavaScript,
311307 octetsAfficher l'extrait de code
Explication
À partir de la première
+
jonction trouvée , le programme tente de trouver des chemins vers d'autres jonctions dans toutes les directions, effectuant des remplacements au fur et à mesure. Il stocke les directions trouvées et l'état "à double bordure" dans une image bitmap, qui détermine ensuite le caractère de jonction approprié.la source
Python 3 , 599 octets
Je ne suis pas vraiment bon au golf en Python 3, mais (à ma honte) je n'ai pas pu obtenir une sortie normale de caractères UTF-8 en Python 2. Alors nous y sommes.
Je suppose que la seule astuce intéressante ici est de décider
+
transformation.J'ai encodé toutes les variantes possibles avec des adresses 4 bits. Chaque bit d'adresse ressemble à la connexion à la cellule voisine. Donc 0 - pas de connexion et 1 - connexion.
1111
is┼
0011
is┐
etc
Certaines configurations de connexions ne sont pas valides et sont remplacées par des valeurs fictives:
'012┐45┌┬8┘0┤└┴├┼'
Si une cellule voisine contient
=
, la deuxième liste sera utilisée avec des lignes doublées.L'adresse est combinée ici.
r
contient une longueur de chaîne 8, où tous les deux caractères sont 1/0 et les caractères voisins réels.Par exemple:
1+0y1-1|
.Ceci est utilisé pour choisir la liste des substitutions comme indiqué ci-dessus. Et ensuite contracté pour adresser:
int(r[0::2],2)
Ce lambda sert à vérifier que les coordonnées de cellule sont valides et que le caractère de la cellule est l'un de '+ - | ='
Ce lambda recevait des chars de la cellule. Renvoie
' '
si les coordonnées ne sont pas valides. (peut certainement être joué au golf)Conditions de récursivité. Peut aussi être jouable au golf.
Essayez-le en ligne!
la source