The nomor berliku adalah jumlah bilangan bulat dari revolusi berlawanan bersih pengamat harus dilakukan untuk mengikuti jalan tertutup diberikan. Perhatikan bahwa setiap putaran searah jarum jam dihitung negatif ke arah angka belitan. Jalan itu diizinkan untuk bersinggungan sendiri.
Beberapa contoh (tanpa malu-malu diambil dari Wikipedia) diberikan di bawah ini:
Tujuan Anda adalah menghitung angka yang berliku untuk jalur yang diberikan.
Memasukkan
Pengamat dianggap asal (0,0)
.
Input adalah urutan titik yang terbatas (pasangan-seperti angka integer) dari sumber input yang diinginkan yang menggambarkan jalur linier yang bijaksana. Anda dapat meratakan ini ke dalam urutan bilangan bulat 1D jika diinginkan, dan juga dapat mengurangi input untuk mengambil semua koordinat x sebelum semua koordinat y / sebaliknya. Anda juga dapat mengambil input sebagai bilangan kompleks a+b i
. Path mungkin bersinggungan sendiri dan mungkin berisi segmen dengan panjang nol. Titik pertama adalah awal jalan dan diasumsikan terletak di suatu tempat pada sumbu x positif.
Tidak ada bagian jalan yang akan memotong titik asal. Path akan selalu ditutup (yaitu titik pertama dan yang hilang adalah sama). Kode Anda mungkin menyiratkan poin terakhir atau mengharuskannya untuk dimasukkan.
Misalnya, tergantung pada preferensi Anda, kedua input menentukan kotak yang sama:
titik akhir tersirat
1,0
1,1
-1,1
-1,-1
1,-1
titik akhir eksplisit
1,0
1,1
-1,1
-1,-1
1,-1
1,0
Keluaran
Outputnya adalah bilangan bulat tunggal untuk nomor belitan. Ini mungkin untuk sumber mana saja (nilai pengembalian, stdout, file, dll.).
Contohnya
Semua contoh memiliki titik akhir yang didefinisikan secara eksplisit dan diberikan sebagai pasangan x, y. Secara kebetulan, Anda harus dapat juga secara langsung memasukkan contoh-contoh ini ke dalam kode apa pun dengan asumsi titik akhir yang didefinisikan secara implisit dan hasilnya harus sama.
1. Tes dasar
1,0
1,1
-1,1
-1,-1
1,-1
1,0
Keluaran
1
2. Tes poin berulang
1,0
1,0
1,1
1,1
-1,1
-1,1
-1,-1
-1,-1
1,-1
1,-1
1,0
Keluaran
1
3. Tes searah jarum jam
1,0
1,-1
-1,-1
-1,1
1,1
1,0
Keluaran
-1
4. Tes di luar
1,0
1,1
2,1
1,0
Keluaran
0
5. Campuran berliku
1,0
1,1
-1,1
-1,-1
1,-1
1,0
1,-1
-1,-1
-1,1
1,1
1,0
1,1
-1,1
-1,-1
1,-1
1,0
1,1
-1,1
-1,-1
1,-1
1,0
Keluaran
2
Mencetak gol
Ini adalah kode golf; kode menang paling pendek. Celah standar berlaku. Anda dapat menggunakan fungsi bawaan apa pun asalkan tidak dirancang secara khusus untuk menghitung angka belitan.
"1-i"
atau"1-1i"
?)Jawaban:
ES6, 83 byte
Dibawa sebagai input, sebuah array pasangan poin yang ditafsirkan sebagai bilangan kompleks. Daripada mengubah setiap titik menjadi sudut, titik-titik tersebut dibagi dengan titik sebelumnya, yang kemudian dikonversi oleh Math.atan2 menjadi sudut antara -π dan π, sehingga secara otomatis menentukan ke arah mana jalannya berliku. Jumlah sudut kemudian 2π kali dari jumlah belitan.
Karena Math.atan2 tidak peduli dengan skala argumennya, saya tidak benar-benar melakukan pembagian penuh, tetapi
z / w = (z * w*) / (w * w*)
saya hanya mengalikan setiap poin dengan konjugasi kompleks dari poin sebelumnya.Sunting: Disimpan 4 byte berkat @ edc65.
sumber
reduce
hampir selalu merupakan pilihan yang buruk.a=>a.map(([x,y])=>r+=Math.atan2(y*b-x*c,y*c+x*b,b=x,c=y),b=c=r=0)&&r/Math.PI/2
menggunakan peta saja atau kurangi. Anda tetap memilih sayareduce
karena saya tidak menyadari bahwa Math.atan2 (0,0) adalah 0. (Yah, itu tergantung pada apakah salah satu dari 0s Anda sebenarnya -0.) Matematika didasarkan pada divisi kompleks, yang biasanya dihitung sebagaiz / w = z * w* / |w|²
, tapi saya tidak peduli tentang besarnya, jadi itu hanya perkalian dengan konjugat kompleks. Math.atan2 juga sedikit membingungkan menerima (y, x) argumen.MATL , 11 byte
Input adalah urutan bilangan kompleks termasuk titik akhir.
Cobalah online!
Penjelasan
Sebagian besar pekerjaan dilakukan oleh
Z/
function (unwrap
), yang membuka sudut dalam radian dengan mengubah lompatan absolut lebih besar dari atau sama dengan pi ke komplemen 2 * pi mereka.sumber
Jelly, 11 byte
Ini mengambil input sebagai daftar koordinat y dan daftar koordinat x.
Coba di sini .
sumber
Python, 111
Jawaban terpanjang sejauh ini. Motivasi saya adalah 1) belajar python dan 2) mungkin port ini ke pyth.
Input diberikan sebagai daftar bilangan kompleks.
Ideone.
Saya pikir pendekatannya mirip dengan jawaban ES6.
Ketika 2 bilangan kompleks dikalikan, argumen atau fase produk adalah jumlah dari argumen atau fase dari dua angka. Jadi ketika bilangan kompleks dibagi dengan yang lain, maka fase hasil bagi adalah perbedaan antara fase pembilang dan penyebut. Dengan demikian kita dapat menghitung sudut yang dilalui untuk setiap titik dan titik berikutnya. Jumlahkan sudut-sudut ini dan bagi dengan 2π memberikan angka berliku yang diperlukan.
sumber