マルチユーザーCRUD:有効、問題、またはエラー?


13

はじめに

Dropboxを他の人と一緒に使用して、同じファイルを変更したことはありますか?リレーショナルデータベースを備えたマルチユーザーアプリケーションを使用していて、2人が同じオブジェクトを変更していた(さらに悪いことに、1人が削除してもう1人が変更していた)としたら、さて、この課題(ソート)でそれをシミュレートしましょう。

この課題のために、2人のユーザーと1つまたは2つの関連ファイルしかありません。両方のユーザーは、すべてのファイルをCRUD(作成、読み取り、更新、および削除)する一般的な特権を持っています。

チャレンジ:

入力:

いくつかの入力があります(入力形式は柔軟で、妥当な形式であれば何でも許可されます)。

1)ロックモード(オン/オフ)楽観的同時実行ロックと悲観的同時実行ロックの違い。
どちらのユーザーもすべてをCRUD(作成、読み取り、更新、および削除)できますが、エラーや問題が発生する場合があります。ロックモードによっては、オフにすると問題が発生し、オンにするとエラーになる場合があります。これについては、以下の「出力」セクションで説明します。

2&3)2つのユーザーアクション。これらのアクションは常に2つのことで構成されています。ユーザーが行うこと(作成、読み取り、更新、または削除)とそのファイルに対して。

出力:

3つの可能な出力があります。

  1. 有効:両方のユーザーによる両方のアクションを、問題が発生することなく同時に実行できます。
  2. エラー:両方のユーザーによる両方のアクションを同時に実行することはできず、ユーザーの1人(このユーザーはこのチャレンジには関係ありません)にエラーを引き起こします。これは次の場合に発生します。
    • 1人のユーザーがファイルを読み取りまたは更新し、もう1人のユーザーが削除した。
    • 両方のユーザーがロックモードをオンにして同じファイルを更新します。
    • ユーザーがファイルを作成し、他のユーザーがそれを読み取り/更新/削除する(つまり、ファイルが既に存在するため、作成できない)。
    • 両方のユーザーが同じファイルを作成します。
  3. 問題:両方のユーザーによる両方のアクションを同時に実行できますが、予期しない問題が発生する可能性があります。これは次の場合に発生します。
    • 両方のユーザーロックモードがオフになっているときにファイルを更新します。
    • 一方のユーザーがファイルを更新し、もう一方のユーザーがそれを読み取る。
    • 両方のユーザーが同じファイルを削除する(実際には2番目のユーザーにエラーが発生しますが、ユーザーの希望どおりに削除されるため、このチャレンジのためにエラーではなく問題になります)

チャレンジルール:

  • すべての入力と出力は柔軟であり、誰もが答えで使用したものを明記する必要があります!
    入力例:0/ 1ロックモードの場合&31(3番目のアクション:更新;ファイル:1)&21(2番目のアクション:読み取り;ファイル:1); true/ falseロックモードの場合&['C','A'](アクション:作成;ファイル:A)&['D','B'](アクション:削除;ファイル:B); etc.
    出力例:null/ true/ false(null =有効; true =エラー; false =問題); -1/ 0/ 1(-1 =エラー; 0 =問題; 1 =有効); はいえ、3 つの可能な出力は、3つの出力タイプに対して一意で異なる必要があります。
  • ファイルが何と呼ばれるかは関係ありません。これは上記の入力例でも確認できます。そのため、1つの(ASCII)文字または数字で構成される任意のタイプのファイル名を回答に使用してください。彼らはあなたが使用することはできませんので、しかし、すべてのテストケースで一貫してしなければならないのA/ Bつのテストケースに及び1/ 2別で。
  • CRUDの4つのアクションも、一意で一貫した値でなければなりません。したがって、あるテストケースで'D'/ 'C'を使用してから、別のテストケースで4/ 1を使用することはできません。
  • ユーザーが選択したファイルは、ユーザーがファイルを読み取り、更新、または削除するときに常に存在すると想定できます。

一般的なルール:

  • これはなので、バイト単位の最短の回答が優先されます。
    コードゴルフ言語では、コードゴルフ言語以外の言語で回答を投稿しないようにしないでください。「あらゆる」プログラミング言語について、可能な限り短い答えを考え出すようにしてください。
  • デフォルトのI / Oルールを使用した回答には標準ルールが適用されるため、STDIN / STDOUT、関数/メソッドを適切なパラメーターで使用し、戻り値の型の完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテスト(TIOなど)のリンクを追加してください。
  • また、回答の説明を追加することを強くお勧めします。

すべての可能なテストケース(アクションは入力順†のどちらでもかまいません):

:以下のテストケースのすべて(最大4つ)のバリエーションをサポートする必要があります。そのため、テストケースにが記載されている場合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
@アーノールドああ、私はB/Bそれらをと同様と見なしたので、私のカウントではすべてのケースを除外しましたA/A。そこから違いが生まれます。しかし、私は..あなたは、ファイルのための具体的な値を持っている場合、その考え方は間違っていると思う
ケビンCruijssen

回答:


8

JavaScript(ES6)、36バイト

ルックアップテーブルなし

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

オンラインでお試しください!

I / O

  • メートル08
  • a0248
  • fF
  • 028

どうやって?

2

ファイルが同一の場合は、以下を返す必要があります。

  • 2
  • 8
  • メートル
  • 0

4×4

a ^ Aa ? a * A&8 : a&4更新? ? メートルa

CRUD0248C00000R20280U408メートル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
  • 012
  • ファイル:任意の整数
  • 01

4

Retina 0.8.2、53バイト

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

オンラインでお試しください!リンクにはテストスイートが含まれます。ファイル名を表す2文字CRUD、次にfrom 、then、LまたはU(ロック/ロック解除)の5文字の文字列として入力を受け取り、VPE(有効/問題/エラー)のいずれかを出力します。説明:

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

2つの読み取りと同様に、異なるファイル名は常に有効です。厄介なことに、これは私がヘッダーを使用することを強制する唯一のテストです。(ヘッダーを不要にするために1バイト余分にかかります。)

..DD.
P

2つの削除は常に問題です。

..UUL
E

ロックされた2つの更新はエラーです。

.+[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 =ロックとして入力

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.