Taglia la mia arte ASCII


14

Diciamo che ho un po 'di arte ASCII:

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

( Fonte )

Ma voglio concentrarmi sul cavo di questo joystick, perché in realtà voglio una foto di un percorso da giardino, che porta a una porta.

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

Potrei copiare riga per riga, potrei usare un editor di testo con la modalità di selezione dei blocchi, oppure ... potrei scrivere del codice!

Quindi, il mio codice ha bisogno di cinque argomenti:

  • Un pezzo di arte ASCII, una nuova linea separata di stringa.
  • Asse X dell'angolo in alto a sinistra (1 indicizzato, dalla colonna di sinistra, numero intero positivo)
  • Asse Y dell'angolo in alto a sinistra (1 indicizzato, dalla riga superiore, intero positivo)
  • Larghezza dell'immagine risultante (numero intero positivo)
  • Altezza dell'immagine risultante (numero intero positivo)

Casi test

Immagine ASCII:

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

Percorso del giardino

  • X: 10
  • Y: 15
  • Larghezza: 5
  • Altezza: 7

Risultato:

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

Icona DB

  • X: 3
  • Y: 12
  • Larghezza: 6
  • Altezza: 4

Produzione:

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

Alien Elder

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

Firma

  • X: 16
  • Y: 19
  • Larghezza: 3
  • Altezza: 1
hjw

Regole


8
Possiamo prendere X e Y come indicizzati 0?
TFeld,

8
Inoltre, nel testcase 1, Ydovrebbe apparire 15, e nel TC 2, Xdovrebbe essere3
TFeld il

2
Possiamo supporre che l'input sia imbottito in un rettangolo con spazi?
DLosc,

6
Questo è esattamente quello che ho pensato quando ho visto quell'arte ascii, un sentiero nel giardino. Non pensavo a nient'altro ...
Jo King,

3
Sembra che molti dei valori X e Y non siano corretti nei casi di test (forse alcuni sono 0 indicizzati ?!) - almeno: Y di Garden Path dovrebbe essere 15; X of DB Icon dovrebbe essere 3.
Jonathan Allan,

Risposte:


22

Tela , 1 byte

Provalo qui!

Prende altezza, larghezza, Y, X e ASCII come input, in quell'ordine.

Sebbene quasi tutto ciò che riguarda gli oggetti d'arte ASCII in Canvas sia 0-indicizzato, per qualche ragione è 1-indicizzato. ¯ \ _ (ツ) _ / ¯


Risposta attesa dalla tela: D (il carbone mb ha qualcosa di simile)
Dead Possum

Che stregoneria è questa!
AJFaraday

@AJFaraday Voglio dire, non ti aspetteresti che un linguaggio creato appositamente per la manipolazione dell'arte ASCII non abbia un incorporato per ottenere una parte specifica di un'arte ascii? : p
dzaima,


4

Carbone , 7 byte

δJθηTζε

Provalo online!Il collegamento è alla versione dettagliata del codice. Accetta coordinate con indice 0. Spiegazione:

δ

Stampa l'arte ASCII.

Jθη

Vai all'angolo in alto a sinistra del rettangolo desiderato.

Tζε

Taglia la tela nella dimensione desiderata.


3

Pip -n , 21 byte

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

Provalo online!

Oppure, se è consentito l'indicizzazione 0 ...

Pip -n, 17 byte :

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

Provalo online!

Spiegazione

Accetta tutti e cinque gli argomenti come argomenti della riga di 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)

Le soluzioni di cui sopra presuppongono anche che l'input sia un rettangolo perfetto, ovvero che le linee abbiano tutte la stessa lunghezza. In caso contrario, sono necessari 2 byte extra (utilizzare -linvece di -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 byte

·tWÉY ®tVÉX

Provalo

2 byte salvati grazie a Kamil Drakari

9 byte se non per il requisito superfluo che le soluzioni utilizzano l'indicizzazione basata su 1.

·tWY ®tVX

Spiegazione

                :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

Nel mio test, è possibile salvare 2 byte cambiando la sezione in te altri 2 byte per 0 indicizzazione. Potrebbe valere la pena aspettare il secondo poiché OP non ha chiarito se l'indicizzazione 0 è accettabile o ha risolto i casi di test.
Kamil Drakari,

Bello, @KamilDrakari - ho completamente dimenticato che il tmetodo funziona anche sugli array.
Shaggy,


2

J , 45 byte

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

Provalo online!

Note: J accetta fino a 2 argomenti, sinistro e destro. L'argomento giusto è la stringa di arte ASCII, quella sinistra - un elenco di valori UHXW

Simulo la newline e la chiamata di funzione ha un codice per convertire la stringa in un array.


2

V , 16 byte

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

Provalo online!

Ci si aspetta che l'input sia riempito di spazi per essere un rettangolo perfetto. Inoltre, l'ingresso "Y" precede la "X".

hexdump:

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

2

C (gcc) , 118 109 byte

L'input può contenere linee frastagliate: le nuove righe vengono stampate se esistono nell'intervallo y.

Grazie a ceilingcat per il suggerimento.

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

Provalo online!




1

Bash + coreutils, 37

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

È interessante notare che GNU tail 8.28 (su Ubuntu 18.04) consente il +NUMformato, mentre GNU tail 8.29 su TIO richiede 2 byte extra per questo -n+NUM.

Provalo online!

Ho pensato che fare tutto questo sedpotrebbe essere più breve, ma a 50 byte non è:

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

1

K4 , 31 byte

Soluzione:

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

Esempi:

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"

Spiegazione:

Prendi l'input con 1 indice, genera le coordinate x / y e indicizza in ascii art.

{[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 byte

Forse una soluzione sorprendentemente breve a una sfida testuale in R, perché non abbiamo bisogno di leggere l'intero testo in una matrice.

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

Provalo online!


1

\ / \ /> , 123 byte

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

Ingresso è costituito da una singola linea di variabili di input spazio delimitato x, y, w, e h, seguita dall'arte ASCII nella riga successiva in poi.

Spiegazione

Questo codice usa la capacità di \ / \ /> di auto-modificarsi posizionando l'arte ascii nel codice stesso, che finisce per apparire così:

codice

Quindi prende i caratteri nel rettangolo specificato dal codice e li emette.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.