Введение :
Вы когда-нибудь использовали 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
. Вот откуда разница. Но я думаю, что думать неправильно, если у вас есть определенное значение для файлов ..