はじめに:
Dropboxを他の人と一緒に使用して、同じファイルを変更したことはありますか?リレーショナルデータベースを備えたマルチユーザーアプリケーションを使用していて、2人が同じオブジェクトを変更していた(さらに悪いことに、1人が削除してもう1人が変更していた)としたら、さて、この課題(ソート)でそれをシミュレートしましょう。
この課題のために、2人のユーザーと1つまたは2つの関連ファイルしかありません。両方のユーザーは、すべてのファイルをCRUD(作成、読み取り、更新、および削除)する一般的な特権を持っています。
チャレンジ:
入力:
いくつかの入力があります(入力形式は柔軟で、妥当な形式であれば何でも許可されます)。
1)ロックモード(オン/オフ):楽観的同時実行ロックと悲観的同時実行ロックの違い。
どちらのユーザーもすべてをCRUD(作成、読み取り、更新、および削除)できますが、エラーや問題が発生する場合があります。ロックモードによっては、オフにすると問題が発生し、オンにするとエラーになる場合があります。これについては、以下の「出力」セクションで説明します。
2&3)2つのユーザーアクション。これらのアクションは常に2つのことで構成されています。ユーザーが行うこと(作成、読み取り、更新、または削除)とそのファイルに対して。
出力:
3つの可能な出力があります。
- 有効:両方のユーザーによる両方のアクションを、問題が発生することなく同時に実行できます。
- エラー:両方のユーザーによる両方のアクションを同時に実行することはできず、ユーザーの1人(このユーザーはこのチャレンジには関係ありません)にエラーを引き起こします。これは次の場合に発生します。
- 1人のユーザーがファイルを読み取りまたは更新し、もう1人のユーザーが削除した。
- 両方のユーザーがロックモードをオンにして同じファイルを更新します。
- ユーザーがファイルを作成し、他のユーザーがそれを読み取り/更新/削除する(つまり、ファイルが既に存在するため、作成できない)。
- 両方のユーザーが同じファイルを作成します。
- 問題:両方のユーザーによる両方のアクションを同時に実行できますが、予期しない問題が発生する可能性があります。これは次の場合に発生します。
- 両方のユーザーロックモードがオフになっているときにファイルを更新します。
- 一方のユーザーがファイルを更新し、もう一方のユーザーがそれを読み取る。
- 両方のユーザーが同じファイルを削除する(実際には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
を使用することはできません。 - ユーザーが選択したファイルは、ユーザーがファイルを読み取り、更新、または削除するときに常に存在すると想定できます。
一般的なルール:
- これはcode-golfなので、バイト単位の最短の回答が優先されます。
コードゴルフ言語では、コードゴルフ言語以外の言語で回答を投稿しないようにしないでください。「あらゆる」プログラミング言語について、可能な限り短い答えを考え出すようにしてください。 - デフォルトの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