Diberikan string N, S, E dan W, menghasilkan arah (sudut searah jarum jam dari Utara dalam derajat), dikoreksi ke 5 tempat desimal.
Dalam notasi kompas tradisional , string hanya terdiri dari 2 karakter ini (seperti NNW atau ESE). Di sini Anda juga harus menerima string yang berisi semua 4 (seperti WNNNSE) . Menggunakan hanya 2 simbol memungkinkan manusia untuk memahami makna secara intuitif. Membiarkan 4 simbol membuatnya mengerikan untuk dibaca, tetapi memungkinkan cara yang lebih singkat untuk menggambarkan bantalan ke akurasi yang diberikan.
(Seperti yang ditunjukkan dalam komentar oleh user2357112 , ternyata Anda dapat membuktikan bahwa untuk setiap bantalan yang diberikan, string 4 simbol akan sama persis panjangnya dengan string 2 simbol, jadi saya telah mendasarkan tantangan ini pada asumsi yang salah. Semoga ketiadaan tujuan praktis ini tidak mengurangi kesenangan Anda terhadap tantangan ...)
Metode yang tepat dijelaskan di bawah ini, dan setara dengan notasi tradisional (itu memperluas itu daripada mengubahnya).
Memasukkan
- Input adalah string tunggal yang hanya berisi karakter
NESW
. - Input dapat berupa urutan karakter jika Anda mau, asalkan ini tidak termasuk preprocessing. Misalnya, mengambil daftar bersarang
[N, [E, [S, [W]]]]
untuk membantu urutan pemrosesan tidak diizinkan. - Mengambil karakter yang berbeda tidak diizinkan. Anda tidak boleh mengambil string
1234
sebagai gantinyaNESW
.
Keluaran
- Output harus berupa angka desimal atau representasi string dari satu (bukan rasional / fraksi).
- Nol trailing tidak perlu ditampilkan. Jika bantalan adalah
9.00000
, maka output9
juga dihitung sebagai benar ke 5 tempat desimal. - Outputnya dalam kisaran [0, 360). Yaitu, termasuk 0 tetapi tidak termasuk 360.
- Kebenaran diperiksa dengan membulatkan output ke 5 tempat desimal. Jika bantalan 0,000005, ini akan menjadi 0,00001. Output 0,00001 dan 0,000005 keduanya benar.
- Output dalam notasi ilmiah untuk beberapa input dapat diterima. Misalnya,
1e-5
bukannya0.00001
.
Konversi
- Single karakter kompas poin
N
,E
,S
, danW
sesuai dengan 0, 90, 180, dan 270 derajat masing-masing. - Melekatkan salah satu dari ini ke string menghasilkan bantalan yang membagi dua bantalan karakter tunggal dan bantalan string asli.
- Yang paling dekat dari dua bantalan yang membagi dua mungkin dipilih, sehingga NE mewakili 45 derajat, bukan 225 derajat.
- Ini tidak ambigu kecuali di mana sudut yang akan dibagi dua adalah 180 derajat. Oleh karena itu
NS
,SN
,WE
, danEW
sesuai dengan bantalan terdefinisi, dan masukan tidak akan pernah berakhir di salah satu ini. Namun mereka dapat muncul di tempat lain di string input, karena ini tidak menyebabkan ambiguitas. - Jika dua karakter terakhir identik, karakter terakhir akan redundan karena pembagian dua akan menghasilkan bantalan yang sama. Karena ini tidak menambah apa pun pada notasi, kode Anda tidak perlu menangani ini. Oleh karena itu
NN
,EE
,SS
, danWW
sesuai dengan bantalan terdefinisi, dan masukan tidak akan pernah berakhir di salah satu ini. Namun mereka dapat muncul di tempat lain di string input.
Contohnya
N: 0
E: 90
S: 180
SE: halfway between S and E: 135
NSE: halfway between N and SE: 67.5
NNSE: halfway between N and NSE: 33.75
NNNSE: halfway between N and NNSE: 16.875
NNNNSE: halfway between N and NNNSE: 8.4375
Uji kasus
Pengajuan hanya valid jika memberikan hasil yang benar untuk semua kasus uji. Perhatikan bahwa test case mendorong hingga batas yang dapat ditangani dengan presisi ganda. Untuk bahasa-bahasa yang default ke presisi tunggal, Anda mungkin perlu menghabiskan byte untuk menentukan presisi ganda untuk mendapatkan output yang benar.
Output kasus uji ditampilkan dibulatkan ke 5 tempat desimal, dan juga ke presisi sewenang-wenang. Keduanya adalah output yang valid.
WNE 337.5 337.5
WEN 337.5 337.5
WEWEWEWEWEWEWEWEWEWEWEN 330.00001 330.000007152557373046875
NESWNESWNESWNESWNESWNESWNESW 90 89.99999932944774627685546875
NNNNNNNNNNNNNNNNNNNNNNNE 0.00001 0.0000107288360595703125
NNNNNNNNNNNNNNNNNNNNNNNW 359.99999 359.9999892711639404296875
SNNNNNNNNNNNNNNNNNNNNNNNE 90.00001 90.00000536441802978515625
SNNNNNNNNNNNNNNNNNNNNNNNW 269.99999 269.99999463558197021484375
Mencetak gol
Ini adalah kode-golf . Skor adalah panjang kode sumber dalam byte, dan yang terpendek menang.
Sifat suka menonjolkan keilmuan
Saya membuat kesalahan dengan berpikir bahwa "Utara oleh Barat Laut" adalah arah kompas yang valid. Kesalahan yang membahagiakan, karena mengarah pada ide tantangan, tetapi saya kemudian menemukan dari halaman Wikipedia :
"Judul film Alfred Hitchcock 1959, North by Northwest, sebenarnya bukan titik arah pada kompas 32-angin, tetapi Film berisi referensi ke Northwest Airlines. "
Ternyata juga metode yang digunakan untuk tantangan ini hanya konsisten dengan titik kompas tradisional hingga dan termasuk kompas 16 titik. Kompas 32-angin yang dijelaskan pada halaman itu sedikit berbeda dan saya dengan mudah mengabaikan keberadaannya untuk tantangan ini.
Akhirnya, bagi siapa pun yang berpikir saya harus menggunakan "Tenggara" daripada "Tenggara",.
WNNNSE
<= apa yang akan menjadi output untuk entri contoh ini di awal posting Anda? kedengarannya tidak valid untuk saya, tetapi sulit untuk mengatakannya.WNNNSE
hasilnya323.4375
. Lihat bagian contoh untuk langkah-langkah yang akan berlaku dengan cara yang sama untuk kasus ini.f(N,N,N,S,E)
apa?Jawaban:
JavaScript (ES6),
8480787472 byteMenyimpan satu byte berkat @Titus, 1 terima kasih ke @Neil
Butuh beberapa saat, tapi saya pikir saya akhirnya menyempurnakan formula ...
Cuplikan tes
Tampilkan cuplikan kode
Penjelasan
Mari kita mulai dengan case paling sederhana: string single-char. Hasilnya hanyalah posisinya (0-diindeks) dalam string
NESW
, dikalikan dengan 90.Untuk string dua-char, hasilnya terletak di tengah-tengah antara hasil dari char pertama dan hasil dari yang kedua. Namun, ada yang menarik: jika perbedaan absolut antara keduanya lebih besar dari 180 (misalnya
NW
atauWN
), kita harus 180 ke sudut sehingga tidak menunjuk ke arah yang berlawanan.Untuk string yang lebih panjang, hasilnya terletak di tengah-tengah antara hasil char pertama dan hasil dari sisa string. Ini dapat digeneralisasi dengan cara berikut:
NESW
kali 90.NESW
kali 45, ditambah setengah hasil dari sisa string; tambahkan ekstra 180 jika perbedaan absolut antara keduanya lebih besar dari 90.sumber
search
alih-alihindexOf
menghemat satu byte.C # 6,
226217207185 byteSunting: -10 byte dengan ide "meminjam" dari pengajuan ETHproduk
-22 byte berkat @Titus
Tidak disatukan
sumber
b=(b+360)%360;
sebagai gantinyab+=b>360?-360:b<0?360:0;
. Simpan 12 byte lagi dengan membagi semuanya dengan 90 danreturn b*90;
.b=(b+f(c)+(b-f(c)>2?4:f(c)-b>2?-4:0)+8)/2%4;
kemudian bagikan+8
ke hasil ternaryb=(b+f(c)+(b-f(c)>2?12:f(c)-b>2?4:8))/2%4;
PHP,
958886100127104101 byteN
(dan banyak lagi, karena itu memungkinkan untuk menempatkan terjemahan ke kepala loop:N
benar, tetapi mengevaluasi0
dalam perhitungan.)strtr
dengan salah satu dari juggling bit sayaIni secara resmi pertama kalinya saya menggunakan operator penggabungan nol. Jalankan dengan
-r
.PHP 7.1
Offset string negatif dalam versi PHP yang akan datang akan menghemat 12 byte:
Ganti
strlen($s=$argv[1])
dengan0
dan$s
dengan$argv[1]
.Bita gratis untuk (hampir) semua orang:
(a/2%6+2)%5
a<87?a/2&3^3:3
ataua/2&3^3*(a<87)
a&1?a&2|a/4&1:0
a/.8-1&3
sumber
Python 3,
133113 byteHanya meningkatkan jawaban @ L3viathan karena saya baru saja membuat akun ini dan karena itu belum dapat memberikan komentar.
sumber
05AB1E ,
48423732 byteDisimpan 6 byte berkat Emigna. Disimpan 5 byte berkat ide Titus untuk bekerja pada kisaran [0,4 [dan kalikan dengan 90 di akhir. Disimpan 5 byte berkat penguasaan Adnan terhadap metamorfosis xor / modulo kuno.
Jadi setiap sudut dikurangi dari kisaran [0,360 [hingga kisaran [0,4 [selama eksekusi]. Hasilnya kemudian dikalikan dengan 90 dan ditampilkan.
Cobalah online!
Sumbu potensial golf:
sumber
NNNNNNNNNNNNNNNNNNNNNNNE
danSNNNNNNNNNNNNNNNNNNNNNNNE
menguji kasus.v"NESW"yk90*})R¬U¦vXy+;DX-Ä89›180*+360%U}X
.89›
sebenarnya berarti bagian bilangan bulat lebih besar dari 89, yang setara dengan mengatakan angka lengkap lebih besar atau sama dengan 90 (yang masih berfungsi dengan baik karena tepat 90 seharusnya tidak pernah terjadi). Saat ini komentar dalam kode yang dijelaskan membuatnya terdengar seperti memeriksa lebih besar dari 89, sedangkan kode Anda melewati kasus uji sehingga jelas memeriksa dengan benar lebih besar dari 90.›
harus bersikap terhadap nilai-nilai floating point negatif. Tidak ada masalah di sini karena ini bekerja pada nilai absolut, tetapi saya lebih suka tidak membuat asumsi terlalu kuat pada operator.v"NESW"yk})
denganÇ30^5%
:)Python 3,
14614511710797949392 bytePanggil
f
dengan string.sumber
...0else
mereka lemparkan SyntaxErrors.else
dan-
juga? (bisa dalam 3.3.3)d.find
bisa, saya punya ide yang tepat semenit yang lalu; lihat jawaban yang diperbarui.C, 184 byte
Tidak disatukan
sumber
d
)?R,
172146 byteTidak disatukan
Dijelaskan
c("N","E","S","W")
0:3*90
(alih-alihc(0,90,180,270)
)z
p
ke tingkat yang setara dengan input karakter terakhirl
p
kez
Coba uji kasus pada R-fiddle (perhatikan bahwa ini adalah fungsi karena
scan
tidak bekerja pada R-fiddle)sumber
Outputs 0.00001 and 0.000005 are both correct.
Jadi Anda harus dapat menghemat beberapa byte dengan tidak membulatkannyac("N","N","E")
bukan"NNE"
? Ini setara dengan daftar python yang tidak bersarang["N","N","E"]
.Haskell,
109 105103 byteTerima kasih untuk -2 byte @xnor!
sumber
f
terlihat panjang, tapi saya kesulitan menemukan sesuatu yang lebih pendek. Yang paling dekat saya dapatkan adalahf c=90*until(\i->"NESW"!!i==c)(+1)0
(35). Saya pikir Anda bisa menggantinya'W'
dengan_
._
!Dyalog APL ,
554538 byteLarutan
Membutuhkan
⎕IO←0
, yang merupakan standar pada banyak sistem. Meminta arahan.Penjelasan
Mengatasi masalah dengan mengubah setiap huruf menjadi angka kompleks 1∠ θ ⇔ a + b · i , kemudian melakukan pengurangan jumlah dari kanan-ke-kiri (forte APL) sambil menormalisasi pada setiap langkah. Θ akhir kemudian dikonversi ke derajat dan dinormalisasi menjadi dalam [0, 360):
'NES'⍳⍞
indeks setiap huruf input dalam "NES"; N → 0, E → 1, S → 2, apa pun → 3○2÷⍨
dikonversi ke sudut dalam radian; θ = π · x ∕ 2¯12○
konversikan ke bilangan kompleks pada lingkaran unit; e i · θ(
...)/
kurangi daftar dengan ... (mis. menyisipkan fungsi antara elemen-elemen ...)+÷(|+)
... jumlah yang dinormalisasi; x n - 1 + x n ∕ | x n - 1 + x n |12○
mengkonversi ke sudut; θ÷○÷180×
dikonversi ke derajat; 1 ∕ π · 1 ∕ 180 · x360|
pembagian divisi ketika dibagi 360TryAPL online!
Anekdot
Jika input dan output adalah unit kompleks ortogonal, seluruh solusi akan menjadi hanya:
Sisa kode mem-parsing input dan memformat output.
sumber
⎕FR←1287
menggunakan floats 128 bit, tetapi TryAPL tidak mengizinkannya.Common Lisp,
347327 byteTerima kasih kepada @Titus untuk melepas beberapa
Ini mungkin bisa bermain golf lebih banyak, tetapi setidaknya itu berfungsi (saya pikir):
Pemakaian:
Fungsi
d
mengambil karakterN
,E
,W
, atauS
dan kembali tingkat yang sesuai. Fungsim
mendapat tingkat gabungan yang tepat dari dua arah yang diberikan. Berfungsif
melalui string yang disediakan, menghitung derajat yang sesuai, dan mencetaknya sebagai titik mengambang.sumber
Befunge,
183181175 byteCobalah online!
Penjelasan
Ini mengikuti algoritma yang mirip dengan banyak jawaban lainnya, hanya saja menggunakan perhitungan titik tetap yang ditiru dengan bilangan bulat karena Befunge tidak mendukung floating point.
Terima kasih kepada @Titus untuk rutin ASCII-to-int.
sumber
APL (Dyalog Classic) ,
3027 byteCobalah online!
sumber