Çok Kullanıcılı CRUD: Geçerli mi, Sorun mu, Hata mı?


13

Giriş :

Hiç Dropbox'ı başka insanlarla kullandınız ve ikiniz de aynı dosyayı değiştirdiniz mi? Hiç ilişkisel veritabanına sahip çok kullanıcılı bir uygulama vardı ve iki kişi aynı nesneyi değiştiriyordu (ya da daha kötüsü, biri siliniyor ve diğeri değiştiriyordu)? Bunu bu meydan okuma (benzet) ile simüle edelim.

Bu zorluk uğruna, sadece iki kullanıcımız ve bir ya da iki ilgili dosyamız var. Her iki kullanıcı da genel olarak tüm dosyaları CRUD (Oluşturma, Okuma, Güncelleme ve Silme) ayrıcalıklarına sahiptir .

Meydan okuma:

Giriş:

Birkaç girişimiz olacak (giriş biçimi esnektir ve makul biçimlere izin verilir):

1) Kilitleme modu (açık / kapalı) : İyimser ve kötümser eşzamanlı kilitleme arasındaki fark .
Her iki kullanıcının da her şeyi CRUD'ye (Oluşturma, Okuma, Güncelleme ve Silme) izin verilir, ancak bazen hatalar veya sorunlar oluşabilir. Kilitleme moduna bağlı olarak, kapatıldığında bir sorun, açıldığında bir hata olabilir. Bu, aşağıda Çıktı bölümünde açıklanmaktadır .

2 & 3) İki kullanıcı işlemi . Bu eylemler her zaman iki şeyden oluşur: Kullanıcının yaptığı (Oluşturma, Okuma, Güncelleme veya Silme) ve hangi dosya için.

Çıktı:

Üç olası çıktımız olacak:

  1. Geçerli : Her iki kullanıcı tarafından yapılan her iki işlem de herhangi bir sorun olmadan aynı anda yapılabilir.
  2. Hata : Her iki kullanıcının da her iki eylemi aynı anda yapılamaz ve kullanıcılardan biri için hataya neden olur (bu kullanıcı bu zorluk için önemsizdir). Bu şu durumlarda oluşabilir:
    • bir kullanıcı diğer kullanıcının sildiği bir dosyayı Okur veya Günceller;
    • her iki kullanıcı aynı dosyayı kilitleme modu açık olarak güncelleyin;
    • bir kullanıcı Diğer kullanıcının Okuduğu / Güncellediği / Sildiği (yani dosyanın zaten var olduğu, bu nedenle Oluşturulamadığı anlamına gelir) bir dosya oluşturur;
    • her iki kullanıcı Aynı dosyayı oluşturun.
  3. Sorun : Her iki kullanıcının da her iki eylemi aynı anda yapılabilir, ancak beklenmedik sorunlara neden olabilir. Bu şu durumlarda oluşabilir:
    • her iki kullanıcı Kilitleme modu kapalıyken bir dosyayı güncelleyin;
    • bir kullanıcı diğer kullanıcının okuyacağı bir dosyayı günceller;
    • her iki kullanıcı aynı dosyayı siler (pratik olarak bu ikinci kullanıcı için bir hataya neden olur, ancak yine de kullanıcı istediği gibi silineceğinden, bu sorun uğruna bir hata yerine bir sorun olacaktır)

Zorluk Kuralları:

  • Tüm girdi ve çıktılar esnektir ve herkes cevaplarında hangisini kullandığını belirtmelidir!
    Örnek girişler: 0/ 1kilitleme modu için & 31(üçüncü eylem: Güncelleme; dosya: 1) & 21(ikinci eylem: Okuma; dosya: 1); true/ falsekilitleme modu için & ['C','A'](eylem: Oluştur; dosya: A) & ['D','B'](eylem: Sil; dosya: B); vb
    Örnek çıkışları: null/ true/ false(boş = geçerli true = hata, yanlış = sorunu); -1/ 0/ 1(-1 = hata; 0 = sorun; 1 = geçerli); Ancak, olası üç çıkış, üç çıkış tipi için benzersiz ve farklı olmalıdır .
  • Dosyalara ne denir, ilgisizdir, bu da yukarıdaki girdi örnekleriyle de görülebilir. Yanıtlarınızda tek bir (ASCII) harf veya rakamdan oluşan her türlü dosya adını kullanmaktan çekinmeyin. Bununla birlikte, tüm test durumlarınızda tutarlı olmaları gerekir, bu nedenle A/ Bbir test durumunda ve 1/ 2bir başka durumda kullanamazsınız .
  • CRUD için dört eylemin de benzersiz ve tutarlı değerler olması gerekir. Böylece bir test durumunda / sonra başka bir test durumunda 'D'/ kullanamazsınız .'C'41
  • Bir kullanıcı tarafından seçilen dosyanın, Okumak, Güncellemek veya Silmek istediğinde her zaman var olduğunu varsayabilirsiniz.

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için olabildiğince kısa bir cevap bulmaya çalışın.
  • Varsayılan I / O kuralları ile cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem, uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için bir test içeren bir bağlantı ekleyin (örn. TIO ).
  • Ayrıca, cevabınız için bir açıklama eklemeniz şiddetle tavsiye edilir.

