pengantar
Saya ingin membangun tangga. Untuk ini, saya telah memungut dari tempat barang rongsokan dua papan panjang dengan lubang di dalamnya, dan saya ingin menempatkan langkah-langkah ke dalam lubang ini. Namun, lubang tidak ditempatkan secara merata, sehingga langkah-langkahnya akan sedikit miring, dan saya merasa sulit untuk memperkirakan jumlah batang yang saya butuhkan untuk mereka. Tugas Anda adalah melakukan perhitungan untuk saya.
Memasukkan
Input Anda adalah dua vektor bit, diberikan sebagai array bilangan bulat, yang mewakili dua papan. A 0
mewakili segmen satu aud ( unit jarak sewenang-wenang ) tanpa lubang, dan 1
mewakili segmen dari satu aud dengan lubang tunggal. Array mungkin memiliki panjang yang berbeda dan mengandung jumlah 1
s yang berbeda , tetapi array tersebut tidak akan kosong.
Saya akan membangun tangga saya sebagai berikut. Pertama, saya menempatkan kedua papan tepat satu audit terpisah, dan sejajarkan ujung kiri mereka. Untuk setiap indeks i
, saya mengukur jarak antara i
lubang ke-1 papan pertama dengan i
lubang ke-2 untuk papan kedua, memotong sepotong batang, dan memasangnya di antara dua lubang. Saya berhenti begitu saya kehabisan lubang di salah satu papan.
Keluaran
Output Anda adalah jumlah total batang yang saya perlukan untuk langkah-langkahnya, diukur dalam audit. Outputnya harus benar setidaknya enam digit signifikan.
Contoh
Pertimbangkan input [0,1,1,0,1,1,1,1,0,0]
dan [1,0,0,1,1,1,0,0,1]
. Tangga yang dihasilkan terlihat seperti ini:
Panjang total batang di tangga ini adalah 7.06449510224598
aud.
Aturan
Anda dapat menulis fungsi atau program lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Uji Kasus
[0] [0] -> 0.0
[0] [1,0] -> 0.0
[1,0,0] [1,1,1,1,1] -> 1.0
[0,1,0,1] [1,0,0,1] -> 2.414213562373095
[0,1,1,0,1,1,1,1,0,0] [1,0,0,1,1,1,0,0,1] -> 7.06449510224598
[1,1,1,1,1] [0,0,1,1,0,1,0,0,1] -> 12.733433128760744
[0,0,0,1,0,1,1,0,0,0,1,1,1,0,0,1,0,1,1,0,0,0,1,0] [0,0,1,1,0,1,1,1,0,0,0,0,0,1,1,0,1,1,0,0,0,1] -> 20.38177416534678
Jawaban:
J, 20 byte
Ia menggunakan trik di jawaban MickyT di R .
(<0 1)|:
memberikan diagonal dari sebuah matriks. Untuk penjelasan bagian lain, lihat jawaban FUZxxl .sumber
J, 22 karakter
Tidak terinspirasi oleh jawaban randomra. Bagian
I.
itu sama karena itu adalah cara langsung yang jelas untuk menemukan lubang.I. y
- semua indeksy
diulang sesering item yang sesuai dariy
. Kebetulan, jikay
adalah vektor dari boolean,I. y
berisi indeks di manay
adalah1
. Misalnya,I. 1 0 0 1 1 1 0 0 1
hasil0 3 4 5 8
.x u&v y
- sama seperti(v x) u (v y)
. Diterapkan sebagaix u&I. y
, kita dapatkan(I. x) u (I. y)
. Mari kita lanjutkan dengan input yang diubah.x <.&# y
- lebih kecil dari panjangx
dany
.x -/@,: y
- perbedaan itemx
dany
. Jika satu vektor lebih panjang, itu diisi dengan nol.x $ y
-y
dibentuk kembali ke bentuk yang ditentukan olehx
. Secara khusus, jikax
skalar,x
elemen diambil dariy
. Dalam penggunaan ini,x (<.&# $ -/@,:) y
pastikan lubang trailing diabaikan.4 o. y
- fungsi%: 1 + *: y
, yaitu, sqrt (1 + y ²). Secara kebetulan, fungsi ini memetakan dari jarak lubang ke panjang batang.+/ y
- jumlah elemeny
.sumber
Python, 85
Ini ternyata mirip dengan solusi Mac . Konversikan daftar 0 dan 1 ke daftar indeks satu-urutan, dan kemudian menjumlahkan jarak antara elemen masing-masing.
sumber
J,
3228 byteKata kerja
I.
mengembalikan posisi1
s dalam string biner yang sangat membantu.Untuk solusi J yang lebih baik periksa jawaban FUZxxl .
sumber
R, 67
Gunakan bagian luar untuk melakukan perbedaan pada lubang yang diindeks. Diag mengembalikan perbedaan yang diperlukan. Kemudian jumlah jarak yang dihitung
Tes dijalankan di R Fiddle. Saya telah membungkusnya dalam cetakan untuk menunjukkan pengembalian sesuai dengan spesifikasi.
sumber
a==1
bisaa>0
atau!!a
.Haskell,
7773 bytePenggunaan:
[0,1,0,1] # [1,0,0,1]
output mana2.414213562373095
Cara kerjanya: fungsi
r
mengembalikan daftar posisi lubang papan, misalnyar [0,1,0,1]
->[2,4]
.#
ritsleting dua dari daftar tersebut dan mengubahnya menjadi daftar jarak antara lubang yang sesuai dan akhirnya menjumlahkannya.sumber
CJam,
3633 bytePendekatan yang sangat naif ... mengharapkan input sebagai array gaya CJam pada STDIN
Berikut ini adalah test harness untuk semua input contoh. Hasil di bidang input digunakan sebelum kode aktual dipanggil. Anda dapat menghapusnya jika Anda tidak mempercayai saya. ;)
Penjelasan
sumber
Python, 86
Solusi rekursif tingkat rendah dan naif tanpa pencarian daftar.
Daftar input adalah
a
danb
. Jika salah satu kosong, kembali0
.Kalau tidak, biarkan
x
dany
menjadi elemen pertama mereka (kode tidak benar-benar menetapkan ini karena Anda tidak dapat melakukan tugas dalamlambda
, tetapi itu akan membuat menjelaskan lebih mudah). Jika keduanya 1, yaitu produk mereka 1, maka mereka berkontribusi jarak batang. Kami melacak jarak dalam bilangan kompleksi
, sehingga jarak adalah nilai absolut. Sebenarnya, kami menghitungnya apa pun, lalu mengalikannya denganx*y
.Kemudian, kita muncul kembali. Idenya adalah untuk menggeser kedua daftar satu langkah, kecuali satu daftar dimulai dengan 0 dan yang lainnya dengan satu, dalam hal ini kita hanya menggeser daftar 0. Dengan begitu, 1 selalu dikonsumsi berpasangan. Kami dapat memeriksa kondisi ini dengan
x<y
dany<x
, tetapi lebih pendek untuk memanfaatkan perbandingan daftar sebagaia[:1]<=b
. Akhirnya, kami menyesuaikan perpindahan kompleks antara elemen saat ini denganx-y
.sumber
a>[]<b
kea>0<b
. Ini bekerja karena keduanya[]
dan0
palsu, jadi mereka setara.a:
?([] > []) != ([] > 0)
dan dalam python3 itu adalah kesalahan (tipe tidak dapat dipesan).a:
adalah bagian dari slice[b[:1]<=a:]
.Python,
105102100 byteCukup mendasar, cukup konversi daftar input ke daftar indeks lubang, lalu hitung jarak antara setiap pasangan indeks tersebut.
Kasus cobaan:
Kredit ke @FryAmTheEggman untuk beberapa saran penghematan byte. Ternyata ini bisa di-golf lebih lanjut, seperti yang ditunjukkan dalam jawaban xnor .
sumber
enumerate(l)
dan0.5
(yang bisa saja .5).l=lambda*a:sum(((a-b)**2+1)**.5for a,b in zip(*map(i,a)))
Pyth, 30 byte
Cobalah online dengan input
[0,1,1,0,1,1,1,1,0,0], [1,0,0,1,1,1,0,0,1]
.Penjelasan:
Saya mengkonversi daftar menjadi daftar indeks
[2, 3, 5, 6, 7, 8]
dan[1, 4, 5, 6, 9]
dan ritsleting bersama-sama[(2,1), (3,4), (5,5), (6,6), (7,9)]
. Lalu saya kurangi nilainya, kuadratkan, tambahkan 1 dan jumlahkan semua akar kuadrat.Rasa malu yang
sum
tidak berfungsi untuk daftar kosong.sumber
Python,
116115 byteIni adalah solusi rekursif.
Itu menjadi sangat menjengkelkan ketika saya menemukan bahwa
index()
hanya melempar kesalahan ketika tidak ada nilai ditemukan, tetapi saya membuatnya bekerja. Sayangnya, saya tidak bisa menggunakan lambda. Itu juga mengganggu saya yanglist.remove()
tidak mengembalikan daftar, tetapi sebaliknya kembaliNone
.Jalankan online di sini: http://repl.it/c5L/2
sumber
Klip 3 ,
55 4738Untuk daftar dengan lubang yang lebih sedikit, program akan memutarnya, dan menghubungkan setiap lubang dengan lubang yang sesuai dari daftar lainnya. Ukurannya dihitung dan dijumlahkan.
Penjelasan
Jika kami sangat liberal tentang format input, kami dapat mengurangi ini menjadi 36 byte dengan menghapus masing-masing
k
. Ini membutuhkan input untuk menjadi string karakter kontrol\0
dan karakter\1
.sumber
ECMAScript 6, 86 byte
Ini awalnya dimulai dengan mengurangi (saya ingin melihat apakah itu bisa dilakukan dalam satu loop sebagai lawan dari jawaban @ edc65).
Tetapi menggunakan @ edc65 untuk
map
dan&&t
mengembalikan nilai, saya dapat mempersingkatnya sedikit.sumber
reduce
lebih masuk akal secara semantik, tetapi selain itu sebenarnya agak canggung untuk digunakan. Tentu saja, sejak kapan pegolf kode khawatir tentang semantik.Jawa, 151
Ini hanya berjalan
a
mencari, lalu berjalanb
ketika menemukan satu. Jikafloat
akurasi dapat diterima saya bisa menghemat beberapa byte, tetapi saya pergidouble
untuk mencocokkan hasil tes.Dengan spasi putih:
sumber
JavaScript (ES6) 108
Titik utama adalah fungsi f yang memetakan array input 0..1 dalam array posisi hole. Kemudian array dipindai menghitung panjang batang total menggunakan teorema pythagoras. The
|0
dekat akhir diperlukan untuk NaN mengkonversi yang dapat terjadi ketika pengemudi array (yang pertama) lebih panjang daripada yang kedua.Uji di Firefox / konsol FireBug
sumber
Oktaf,
605942sumber
Perl 98
Dapat dibaca:
Pengujian:
sumber
APL,
3528 byteMenggunakan algoritma yang mirip dengan solusi J, tetapi APL memiliki lebih sedikit builtin.
Input contoh:
sumber