多用户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(空=有效;真=错误;假=问题); -1/ 0/ 1(-1 =错误; 0 =问题; 1 =有效); 但是对于这三种输出类型,这三种可能的输出必须是唯一且不同的。
  • 文件的调用无关紧要,也可以从上面的输入示例中看到。因此,请在您的答案中随意使用由单个(ASCII)字母或数字组成的任何类型的文件名。他们必须在所有的测试案例一致然而,这样你就不能使用A/ B在一个测试用例和1/ 2在另一个。
  • CRUD的四个动作也必须是唯一且一致的值。所以你不能使用'D'/ 'C'在一个测试用例,然后4/ 1在另一个测试案例。
  • 您可以假设用户选择的文件在要读取,更新或删除时始终存在。

通用规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您使用非代码高尔夫球语言发布答案。尝试针对“任何”编程语言提出尽可能简短的答案。
  • 标准规则适用于具有默认I / O规则的答案,因此您可以使用STDIN / STDOUT,具有正确参数的函数/方法以及返回类型的完整程序。您的来电。
  • 默认漏洞是禁止的。
  • 如果可能的话,请添加一个带有测试代码的链接(即TIO)。
  • 另外,强烈建议为您的答案添加说明。

所有可能的测试用例(动作可以按输入顺序):

:您应该支持以下测试用例的所有(最多四个)变体。因此,如果有一个测试用例说明action1: Create file A; action2: Update file B,则该测试用例也应具有相同的结果action1: Create file B; action2: Update file Aaction1: 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更改了可能输出的一些部分,它们必须是一致的,但不一定是唯一的。并且输入必须是一致的。
凯文·克鲁伊森

1
@Arnauld啊,我将所有B/B案件都排除在外了,因为我认为它们与相似A/A。那就是差异的来源。但我想这想法是不正确的,如果你有这些文件的特定值..
凯文Cruijssen

Answers:


8

JavaScript(ES6),36个字节

没有查找表

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

在线尝试!

输入输出

  • 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]

在线尝试!

输入输出

  • 1
  • 0123
  • 文件:任何整数
  • 01

4

视网膜0.8.2,53字节

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

在线尝试!链接包括测试套件。将输入作为5个字符的字符串输入,两个字符代表文件名,然后是中的两个字符CRUD,然后是LU(锁定/解锁),然后输出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 =锁定

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.