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:
- Ważne : Oba działania obu użytkowników mogą być wykonywane jednocześnie bez żadnych problemów.
- 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.
- 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
/1
dla trybu blokowania &31
(trzecia akcja: aktualizacja; plik: 1) &21
(druga akcja: odczyt; plik: 1);true
/false
dla 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
/B
w jednym przypadku testowym i1
/2
w 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ępnie4
/1
w 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 golf golfowy , 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
źródło
B/B
przypadki w moim liczeniu , ponieważ uznałem je za podobne doA/A
. Stąd bierze się różnica. Ale myślę, że myślenie jest niepoprawne, jeśli masz określoną wartość dla plików.Odpowiedzi:
JavaScript (ES6), 36 bajtów
Bez tabeli przeglądowej
Wypróbuj online!
I / O
W jaki sposób?
Jeśli pliki są identyczne, musimy zwrócić:
JavaScript (ES6),
46 4540 bajtówZ tabelą przeglądową
Wypróbuj online!
I / O
źródło
Retina 0.8.2 , 53 bajty
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ępnieL
lubU
(zablokowany / odblokowany) i zwraca jeden zVPE
(poprawny / problem / błąd). Wyjaśnienie: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).
Dwa usunięcia zawsze stanowią problem.
Dwie zablokowane aktualizacje to błąd.
Wszelkie inne operacje tworzenia lub usuwania są błędem.
Cała reszta to problem.
źródło
Oktawa , 96 bajtów
Wypróbuj online!
Zdecydowanie może być krótszy, ale nie mam teraz na to czasu
Wprowadź jako = [plik, akcja], b = [plik2, akcja2], c = blokada
źródło