Mehrbenutzer-CRUD: Gültig, Problem oder Fehler?

12

Einführung :

Haben Sie Dropbox schon einmal mit anderen Leuten verwendet und Sie haben beide dieselbe Datei geändert? Hatten Sie jemals eine Mehrbenutzeranwendung mit einer relationalen Datenbank, und zwei Personen haben dasselbe Objekt geändert (oder schlimmer noch, eine hat gelöscht und die andere geändert)? Lassen Sie uns das mit dieser Herausforderung simulieren.

Für diese Herausforderung haben wir nur zwei Benutzer und entweder eine oder zwei relevante Dateien. Beide Benutzer haben im Allgemeinen die Berechtigung, alle Dateien mit CRUD (Erstellen, Lesen, Aktualisieren und Löschen) zu versehen .

Herausforderung:

Eingang:

Wir werden einige Eingaben haben (das Eingabeformat ist flexibel und jedes vernünftige Format ist zulässig):

1) Sperrmodus (Ein / Aus) : Ein bisschen der Unterschied zwischen optimistischer und pessimistischer Parallelitätssperre .
Beide Benutzer dürfen alles CRUD (Erstellen, Lesen, Aktualisieren und Löschen), aber manchmal können Fehler oder Probleme auftreten. Abhängig vom Sperrmodus kann ein Problem beim Ausschalten ein Fehler beim Einschalten sein. Dies wird unten im Abschnitt Ausgabe erläutert .

2 & 3) Zwei Benutzeraktionen . Diese Aktionen bestehen immer aus zwei Dingen: Was der Benutzer tut (Erstellen, Lesen, Aktualisieren oder Löschen) und für welche Datei.

Ausgabe:

Wir werden drei mögliche Ausgaben haben:

  1. Gültig : Beide Aktionen beider Benutzer können gleichzeitig ausgeführt werden, ohne dass Probleme auftreten.
  2. Fehler : Beide Aktionen beider Benutzer können nicht gleichzeitig ausgeführt werden und verursachen einen Fehler für einen der Benutzer (welcher Benutzer für diese Herausforderung irrelevant ist). Dies kann auftreten, wenn:
    • Ein Benutzer liest oder aktualisiert eine Datei, die der andere Benutzer löscht.
    • beide Benutzer Aktualisieren Sie dieselbe Datei mit aktiviertem Sperrmodus.
    • Ein Benutzer erstellt eine Datei, die der andere Benutzer liest / aktualisiert / löscht (dies bedeutet, dass die Datei bereits vorhanden ist und daher nicht erstellt werden kann).
    • beide Benutzer Erstellen dieselbe Datei.
  3. Problem : Beide Aktionen beider Benutzer können gleichzeitig ausgeführt werden, können jedoch zu unerwarteten Problemen führen. Dies kann auftreten, wenn:
    • beide Benutzer Aktualisieren Sie eine Datei, wenn der Sperrmodus deaktiviert ist.
    • Ein Benutzer aktualisiert eine Datei, die der andere Benutzer liest.
    • beide Benutzer löschen dieselbe Datei (praktisch verursacht dies einen Fehler für den zweiten Benutzer, aber da sie weiterhin wie vom Benutzer gewünscht gelöscht wird, handelt es sich um ein Problem anstelle eines Fehlers für diese Herausforderung)

Herausforderungsregeln:

  • Alle Ein- und Ausgaben sind flexibel und jeder sollte angeben, welche er in seiner Antwort verwendet hat!
    Beispieleingaben: 0/ 1für den Sperrmodus & 31(dritte Aktion: Aktualisieren; Datei: 1) & 21(zweite Aktion: Lesen; Datei: 1); true/ falsefür den Sperrmodus & ['C','A'](Aktion: Erstellen; Datei: A) & ['D','B'](Aktion: Löschen; Datei: B); usw.
    Beispiel Ausgänge: null/ true/ false(null = gültig; true = Fehler; false = Problem); -1/ 0/ 1(-1 = Fehler; 0 = Problem; 1 = gültig); usw. Die drei möglichen Ausgänge müssen jedoch für die drei Ausgabetypen eindeutig und unterschiedlich sein .
  • Was die Dateien heißen, ist irrelevant, was auch an den obigen Eingabebeispielen zu sehen ist. Sie können also in Ihren Antworten einen beliebigen Dateinamen verwenden, der aus einem einzelnen Buchstaben oder einer einzelnen Ziffer (ASCII) besteht. Sie müssen jedoch in allen Testfällen konsistent sein, damit Sie A/ Bin einem Testfall und 1/ 2in einem anderen nicht verwenden können.
  • Die vier Aktionen für CRUD müssen ebenfalls eindeutige und konsistente Werte sein. Sie können also nicht 'D'/ 'C'in einem Testfall und dann 4/ 1in einem anderen Testfall verwenden.
  • Sie können davon ausgehen, dass die von einem Benutzer ausgewählte Datei immer vorhanden ist, wenn er sie lesen, aktualisieren oder löschen möchte.

