Latar Belakang
Etiket Kamar Mandi, ketika berkaitan dengan urinal yang tersedia, menyatakan bahwa urinoir berikutnya yang harus diisi adalah urin yang meminimalkan ketidaknyamanan total. Persamaan ketidaknyamanan total diberikan oleh set persamaan berikut:
dist (x, y) = jarak linear antara orang x dan orang y dalam ketidaknyamanan Unit Urinal (x) = jumlah (1 / (dist (x, y) * dist (x, y))) untuk semua orang y tidak termasuk orang x total_Discomfort = jumlah (ketidaknyamanan (x)) untuk semua x
Makalah yang lebih mendalam berurusan dengan masalah yang serupa (tidak persis sama) dapat ditemukan di sini: (Terima kasih kepada @Lembik karena telah mengingatkan saya pada whitepaper yang menakjubkan ini!)
Input output
Diberikan input dari urinal yang kosong dan penuh, output set urinal yang dihasilkan dengan penambahan satu orang. Jika ada dasi untuk posisi urinal harus mengisi kiri ke kanan. Output harus dalam format yang sama dengan input.
- Jika diberi case dengan urinal penuh, kembalikan input.
- Input akan selalu memiliki setidaknya satu urinoir yang ditentukan.
Uji Kasus
INPUT -> OUTPUT 1000001 -> 1001001 101010101 -> 111010101 100 -> 101 00000 -> 10.000 1111111 -> 1111111 0100 -> 0101 101000 -> 101001
Aturan
Ini adalah kode-golf , jadi kode terpendek dalam byte menang. Lubang loop standar dilarang.
0100
dan101000
dalam kasus uji (beberapa pendekatan berbasis regex bekerja pada kasus uji yang sebenarnya tetapi tidak akan bekerja pada kasus-kasus yang masih harus ditangani)Jawaban:
Jelly ,
1312 byteCobalah online! atau Verifikasi semua kasus uji.
Penjelasan
sumber
MATL ,
191817 byteCobalah online! Atau verifikasi semua kasus uji (kode yang sedikit dimodifikasi).
Penjelasan
Cukuplah untuk menghitung jarak dari setiap posisi baru potensial ke posisi yang sudah ditempati. Jarak yang tersisa tidak tergantung pada posisi baru potensial, dan karenanya merupakan istilah yang konstan, yang dapat diabaikan.
Mari kita ambil input
[1 0 0 0 0 0 1]
sebagai contoh.sumber
JavaScript (ES6), 89 byte
Output dengan memodifikasi array input.
sumber
R,
837667 byteBaru menyadari bahwa saya dapat menyimpan beberapa byte dengan tidak repot memeriksa apakah kandidat urinal kosong. Ural yang tidak kosong akan selalu mengembalikan
Inf
nilai ketidaknyamanan, sehingga tidak dimasukkan dalam perhitungan. Juga, hanya menggunakan pengindeksan langsung daripadareplace
, jadi lebih pendek tapi kurang elegan.Penjelasan
Kami membaca status saat ini dari stdin dan menyebutnya
x
. Kami berasumsi bahwa input adalah urutan1
s dan0
s dipisahkan oleh spasi atau baris baru. Untuk keperluan penjelasan, misalkan kita masukan1 0 0 0 0 0 1
.Kami mengganti nilai
x
pada indeks tertentu dengan 1. Segala sesuatu di antara[ ]
ini mencari tahu apa indeks terbaik.Karena urinal yang ada tidak berubah, kita tidak perlu mempertimbangkan jarak di antara mereka. Kita hanya perlu mempertimbangkan jarak antara urinal yang ditempati dan kemungkinan yang baru. Jadi kami menentukan indeks urinal yang diduduki. Kami menggunakan
which
, fungsi untuk mengembalikan indeks vektor logisTRUE
. Semua angka dalam R, ketika dipaksa untuk mengetiklogical
, adalahTRUE
jika bukan nol danFALSE
jika nol. Cukup melakukanwhich(x)
akan menghasilkan kesalahan ketikargument to 'which' is not logical
,, sepertix
vektor numerik. Karena itu kami harus memaksanya masuk akal.!
adalah fungsi negasi logis R, yang secara otomatis memaksa ke logis. Menerapkannya dua kali!!x
,, menghasilkan vektorTRUE
danFALSE
menunjukkan urinal mana yang ditempati. (Alternatif paksaan setara byte untuk logika melibatkan operator logika&
dan|
dan builtinT
danF
, misalnyaF|x
atauT&x
seterusnya.!!x
Terlihat lebih seram sehingga kita akan menggunakannya.)Ini dipasangkan dengan
seq(x)
, yang mengembalikan urutan bilangan bulat dari1
panjangx
, yaitu semua lokasi urinoir (dan dengan demikian semua lokasi yang memungkinkan untuk dipertimbangkan).Sekarang kita memiliki indeks urinal kita yang diduduki:
1 7
dan urinal kita yang kosong1 2 3 4 5 6 7
. Kami lulus`-`
, fungsi pengurangan, keouter
fungsi untuk mendapatkan "pengurangan luar", yang merupakan matriks jarak berikut antara semua urinal dan urinal yang ditempati:Kami mengangkat ini ke
-2
kekuatan th. (Bagi mereka yang sedikit tersesat, dalam OP, "ketidaknyamanan" didefinisikan sebagai1 / (distance(x, y) * distance(x, y))
, yang menyederhanakan1/d(x,y)^2
, yaitud(x,y)^-2
.)Ambil jumlah setiap baris dalam matriks.
Dapatkan indeks nilai terkecil, yaitu urinal optimal. Dalam kasus beberapa nilai terkecil, yang pertama (yaitu paling kiri) dikembalikan.
Dan voila, kami memiliki indeks urinal optimal. Kami mengganti nilai pada indeks ini
x
dengan1
. Dalam hal1111
sebagai input, tidak masalah yang mana yang kami ganti, kami masih akan memiliki output yang valid.Kembalikan input yang dimodifikasi.
sumber
PHP, 135 byte
Saya yakin ada cara yang jauh lebih cepat untuk melakukannya, tetapi saya memiliki kepala yang kabur dan tidak dapat memikirkannya!
Kode lama
Kode tanpa minifikasi:
sumber
Python 3
223222165 BytesOke, saya tahu ini bukan jawaban tercantik di luar sana, dan saya yakin itu bisa diturunkan sedikit, tapi saya hanya main-main dan melihat apa yang bisa saya lakukan
Berteriak ke mbomb007 untuk tips tentang ruang putih dan pembanding
Menampilkan ruang putih yang direvisi:
Asli:
Ini mengharapkan string yang diteruskan menjadi seperti 1 dan 0
"10001"
dan mengembalikan string"10101"
Edit: Diubah
1/float((j-i)**2)
menjadifloat((j-i)**-2)
sumber
!='1'
bisa<'1'
dan=='1'
bisa>'0'
. Juga, pertimbangkan tip iniPython 3,
574471347 byteSaya mungkin akan mengerjakan ini lagi, mengingat solusi Python lainnya seperti seperlima dari yang ini: [.
Nah itu jauh lebih baik sekarang karena saya telah belajar Anda dapat menggunakan spasi tunggal.
sumber
Python,
165163158147141140139 bytessumber
if"1"*len(p)==p:return p
untuk menghemat satu byte