Hacher mon art ASCII

14

Disons que j'ai de l'art ASCII:

          ___
        ,"---".
        :     ;
         `-.-'
          | |
          | |
          | |
       _.-\_/-._
    _ / |     | \ _
   / /   `---'   \ \
  /  `-----------'  \
 /,-""-.       ,-""-.\
( i-..-i       i-..-i )
|`|    |-------|    |'|
\ `-..-'  ,=.  `-..-'/
 `--------|=|-------'
          | |
          \ \
           ) ) hjw
          / /
         ( (

( Source )

Mais je veux me concentrer sur le câble de ce joystick, car je veux en fait une photo d'un chemin de jardin menant à une porte.

 ,=.
-|=|-
 | |
 \ \
  ) )
 / /
( (

Je pourrais copier ligne après ligne, je pourrais utiliser un éditeur de texte avec le mode de sélection de bloc, ou ... je pourrais écrire du code!

Donc, mon code a besoin de cinq arguments:

  • Une œuvre d'art ASCII, une chaîne séparée par des sauts de ligne.
  • L'axe X du coin supérieur gauche (1 indexé, à partir de la colonne de gauche, entier positif)
  • L'axe Y du coin supérieur gauche (indexé 1, à partir de la ligne supérieure, entier positif)
  • Largeur de l'image résultante (entier positif)
  • Hauteur de l'image résultante (entier positif)

Cas de test

Image ASCII:

          ___
        ,"---".
        :     ;
         `-.-'
          | |
          | |
          | |
       _.-\_/-._
    _ / |     | \ _
   / /   `---'   \ \
  /  `-----------'  \
 /,-""-.       ,-""-.\
( i-..-i       i-..-i )
|`|    |-------|    |'|
\ `-..-'  ,=.  `-..-'/
 `--------|=|-------'
          | |
          \ \
           ) ) hjw
          / /
         ( (

Chemin de jardin

  • X: 10
  • Y: 15
  • Largeur: 5
  • Hauteur: 7

Résultat:

 ,=.
-|=|-
 | |
 \ \
  ) )
 / /
( (

Icône DB

  • X: 3
  • Y: 12
  • Largeur: 6
  • Hauteur: 4

Production:

,-""-.
i-..-i
|    |
`-..-'

Ancien étranger

  • X: 9
  • Y: 1
  • Largeur: 7
  • Hauteur: 10
  ___
,"---".
:     ;
 `-.-'
  | |
  | |
  | |
.-\_/-.
|     |
 `---'

Signature

  • X: 16
  • Y: 19
  • Largeur: 3
  • Hauteur: 1
hjw

Règles

AJFaraday
la source
8
Pouvons-nous prendre X et Y comme indexés 0?
TFeld
8
En outre, dans le testcase 1, Ydevrait être bew 15, et dans TC 2, Xdevrait être3
TFeld
2
Pouvons-nous supposer que l'entrée est complétée par un rectangle avec des espaces?
DLosc
6
C'est exactement ce à quoi j'ai pensé quand j'ai vu cet art ascii, une allée de jardin. Je ne pensais à rien d'autre ...
Jo King
3
Il semble que la plupart des valeurs X et Y sont incorrectes dans les cas de test (peut-être que certains sont indexés 0?!) - au moins: Y de Garden Path devrait être 15; X de DB Icon devrait être 3.
Jonathan Allan

Réponses:

22

Toile , 1 octet

Essayez-le ici!

Il prend la hauteur, la largeur, l'art Y, X et ASCII comme entrées, dans cet ordre.

Bien que presque tout sur les objets d'art ASCII dans Canvas soit indexé 0, est indexé 1 pour une raison quelconque. ¯ \ _ (ツ) _ / ¯

dzaima
la source
Réponse attendue de la toile: D (mb charbon de bois ont quelque chose de similaire)
Dead Possum
Quelle sorcellerie est-ce!
AJFaraday
@AJFaraday Je veux dire, ne vous attendriez-vous pas à ce qu'un langage spécialement conçu pour la manipulation de l'art ASCII n'ait pas de fonction intégrée pour obtenir une partie spécifique d'un art ascii? : p
dzaima
4

