Les boîtes ASCII ressemblent à ceci:
++ +---+ +------+ +---+ +---+
++ | | | | | | | |
| | | | | | | |
+-+ | | | | | | | |
+-+ | | | | | | +---+
+---+ | | | |
+--+ | | | | ++
| | | | | | ||
| | +------+ | | ||
+--+ | | ||
+---+ ||
||
+-----+ ||
+------------+ | | ++
| | | |
| | | |
+------------+ +-----+
Voici quelques exemples des mêmes boîtes ASCII implosées:
++ +- -+ +- -+ +- -+ +- -+
++ | - | | - - | | - | | - |
| | | -- | | | | |
+-+ | | | | " | - |
+-+ | - | || | | +- -+
+- -+ | | | |
+--+ | -- | | | ++
| | | - - | " ||
| | +- -+ | | ||
+--+ | - | | |
+- -+ | |
-- ||
- - +- -+ ||
+- - - -+ | - - | ++
| -- -- | | = |
| -- -- | | - - |
+- - - -+ +- -+
- -
--
Voici un lien vers toutes ces boîtes de cas de test dans un format plus facile à copier. L'ordre est toutes les entrées suivies de toutes les sorties dans le même ordre.
Votre objectif est de prendre une boîte ASCII en entrée et de renvoyer la boîte implosée. Les règles d'implosion sont:
- "+" ne change jamais; ni "-" ni "|" directement à côté de "+"
- En partant des coins, les "-" et "|" déplacer vers l'intérieur d'un espace de plus que le même personnage plus près du coin. Si un "-" et un "|" se déplacerait jamais au même endroit, ni l'un ni l'autre ne bouge.
- Si un "-" et un "-" se déplacent au même endroit, mettez un "=" à cet endroit. Si un "|" et "|" déplacer au même endroit, mettre un "à cet endroit. Ceux-ci comptent comme deux de leurs personnages respectifs au même endroit se déplaçant dans des directions opposées.
- Deux "-" ou deux "|" peuvent se dépasser, comme le montre l'exemple en bas à gauche.
- Si la boîte est suffisamment maigre, elle commencera à s'étendre vers l'extérieur de la même manière, en s'éloignant toujours du côté où elle a commencé.
- Le résultat doit être symétrique à travers la ligne médiane dans les directions x et y (en ignorant les nouvelles lignes); cela inclut des espaces, il peut donc être nécessaire de compléter le résultat avec des espaces pour satisfaire cela.
Détails de la règle:
- Il s'agit de code-golf, donc le programme le plus court en octets gagne.
- Des échappatoires standard s'appliquent.
- Vous pouvez supposer que chaque ligne se termine par un caractère de nouvelle ligne.
- Les seuls caractères de la chaîne d'entrée seront "+", "-", "|", "" et "\ n" (nouvelle ligne), et votre chaîne de sortie devrait suivre les mêmes règles, avec l'ajout de "=" et "comme caractères possibles.
- Vous pouvez éventuellement avoir une seule nouvelle ligne à la fin de la dernière ligne.
- La plus petite boîte ASCII que vous devez gérer est l'exemple en haut à gauche. Chaque boîte ASCII aura exactement 4 "+", exactement à ses coins.
- Vous devrez gérer des boîtes de taille
m x n
pour tous les entiersm,n
tels que2<=m,n<256
(la plus grande taille de chaîne possible255*(255+1)
) - Vous pouvez supposer que vous obtiendrez toujours une seule boîte ASCII valide en entrée.
||
de cet exemple doit être un"
ou quelque chose comme ça"
? Je suppose que le"
seul apparaît sur 3 de large ou plus?"
vous? À gauche ou à droite? Ça ne peut pas être les deux, mais ça ne peut pas non plus parce que le résultat est symétrique.Réponses:
Python 2 ,
591555545527525496436351334333303 octetsEssayez-le en ligne!
EDIT : Mon ancienne méthode a d'abord implosé le haut et le bas, puis la gauche et la droite. Au lieu de cela, nous pouvons imploser le haut, pivoter de 90 degrés et le faire 4 fois. De plus, j'utilisais le code convivial, celui-ci nécessite une entrée sous la forme
[['+', '-', '-', '-', '-', '-', '+'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['+', '-', '-', '-', '-', '-', '+']]
qui est laide mais plus courte pour le programme: P (Merci à Phoenix d'avoir attrapé ça)Crédits à Leaky Nun pour le code d'en-tête dans le lien TIO utilisé pour convertir les entrées lisibles par l'homme en entrées lisibles par ordinateur.
-85 octets grâce à Leaky Nun!
-17 octets en passant de l'implosion supérieure à l'implosion gauche qui permet à la ligne entière d'être stockée dans une variable et modifiée. Merci à Leaky Nun pour la suggestion!
-1 octet en inversant les choses pour supprimer un espace.
-30 octets grâce à Leaky Nun!
la source
s[0]
etS[0]
à des variables pour économiser quelques octetsp=s[0]
etP=S[0]
avecp=z(s[0])
etP=z(S[0])
, respectivement, puis remplacer toutes les occurrences dez(p)
avecp
et tousz(P)
avecP
pour économiser 18 octets.(z(s)-1)/2-p
parz(s)/2-.5-p
et(p-1)/2-z(s)
parp/2-.5-z(s)
pour économiser 2 octets supplémentaires.C (clang) , 693 octets
Nouvelles lignes ajoutées pour plus de lisibilité. Les deux premiers sont requis mais les autres ne le sont pas.
Merci pour le grand défi! C'était assez compliqué mais je m'amusais toujours beaucoup.
Cela prend l'entrée comme arguments de ligne de commande et renvoie à STDOUT une chaîne de plusieurs lignes de la boîte implosée. Comme toujours, les conseils de golf sont très appréciés.
Essayez-le en ligne!
la source