Temukan luas wilayah sel satuan yang diberi perimeter loop sebagai urutan putaran 90 derajat.
Misalnya, ambil wilayah tiga sel
XX
X
loop perimeter yang kita gambar
L<S<L
v ^
S R>L
v ^
L>L
Setiap belokan ditandai sebagai kiri (L), lurus (S), atau kanan (R). Mulai dari R, belokannya RLLSLSLL
. Jadi, diberi input RLLSLSLL
, kita harus mengeluarkan 3 untuk area tersebut.
Urutan input dijamin untuk melacak lingkaran yang menyertakan satu wilayah di sebelah kirinya.
- Jalur berakhir kembali pada titik awal, menghadap ke arah awal, membentuk lingkaran.
- Loop tidak bersilangan atau menyentuh dirinya sendiri.
- Loop berputar berlawanan arah jarum jam di sekitar suatu wilayah.
I / O
Anda dapat mengambil input sebagai daftar atau rangkaian karakter LSR
, atau sebagai angka -1, 0, 1
untuk kiri, lurus, kanan. Output adalah bilangan bulat positif. Mengapung tidak masalah.
Uji kasus
Input diberikan dalam kedua format diikuti oleh output masing-masing.
RLLSLSLL
LLLL
SLLSLL
LSRRSLLSSLSSLSSL
SSSSSLSSSSSLSSSSSLSSSSSL
[1, -1, -1, 0, -1, 0, -1, -1]
[-1, -1, -1, -1]
[0, -1, -1, 0, -1, -1]
[-1, 0, 1, 1, 0, -1, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]
[0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1]
3
1
2
7
36
JavaScript (ES6),
5250 byteDisimpan 2 byte berkat @Neil
Mengharapkan format input kedua.
Cobalah online!
Bagaimana?
Deskripsi ini berlaku untuk versi sebelumnya : x dan y sejak itu telah terbalik.
Ini didasarkan pada rumus yang telah disebutkan oleh @ngn : A = Σ (x i - x i + 1 ) y i , yang juga dapat ditulis sebagai Σdx i y i di mana dx i bernilai -1, 0 atau 1.
Kita mulai dengan r = y = 0 .
Kami terus melacak dari arah arus di sebuah :
Itu diperbarui dengan
a = a + k & 3
, di mana k adalah elemen saat ini dari array input.Karena suatu awalnya berisi array input, a + k adalah dipaksa untuk NaN pada iterasi pertama dan kemudian ke 0 ketika bitwise DAN diterapkan. Ini berarti bahwa perubahan arah pertama sebenarnya diabaikan dan kami selalu mulai menuju ke Timur. Tidak masalah karena area tetap sama, tidak peduli orientasi bentuk akhir.
Kemudian, kami memperbarui y dengan
y += (2 - a) % 2
.Akhirnya, kita menghitung -dx dengan
~-a % 2
dan mengurangi y * -dx dari r , yang - pada akhir proses - adalah hasil akhir kita.sumber
a=>a.map(k=>r+=(2-(a=a+k&3))%2*(y+=~-a%2),r=y=0)|r
menghemat 2 byte.Python 2 , 64 byte
Cobalah online!
Menghitung ΔxΔy menggunakan bilangan kompleks.
sumber
Haskell ,
717069 bytePenjelasan: Teorema Green memberikan rumus untuk area: A = ½ € (x k + 1 + x k ) (y k + 1 -y k ), yang disederhanakan menjadi A = ½ € Δx = 0 2x k Δy + ½ € Δy = 0 ( xk + 1 + x k ) * 0 = ∑xΔy saat belokan 90 derajat di sepanjang sumbu. Kami memiliki pseudocode berikut untuk fungsi turn-globbing rekursif yang melacak posisi dan arah x:
di mana arah baru, ΔA dan Δx dapat dilihat dari tabel berikut. Kita dapat melihat periodisitas sinusoidal dengan panjang empat di ΔA dan Δx di sepanjang sumbu diagonal
dir+turn
, yang diimplementasikan menggunakansin
alih-alih aritmatika modular.Cobalah online!
sumber
Bahasa Wolfram (Mathematica) ,
3630 byteJika Anda memiliki versi Mathematica (~ v10) yang lebih lama, Anda harus
Most@
di depanAnglePath
untuk menghindari menutup poligon. (Terima kasih kepada @ user202729 untuk tipsnya).asli: Coba online!
diperbarui: Coba online!
sumber
#.5Pi
sepertinya berhasil.Most
juga.Jelly ,
1511 byteTerima kasih kepada @xnor karena menunjukkan langkah yang tidak berguna, menghemat 2 byte
Terima kasih kepada @dylnan karena telah menyimpan byte lain
Mengharapkan format input kedua. Mengembalikan float.
Cobalah online! atau jalankan semua test case
Berkomentar
sumber
+\ı*Ḟ_\×ƊĊS
menghemat satu bytePython 2 , 62 byte
Cobalah online!
Mirip dengan solusi Lynn , tetapi menggunakan beberapa aritmatika kompleks untuk mengekstrak komponen yang tepat dari bilangan kompleks dalam sekali jalan.
sumber
Pyth , 25 byte
Menggunakan
-1, 0, 1
format input.Coba di sini!
sumber
Pyth , 14 byte
Suite uji
Ini menyatakan area sebagai jumlah dari
-1/2 * g(sum(l))
semua daftar yang berdekatanl
atas input, di manag
pengindeksan modular menjadi[0,1,0,-1]
. Kode diimplementasikang
sebagaig(x)=imag(1j**x)
. Mungkin ada metode yang lebih pendek dengan pengindeksan modular langsung, menggunakansin
, atau fungsi aritmatika aktifx%4
.sumber