Fusain , 7 octets

δJθηTζε

Essayez-le en ligne! Le lien est vers la version détaillée du code. Prend les coordonnées indexées 0. Explication:

δ

Imprimez l'art ASCII.

Jθη

Aller dans le coin supérieur gauche du rectangle souhaité.

Tζε

Coupez la toile à la taille souhaitée.

Neil
la source
3

Pip -n , 21 octets

_@>--b@<dM(a^n--c+,e)

Essayez-le en ligne!

Ou, si l'indexation 0 est autorisée ...

Pip -n, 17 octets :

_@>b@<dM(a^nc+,e)

Essayez-le en ligne!

Explication

Prend les cinq arguments comme arguments de ligne de commande.

                   a-e are the 5 cmdline args; n is newline
         a^n       Split a on newlines
              ,e   Range(e)
            c+     Add c to each element
        (       )  Use the resulting range(c,c+e) to slice into the list of lines
       M           To each line, map this function:
_                   The line
 @>b                Slice, keeping indices b and greater
    @<d             Slice, keeping indices less than d
                   Print, joining on newlines (-n flag)

Les solutions ci-dessus supposent également que l'entrée est un rectangle parfait - c'est-à-dire que les lignes ont toutes la même longueur. Sinon, 2 octets supplémentaires sont nécessaires (utilisez à la -lplace de -n):

(Z(a^nZDsb+,d)c+,e)      0-indexed, 19 bytes
(Z(a^nZDs--b+,d)--c+,e)  1-indexed, 23 bytes
DLosc
la source
3

Japt -R , 13 11 octets

·tWÉY ®tVÉX

Essayez-le

2 octets économisés grâce à Kamil Drakari

9 octets sinon pour l'exigence inutile que les solutions utilisent une indexation basée sur 1.

·tWY ®tVX

Explication

                :Implicit input of string U and integers V=X, W=Y, X=Width & Y=Height
·               :Split U on newlines
 t              :Slice
  WÉ            : From 0-based index W-1
    Y           : To length Y
      ®         :Map
       t        :  Substring
        VÉ      :   From 0-based index V-1
          X     :   To length X
                :Implicitly join with newlines and output
Hirsute
la source
Dans mes tests, vous pouvez enregistrer 2 octets en basculant la tranche vers t, et 2 autres octets par 0 d'indexation. Il vaut peut-être la peine d'attendre le deuxième, car OP n'a pas précisé si l'indexation 0 est acceptable ou corrigé les cas de test.
Kamil Drakari
Sympa, @KamilDrakari - j'ai complètement oublié que la tméthode fonctionne également sur les tableaux.
Shaggy
2

J , 45 octets

f=:4 :0
'a b c d'=.x-#:10
y{~<(a+i.b);c+i.d
)

Essayez-le en ligne!

Remarques: J accepte jusqu'à 2 arguments, gauche et droite. L'argument de droite est la chaîne d'art ASCII, celle de gauche - une liste de valeurs UHXW

Je simule la nouvelle ligne et l'appel de fonction a un code pour convertir la chaîne en un tableau.

Galen Ivanov
la source
2

V , 16 octets

ÀGÀ|<C-v>@cl@djyHVGp

Essayez-le en ligne!

L'entrée devrait être remplie d'espaces pour être un rectangle parfait. De plus, l'entrée «Y» précède le «X».

Hexdump:

00000000: c047 c07c 1640 636c 4064 6a79 4856 4770  .G.|.@cl@djyHVGp
James
la source
2

C (gcc) , 118109 octets

L'entrée peut contenir des lignes irrégulières: les retours à la ligne sont imprimés s'ils existent dans la plage y.

Merci à plafondcat pour la suggestion.

f(s,x,y,w,h,a,b,c)char*s;{for(b=1,a=0;*s;a=c?!b++:a,s++)((c=*s==10)|++a>=x&a-x<w)&b>=y&b-y<h-c&&putchar(*s);}

Essayez-le en ligne!

ErikF
la source
1

Gelée , 11 octets

Ỵṫ€¥ṫḣ€ḣ4ƭ/

Essayez-le en ligne!

Prend l'art ASCII comme une chaîne r multi-ligne Python (afin d'éviter les problèmes avec les barres obliques inverses).

