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

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

dzaima
sumber
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
7

Python 2 , 64 62 byte

lambda I,x,y,w,h:[l[x-1:][:w]for l in I.split('\n')[y-1:][:h]]

Cobalah online!


Jika Xdan Ydapat 0-indeks:

Python 2 , 56 byte

lambda I,x,y,w,h:[l[x:x+w]for l in I.split('\n')[y:y+h]]

Cobalah online!

TFeld
sumber
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.

Neil
sumber
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
DLosc
sumber
3

05AB1E , 21 19 byte

UV¶¡εXG¦}Y£}sG¦}s£»

Cobalah online!

Atau jika 0-indexing is allowed:

05AB1E , 18 byte

UV¶¡εX.$Y£}sF¦}s£»

Cobalah online!

Emigna
sumber
12 jika Anda dapat menerima [X1, X2]dan [Y1, Y2]sebagaiv³ŸNåiy²ŸèJ=
Magic Gurita Guci
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
Shaggy
sumber
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
3

JavaScript (Node.js) , 70 69 byte

-1 Terima kasih @Shaggy untuk splice()idenya.

(a,x,y,w,h)=>a.split`
`.map(q=>q.substr(x-1,w)).splice(--y,h).join`
`

Cobalah online!

Seni ASCII yang diberikan mengganggu tbh

Shieru Asakoto
sumber
1
69 byte
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.

Galen Ivanov
sumber
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
DJMcMayhem
sumber
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!

ErikF
sumber
1

Jelly , 11 byte

Ỵṫ€¥ṫḣ€ḣ4ƭ/

Cobalah online!

Mengambil ASCII-art sebagai r-string Python multi-line (untuk menghindari masalah dengan backslash).

Erik the Outgolfer
sumber
1

Haskell , 61 byte

(x#y)w h=unlines.map(take w.drop(x-1)).take h.drop(y-1).lines

Cobalah online!

Mengambil argumen dalam rangka: x, y, w, h, s.

benar-benar manusiawi
sumber
58 byte: Cobalah secara online!
Laikoni
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"
Trauma Digital
sumber
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
streetster
sumber
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!

J.Apakah
sumber
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.

torcado
sumber