Seni ASCII itu menyenangkan. Editor teks modern sangat pandai memanipulasi teks. Apakah bahasa pemrograman modern sesuai dengan tugasnya?
Satu tugas umum dalam manipulasi seni ASCII adalah memotong teks menjadi persegi panjang di antara dua karakter. Ini adalah tugas yang harus Anda laksanakan dalam tantangan ini.
Detail
Program Anda akan mengambil 3 input:
- yang pertama adalah karakter 'awal' dari blok - menandai sudut kiri atas
- yang kedua adalah karakter 'ujung' dari blok - menandai sudut kanan bawah
- yang ketiga adalah beberapa bentuk teks multiline, baik string, atau daftar string, atau nama file, atau apa pun
Hasilnya akan berupa teks multiline (sekali lagi, dalam salah satu format di atas) yang dipangkas menjadi persegi panjang di antara input yang diberikan. Perhatikan bahwa dua input pertama mungkin tidak unik.
Kasus tepi
Kotak harus selalu memiliki volume setidaknya 2. Dengan demikian:
() (
)
adalah kotak tetapi ini:
)( ) (
( )
tidak (dengan mulai = (
dan akhir = )
).
Input hanya akan berisi satu kotak. Dengan demikian karakter awal dan akhir hanya boleh muncul sekali, kecuali mereka adalah karakter yang sama dalam hal ini mereka harus muncul tepat dua kali.
Selain itu setiap baris dalam input harus setidaknya sepanjang jarak dari awal garis ke tepi kanan kotak di input.
Program Anda tidak perlu menangani input yang tidak valid; mereka dapat mengakibatkan perilaku yang tidak terdefinisi.
Aturan
Aturan kode-golf berlaku. Kode terpendek menang.
Contohnya
Hari yang cerah: start: ( end: ) input:
This is some text
. (but this text
is in a box ).
So only it is important.
Keluaran:
(but this text
is in a box )
Perhatikan juga pengupasan ruang horizontal. Tanaman seni ASCII adalah 2d.
Hari hujan: start: ( end: ) input:
This is some text (
But is that even )
really a box?
Keluaran:
(
)
Awal / akhir yang sama: start: / end: / input:
Oh, I get how this could be useful
/----------------------------\
| All this text is in a box! |
\----------------------------/
Keluaran:
/----------------------------\
| All this text is in a box! |
\----------------------------/
Masukan tidak valid: start: ( end: ) input:
Boxes are rectangular ( so this has
0 volume ) which is illegal.
Input 2 tidak valid: start: ( end: ) input:
(The lines must already be square
so this line that is too short
relative to this end, is illegal)
Jawaban:
Vim,
16, 12 byte / penekanan tombolCobalah online! dalam penerjemah V
Saya yakin editor teks lama bahkan lebih baik! : D
Meskipun tidak harus, jawaban ini bekerja dengan kedua input "tidak valid" yang diberikan, menghasilkan
dan
Penjelasan:
sumber
/\/<cr><c-v>nygv$o0dp
atau sesuatu seperti itu terlalu lama :)Jelly , 13 byte
Tautan diad yang menerima daftar karakter awal dan akhir di sebelah kiri dan daftar garis (sebagai daftar karakter) di sebelah kanan yang menghasilkan daftar garis (sebagai daftar karakter).
Cobalah online! (program lengkap - jika input Python valid, input Python-string-quote.)
Bagaimana?
Sebagai contoh, dengan kiri =
['a', 'b']
dan kanan (sebagai daftar daftar karakter - garis):=€
menghasilkan daftar dua daftar daftar (yang berkinerja pertama'a'=
, yang kedua'b'=
):menjumlahkan ini menghasilkan satu daftar daftar (menjumlahkan elemen-bijaksana):
ŒṪ
kemudian memberi kita indeks multi-dimensi (1-diindeks) dari non-nol,[[2,3],[4,6]]
- yaitu[[top,left],[bottom,right]]
.r/
kemudian melakukan[2,3]r[4,6]
yang, karenar
vektorisasi, seperti[2r4, 3r6]
, mengevaluasi ke[[2,3,4],[3,4,5,6]]
- yaitu[rows,columns]
.,þ/
kemudian melakukan di[2,3,4],þ[3,4,5,6]
manaþ
instruksi luar-poduct dan,
berpasangan. Ini menghasilkan semua[row,column]
nilai berdasarkan kolom, dalam hal ini:Kami ingin ini dengan baris, jadi
Z
digunakan untuk memindahkan ini ke:Akhirnya
œị
indeks kembali ke jalur input:Perlu dicatat bahwa ketika kedua karakter pembatas adalah sama
=€
mengidentifikasi dua kali tetapiSŒṪ
akhirnya melakukan hal yang benar, karena2
itu benar, misalnya dengan['a','a']
:sumber
APL (Dyalog) ,
3830 byte4 byte disimpan berkat @EriktheOutgolfer
Cobalah online!
sumber
⍸matrix∊separators
, dan lakukan take / drop dengannya(⍸a=⎕)↓(1+⍸a=⎕)↑a←⎕
dengan⎕io←0
⊃{⌽⊖⍵↓⍨⊃⍸⍺=⍵}/⎕⎕⎕
(sic, dengan 3 trailing quads) yang bahkan lebih pendek. Atau... ⎕⎕(↑⎕)
jika matriks pra-campuran tidak diizinkan.Jelly , 14 byte
Cobalah online!
sumber
()
), bukan'()'
. Jika parse-mampu, perlu dikutip, namun, saya//
tidak perlu dikutip (operator divisi integer tanpa operan? Hm ...).()
hanya ditafsirkan oleh Jelly sebagai semacam karakter khusus. Kebanyakan pasangan karakter saya coba bekerja. Saya ingin mendengar apa yang dipikirkan orang yang lebih akrab dengan Jelly. EDIT: ninja-red oleh erik the outgolferPython 2 , 130 byte
Cobalah online!
sumber
Kanvas , 37 byte
Coba di sini!
36 byte untuk mendapatkan koordinat karakter (dan mengubahnya menjadi x, y, w, h karena itu yang
@
diperlukan) dan 1 byte untuk mendapatkan subbagian .. Harus ada pendekatan yang lebih baiksumber
JavaScript (ES6), 98 byte
Mengambil input sebagai dua bilangan bulat dan larik string. Mengembalikan array string.
Cobalah online!
Berkomentar
sumber
filter
danmap
? Apakah membangun array baru denganreduce
atau solusi rekursif tidak berhasil lebih pendek? Di telepon saya, di pub atau saya akan mencobanya sendiri.X
danY
dikenal pasti.Java 10, 204 byte
Memodifikasi input-array alih-alih mengembalikan yang baru untuk menghemat byte. Namun, ini berarti bahwa garis yang dihapus menjadi
""
sebaliknya. Jika ini tidak diizinkan, saya akan mengubahnya.Cobalah online.
Penjelasan:
Sebagai contoh:
Dengan input
start = "("
,end = ")"
danlines =
loop pertama akan memotongnya di bagian atas dan kiri, mengubahnya menjadi ini:
loop kedua akan memotongnya di bagian bawah dan kanan, mengubahnya menjadi ini:
sumber
Retina 0.8.2 , 110 byte
Cobalah online! Penjelasan:
Hapus baris input sebelum baris pertama kotak.
Jika karakter awal ada di kolom kiri input, hapus saja.
Jika karakter awal belum dihapus, geser semua kolom input yang ditinggalkan oleh satu dan ulangi dari awal.
Hapus karakter akhir dan semua yang ada di input setelah karakter akhir.
Pangkas semua garis dengan panjang baris berikutnya. Ini berfungsi dengan menghitung semua kecuali satu karakter pada setiap baris, kemudian mencoba mencocokkan dengan banyak karakter pada baris berikutnya; jika ini berhasil maka baris kedua lebih pendek, sehingga karakter terakhir dihapus dan loop berulang.
sumber
C (gcc) , 237 byte
Cobalah online!
Saya yakin 99% ini dapat disingkat menggunakan semacam fungsi pembantu untuk menemukan indeks horizontal dan pointer ke karakter, karena diulang dua kali. Sayangnya saya tidak dapat menemukan cara yang cukup singkat untuk melakukannya, saya dapat mencoba lagi nanti jika saya menemukan waktu.
Deskripsi
sumber
Stax , 15 byte
Jalankan dan debug itu
Dibutuhkan set karakter pembatas kotak (1 atau 2) pada baris input pertama. Sisa baris adalah badan input.
Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.
Jalankan yang ini
sumber