Saya pada posisi (0, 0) dari kota dua dimensi yang tak terbatas, yang secara sempurna dibagi menjadi blok-blok yang berpusat pada setiap titik kisi, beberapa di antaranya berisi bangunan. Sebuah bangunan pada titik tertentu (x, y) menempati seluruh kotak dengan sudut yang berlawanan pada (x-.5, y-.5) dan (x + .5, y + .5) , termasuk perbatasannya. Sebuah bangunan terlihat jika ada beberapa ruas garis dari (0, 0) ke titik di gedung yang tidak bersinggungan dengan bangunan lain.
Misalnya, saya (yang @
) dapat melihat 6 bangunan ( *
) di kota berikut:
*
*
*
*@
x**
* y
Saya tidak dapat melihat bangunan yang ditandai dengan x
, at (-1, -1) karena terhalang oleh dua yang berdekatan dengannya; atau yang ditandai dengan y
at (3, -2) karena terhalang oleh tepi bangunan (1, -1) .
Memasukkan
String multiline, atau daftar garis, secara opsional diisi dengan spasi menjadi persegi panjang. Ini hanya akan berisi:
- satu
@
(posisi saya) - Spasi
*
, yang mewakili bangunan.
Akan selalu ada setidaknya satu bangunan, dan karena itu setidaknya satu bangunan yang terlihat.
Keluaran
Jumlah bangunan yang terlihat.
Uji kasus
*@
1
* *******
@ *
7
*****
**@**
*****
4
*
**
@ **
2
* *
* *
@
4
@
*
***
1
Terima kasih kepada @Geobits untuk judulnya .
Jawaban:
Unity + C #, 589 bytes
Ini mungkin bahasa terburuk untuk melakukan kode golf (baca: lebih buruk dari Java), tetapi Unity hadir dengan banyak fitur yang bermanfaat untuk tantangan ini.
EDIT: melewatkan beberapa spasi, mengembalikan panjang daftar, bukan melawan
Golf:
Tidak Disatukan:
Saya menggunakan 3600 raycast karena gagal test case ke-5 dengan lebih rendah. Mungkin masih gagal untuk kasus uji yang lebih besar / lebih presisi.
Sayangnya, baik webgl dan desktop sepertinya rusak, jadi semua yang saya miliki adalah kode sumber untuk diuji dengan di github .
sumber
read: worse than Java
Ini lebih pendek 383 byte dari solusi Java!total+=1
dengantotal++
? Saya pikir cara lain untuk menyimpan beberapa karakter adalah dengan membuat kubus bangunan dan mengatur posisinya dalam satu pernyataan. Anda tampaknya tidak menggunakan kembalicube
variabel di mana pun.GameObject b=GameObject.CreatePrimitive(PrimitiveType.Cube);b.transform.position=new Vector3(x,y);
. Saya tidak tahu apakah itu mungkin di C # tetapi di Jawa orang bisa menulisGameObject.CreatePrimitive(PrimitiveType.Cube).transform.position=new Vector3(x,y);
.Java 8 lambda,
15061002972942 karakterSaya ingin mengalahkan tantangan ini, karena sangat menarik. Hasilnya
(tidak terlalu golf)dapat dilihat di sini:Tentu saja ini juga ada dalam versi yang tidak di-serigala:
Jadi itu terlihat sangat sulit tetapi itu jauh lebih mudah daripada yang diperkirakan. Ide pertama saya adalah menggunakan beberapa algoritma persimpangan untuk memeriksa apakah garis dari posisi saya ke bangunan dapat dibuat tanpa persimpangan. Untuk melakukan ini, saya memutuskan untuk menggunakan algoritma Cohen-Sutherland dan menggambar garis ke keempat sudut bangunan. Ini bekerja cukup baik untuk tes pertama, tetapi yang terakhir gagal. Saya segera mengetahui, bahwa itu adalah kasus di mana Anda tidak dapat melihat sudut tetapi bagian dari tepi. Jadi saya berpikir tentang semacam casting ray seperti @Blue yang melakukannya. Saya menyingkirkan tantangan itu, karena saya tidak mendapatkan kemajuan. Lalu aku melihat jawaban Blue dan ide sederhana berikut muncul di benakku: Setiap bangunan menghalangi sudut di mana tidak ada hal lain yang bisa dilihat. Saya hanya perlu melacak apa yang bisa dilihat dan apa yang sudah disembunyikan oleh bangunan lain. Itu dia!
Algoritma bekerja sebagai berikut: Ini menentukan bangunan dengan jarak terkecil ke orang. Kemudian kita membayangkan empat garis yang ditarik dari orang tersebut ke sudut-sudut bangunan. Dua di antaranya memiliki nilai ekstrem: Sudut minimum dan maksimum di mana bangunan dapat dilihat. Kami mengambilnya sebagai jangkauan dan membandingkannya dengan bangunan lain yang kami tahu bahwa mereka dapat dilihat (tidak ada di awal). Rentang mungkin tumpang tindih, termasuk satu sama lain atau tidak menyentuh sama sekali. Saya membandingkan rentang dan mendapatkan beberapa rentang baru bangunan yang tidak disembunyikan oleh bangunan yang dapat dilihat. Jika ada sesuatu yang tersisa setelah membandingkannya dengan bangunan yang terlihat, bangunan tersebut juga dapat dilihat. Kami menambahkan rentang sudut yang tersisa ke daftar rentang untuk dibandingkan dan mulai dengan bangunan berikutnya dengan jarak yang lebih jauh berikutnya.
Terkadang rentang mungkin tumpang tindih dengan cara saya berakhir dengan kisaran 0 derajat. Rentang ini akan difilter agar tidak salah menambahkan bangunan yang bahkan tidak dapat dilihat.
Saya harap seseorang mengerti penjelasan ini :)
Saya tahu kode ini tidak terlalu banyak golf, saya akan segera melakukannya.Itu adalah tugas yang sangat menantang. Anda pikir Anda menemukan solusi yang berfungsi tetapi Anda masih jauh. Saya pikir solusi ini cukup bagus. Itu tidak terlalu cepat tetapi setidaknya itu berfungsi;) Terima kasih untuk teka-teki itu!
Memperbarui
Saya menemukan waktu untuk golf semuanya menjadi satu fungsi, yang dengan demikian dapat diubah menjadi lambda. Semua fungsi hanya dipanggil sekali dan dengan demikian dapat dimasukkan ke dalam satu metode. Saya beralih dari daftar ke set karena ini menghemat beberapa karakter tambahan. Deklarasi telah disatukan. Perbandingan telah disatukan dan karakter digantikan oleh nilai ascii yang ada. Membandingkan rentang dapat dinyatakan sebagai banyak terner. Beberapa trik di sana-sini untuk mencegah ekspresi panjang seperti Double.NEGATIVE_INFINITY dilakukan. Jika memungkinkan, inline assigment dilakukan. Untuk menghemat lebih banyak, saya beralih dari membandingkan sudut dalam derajat ke membandingkan radian. Seluruh perubahan menyelamatkan lebih dari 500 karakter, saya berharap mendapatkan semuanya di bawah 1000;)
Saya menghapus generik jika memungkinkan dan mempersingkat perbandingan pengembalian dengan membuat array elemen satu dan memeriksa nilainya. Saya juga mengganti Double.NEGATIVE_INFINITY dengan PI2 dan -PI2 karena ini adalah batas atas dan bawah sudut. Sekarang akhirnya panjangnya kurang dari 1000 karakter!
Saya menggabungkan loop untuk menemukan lokasi orang dan iterator bangunan untuk menyimpan beberapa karakter. Sayangnya ini mengharuskan kita untuk memindahkan pengembalian dari loop dan masih menggunakan jeda tetapi kali ini tanpa label. Saya bergabung
max
dandistanceSquared
danmin
dannewDistanceSquared
karena mereka tidak diharuskan pada saat yang sama. Saya berubahInteger.MAX_VALUE
menjadi2e31-1
. Saya juga membuat konstantahalf = 0.5
yang digunakan untuk menghitung sudut-sudut bangunan. Ini lebih pendek dalam versi golf. Secara keseluruhan kami menyimpan 30 karakter lainnya!sumber