Многопользовательский 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-байтовое решение, если я смогу просто найти правильные методы ввода / вывода (может быть, какая-то битовая маскировка)
Expired Data

2
@ExpiredData Изменено несколько частей возможных выходных данных, чтобы они были согласованными, но не обязательно уникальными. А также, что входные данные должны быть последовательными.
Кевин Круйссен

1
@Arnauld Ах, я исключил все B/Bслучаи из моего подсчета , так как считал их похожими A/A. Вот откуда разница. Но я думаю, что думать неправильно, если у вас есть определенное значение для файлов ..
Кевин Круйссен

Ответы:


8

JavaScript (ES6), 36 байт

Без справочной таблицы

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

Попробуйте онлайн!

I / O

  • м08
  • aA0248
  • еF
  • 028

Как?

2

Если файлы идентичны, нам нужно вернуть:

  • 2
  • 8 и одно чтение
  • м (либо проблема, либо ошибка), если у нас есть две операции обновления
  • 0 (ошибка) для всего остального

4×4

^ AaA? ? * A & 8 : а & 4Обновить? ? м:a

СрUD0248С00000р20280U408м0D80008


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.