L'art ASCII est amusant. Les éditeurs de texte modernes sont très bons pour manipuler le texte. Les langages de programmation modernes sont-ils à la hauteur?
Une tâche courante dans la manipulation d'œuvres d'art ASCII consiste à rogner le texte dans un rectangle entre deux caractères. C'est la tâche que vous devez mettre en œuvre dans ce défi.
Détails
Votre programme prendra 3 entrées:
- le premier est le caractère 'start' du bloc - marquant le coin supérieur gauche
- le second est le caractère «fin» du bloc - marquant le coin inférieur droit
- le troisième est une forme de texte multiligne, soit une chaîne, soit une liste de chaînes, soit un nom de fichier, ou autre
Le résultat sera un texte multiligne (encore une fois, dans l'un des formats ci-dessus) rogné dans le rectangle entre les entrées données. Notez que les deux premières entrées peuvent ne pas être uniques.
Cas de bord
Les boîtes doivent toujours avoir un volume d'au moins 2. Ainsi:
() (
)
sont des boîtes mais celles-ci:
)( ) (
( )
ne le sont pas (avec start = (
et end =)
).
L'entrée ne contiendra qu'une seule case. Ainsi, les caractères de début et de fin ne doivent apparaître qu'une seule fois, sauf s'ils sont identiques, auquel cas ils doivent apparaître exactement deux fois.
De plus, chaque ligne de l'entrée doit être au moins aussi longue que la distance entre le début d'une ligne et le bord droit de la zone de l'entrée.
Votre programme n'a pas besoin de gérer des entrées invalides; ils peuvent entraîner un comportement indéfini.
Règles
Des règles de code-golf typiques s'appliquent. Le code le plus court gagne.
Exemples
Journée ensoleillée: start: ( end: ) input:
This is some text
. (but this text
is in a box ).
So only it is important.
Production:
(but this text
is in a box )
Notez également le dépouillement de l'espace horizontal. Les cultures d'art ASCII sont 2D.
Jour de pluie: start: ( end: ) input:
This is some text (
But is that even )
really a box?
Production:
(
)
Même début / fin: start: / end: / input:
Oh, I get how this could be useful
/----------------------------\
| All this text is in a box! |
\----------------------------/
Production:
/----------------------------\
| All this text is in a box! |
\----------------------------/
Entrée invalide: start: ( end: ) input:
Boxes are rectangular ( so this has
0 volume ) which is illegal.
Entrée non valide 2: start: ( end: ) input:
(The lines must already be square
so this line that is too short
relative to this end, is illegal)
Réponses:
Vim,
16, 12 octets / touchesEssayez-le en ligne! dans l'interpréteur V
Je parie que les anciens éditeurs de texte sont encore meilleurs! :RÉ
Même si ce n'est pas nécessairement le cas, cette réponse fonctionne avec les deux entrées "invalides" données,
et
Explication:
la source
/\/<cr><c-v>nygv$o0dp
ou quelque chose comme ça depuis trop longtemps :)Gelée , 13 octets
Un lien dyadique acceptant une liste de caractères de début et de fin à gauche et une liste de lignes (sous forme de listes de caractères) à droite qui donne une liste de lignes (sous forme de listes de caractères).
Essayez-le en ligne! (programme complet - si les entrées sont en Python valide, elles nécessiteront des guillemets de chaîne Python.)
Comment?
Par exemple, avec left =
['a', 'b']
et right (comme une liste de listes de caractères - les lignes):=€
renvoie une liste de deux listes de listes (la première effectue'a'=
, la seconde'b'=
):la sommation donne une seule liste de listes (sommation par élément):
ŒṪ
nous donne ensuite les indices multidimensionnels (1-indexés) des non-zéros,[[2,3],[4,6]]
c'est-à-dire[[top,left],[bottom,right]]
.r/
effectue ensuite[2,3]r[4,6]
qui, puisquer
vectorise, est comme[2r4, 3r6]
, évaluant à[[2,3,4],[3,4,5,6]]
- ie[rows,columns]
.,þ/
exécute alors[2,3,4],þ[3,4,5,6]
oùþ
est une instruction de poduct externe et,
est paire. Cela donne toutes les[row,column]
valeurs par colonne, dans ce cas:Nous voulons ceux-ci par ligne, donc
Z
est utilisé pour transposer ceci en:Enfin
œị
indexe de nouveau dans les lignes d'entrée:Il convient de noter que lorsque les deux caractères de délimitation sont identiques, ils
=€
identifient les deux fois maisSŒṪ
finissent par faire la bonne chose, car2
c'est vrai, par exemple avec['a','a']
:la source
APL (Dyalog) ,
3830 octets4 octets enregistrés grâce à @EriktheOutgolfer
Essayez-le en ligne!
la source
⍸matrix∊separators
, et prendre / déposer avec elles(⍸a=⎕)↓(1+⍸a=⎕)↑a←⎕
avec⎕io←0
⊃{⌽⊖⍵↓⍨⊃⍸⍺=⍵}/⎕⎕⎕
(sic, avec 3 quads de fin) qui est encore plus court. Ou... ⎕⎕(↑⎕)
si une matrice prémélangée n'est pas autorisée.Gelée , 14 octets
Essayez-le en ligne!
la source
()
) vide (Python ), non'()'
. S'il est analysable, il doit être cité, cependant, mon//
n'a pas besoin d'être cité (opérateur de division entier sans opérandes? Hm ...).()
Jelly vient juste de l'interpréter comme une sorte de personnage spécial. La plupart des paires de personnages que j'essaie de travailler. J'adorerais entendre ce que les gens plus familiers avec Jelly pensent. EDIT: ninja-ed par erik the outgolferPython 2 , 130 octets
Essayez-le en ligne!
la source
Toile , 37 octets
Essayez-le ici!
36 octets pour obtenir les coordonnées des caractères (et les convertir en x, y, w, h car c'est ce qu'il
@
faut) et 1 octet pour obtenir la sous-section. Il doit y avoir une meilleure approchela source
JavaScript (ES6), 98 octets
Prend l'entrée comme deux entiers et un tableau de chaînes. Renvoie un tableau de chaînes.
Essayez-le en ligne!
Commenté
la source
filter
etmap
?! Est-ce que la construction d'une nouvelle baiereduce
ou d'une solution récursive ne fonctionnerait pas plus rapidement? Sur mon téléphone, dans le pub ou j'essayerais moi-même.X
etY
sont connues avec certitude.Java 10, 204 octets
Modifie le tableau d'entrée au lieu d'en renvoyer un nouveau pour économiser des octets. Cela signifie cependant que les lignes supprimées deviennent à la
""
place. Si cela n'est pas autorisé, je le changerai.Essayez-le en ligne.
Explication:
Par exemple:
Avec les entrées
start = "("
,end = ")"
etlines =
la première boucle le recadrera en haut et à gauche, en le changeant comme suit:
la deuxième boucle le recadrera en bas et à droite, en le changeant comme suit:
la source
Rétine 0.8.2 , 110 octets
Essayez-le en ligne!Explication:
Supprimez les lignes d'entrée précédant la première ligne de la boîte.
Si le caractère de début se trouve dans la colonne de gauche de l'entrée, supprimez-le.
Si le caractère de début n'a pas encore été supprimé, déplacez toutes les colonnes d'entrée vers la gauche et répétez depuis le début.
Supprimez le caractère de fin et tout ce qui se trouve dans l'entrée après le caractère de fin.
Tronquez toutes les lignes à la longueur de la ligne suivante. Cela fonctionne en comptant tous les caractères sauf un sur chaque ligne, puis en essayant de faire correspondre jusqu'à autant de caractères sur la ligne suivante; si cela réussit, la deuxième ligne était plus courte, donc le dernier caractère est supprimé et la boucle se répète.
la source
C (gcc) , 237 octets
Essayez-le en ligne!
Je suis sûr à 99% que cela peut être raccourci en utilisant une sorte de fonction d'aide pour trouver l'index horizontal et le pointeur sur un caractère, car il est répété deux fois. Hélas, je n'ai pas trouvé de moyen assez court pour le faire, je pourrai réessayer plus tard si je trouve le temps.
La description
la source
Stax , 15 octets
Exécuter et déboguer
Il prend le jeu de caractères délimiteurs de boîte (1 ou 2) sur la première ligne d'entrée. Le reste des lignes est le corps d'entrée.
Déballé, non golfé et commenté, il ressemble à ceci.
Exécutez celui-ci
la source