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


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. ¯ \ _ (ツ) _ / ¯


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.


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


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

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.


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

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!




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"

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

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!


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.