CRUD Multi-pengguna: Valid, Masalah, atau Kesalahan?

13

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:

  1. Valid : Kedua tindakan oleh kedua pengguna dapat dilakukan secara bersamaan tanpa ada masalah yang terjadi.
  2. 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.
  3. 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/ 1untuk mode penguncian & 31(aksi ketiga: Perbarui; file: 1) & 21(aksi kedua: Baca; file: 1); true/ falseuntuk 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/ Bdalam satu kasus uji dan 1/ 2dalam 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 kemudian 4/ 1dalam 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 , 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
Kevin Cruijssen
sumber
2
Saya merasa akan ada solusi 1 byte jika saya dapat memunculkan metode input / output yang tepat (mungkin semacam penyembunyian bit)
Expired Data
2
@ExpiredData Mengubah beberapa bagian dari output yang mungkin, bahwa mereka harus konsisten, tetapi tidak harus unik. Dan juga bahwa inputnya harus konsisten.
Kevin Cruijssen
1
@Arnauld Ah, saya mengecualikan semua B/Bkasus 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 ..
Kevin Cruijssen

Jawaban:

8

JavaScript (ES6), 36 byte

Tanpa tabel pencarian

(m,a,f,A,F)=>f-F?2:a^A?a*A&8:a&4?m:a

Cobalah online!

I / O

  • m08
  • aA0248
  • fF
  • 028

Bagaimana?

2

Jika file-file itu identik, kita perlu kembali:

  • 2
  • 8
  • m
  • 0

4×4

a ^ AaA? ? a * A & 8 : a & 4update? ? m:a

CRUD0248C00000R20280U408m0D80008


JavaScript (ES6),  46 45  40 byte

Dengan tabel pencarian

(m,a,f,A,F)=>f-F?0:[m,1,1,0][a*2+A*9&23]

Cobalah online!

I / O

  • 1
  • 0123
  • File: bilangan bulat apa saja
  • 01
Arnauld
sumber
4

Retina 0.8.2 , 53 byte

^(.)(?!\1).+|..RR.
V
..DD.
P
..UUL
E
.+[CD].+
E
..+
P

Cobalah online! Tautan termasuk test suite. Mengambil input sebagai string 5 karakter, dua karakter yang mewakili nama file, kemudian dua karakter dari CRUD, lalu Latau U(terkunci / tidak terkunci), dan mengeluarkan salah satu dari VPE(valid / masalah / kesalahan). Penjelasan:

^(.)(?!\1).+|..RR.
V

Nama file yang berbeda selalu valid, seperti halnya dua kali dibaca. Mengganggu, ini adalah satu-satunya tes yang memaksa saya untuk menggunakan header. (Dibutuhkan byte tambahan untuk membuat header tidak perlu.)

..DD.
P

Dua penghapusan selalu menjadi masalah.

..UUL
E

Dua pembaruan yang dikunci adalah kesalahan.

.+[CD].+
E

Yang lain membuat atau menghapus adalah kesalahan.

..+
P

Yang lainnya adalah masalah.

Neil
sumber
3

Oktaf , 96 byte

@(a,b,c)[a(1)!=b(1)|a(2)+b(2)==20,mod((m=a+b+c)(2),10010)<1|mod(m(2),1020000)<1|mod(m(2),200)<1]

Cobalah online!

Jelas bisa lebih pendek, tetapi saya tidak punya waktu sekarang untuk melakukan itu

File 1 = 0
File 2 = 1
Read = 10
Delete = 100
Create = 1000 
Update = 10000
Lock on = 100000
Lock off = 1000000

Valid Values: 
[1 0] 

Problem Values: 
[0 1]


Invalid Values: 
[0 0]

Input sebagai = [file, tindakan], b = [file2, action2], c = kunci

Data Kedaluwarsa
sumber