Багатокористувацька CRUD: дійсна, проблема чи помилка?


13

Вступ :

Ви коли-небудь використовували Dropbox з іншими людьми, і ви обидва змінили один і той же файл? У вас коли-небудь було багатокористувацького додатку з реляційною базою даних, і двоє людей модифікували (або ще гірше, один видаляв, а інший модифікував) той самий об’єкт? Що ж, давайте моделюємо це з цим викликом (свого роду).

Задля цього виклику у нас є лише два користувачі та один або два відповідних файли. Обидва користувачі мають загальні права користування CRUD (Створення, читання, оновлення та видалення) всіх файлів.

Виклик:

Вхід:

У нас буде кілька входів (формат введення гнучкий, і будь-який розумний формат дозволений):

1) Режим блокування (увімкнення / вимкнення) : якась різниця між оптимістичним і песимістичним блокуванням одночасності .
Обом користувачам дозволено CRUD (Створювати, читати, оновлювати та видаляти) все, але іноді можуть виникати помилки чи проблеми. Залежно від режиму блокування, проблема при відключенні може бути помилкою при включенні. Це пояснено нижче в розділі Вихідні дані .

2 та 3) Дві дії користувача . Ці дії завжди складаються з двох моментів: що робить користувач (Створення, читання, оновлення чи видалення) та для якого файлу.

Вихід:

У нас буде три можливі результати:

  1. Дійсно : обидві дії обох користувачів можна виконати одночасно, без виникнення проблем.
  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

2
Я відчуваю, що знайдеться рішення в байті на 1 байт, якщо я просто
Термін дії закінчився

2
@ExpiredData Змінено декілька частин можливих результатів, що вони повинні бути послідовними, але не обов'язково унікальними. А також, що вхідні дані повинні бути послідовними.
Kevin Cruijssen

1
@Arnauld Ах, я виключив усі B/Bвипадки підрахунку , оскільки вважав їх подібними A/A. Ось звідки походить різниця. Але я здогадуюсь, що мислення неправильне, якщо у вас є конкретне значення для файлів ..
Kevin Cruijssen

Відповіді:


8

JavaScript (ES6), 36 байт

Без таблиці пошуку

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

Спробуйте в Інтернеті!

I / O

  • m08
  • aA0248
  • fF
  • 028

Як?

2

Якщо файли ідентичні, нам потрібно повернути:

  • 2
  • 8
  • m
  • 0

4×4

a ^ AaA? ? a * A & 8 : a & 4update? ? m:a

CRUD0248C00000R20280U408m0D80008


JavaScript (ES6),  46 45  40 байт

За допомогою таблиці пошуку

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

Спробуйте в Інтернеті!

I / O

  • 1
  • 0123
  • Файли: будь-які цілі числа
  • 01

4

Сітківка 0,8,2 , 53 байти

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

Спробуйте в Інтернеті! Посилання включає тестовий набір. Приймає введення як рядок з 5 символів, два символи, що представляють імена файлів, потім два символи з CRUD, потім Lабо U(заблоковано / розблоковано), і виводить один з VPE(дійсний / проблема / помилка). Пояснення:

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

Різні імена файлів завжди дійсні, як і два читання. Прикро, це єдиний тест, який змушує мене використовувати заголовок. (Коштує зайвий байт, щоб заголовок був непотрібним.)

..DD.
P

Два видалення - це завжди проблема.

..UUL
E

Два заблокованих оновлення - це помилка.

.+[CD].+
E

Будь-яке інше створення або видалення є помилкою.

..+
P

Все інше - проблема.


3

Октава , 96 байт

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

Спробуйте в Інтернеті!

Однозначно може бути коротше, але я зараз не маю часу на це

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 = [файл, дія], b = [файл2, дія2], c = замок

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.