Allgemeine Regeln:

  • Dies ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich nicht von Code-Golf-Sprachen davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, eine möglichst kurze Antwort für "jede" Programmiersprache zu finden.
  • Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln . Sie können also STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
  • Standardschlupflöcher sind verboten.
  • Wenn möglich, fügen Sie bitte einen Link mit einem Test für Ihren Code (dh TIO ) hinzu.
  • Es wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.

Alle möglichen Testfälle (bei denen die Aktionen in einer der Eingabereihenfolgen erfolgen können ):

: Sie sollten alle (bis zu vier) Varianten der folgenden Testfälle unterstützen. Wenn also ein Testfall angibt action1: Create file A; action2: Update file B, sollte dieser Testfall auch die gleichen Ergebnisse enthalten für action1: Create file B; action2: Update file A; action1: Update file B; action2: Create file A;; und 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
Kevin Cruijssen
quelle
2
Ich denke, es wird eine 1-Byte-Lösung geben, wenn ich nur die richtigen Eingabe- / Ausgabemethoden finden kann (vielleicht eine Art Bitmaskierung)
Abgelaufene Daten
2
@ExpiredData Einige Teile der möglichen Ausgaben wurden geändert, sodass sie konsistent, aber nicht unbedingt eindeutig sein müssen. Und auch, dass die Eingaben konsistent sein müssen.
Kevin Cruijssen
1
@Arnauld Ah, ich habe alle B/BFälle in meiner Zählung ausgeschlossen , da ich sie für ähnlich hielt A/A. Hier kommt der Unterschied her. Aber ich denke, dass das Denken falsch ist, wenn Sie einen bestimmten Wert für die Dateien haben ..
Kevin Cruijssen

Antworten:

8

JavaScript (ES6), 36 Byte

Ohne Nachschlagetabelle

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

Probieren Sie es online aus!

I / O.

  • m08
  • aA0248
  • fF
  • 028

Wie?

2

Wenn die Dateien identisch sind, müssen wir Folgendes zurückgeben:

  • 2
  • 8
  • m
  • 0

4×4

a ^ AaA? ? a * A & 8 : a & 4update? ? m:a

CRUD0248C00000R20280U408m0D80008


JavaScript (ES6),  46 45  40 Byte

Mit einer Nachschlagetabelle

(m,a,f,A,F)=>f-F?0:[m,1,1,0][a*2+A*9&23]

Probieren Sie es online aus!

I / O.

  • 1
  • 0123
  • Dateien: beliebige Ganzzahlen
  • 01
Arnauld
quelle
4

Retina 0,8,2 , 53 Bytes

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

Probieren Sie es online aus! Link enthält Testsuite. Nimmt die Eingabe als Zeichenfolge mit 5 Zeichen, zwei Zeichen, die die Dateinamen darstellen, dann zwei Zeichen von CRUD, dann Loder U(gesperrt / entsperrt) und gibt eines von VPE(gültig / Problem / Fehler) aus. Erläuterung:

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

Unterschiedliche Dateinamen sind immer gültig, ebenso wie zwei Lesevorgänge. Ärgerlicherweise ist dies der einzige Test, der mich zwingt, einen Header zu verwenden. (Es würde ein zusätzliches Byte kosten, um den Header unnötig zu machen.)

..DD.
P

Zwei Löschungen sind immer ein Problem.

..UUL
E

Zwei gesperrte Updates sind ein Fehler.

.+[CD].+
E

Alle anderen Erstellungen oder Löschungen sind ein Fehler.

..+
P

Alles andere ist ein Problem.

Neil
quelle
3

Oktave , 96 Bytes

@(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]

Probieren Sie es online aus!

Kann definitiv kürzer sein, aber ich habe momentan keine Zeit dafür

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]

Eingabe als a = [Datei, Aktion], b = [Datei2, Aktion2], c = Sperre

Abgelaufene Daten
quelle