Pendahuluan :
Pernah menggunakan Dropbox dengan beberapa orang lain dan Anda berdua memodifikasi file yang sama? Pernah memiliki aplikasi multi-pengguna dengan database relasional, dan dua orang memodifikasi (atau lebih buruk, satu menghapus dan yang lainnya memodifikasi) objek yang sama? Baiklah, mari kita simulasikan itu dengan tantangan ini (semacam).
Demi tantangan ini, kami hanya memiliki dua pengguna dan satu atau dua file yang relevan. Kedua pengguna secara umum memiliki hak untuk CRUD (Buat, Baca, Perbarui, dan Hapus) semua file.
Tantangan:
Memasukkan:
Kami akan memiliki beberapa input (format input fleksibel, dan format wajar apa pun diizinkan):
1) Mode penguncian (on / off) : Sedikit perbedaan antara penguncian konkurensi optimis dan pesimistis .
Kedua pengguna diizinkan untuk CRUD (Buat, Baca, Perbarui, dan Hapus) semuanya, tetapi terkadang kesalahan atau masalah dapat terjadi. Tergantung pada mode penguncian masalah ketika dimatikan, bisa menjadi kesalahan saat dihidupkan. Ini dijelaskan di bawah di bagian Output .
2 & 3) Dua tindakan pengguna . Tindakan ini selalu terdiri dari dua hal: Apa yang dilakukan pengguna (Buat, Baca, Perbarui, atau Hapus) dan untuk file mana.
Keluaran:
Kami akan memiliki tiga kemungkinan keluaran:
- Valid : Kedua tindakan oleh kedua pengguna dapat dilakukan secara bersamaan tanpa ada masalah yang terjadi.
- Kesalahan : Kedua tindakan oleh kedua pengguna tidak dapat dilakukan secara bersamaan dan menyebabkan kesalahan untuk salah satu pengguna (pengguna mana yang tidak relevan untuk tantangan ini). Ini dapat terjadi ketika:
- satu pengguna membaca atau memperbarui file, yang dihapus oleh pengguna lain;
- kedua pengguna Perbarui file yang sama dengan mode penguncian diaktifkan;
- seorang pengguna Membuat file, yang pengguna lain Baca / Perbarui / Hapus (ini berarti file sudah ada, sehingga tidak dapat Dibuat);
- kedua pengguna Buat file yang sama.
- Masalah : Kedua tindakan oleh kedua pengguna dapat dilakukan secara bersamaan, tetapi dapat menyebabkan masalah yang tidak terduga. Ini dapat terjadi ketika:
- kedua pengguna Perbarui file saat mode penguncian dimatikan;
- satu pengguna Memperbarui file, yang dibaca pengguna lain;
- kedua pengguna Hapus file yang sama (praktis ini akan menyebabkan kesalahan bagi pengguna kedua, tetapi karena masih akan dihapus seperti yang diinginkan pengguna, itu akan menjadi masalah alih-alih kesalahan demi tantangan ini)
Aturan Tantangan:
- Semua input dan output fleksibel, dan setiap orang harus menyatakan yang mana yang mereka gunakan dalam jawaban mereka!
Input contoh:0
/1
untuk mode penguncian &31
(aksi ketiga: Perbarui; file: 1) &21
(aksi kedua: Baca; file: 1);true
/false
untuk mode penguncian &['C','A']
(aksi: Buat; file: A) &['D','B']
(aksi: Hapus; file: B); dll
Contoh output:null
/true
/false
(null = berlaku; benar = kesalahan; palsu = masalah);-1
/0
/1
(-1 = kesalahan; 0 = masalah; 1 = valid); dll. Tiga kemungkinan keluaran harus unik dan berbeda untuk tiga tipe keluaran. - Apa yang disebut file-file itu tidak relevan, yang juga bisa dilihat dengan input-contoh di atas. Jadi jangan ragu untuk menggunakan semua jenis nama file dalam jawaban Anda yang terdiri dari satu huruf atau digit (ASCII). Mereka harus konsisten di semua kasus uji Anda, jadi Anda tidak dapat menggunakan
A
/B
dalam satu kasus uji dan1
/2
dalam yang lain. - Keempat tindakan untuk CRUD juga harus memiliki nilai yang unik dan konsisten. Jadi Anda tidak dapat menggunakan
'D'
/'C'
dalam satu test case, dan kemudian4
/1
dalam test case lain. - Anda dapat mengasumsikan bahwa file yang dipilih oleh pengguna selalu ada ketika mereka ingin membaca, memperbarui, atau menghapusnya.
Aturan umum:
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jangan biarkan bahasa kode-golf mencegah Anda dari memposting jawaban dengan bahasa yang bukan kode. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'. - Aturan standar berlaku untuk jawaban Anda dengan aturan I / O default , sehingga Anda diizinkan untuk menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
- Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.
Semua kasus uji yang memungkinkan (di mana tindakan dapat dalam urutan input † ):
† : Anda harus mendukung semua (hingga empat) variasi kasus uji di bawah ini. Jadi jika sebuah test case menyatakan action1: Create file A; action2: Update file B
, test case itu juga harus memiliki hasil yang sama untuk action1: Create file B; action2: Update file A
; action1: Update file B; action2: Create file A
; dan action1: Update file A; action2: Create file B
.
Valid use-cases:
locking mode: either; action1: Create file A; action2: Create file B
locking mode: either; action1: Create file A; action2: Read file B
locking mode: either; action1: Create file A; action2: Update file B
locking mode: either; action1: Create file A; action2: Delete file B
locking mode: either; action1: Read file A; action2: Read file A
locking mode: either; action1: Read file A; action2: Read file B
locking mode: either; action1: Read file A; action2: Update file B
locking mode: either; action1: Read file A; action2: Delete file B
locking mode: either; action1: Update file A; action2: Update file B
locking mode: either; action1: Update file A; action2: Delete file B
locking mode: either; action1: Delete file A; action2: Delete file B
Error use-cases:
locking mode: either; action1: Create file A; action2: Create file A
locking mode: either; action1: Create file A; action2: Read file A
locking mode: either; action1: Create file A; action2: Update file A
locking mode: either; action1: Create file A; action2: Delete file A
locking mode: either; action1: Read file A; action2: Delete file A
locking mode: on; action1: Update file A; action2: Update file A
locking mode: either; action1: Update file A; action2: Delete file A
Problem use-cases:
locking mode: either; action1: Read file A; action2: Update file A
locking mode: off; action1: Update file A; action2: Update file A
locking mode: either; action1: Delete file A; action2: Delete file A
B/B
kasus dalam penghitungan saya , karena saya menganggapnya sama A/A
. Dari situlah perbedaan itu berasal. Tapi saya kira pemikiran itu tidak benar jika Anda memiliki nilai spesifik untuk file-file tersebut ..