Erik le Outgolfer
la source
1

Bash + coreutils, 37

cut -b$1-$[$1+$3-1]|tail +$2|head -$4

Fait intéressant, GNU tail 8.28 (sur Ubuntu 18.04) autorise le +NUMformatage, tandis que GNU tail 8.29 sur TIO nécessite 2 octets supplémentaires pour cela -n+NUM.

Essayez-le en ligne!

Je pensais que cela sedpourrait être plus court, mais à 50 octets, ce n'est pas:

sed -nr "$2,$[$2+$4-1]s/.{$[$1-1]}(.{,$3}).*/\1/p"
Traumatisme numérique
la source
1

K4 , 31 octets

Solution:

{[a;x;y;w;h]a .-1+(y;x)+!:'h,w}

Exemples:

q)ASCII:("          ___";"        ,\"---\".";"        :     ;";"         `-.-'";"          | |";"          | |";"          | |";"       _.-\\_/-._";"    _ / |     | \\ _";"   / /   `---'   \\ \\";"  /  `-----------'  \\";" /,-\"\"-.       ,-\"\"-.\\";"( i-..-i       i-..-i )";"|`|    |-------|    |'|";"\\ `-..-'  ,=.  `-..-'/";" `--------|=|-------'";"          | |";"          \\ \\";"           ) ) hjw";"          / /";"         ( (")
q)k){[a;x;y;w;h]a .-1+(y;x)+!:'h,w}[ASCII;10;15;5;7]
" ,=. "
"-|=|-"
" | | "
" \\ \\ "
"  ) )"
" / / "
"( (  "
q)k){[a;x;y;w;h].[a;-1+(y;x)+!:'h,w]}[ASCII;3;12;6;4]
",-\"\"-."
"i-..-i"
"|    |"
"`-..-'"
q)k){[a;x;y;w;h].[a;-1+(y;x)+!:'h,w]}[ASCII;9;1;7;10]
"  ___  "
",\"---\"."
":     ;"
" `-.-' "
"  | |  "
"  | |  "
"  | |  "
".-\\_/-."
"|     |"
" `---' "
q)k){[a;x;y;w;h].[a;-1+(y;x)+!:'h,w]}[ASCII;16;19;3;1]
"hjw"

Explication:

Prenez l'entrée 1-indexée, générez les coordonnées x / y et indexez dans l'art ascii.

{[a;x;y;w;h]a .-1+(y;x)+!:'h,w} / the solution
{[a;x;y;w;h]                  } / lambda taking 5 inputs, a(scii), x, y, w(idth), h(eight)
                           h,w  / concatenate height and width, e.g. 7 5
                        !:'     / range til each, e.g. (0 1 2 3 4 5 6;0 1 2 3 4)
                  (y;x)+        / add list y x to it, e.g. (15 16 17 18 19 20 21;10 11 12 13 14)
               -1+              / subtract 1, e.g. (14 15 16 17 18 19 20;9 10 11 12 13)
            a .                 / index into a at these coordinates
streetster
la source
1

R , 62 octets

Peut-être une solution étonnamment courte à un défi de texte dans R, car nous n'avons pas besoin de lire le texte entier dans une matrice.

function(x,y,w,h)write(substr(readLines()[y+1:h-1],x,x+w-1),1)

Essayez-le en ligne!

J.Doe
la source
1

\ / \ /> , 123 octets

j:j8+}j+}j}pppp80x
{:}i:0(?v:a=?x@s1+:
~~~~1+0!/000y
yp:qqqq~
q{y?=p:+1q:}}g$q:pp:
1}x}p}ap:q~q+1{{y!?:-
ys{{
~!u.*2(0:;!?h

Entrée se compose d'une seule ligne de variables d'entrée séparées par des espaces x, y, w, eth , suivie de l'art ascii sur la ligne suivante avant.

Explication

Ce code utilise la capacité de \ / \ /> à s'auto-modifier en plaçant l'art ascii dans le code lui-même, ce qui finit par ressembler à ceci:

code

Il saisit ensuite les caractères dans le rectangle spécifié hors du code et le génère.

torcado
la source