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:
- Geçerli : Her iki kullanıcı tarafından yapılan her iki işlem de herhangi bir sorun olmadan aynı anda yapılabilir.
- 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.
- 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
/1
kilitleme modu için &31
(üçüncü eylem: Güncelleme; dosya: 1) &21
(ikinci eylem: Okuma; dosya: 1);true
/false
kilitleme 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
/B
bir test durumunda ve1
/2
bir 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'
4
1
- 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 kod golf , 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
B/B
davaları 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 ..