Jendela adalah kotak ASCII-art square dengan panjang sisi ganjil minimal 3, dengan batas karakter tunggal di sekitar tepi serta goresan vertikal dan horizontal di tengah:
#######
# # #
# # #
#######
# # #
# # #
#######
MS Window adalah jendela di mana perbatasan dibuat hanya dari karakter M
dan S
. Tugas Anda adalah menulis sebuah program (atau fungsi) yang mengambil string dan menampilkan nilai kebenaran jika inputnya adalah MS Window yang valid, dan nilai falsey jika tidak.
Spesifikasi
- Anda dapat mengambil input sebagai string yang dipisahkan baris baru atau array string yang mewakili setiap baris.
- Batas MS Window mungkin berisi campuran karakter M dan S, tetapi bagian dalamnya akan selalu terdiri dari spasi.
- Anda dapat memilih untuk mendeteksi hanya windows dengan trailing newlines, atau hanya windows tanpa trailing newlines, tetapi tidak keduanya.
Uji Kasus
Benar:
MMM
MMM
MMM
SMSMS
M M S
SMSMM
S S M
SMSMS
MMMMMMM
M S M
M S M
MSSSSSM
M S M
M S M
MMMMMMM
Falsey:
Hello, World!
MMMM
MSSM
MS M
MMMM
MMSMM
M S.M
sSSSS
M S M
MMSMM
MMMMMMM
M M M
MMMMMMM
M M M
MMMMMMM
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
M M M M
MMMMMMM
MMSSMSSMM
M M M
S S S
S S S
MMSSMSSMM
S S S
S S S
M M M
MMSSMSSMM
code-golf
string
ascii-art
decision-problem
Buah Esolanging
sumber
sumber
Jawaban:
Pyke,
3431 byteCoba di sini!
sumber
Retina ,
6867 byteHitungan byte mengasumsikan penyandian ISO 8859-1.
Cobalah online!
sumber
Grime ,
3938 byteTerima kasih kepada Zgarb karena telah menghemat 1 byte.
Cobalah online!
Saya tidak yakin apakah ada cara yang lebih sederhana untuk menegakkan rasio aspek kuadrat dari masing-masing komponen jendela daripada menggunakan rekursif nonterminal, tetapi ini tampaknya bekerja dengan cukup baik.
Penjelasan
Yang terbaik adalah membaca program dari bawah ke atas.
Ini hanya mendefinisikan nonterminal (yang dapat Anda anggap sebagai subrutin yang cocok dengan persegi panjang)
W
yang cocok dengan salah satuM
atauS
(ada yang tersirat]
di akhir baris).Ini mendefinisikan non-terminal
B
yang cocok dengan sekitar seperempat dari output, yaitu satu panel jendela dengan batas kiri dan atas. Sesuatu seperti ini:Untuk memastikan bahwa panel jendela ini berbentuk persegi, kami mendefinisikan
B
secara rekursif. Entah itu karakter jendelaW
, atauB/W\ * W/\ /*
yang menambahkan satu lapisan ke kanan dan ke bawah. Untuk melihat bagaimana hal ini dilakukan, mari kita hapus beberapa gula sintaksis:Ini sama, karena konkatasi horizontal dapat ditulis salah satu
AB
atauA B
, tetapi yang terakhir memiliki prioritas lebih rendah daripada konkatasi vertikal/
sedangkan untuk yang sebelumnya memiliki yang lebih tinggi. BegituB/W[ ]*
jugaB
dengan karakter jendela dan deretan spasi di bawah. Dan kemudian kita menambahkan secara horizontalW/[ ]/*
yang merupakan karakter jendela dengan kolom spasi.Akhirnya, kami mengumpulkan nonterminal ini ke dalam bentuk jendela terakhir:
Itu empat panel jendela
B
diikuti oleh deretan karakter jendela dan kolom karakter jendela. Perhatikan bahwa kami tidak membuat pernyataan eksplisit bahwa keempat panel jendela berukuran sama, tetapi jika tidak, tidak mungkin untuk menggabungkannya menjadi persegi panjang.Akhirnya
e`
pada awalnya hanyalah sebuah konfigurasi yang memberitahu Grime untuk memeriksa bahwa seluruh input dapat dicocokkan dengan pola ini (dan itu mencetak0
atau1
sesuai).sumber
JavaScript (ES6),
115113 byteMengambil input sebagai array array karakter (tambahkan 5 byte untuk array string) dan mengembalikan
1
atau0
. Setelah memverifikasi bahwa ketinggiannya ganjil, setiap baris diperiksa untuk memastikan lariknya berbentuk bujur sangkar, dan setiap karakter diverifikasi menjadi salah satu karakter yang kami harapkan di posisi tertentu. Sunting: Disimpan 2 byte berkat @PatrickRoberts.sumber
(...).includes(c)
ke~(...).search(c)
untuk menyimpan 1 byte(...?/ /:/[MS]/).test(c)
untuk menghemat 2 byte, bukan hanya 1.Perl,
124123119959384Script Perl berikut membaca satu kandidat MS Window dari input standar. Itu kemudian keluar dengan status keluar nol jika kandidat adalah MS Window dan dengan status keluar non-nol jika tidak.
Ia bekerja dengan menghasilkan dua ekspresi reguler, satu untuk garis atas, tengah dan bawah dan satu untuk setiap baris lainnya, dan memeriksa input terhadapnya.
Terima kasih, @Dada. Dan lagi.
sumber
@a=<>;$s=$"x(($.-3)/2);$m="[MS]";map{$a[$_]!~($_%($./2)?"$m$s$m$s$m":"$m${m}{$.}")&&die}0..--$.
$.
pada akhirnya untuk menghindari menggunakan dua kali$.-1
(terutama sejak pertama kali itu($.-1)/2
jadi diperlukan beberapa tanda kurung tambahan), jadi$m
dalam$m${m}{$.}
bukan kesalahan. Juga, saya baru sadar sekarang, tetapi regex harus dikelilingi dengan^...$
(jadi karakter tambahan di akhir atau awal membuat mereka gagal), atau lebih pendek: gunakanne
bukan!~
.ne
bukan!~
(saya tidak harus menulis pesan ketika saya sudah bangun hanya 15 menit!). Jadi Anda harus menggunakan^...$
di kedua regex, saya khawatir.Mathematica, 166 byte
Fungsi tanpa nama mengambil daftar daftar karakter sebagai input dan pengembalian
True
atauFalse
. Ini versi yang kurang golf:Baris pertama mendefinisikan fungsi
t
, yang memisahkan daftar panjangd
menjadi dua bagian, yang pertama adalah entri pertama, tengah, dan terakhir dari daftar, dan yang kedua adalah sisanya. Baris kedua memeriksa apakah input adalah array persegi di tempat pertama. Baris keempat menggunakant
dua kali, sekali pada input itu sendiri dan sekali pada semua * string dalam input, untuk memisahkan karakter yang seharusnya"M"
atau"S"
dari karakter yang seharusnya spasi; kemudian baris kelima dan ketujuh memeriksa apakah mereka benar-benar seharusnya.sumber
JavaScript (ES6),
108106 byteInput: array string / Output:
0
atau1
Uji kasus
Tampilkan cuplikan kode
sumber
JavaScript (ES6),
140138141140 byteSaya tahu ini bukan hitungan byte yang menang (walaupun terima kasih kepada Patrick Roberts untuk -3, dan saya menyadari itu melemparkan positif palsu untuk 1 bukannya M / S: +3), tetapi saya melakukannya dengan cara yang sedikit berbeda, saya ' Saya baru dengan ini, dan itu menyenangkan ...
Menerima serangkaian string, satu untuk setiap baris dan mengembalikan benar atau salah. Baris baru ditambahkan untuk kejelasan (tidak termasuk dalam jumlah byte).
Alih-alih memeriksa input terhadap pola umum, saya membangun jendela 'M' dengan ukuran yang sama, mengganti S dengan M pada input, dan membandingkan keduanya.
Tidak disatukan
Uji kasus
sumber
f=
tidak perlu dimasukkan dalam jumlah byte, jadi ini sebenarnya adalah pengiriman 138 byte.z=-1+s/2|0
denganz=(s-3)/2
menyimpan 1 bytee.replace(/S/g,'M')==...
dengane.split`S`.join`M`==...
untuk menyimpan byte lainz=-1+s/2|0
ada untuk mengembalikan bilangan bulat positif untuk s == 1 dan bahkan s, yaitu fungsi mengembalikan false tanpa Array () menabraknya. Kalau tidak, logika yang diperlukan membuatnya lebih lama. Tip luar biasa untuk split / gabung, terima kasihs=1
kasusnya, karena regex saya yang tidak valid hanya diam-diam gagal.JavaScript (ES6),
10910710610599 byteSunting : Whoa, Arnauld menyelamatkan saya 6 byte dengan mengubah
s.split`\n`.length
kes.search`\n`
! Terima kasih!Ini mengambil string multiline tunggal dan membangun
RegExp
validasi berbasis menggunakan panjang string input. Pengembaliantrue
ataufalse
. Mengasumsikan jendela validmemilikitidak memiliki baris baru trailing.Demo
sumber
r=s.search('\n')
bukansplit / length
?s=>!s.split`S`.join`M`.search([...])
dapat dihapus, tanpa menyebabkan kesalahan sintaksis.RegExp