CRUD dla wielu użytkowników: ważny, problem lub błąd?

13

Wprowadzenie :

Kiedyś korzystałeś z Dropbox z kilkoma innymi osobami i oboje zmodyfikowaliście ten sam plik? Czy kiedykolwiek miałeś aplikację dla wielu użytkowników z relacyjną bazą danych, a dwie osoby modyfikowały (lub gorzej, jedna usuwała, a druga modyfikowała) ten sam obiekt? Cóż, zasymulujmy to z tym wyzwaniem (w pewnym sensie).

Ze względu na to wyzwanie mamy tylko dwóch użytkowników i jeden lub dwa odpowiednie pliki. Obaj użytkownicy mają ogólnie uprawnienia do CRUD (tworzenie, czytanie, aktualizowanie i usuwanie) wszystkich plików.

Wyzwanie:

Wejście:

Będziemy mieć kilka danych wejściowych (format wejściowy jest elastyczny i dozwolony jest dowolny rozsądny format):

1) Tryb blokowania (włączanie / wyłączanie) : Niby różnica między optymistycznym a pesymistycznym blokowaniem współbieżności .
Obaj użytkownicy mogą CRUD (tworzyć, czytać, aktualizować i usuwać) wszystko, ale czasami mogą wystąpić błędy lub problemy. W zależności od trybu blokowania problem po wyłączeniu może być błędem po włączeniu. Wyjaśniono to poniżej w części Wyjście .

2 i 3) Dwie akcje użytkownika . Te działania zawsze składają się z dwóch rzeczy: Co robi użytkownik (Utwórz, Odczytaj, Aktualizuj lub Usuń) i dla którego pliku.

Wynik:

Będziemy mieć trzy możliwe wyniki:

  1. Ważne : Oba działania obu użytkowników mogą być wykonywane jednocześnie bez żadnych problemów.
  2. Błąd : Obie akcje obu użytkowników nie mogą być wykonywane jednocześnie i powodują błąd jednego z użytkowników (który użytkownik nie ma znaczenia dla tego wyzwania). Może się to zdarzyć, gdy:
    • jeden użytkownik czyta lub aktualizuje plik, który drugi użytkownik usuwa;
    • obaj użytkownicy Aktualizują ten sam plik z włączonym trybem blokowania;
    • użytkownik Tworzy plik, który drugi użytkownik czyta / aktualizuje / usuwa (oznacza to, że plik już istnieje, więc nie można go utworzyć);
    • obaj użytkownicy Utwórz ten sam plik.
  3. Problem : Oba działania obu użytkowników mogą być wykonywane jednocześnie, ale mogą powodować nieoczekiwane problemy. Może się to zdarzyć, gdy:
    • obaj użytkownicy Aktualizują plik, gdy tryb blokowania jest wyłączony;
    • jeden użytkownik aktualizuje plik, który czyta drugi użytkownik;
    • obaj użytkownicy Usuń ten sam plik (praktycznie spowoduje to błąd dla drugiego użytkownika, ale ponieważ nadal będzie usuwany tak, jak chce użytkownik, będzie to problem zamiast błędu ze względu na to wyzwanie)

