Gunting seni ASCII saya


14

Katakanlah saya punya beberapa seni ASCII:

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

( Sumber )

Tapi saya ingin fokus pada kabel joystick ini, karena saya sebenarnya ingin gambar jalan taman, mengarah ke pintu.

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

Saya dapat menyalin baris demi baris, saya dapat menggunakan editor teks dengan mode pemilihan blok, atau ... Saya bisa menulis beberapa kode!

Jadi, kode saya perlu lima argumen:

  • Sepotong seni ASCII, string yang dipisahkan baris baru.
  • Sumbu X sudut kiri atas (diindeks 1, dari kolom kiri, bilangan bulat positif)
  • Sumbu Y dari sudut kiri atas (1-diindeks, dari baris atas, bilangan bulat positif)
  • Lebar gambar yang dihasilkan (bilangan bulat positif)
  • Tinggi gambar yang dihasilkan (bilangan bulat positif)

Uji Kasus

Gambar ASCII:

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

Jalur taman

  • X: 10
  • Y: 15
  • Lebar: 5
  • Tinggi: 7

Hasil:

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

Ikon DB

  • X: 3
  • Y: 12
  • Lebar: 6
  • Tinggi: 4

Keluaran:

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

Penatua Alien

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

Tanda tangan

  • X: 16
  • Y: 19
  • Lebar: 3
  • Tinggi: 1
hjw

Aturan


8
Bisakah kita mengambil X dan Y sebagai 0-diindeks?
TFeld

8
Juga, dalam testcase 1, Yharusnya baru 15, dan dalam TC 2, Xharus3
TFeld

2
Bisakah kita berasumsi bahwa input diisi dengan persegi panjang dengan spasi?
DLosc

6
Itulah yang saya pikirkan ketika saya melihat seni ascii itu, jalan setapak di taman. Saya tidak memikirkan hal lain sama sekali ...
Jo King

3
Tampaknya banyak dari nilai X dan Y tidak benar dalam kasus uji (mungkin beberapa diindeks 0 ?!) - setidaknya: Y dari Garden Path harus 15; X dari DB Icon harus 3.
Jonathan Allan

Jawaban:


22

Kanvas , 1 byte

Coba di sini!

Dibutuhkan tinggi, lebar, Y, X, dan seni ASCII sebagai input, dalam urutan itu.

Meskipun hampir semua hal tentang objek seni ASCII di Canvas adalah 0-diindeks, 1-diindeks oleh beberapa alasan. ¯ \ _ (ツ) _ / ¯


Jawaban yang diharapkan dari kanvas: D (mb arang memiliki sesuatu yang serupa)
Dead Possum

Sihir apa ini!
AJFaraday

@AJFaraday Maksud saya, tidakkah Anda berharap bahwa bahasa yang dibuat khusus untuk manipulasi ASCII-art tidak memiliki built-in untuk mendapatkan bagian spesifik dari ascii-art? : p
dzaima


4

Arang , 7 byte

δJθηTζε

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil coordintaes yang diindeks 0. Penjelasan:

δ

Cetak seni ASCII.

Jθη

Lompat ke sudut kiri atas dari persegi panjang yang diinginkan.

Tζε

Pangkas kanvas ke ukuran yang diinginkan.


3

Pip -n , 21 byte

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

Cobalah online!

Atau, jika pengindeksan 0 diizinkan ...

Pip -n, 17 byte :

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

Cobalah online!

Penjelasan

Mengambil semua argumen sebagai argumen baris perintah.

                   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)

Solusi di atas juga menganggap input adalah persegi panjang yang sempurna - yaitu, semua garis memiliki panjang yang sama. Jika tidak, diperlukan 2 byte tambahan (gunakan -lbukan -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

Cobalah

2 byte disimpan berkat Kamil Drakari

9 byte jika bukan karena persyaratan yang tidak perlu bahwa solusi menggunakan pengindeksan berbasis 1.

·tWY ®tVX

Penjelasan

                :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

Dalam pengujian saya, Anda dapat menyimpan 2 byte dengan mengalihkan slice ke t, dan 2 byte dengan 0 indeks. Mungkin layak menunggu yang kedua karena OP belum menjelaskan apakah pengindeksan 0 dapat diterima, atau memperbaiki kasus uji.
Kamil Drakari

Bagus, @KamilDrakari - benar-benar lupa tmetode ini berfungsi pada array juga.
Shaggy


2

J , 45 byte

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

Cobalah online!

Catatan: J menerima hingga 2 argumen, kiri dan kanan. Argumen yang tepat adalah string seni ASCII, yang kiri - daftar nilai UHXW

Saya mensimulasikan baris baru dan pemanggilan fungsi memiliki kode untuk mengkonversi string ke array.


2

V , 16 byte

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

Cobalah online!

Input diharapkan diisi dengan spasi menjadi persegi panjang yang sempurna. Juga, input 'Y' muncul sebelum 'X'.

Hexdump:

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

2

C (gcc) , 118 109 byte

Input dapat berisi garis bergerigi: baris baru dicetak jika ada dalam rentang-y.

Terima kasih kepada ceilingcat untuk sarannya.

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

Cobalah online!




1

Bash + coreutils, 37

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

Menariknya, GNU tail 8.28 (pada Ubuntu 18.04) memungkinkan +NUMformat, sedangkan GNU tail 8.29 pada TIO membutuhkan 2 byte tambahan untuk ini -n+NUM.

Cobalah online!

Saya pikir melakukan ini semua sedmungkin lebih pendek, tetapi pada 50 byte tidak:

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

1

K4 , 31 byte

Larutan:

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

Contoh:

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"

Penjelasan:

Ambil input 1-diindeks, buat koordinat x / y dan indeks ke 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

Mungkin solusi mengejutkan pendek untuk tantangan teks dalam R, karena kita tidak perlu benar-benar membaca seluruh teks menjadi sebuah matriks.

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

Cobalah 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

Masukan terdiri dari satu baris variabel input ruang-delimited x, y,w , danh , diikuti oleh seni ascii pada baris berikutnya dan seterusnya.

Penjelasan

Kode ini menggunakan kemampuan \ / \ /> untuk memodifikasi sendiri dengan menempatkan ascii art ke dalam kode itu sendiri, yang pada akhirnya tampak seperti ini:

kode

Itu kemudian mengambil karakter dalam persegi panjang yang ditentukan dari kode dan mengeluarkannya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.