Corta mi arte ASCII

14

Digamos que tengo algo de arte ASCII:

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

( Fuente )

Pero quiero centrarme en el cable de este joystick, porque realmente quiero una imagen de un camino de jardín, que conduce a una puerta.

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

Podría copiar línea tras línea, podría usar un editor de texto con modo de selección de bloque, o ... ¡podría escribir un código!

Entonces, mi código necesita cinco argumentos:

  • Una pieza de arte ASCII, una cadena separada por una nueva línea.
  • El eje X de la esquina superior izquierda (1 indexado, desde la columna de la izquierda, entero positivo)
  • El eje Y de la esquina superior izquierda (1 indexado, desde la fila superior, entero positivo)
  • Ancho de la imagen resultante (entero positivo)
  • Altura de la imagen resultante (entero positivo)

Casos de prueba

Imagen ASCII:

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

Sendero del jardín

  • X: 10
  • Y: 15
  • Ancho: 5
  • Altura: 7

Resultado:

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

Icono de DB

  • X: 3
  • Y: 12
  • Ancho: 6
  • Altura: 4

Salida:

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

Anciano alienígena

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

Firma

  • X: 16
  • Y: 19
  • Ancho: 3
  • Altura: 1
hjw

Reglas

AJFaraday
fuente
8
¿Podemos tomar X e Y como 0 indexado?
TFeld
8
Además, en el caso de prueba 1, Ydebe inclinarse 15, y en TC 2, Xdebe ser3
TFeld
2
¿Podemos suponer que la entrada se rellena a un rectángulo con espacios?
DLosc
66
Eso es exactamente lo que pensé cuando vi ese arte ascii, un sendero del jardín. No pensé en nada más ...
Jo King
3
Parece que muchos de los valores de X e Y son incorrectos en los casos de prueba (¡tal vez algunos tienen un índice de 0 ?!) - al menos: Y de Garden Path debería ser 15; La X de DB Icon debería ser 3.
Jonathan Allan

Respuestas:

22

Lienzo , 1 byte

Pruébalo aquí!

Toma arte de altura, ancho, Y, X y ASCII como entradas, en ese orden.

Aunque casi todo lo relacionado con los objetos de arte ASCII en Canvas está indexado en 0, por alguna razón está indexado en 1. ¯ \ _ (ツ) _ / ¯

dzaima
fuente
Respuesta esperada del lienzo: D (mb carbón tiene algo similar)
Dead Possum
¡Que brujería es esta!
AJFaraday
@AJFaraday Quiero decir, ¿no esperarías que un lenguaje hecho específicamente para la manipulación de arte ASCII no tenga una función incorporada para obtener una parte específica de un arte ascii? : p
dzaima
4

Carbón de leña , 7 bytes

δJθηTζε

Pruébalo en línea! El enlace es a la versión detallada del código. Toma coordenadas 0 indexadas. Explicación:

δ

Imprima el arte ASCII.

Jθη

Salta a la esquina superior izquierda del rectángulo deseado.

Tζε

Recorte el lienzo al tamaño deseado.

Neil
fuente
3

Pip -n , 21 bytes

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

Pruébalo en línea!

O, si se permite la indexación 0 ...

Pip -n, 17 bytes :

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

Pruébalo en línea!

Explicación

Toma los cinco argumentos como argumentos de línea de comandos.

                   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)

Las soluciones anteriores también suponen que la entrada es un rectángulo perfecto, es decir, las líneas tienen la misma longitud. De lo contrario, se necesitan 2 bytes adicionales (use en -llugar de -n):

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

Japt -R , 13 11 bytes

·tWÉY ®tVÉX

Intentalo

2 bytes guardados gracias a Kamil Drakari

9 bytes si no fuera por el requisito innecesario de que las soluciones usen indexación basada en 1.

·tWY ®tVX

Explicación

                :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
Lanudo
fuente
En mis pruebas, puede guardar 2 bytes cambiando el segmento a t, y otros 2 bytes por 0 indexación. Puede valer la pena esperar en el segundo puesto que OP no ha aclarado si la indexación 0 es aceptable o ha solucionado los casos de prueba.
Kamil Drakari
Uno agradable, @KamilDrakari: olvidé por completo que el tmétodo también funciona en matrices.
Shaggy
2

J , 45 bytes

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

Pruébalo en línea!

Notas: J acepta hasta 2 argumentos, izquierdo y derecho. El argumento derecho es la cadena de arte ASCII, la izquierda, una lista de valores UHXW

Simulo la nueva línea y la llamada a la función tiene un código para convertir la cadena en una matriz.

Galen Ivanov
fuente
2

V , 16 bytes

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

Pruébalo en línea!

Se espera que la entrada se rellene con espacios para ser un rectángulo perfecto. Además, la entrada 'Y' viene antes que la 'X'.

Hexdump:

00000000: c047 c07c 1640 636c 4064 6a79 4856 4770  .G.|.@cl@djyHVGp
DJMcMayhem
fuente
2

C (gcc) , 118109 bytes

La entrada puede contener líneas irregulares: las nuevas líneas se imprimen si existen en el rango y.

Gracias a ceilingcat por la sugerencia.

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);}

Pruébalo en línea!

ErikF
fuente
1

Jalea , 11 bytes

Ỵṫ€¥ṫḣ€ḣ4ƭ/

Pruébalo en línea!

Toma el arte ASCII como una cadena r multilínea de Python (para evitar problemas con las barras invertidas).

Erik el Outgolfer
fuente
1

Bash + coreutils, 37

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

Curiosamente, GNU tail 8.28 (en Ubuntu 18.04) permite el +NUMformato, mientras que GNU tail 8.29 en TIO requiere 2 bytes adicionales para esto-n+NUM .

Pruébalo en línea!

Pensé que hacer todo esto sedpodría ser más corto, pero a 50 bytes no:

sed -nr "$2,$[$2+$4-1]s/.{$[$1-1]}(.{,$3}).*/\1/p"
Trauma digital
fuente
1

K4 , 31 bytes

Solución:

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

Ejemplos:

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"

Explicación:

Tome la entrada indexada 1, genere las coordenadas x / y e indexe en arte 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
callejero
fuente
1

R , 62 bytes

Quizás una solución sorprendentemente corta para un desafío de texto en R, porque no necesitamos leer todo el texto en una matriz.

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

Pruébalo en línea!

J.Doe
fuente
1

\ / \ /> , 123 bytes

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

La entrada consiste en una sola línea de variables de entrada delimitados por espacios x, y, w, yh , seguido por el arte ascii en la línea siguiente en adelante.

Explicación

Este código usa la capacidad de \ / \ /> para auto modificarse colocando el arte ascii en el código mismo, que termina luciendo así:

code

Luego toma los caracteres en el rectángulo especificado fuera del código y lo genera.

torcado
fuente