Вступ :
Ви коли-небудь використовували Dropbox з іншими людьми, і ви обидва змінили один і той же файл? У вас коли-небудь було багатокористувацького додатку з реляційною базою даних, і двоє людей модифікували (або ще гірше, один видаляв, а інший модифікував) той самий об’єкт? Що ж, давайте моделюємо це з цим викликом (свого роду).
Задля цього виклику у нас є лише два користувачі та один або два відповідних файли. Обидва користувачі мають загальні права користування CRUD (Створення, читання, оновлення та видалення) всіх файлів.
Виклик:
Вхід:
У нас буде кілька входів (формат введення гнучкий, і будь-який розумний формат дозволений):
1) Режим блокування (увімкнення / вимкнення) : якась різниця між оптимістичним і песимістичним блокуванням одночасності .
Обом користувачам дозволено CRUD (Створювати, читати, оновлювати та видаляти) все, але іноді можуть виникати помилки чи проблеми. Залежно від режиму блокування, проблема при відключенні може бути помилкою при включенні. Це пояснено нижче в розділі Вихідні дані .
2 та 3) Дві дії користувача . Ці дії завжди складаються з двох моментів: що робить користувач (Створення, читання, оновлення чи видалення) та для якого файлу.
Вихід:
У нас буде три можливі результати:
- Дійсно : обидві дії обох користувачів можна виконати одночасно, без виникнення проблем.
- Помилка : обидві дії обох користувачів не можуть бути виконані одночасно і спричиняють помилку для одного з користувачів (який користувач не має значення для цього виклику). Це може статися, коли:
- один користувач читає або оновлює файл, який інший користувач видаляє;
- обоє користувачів Оновіть один і той же файл із увімкненим режимом блокування;
- користувач створює файл, який інший користувач читає / оновлює / видаляє (це означає, що файл вже існує, тому його неможливо створити);
- обидва користувачі створюють один і той же файл.
- Проблема : обидві дії обох користувачів можна виконати одночасно, але це може викликати несподівані проблеми. Це може статися, коли:
- обоє користувачів Оновлення файлу, коли режим блокування вимкнено;
- один користувач оновлює файл, який читає інший користувач;
- обидва користувачі видаляють один і той же файл (практично це спричинить помилку для другого користувача, але оскільки він все одно буде видалений так, як хоче користувача, це буде проблема замість помилки заради цієї проблеми)
Правила виклику:
- Усі вхідні та вихідні дані є гнучкими, і кожен повинен зазначити, який саме з них використовував у своїй відповіді!
Приклади входів:0/1для режиму блокування &31(третя дія: оновлення; файл: 1) &21(друга дія: читання; файл: 1);true/falseдля режиму блокування &['C','A'](дія: створення; файл: A) &['D','B'](дія: Видалити; файл: B); і т.д.
Приклад виходів:null/true/false(null = дійсний; true = помилка; false = проблема);-1/0/1(-1 = помилка; 0 = проблема; 1 = дійсна); і т. д. Три можливі виходи повинні бути унікальними та різними для трьох типів виходу. - Те, що називаються файлами, не має значення, що також можна побачити з прикладами введення вище. Тому сміливо використовуйте будь-який тип імені файлу у своїх відповідях, що складається з однієї (ASCII) букви або цифри. Однак вони повинні бути послідовними у всіх ваших тестових випадках, тому ви не можете використовувати
A/Bв одному тестовому випадку та1/2в іншому. - Чотири дії для CRUD повинні бути унікальними і послідовними цінностями. Таким чином, ви не можете використовувати
'D'/'C'в одному тестовому випадку, а потім4/1в іншому тестовому випадку. - Ви можете припустити, що вибраний користувачем файл завжди існує, коли він хоче його прочитати, оновити чи видалити.
Загальні правила:
- Це код-гольф , тому найкоротша відповідь у байтах виграє.
Не дозволяйте мовам з кодовим гольфом відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування. - Для вашої відповіді застосовуються стандартні правила з правилами вводу / виводу за замовчуванням , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу повернення. Твій дзвінок.
- Лазівки за замовчуванням заборонені.
- Якщо можливо, додайте посилання з тестом для вашого коду (тобто TIO ).
- Також настійно рекомендується додавати пояснення до своєї відповіді.
Усі можливі тестові випадки (коли дії можуть бути або в порядку введення † ):
† : Ви повинні підтримувати всі (до чотирьох) варіантів тестових випадків нижче. Отже, якщо в тестовому випадку вказано action1: Create file A; action2: Update file B, що цей тестовий випадок також повинен мати однакові результати action1: Create file B; action2: Update file A; action1: Update file B; action2: Create file 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
B/Bвипадки підрахунку , оскільки вважав їх подібними A/A. Ось звідки походить різниця. Але я здогадуюсь, що мислення неправильне, якщо у вас є конкретне значення для файлів ..