Untuk sebagian besar alasan historis, bash cukup membingungkan dan sintaksis dan paradigma pemrograman - ini bisa membuatnya canggung dan terkadang membuat frustasi bermain golf. Namun bash memiliki beberapa trik di lengannya yang sering membuatnya kompetitif dengan skrip utama lainnya. bahasa. Salah satunya adalah ekspansi brace .
Ada dua jenis dasar ekspansi brace:
- Daftar kawat gigi mungkin berisi daftar string arbitrary yang dipisahkan koma (termasuk duplikat dan string kosong). Misalnya
{a,b,c,,pp,cg,pp,}
akan diperluas kea b c pp cg pp
(perhatikan spasi di sekitar string kosong). - Urutan kawat gigi mungkin berisi titik akhir urutan yang dipisahkan oleh
..
. Secara opsional, orang lain..
dapat mengikuti, diikuti oleh ukuran langkah. Titik akhir urutan dapat berupa bilangan bulat atau karakter. Urutan akan secara otomatis naik atau turun sesuai dengan titik akhir mana yang lebih besar. Sebagai contoh:{0..15}
akan diperluas ke0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{-10..-5}
akan diperluas ke-10 -9 -8 -7 -6 -5
{3..-6..2}
akan diperluas ke3 1 -1 -3 -5
{a..f}
akan diperluas kea b c d e f
{Z..P..3}
akan diperluas keZ W T Q
Di luar ini, kurung kurawal dan daftar mungkin ada dengan kurung kurawal:
{a,b,{f..k},p}
akan diperluas kea b f g h i j k p
{a,{b,c}}
akan diperluas kea b c
Kawat gigi mengembang dengan string non-spasi putih di kedua sisi. Sebagai contoh:
c{a,o,ha,}t
akan diperluas kecat cot chat ct
Ini juga berfungsi untuk beberapa kawat gigi yang disatukan:
{ab,fg}{1..3}
akan diperluas keab1 ab2 ab3 fg1 fg2 fg3
Ini bisa menjadi sangat kompleks. Sebagai contoh:
{A..C}{x,{ab,fg}{1..3},y,}
akan diperluas keAx Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
Namun, jika ada ruang kosong di antara ekspansi, maka mereka hanya memperluas sebagai ekspansi terpisah. Sebagai contoh:
{a..c} {1..5}
akan diperluas kea b c 1 2 3 4 5
Perhatikan bagaimana pesanan selalu dipertahankan.
Entri untuk tantangan ini akan memperluas ekspansi bash brace seperti dijelaskan di atas. Khususnya:
- eval by
bash
(atau cangkang lain yang melakukan ekspansi serupa) tidak diizinkan - kurung kurawal akan selalu berupa angka-ke-angka, huruf kecil ke huruf kecil atau huruf besar ke huruf besar tanpa pencampuran. Angka akan berupa bilangan bulat dalam rentang 32-bit yang ditandatangani. Jika diberikan, ukuran langkah opsional akan selalu menjadi bilangan bulat positif. (Perhatikan bahwa bash juga akan berkembang
{A..z}
, tetapi ini mungkin diabaikan untuk tantangan ini) - masing-masing item dalam kawat gigi daftar akan selalu hanya terdiri dari karakter alfanumerik huruf besar dan kecil (termasuk string kosong)
- daftar kawat gigi dapat berisi sarang sembarang dari ekspansi penjepit lainnya
- kurung kurawal dapat digabungkan beberapa kali secara acak. Ini akan dibatasi oleh ingatan bahasa Anda, jadi harapannya adalah bahwa Anda secara teoritis dapat melakukan jumlah gabungan acak tetapi jika / ketika Anda kehabisan memori itu tidak akan diperhitungkan melawan Anda.
Contoh dalam teks di atas berfungsi sebagai testcases. Ringkasnya, dengan setiap jalur input sesuai dengan jalur output yang sama, mereka adalah:
Memasukkan
{0..15}
{-10..-5}
{3..-6..2}
{a..f}
{Z..P..3}
{a,b,{f..k},p}
{a,{b,c}}
c{a,o,ha,}t
{ab,fg}{1..3}
{A..C}{x,{ab,fg}{1..3},y,}
{a..c} {1..5}
{a{0..100..10},200}r
Keluaran
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-10 -9 -8 -7 -6 -5
3 1 -1 -3 -5
a b c d e f
Z W T Q
a b f g h i j k p
a b c
cat cot chat ct
ab1 ab2 ab3 fg1 fg2 fg3
Ax Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
a b c 1 2 3 4 5
a0r a10r a20r a30r a40r a50r a60r a70r a80r a90r a100r 200r
Jawaban:
Ruby,
405403401400 byteSeorang pria bijak (Jamie Zawinski) pernah berkata, "Beberapa orang, ketika dihadapkan dengan suatu masalah, berpikir 'Saya tahu, saya akan menggunakan ekspresi reguler.' Sekarang mereka memiliki dua masalah. "
Saya rasa saya tidak menghargai kutipan itu sampai saya mencoba menyelesaikan masalah ini dengan regex rekursif. Awalnya, kasus regex tampak sederhana, sampai saya harus berurusan dengan kasus tepi yang melibatkan surat yang berdekatan dengan tanda kurung, dan kemudian saya tahu bahwa saya berada di neraka.
Bagaimanapun, jalankan online di sini dengan kasus uji
Tidak Disatukan:
sumber
Python 2.7,
752728 byteWow, ini seperti sekelompok kode golf dalam satu tantangan!
Terima kasih kepada @Neil untuk mempersingkat lambda
Penjelasan
b
: menghitung rentang sesuai dengan spesifikasi.e
: mengembalikan posisi penjepit dekat terluar pertama. Berulang-ulang.m
: membelah elemen terluar di koma. Rekursif.n
: menggabungkan array sambil memeriksa kekosongan.Saya tidak bisa mulaiand/or
bekerja.p
: Di mana sebagian besar pekerjaan dilakukan. Periksa semua case (Rentang, daftar saja, perlu digabungkan). Rekursif.o
: Apa yang harus diambil input. Memformat input / output kep
.Saya merasa saya dapat meningkat di beberapa tempat, jadi saya akan mencoba bermain golf lebih banyak. Saya juga harus memberikan penjelasan lebih rinci.
sumber
[c+d for c in a for d in b] or a or b
untuk bekerja.JavaScript (Firefox 30-57),
465427425 byteVersi ES6
f
berbobot ekstra 10 byte:Penjelasan: Mulai dengan mengubah spasi menjadi koma dan membungkus seluruh string
{}
untuk konsistensi (terima kasih kepada @Blue untuk idenya). Kemudian mencari semua{..}
konstruk dan mengembangkannya menjadi{,}
konstruk. Selanjutnya menggunakan rekursi untuk berulang kali memperluas semua{,}
konstruksi dari dalam ke luar. Akhirnya, ganti semua koma dengan spasi.sumber