Zasady konkursu:

  • Wszystkie dane wejściowe i wyjściowe są elastyczne i każdy powinien określić, którego użył w swojej odpowiedzi!
    Przykładowe dane wejściowe: 0/ 1dla trybu blokowania & 31(trzecia akcja: aktualizacja; plik: 1) & 21(druga akcja: odczyt; plik: 1); true/ falsedla trybu blokowania & ['C','A'](akcja: Utwórz; plik: A) & ['D','B'](akcja: Usuń; plik: B); itp.
    Przykładowe dane wyjściowe: null/ true/ false(null = valid; true = error; false = problem); -1/ 0/ 1(-1 = błąd; 0 = problem; 1 = prawidłowy); itd. Jednak trzy możliwe wyniki muszą być unikalne i odrębne dla trzech typów wyników.
  • To, co nazywane są plikami, jest nieistotne, co można również zobaczyć w powyższych przykładach wejściowych. Dlatego w swoich odpowiedziach możesz użyć dowolnego rodzaju nazwy pliku składającej się z jednej litery lub cyfry (ASCII). Muszą być jednak spójne we wszystkich twoich przypadkach testowych, więc nie możesz użyć A/ Bw jednym przypadku testowym i 1/ 2w innym.
  • Cztery działania dla CRUD muszą być również unikatowymi i spójnymi wartościami. Dlatego nie można użyć 'D'/ 'C'w jednym przypadku testowym, a następnie 4/ 1w innym przypadku testowym.
  • Możesz założyć, że plik wybrany przez użytkownika zawsze istnieje, gdy chce go odczytać, zaktualizować lub usunąć.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Wszystkie możliwe przypadki testowe (gdzie akcje mogą być w dowolnej kolejności ):

: Powinieneś obsługiwać wszystkie (maksymalnie cztery) warianty przypadków testowych poniżej. Więc jeśli przypadek testowy stwierdza action1: Create file A; action2: Update file B, ten przypadek testowy powinien również przechowywać te same wyniki action1: Create file B; action2: Update file A; action1: Update file B; action2: Create file A; a 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
źródło
2
Wydaje mi się, że będzie rozwiązanie 1-bajtowe, jeśli tylko uda mi się wymyślić odpowiednie metody wejścia / wyjścia (być może jakieś maskowanie bitów)
Data
2
@ExpiredData Zmieniono kilka części możliwych wyników, które muszą być spójne, ale niekoniecznie unikalne. A także, że dane wejściowe muszą być spójne.
Kevin Cruijssen
1
@Arnauld Ah, wykluczyłem wszystkie B/Bprzypadki w moim liczeniu , ponieważ uznałem je za podobne do A/A. Stąd bierze się różnica. Ale myślę, że myślenie jest niepoprawne, jeśli masz określoną wartość dla plików.
Kevin Cruijssen

Odpowiedzi:

8

JavaScript (ES6), 36 bajtów

Bez tabeli przeglądowej

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

Wypróbuj online!

I / O

  • m08
  • zaZA02)48
  • fafa
  • 02)8

W jaki sposób?

2)

Jeśli pliki są identyczne, musimy zwrócić:

  • 2)
  • 8
  • m
  • 0

4×4

a ^ AzaZA? ? a * A i 8 : a i 4aktualizacja? ? m:za

doRUre02)48do00000R2)02)80U408m0re80008


JavaScript (ES6),  46 45  40 bajtów

Z tabelą przeglądową

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

Wypróbuj online!

I / O

  • 1
  • 012)3)
  • Pliki: dowolne liczby całkowite
  • 01
Arnauld
źródło
4

Retina 0.8.2 , 53 bajty

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

Wypróbuj online! Link zawiera pakiet testowy. Pobiera dane wejściowe jako ciąg 5 znaków, dwa znaki reprezentujące nazwy plików, następnie dwa znaki od CRUD, a następnie Llub U(zablokowany / odblokowany) i zwraca jeden z VPE(poprawny / problem / błąd). Wyjaśnienie:

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

Różne nazwy plików są zawsze poprawne, podobnie jak dwa odczyty. Irytujące jest to jedyny test, który zmusza mnie do użycia nagłówka. (Kosztowanie dodatkowego bajtu spowodowałoby, że nagłówek stałby się niepotrzebny).

..DD.
P

Dwa usunięcia zawsze stanowią problem.

..UUL
E

Dwie zablokowane aktualizacje to błąd.

.+[CD].+
E

Wszelkie inne operacje tworzenia lub usuwania są błędem.

..+
P

Cała reszta to problem.

Neil
źródło
3

Oktawa , 96 bajtów

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

Wypróbuj online!

Zdecydowanie może być krótszy, ale nie mam teraz na to czasu

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]

Wprowadź jako = [plik, akcja], b = [plik2, akcja2], c = blokada

Wygasły dane
źródło