Anda harus menulis program atau fungsi yang menerima string yang mewakili poligon ascii-art sebagai input dan output mengembalikan area poligon.
Input adalah string yang terdiri dari karakter _ / \ L V space
dan newline
mendefinisikan poligon sederhana (yang berarti tidak ada segmen tambahan, tidak ada sentuhan diri, dan tidak ada persimpangan diri).
Luas sel karakter tunggal adalah 2
_
membelah sel menjadi ukuran0
dan2
\
membelah sel menjadi ukuran1
dan1
/
membelah sel menjadi ukuran1
dan1
L
membelah sel menjadi ukuran0
dan2
V
membelah sel menjadi ukuran1
dan1
(Kedua sisiV
akan selalu berada di sisi yang sama dari poligon sehingga mereka diperlakukan bersama dalam daftar.)
Setiap karakter menghubungkan dua sudut sel karakternya yang Anda harapkan (misalnya kiri atas dan kanan atas jika ada V
).
Contoh dengan area 7 ( 1+2+1
di baris kedua dan 1+1+1
yang ketiga):
_
/ \
V\/
Memasukkan
- Input akan membentuk persegi panjang, yaitu akan ada jumlah karakter yang sama antara baris baru.
- Mungkin ada spasi putih tambahan di setiap sisi poligon.
- Mengejar baris baru adalah opsional.
Keluaran
- Bilangan bulat positif tunggal, bidang poligon.
Contohnya
Keluaran adalah setelah baris terakhir dari input mereka.
_
V
1
/L
\/
3
/VV\
L /
L/
14
____/\
\ /
/\/ /
\____/
32
/V\
/ \__
\ /
/\/ /V
L____/
45
Ini adalah kode-golf sehingga entri terpendek menang.
^
sengaja?Jawaban:
CJam,
48 4329 bytePembaruan : Golf banyak menggunakan matematika dan trik * 2 negara dari jawaban orlp.
Cara kerjanya (Sudah kedaluwarsa, segera diperbarui)
Kami membagi input pada baris baru dan kemudian untuk setiap bagian kami mempertahankan counter kemunculan karakter batas
L\/
. Penghitung ini% 2 akan memberi tahu kami yang mana dari dua partisi yang akan dipilih untuk semua karakter. Kemudian kita menemukan indeks masing-masing karakter dalam stringL _
.\/V
akan memberikan-1
merujuk pada elemen terakhir dalam array. Setelah mendapatkan indeks, kami menggunakan4558Zb2/
untuk membuat array[[2 0] [0 2] [0 2] [1 1]]
dan kemudian memilih yang benar dari penghitungan menggunakan penghitung.Cobalah online di sini
sumber
Pyth,
4746453630Penjelasan:
Kami memiliki dua negara, "dalam poligon", dan "keluar dari poligon". Masing-masing karakter berikut melakukan hal berikut saat membacanya dari kiri atas ke kanan bawah:
Perhatikan bahwa "tambahkan satu ke area" dan "jika dalam poligon, tambahkan dua ke area" adalah saling eksklusif.
sumber
x=
kerjanya. Apakah ini didokumentasikan di suatu tempat?+=
atau*=
atau apa pun. Dalam halx
ini digunakan sebagai xor, jadi persis sama dengan Python^=
.Retina , 293 + 15 = 308
314385byteSetiap baris masuk dalam file yang terpisah, jadi saya telah menambahkan 13 ke jumlah byte. Atau, Anda dapat meletakkan semua itu dalam satu file apa adanya dan menggunakan
-s
bendera. The<empty>
berdiri untuk file benar-benar kosong atau baris.Sayangnya, saya perlu 187 byte hanya untuk mengubah hasil dari unary ke desimal. Saya kira saya benar-benar harus menerapkan ini dalam waktu dekat .
Penjelasan
Retina adalah bahasa berbasis regex (yang saya tulis persis karena bisa melakukan hal-hal seperti ini dengan regex). Setiap pasangan file / baris menentukan tahap penggantian, dengan baris pertama menjadi pola dan baris kedua sebagai string pengganti. Pola dapat didahului oleh
`
string konfigurasi -dimited, yang mungkin berisi pengubah regex biasa, serta beberapa opsi khusus Retina. Untuk program di atas, opsi yang relevan adalah;
, yang menekan output dari tahap itu dan+
, yang menerapkan penggantian dalam satu lingkaran sampai hasilnya berhenti berubah.Gagasan solusinya adalah menghitung setiap baris secara terpisah, karena kita selalu dapat memutuskan oleh karakter yang sudah kita temui apakah kita di dalam atau di luar poligon. Ini juga berarti saya dapat menggabungkan semuanya menjadi satu baris, karena awal dan akhir baris selalu di luar poligon. Kami juga dapat mencatat bahwa
_
dan ruang benar-benar identik untuk algoritme garis, serta\
dan/
. Jadi sebagai langkah pertama saya mengganti semua baris baru dan spasi dengan_
dan semua\
dengan/
menyederhanakan beberapa kode nanti.Saya melacak keadaan dalam / luar saat ini dengan karakter
i
dano
, sementara juga menggunakani
s untuk menghitung daerah. Untuk melakukannya, saya mulai dengan menambahkan sebuaho
ke baris yang bergabung untuk menandai bahwa kita berada di luar poligon. Saya juga menambahkaniio
hingga akhir input, yang akan saya gunakan sebagai pencarian untuk menghasilkan karakter baru.Kemudian, penggantian besar pertama hanya mengganti
i
atauo
diikuti oleh salah satu dari/V_L
set karakter berikutnya, sehingga membanjiri dan menghitung seluruh hal. Tabel penggantian terlihat sebagai berikut, di mana kolom terkait dengan karakter terakhir di baris itu dan baris ke karakter berikutnya (di manaS
adalah untuk ruang dan<>
untuk string kosong). Saya telah memasukkan semua karakter input untuk menunjukkan persamaan yang telah saya manfaatkan:Perhatikan bahwa karakter terakhir kemudian selalu menunjukkan apakah setelah karakter kita berada di dalam atau di luar poligon, sementara jumlah
i
s sesuai dengan area yang perlu ditambahkan ke poligon. Sebagai contoh di sini adalah hasil dari empat iterasi pertama pada input contoh terakhir (ini dihasilkan oleh versi lama yang sebenarnya membanjiri setiap baris secara terpisah, tetapi prinsipnya masih sama):Terakhir, saya menyingkirkan semua
o
s dan garis terputus dengan menghapus semua yang cocok[^i]
, dan sisanya adalah konversi desimal ke unary yang agak membosankan.sumber
Perl,
6558 bytesumber
$/=\1;$-^=2*y,/\\L,,,$a+=y,/\\V,,||$-for<>;print$a
GNU sed, 290 +1
+1 adalah untuk menjelaskan
-r
sakelar yang diteruskan ke sed. Komentar dan spasi putih tambahan tidak dihitung dalam skor.Saya belum melihat dengan sangat rinci, tetapi saya pikir ini mungkin mirip dengan jawaban Retina Martin :
Ikhtisar
:
Catatan
sed
berorientasi garis sehingga perlu beberapa pekerjaan untuk memproses beberapa baris sekaligus. TheN
perintah ini dilakukan dengan menambahkan baris baru kemudian baris berikutnya ke ruang pola arus. Kesulitan denganN
adalah bahwa begitu sampai ke aliran input EOF, ia berhentised
sepenuhnya tanpa opsi untuk melakukan pemrosesan lebih lanjut. Untuk menyiasatinya, kami menghitung kumpulan titik dua saat ini di akhir setiap baris, tepat sebelum membaca di baris berikutnya.Keluaran:
sumber
C, 93
96 108byteSunting: Mengambil saran akun dalam komentar, mengonversikan while menjadi satu pernyataan untuk loop, dan menghapus variabel "i" sepenuhnya.
Pos asli:
Ini tampak seperti masalah yang menyenangkan dan cukup sederhana untuk akhirnya membuat saya membuat akun di sini.
Teks poligon harus dilewatkan sebagai argumen baris perintah pertama; ini harus bekerja dengan atau tanpa jumlah baris baru / spasi putih.
Ini hanya membaca dalam poligon satu karakter pada satu waktu, beralih apakah saat ini di dalam atau di luar poligon pada '/', 'L', atau '\', dan t bertambah 1 pada '/', 'V', dan '\', atau 2 jika di dalam / 0 jika di luar di 'L', '_', spasi dan baris baru.
Ini adalah pertama kalinya saya mencoba tangan saya dalam segala jenis "golf" (atau C, sejauh itu berbeda dari C ++), jadi kritik apa pun akan dihargai!
sumber
i=t=s=0;
I think C menginisialisasi semuaint
s ke 0. Juga, lihat apakah Anda dapat mengubahwhile
loop menjadifor
loop; yang sering menghemat beberapa byte....int i,t,s;for(i=t=s=0;c=v[1][i++];t+=s+(c>46^!(c%19)^s))s^=c>13^c%9>4;...
yang seharusnya menghemat 4 byte; satu {, satu} dan dua;int i,t,v;
harus diletakkan di depanmain
alih-alih di dalam kita bisa menyingkirkani=t=s=0
sama sekali menghemat 7 byte lainnya.POSIX,
245244POSIX, tidak ada ekstensi atau regexps diperpanjang. Input terbatas pada ukuran ruang penyimpanan maksimum dari mandat - POSIX setidaknya 8192; GNU mengelola lebih banyak. Versi ini mengasumsikan bahwa tidak akan ada garis kosong sebelum atau sesudah bentuk; tambahan 10 byte kode, ditunjukkan dalam ekspansi, dapat mengakomodasi bahwa jika itu merupakan persyaratan (pertanyaan awal tidak menentukan).
Diperluas dan beranotasi
sumber
C, 84 byte
Kita berpindah sisi kapan pun kita melihat
\
,/
atauL
; kami selalu menambahkan satu untuk\\
,/
atauV
, tetapi menambahkan 2 (jika di dalam) atau 0 (jika di luar) untuk ruang, baris baru,L
atau_
.Variabel
a
dani
dianggap nol pada entri - mereka harus diatur ulang jika fungsinya dipanggil lebih dari sekali.Tidak Disatukan:
Program uji:
sumber