Tüm olası test senaryoları (eylemlerin giriş sırasından herhangi biri olabileceği ):

: Aşağıdaki test senaryolarının tüm (dört adede kadar) varyasyonunu desteklemelisiniz. Dolayısıyla, bir test durumu belirtilirse action1: Create file A; action2: Update file B, bu test durumu için de aynı sonuçları almalıdır action1: Create file B; action2: Update file A; action1: Update file B; action2: Create file A; ve 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

2
Sadece doğru giriş / çıkış yöntemleri (belki bir tür bit maskeleme) ile gelebilir eğer 1 bayt bir çözüm olacak gibi hissediyorum
Süresi dolmuş Veri

2
@ExpiredData Olası çıktıların birkaç parçasını değiştirerek tutarlı olmaları, ancak benzersiz olmaları gerekmez. Ayrıca girdilerin tutarlı olması gerekir.
Kevin Cruijssen

1
@Arnauld Ah, sayımımdaki tüm B/Bdavaları hariç tuttum , çünkü onları benzer gördüm A/A. Aradaki fark buradan geliyor. Ama sanırım dosyalar için belirli bir değeriniz varsa düşünme yanlıştır ..
Kevin Cruijssen

Yanıtlar:


8

JavaScript (ES6), 36 bayt

Arama tablosu olmadan

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

Çevrimiçi deneyin!

I / O

  • m08
  • birbir0248
  • fF
  • 028

Nasıl?

2

Dosyalar aynıysa, geri dönmemiz gerekir:

  • 2
  • 8 (sorun) iki silme işlemimiz veya bir güncelleme ve bir okuma
  • mİki güncelleme işlemimiz varsa (sorun veya hata)
  • 0

kullanma4x4 CRUD matrisi (tanım gereği simetriktir), yukarıdaki değerlerin hesaplanabileceğini görebiliriz:

a ^ Abirbir? ? a * A ve 8 : a & 4Güncelleme? ? m:bir

CR,UD0248C00000R,20280U408m0D80008


JavaScript (ES6),  46 45  40 bayt

Bir arama tablosu ile

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

Çevrimiçi deneyin!

I / O

  • 1
  • 0123
  • Dosyalar: herhangi bir tamsayı
  • 01

4

Retina 0.8.2 , 53 bayt

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

Çevrimiçi deneyin! Bağlantı test paketini içerir. Girdiyi 5 karakterlik bir dize olarak alır, dosya adlarını temsil eden iki karakter CRUD, sonra Lveya U(kilitli / kilidi açık) öğesinden iki karakter ve VPE(geçerli / sorun / hata) öğelerinden birini verir . Açıklama:

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

İki dosya gibi, farklı dosya adları her zaman geçerlidir. Can sıkıcı bir şekilde, bu beni bir başlık kullanmaya zorlayan tek test. (Başlığı gereksiz hale getirmek ekstra bir bayt maliyeti olurdu.)

..DD.
P

İki silme işlemi her zaman bir sorundur.

..UUL
E

İki kilitli güncelleme bir hatadır.

.+[CD].+
E

Diğer tüm oluşturma veya silme işlemleri bir hatadır.

..+
P

Diğer her şey bir sorundur.


3

Oktav , 96 bayt

@(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]

Çevrimiçi deneyin!

Kesinlikle daha kısa olabilir, ama şu anda bunu yapacak zamanım yok

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]

A = [dosya, eylem], b = [dosya2, eylem2], c = kilit olarak giriş

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.