Pique minha arte ASCII


14

Digamos que eu tenha alguma arte ASCII:

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

( Fonte )

Mas quero me concentrar no cabo deste joystick, porque na verdade quero uma foto de um caminho de jardim que conduz a uma porta.

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

Eu poderia copiar linha após linha, eu poderia usar um editor de texto com o modo de seleção de bloco ou ... Eu poderia escrever algum código!

Então, meu código precisa de cinco argumentos:

  • Uma obra de arte ASCII, uma sequência separada por nova linha.
  • O eixo X do canto superior esquerdo (indexado 1, da coluna da esquerda, número inteiro positivo)
  • O eixo Y do canto superior esquerdo (indexado 1, da linha superior, número inteiro positivo)
  • Largura da imagem resultante (número inteiro positivo)
  • Altura da imagem resultante (número inteiro positivo)

Casos de teste

Imagem ASCII:

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

Caminho do jardim

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

Resultado:

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

Ícone DB

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

Resultado:

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

Alien Elder

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

Assinatura

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

Regras


8
Podemos considerar X e Y como indexados em 0?
TFeld

8
Além disso, no testcase 1, Ydeve bew 15, e no TC 2, Xdeve ser #3
TFeld 26/10

2
Podemos assumir que a entrada é preenchida com um retângulo com espaços?
DLosc

6
Foi exatamente isso que pensei quando vi a arte ascii, um caminho de jardim. Eu não pensar em mais nada ...
Jo rei

3
Parece que muitos dos valores X e Y estão incorretos nos casos de teste (talvez alguns sejam 0 indexados ?!) - pelo menos: Y do caminho do jardim deve ser 15; O X do DB Icon deve ser 3. #
Jonathan Allan #

Respostas:


22

Tela , 1 byte

Experimente aqui!

Leva altura, largura, Y, X e arte ASCII como entradas, nessa ordem.

Embora quase tudo sobre os objetos de arte ASCII no Canvas seja indexado em 0, é indexado em 1 por algum motivo. ¯ \ _ (ツ) _ / ¯


Resposta esperada da tela: D (mb carvão vegetal têm algo similar)
Morto Possum

Que feitiçaria é essa!
AJFaraday

@AJFaraday, quero dizer, você não esperaria que uma linguagem criada especificamente para manipulação da arte ASCII não tivesse um built-in para obter uma parte específica de uma arte ascii? : p
dzaima 29/10


4

Carvão , 7 bytes

δJθηTζε

Experimente online! Link é a versão detalhada do código. Leva coordenadas indexadas a 0. Explicação:

δ

Imprima o art. ASCII.

Jθη

Pule para o canto superior esquerdo do retângulo desejado.

Tζε

Apare a tela no tamanho desejado.


3

Pip -n , 21 bytes

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

Experimente online!

Ou, se a indexação 0 for permitida ...

Pip -n, 17 bytes :

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

Experimente online!

Explicação

Leva todos os cinco argumentos como argumentos da linha de comando.

                   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)

As soluções acima também assumem que a entrada é um retângulo perfeito - ou seja, as linhas têm o mesmo comprimento. Caso contrário, são necessários 2 bytes extras (use em -lvez de -n):

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


3

Japonês -R , 13 11 bytes

·tWÉY ®tVÉX

Tente

2 bytes salvos graças a Kamil Drakari

9 bytes, se não for o requisito desnecessário de que as soluções usam indexação baseada em 1.

·tWY ®tVX

Explicação

                :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

Nos meus testes, você pode salvar 2 bytes alternando a fatia para te outros 2 bytes pela indexação 0. Pode valer a pena esperar no segundo, pois o OP não esclareceu se a indexação 0 é aceitável ou corrigiu os casos de teste.
Kamil Drakari 26/10/19

Legal, @KamilDrakari - esqueci completamente que o tmétodo também funciona em matrizes.
Shaggy


2

J , 45 bytes

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

Experimente online!

Notas: J aceita até 2 argumentos, esquerdo e direito. O argumento certo é a sequência de arte ASCII, a esquerda - uma lista de valores UHXW

Simulo a nova linha e a chamada da função possui um código para converter a string em uma matriz.


2

V , 16 bytes

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

Experimente online!

A entrada deve ser preenchida com espaços para ser um retângulo perfeito. Além disso, a entrada 'Y' vem antes do 'X'.

Hexdump:

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

2

C (gcc) , 118 109 bytes

A entrada pode conter linhas irregulares: novas linhas serão impressas se existirem no intervalo y.

Agradecimentos a ceilingcat pela sugestão.

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

Experimente online!




1

Bash + coreutils, 37

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

Curiosamente, o GNU tail 8.28 (no Ubuntu 18.04) permite o +NUMformato, enquanto o GNU tail 8.29 no TIO requer 2 bytes extras para isso -n+NUM.

Experimente online!

Eu pensei que fazer isso all in sedpoderia ser mais curto, mas em 50 bytes não é:

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

1

K4 , 31 bytes

Solução:

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

Exemplos:

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"

Explicação:

Pegue a entrada indexada em 1, gere as coordenadas x / y e indexe na 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

1

R , 62 bytes

Talvez uma solução surpreendentemente curta para um desafio de texto em R, porque não precisamos realmente ler o texto inteiro em uma matriz.

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

Experimente online!


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

Entrada consiste de uma única linha de variáveis de entrada delimitados por espaço x, y,w , e h, seguindo-se a arte ASCII na linha seguinte para a frente.

Explicação

Este código usa a capacidade de \ / \ /> de se auto-modificar colocando a arte ascii no próprio código, que acaba assim:

código

Ele então pega os caracteres no retângulo especificado fora do código e o gera.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.