CRUD multi-utilisateur: valide, problème ou erreur?

13

Présentation :

Avez-vous déjà utilisé Dropbox avec d'autres personnes et vous avez tous les deux modifié le même fichier? Avez-vous déjà eu une application multi-utilisateurs avec une base de données relationnelle et deux personnes modifiaient (ou pire, l'une supprimait et l'autre modifiait) le même objet? Eh bien, simulons cela avec ce défi (sorte de).

Pour relever ce défi, nous n'avons que deux utilisateurs et un ou deux fichiers pertinents. Les deux utilisateurs ont en général des privilèges pour CRUD (créer, lire, mettre à jour et supprimer) tous les fichiers.

Défi:

Contribution:

Nous aurons quelques entrées (le format d'entrée est flexible et tout format raisonnable est autorisé):

1) Mode de verrouillage (activé / désactivé) : Différence entre le verrouillage simultané optimiste et pessimiste .
Les deux utilisateurs sont autorisés à tout CRUD (créer, lire, mettre à jour et supprimer) tout, mais parfois des erreurs ou des problèmes peuvent survenir. Selon le mode de verrouillage, un problème lorsqu'il est désactivé peut être une erreur lorsqu'il est activé. Ceci est expliqué ci-dessous dans la section Sortie .

2 & 3) Deux actions utilisateur . Ces actions consistent toujours en deux choses: ce que l'utilisateur fait (créer, lire, mettre à jour ou supprimer) et pour quel fichier.

Production:

Nous aurons trois sorties possibles:

  1. Valide : les deux actions des deux utilisateurs peuvent être effectuées simultanément sans aucun problème.
  2. Erreur : les deux actions des deux utilisateurs ne peuvent pas être effectuées simultanément et provoquent une erreur pour l'un des utilisateurs (lequel utilisateur n'est pas pertinent pour ce défi). Cela peut se produire lorsque:
    • un utilisateur lit ou met à jour un fichier que l'autre utilisateur supprime;
    • les deux utilisateurs Mettre à jour le même fichier avec le mode de verrouillage activé;
    • un utilisateur crée un fichier que l'autre utilisateur lit / met à jour / supprime (cela signifie que le fichier existe déjà, il ne peut donc pas être créé);
    • les deux utilisateurs Créez le même fichier.
  3. Problème : les deux actions des deux utilisateurs peuvent être effectuées simultanément, mais peuvent provoquer des problèmes inattendus. Cela peut se produire lorsque:
    • les deux utilisateurs Mettre à jour un fichier lorsque le mode de verrouillage est désactivé;
    • un utilisateur Met à jour un fichier que l'autre utilisateur lit;
    • les deux utilisateurs suppriment le même fichier (cela entraînera pratiquement une erreur pour le deuxième utilisateur, mais comme il sera toujours supprimé comme le souhaite l'utilisateur, ce sera un problème au lieu d'une erreur pour ce défi)

Règles du défi:

  • Toutes les entrées et sorties sont flexibles, et tout le monde doit indiquer celui qu'il a utilisé dans sa réponse!
    Exemples d'entrées: 0/ 1pour le mode de verrouillage & 31(troisième action: mise à jour; fichier: 1) & 21(deuxième action: lecture; fichier: 1); true/ falsepour le mode de verrouillage & ['C','A'](action: Créer; fichier: A) & ['D','B'](action: Supprimer; fichier: B); etc.
    Exemples de sorties: null/ true/ false(null = valide; true = erreur; false = problème); -1/ 0/ 1(-1 = erreur; 0 = problème; 1 = valide); etc. Cependant, les trois sorties possibles doivent être uniques et distinctes pour les trois types de sortie.
  • Ce que les fichiers sont appelés n'est pas pertinent, ce qui peut également être vu avec les exemples d'entrée ci-dessus. N'hésitez donc pas à utiliser n'importe quel type de nom de fichier dans vos réponses consistant en une seule lettre (ASCII) ou chiffre. Cependant, ils doivent être cohérents dans tous vos cas de test, de sorte que vous ne pouvez pas utiliser A/ Bdans un cas de test et 1/ 2dans un autre.
  • Les quatre actions pour CRUD doivent également être des valeurs uniques et cohérentes. Vous ne pouvez donc pas utiliser 'D'/ 'C'dans un cas de test, puis 4/ 1dans un autre cas de test.
  • Vous pouvez supposer que le fichier choisi par un utilisateur existe toujours lorsqu'il souhaite le lire, le mettre à jour ou le supprimer.

Règles générales:

  • C'est le , donc la réponse la plus courte en octets l'emporte.
    Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues non-golfeur de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation.
  • Des règles standard s'appliquent à votre réponse avec des règles d'E / S par défaut , vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
  • Les failles par défaut sont interdites.
  • Si possible, veuillez ajouter un lien avec un test pour votre code (par exemple TIO ).
  • De plus, l'ajout d'une explication à votre réponse est fortement recommandé.

Tous les cas de test possibles (où les actions peuvent être dans l'un ou l'autre des ordres d'entrée ):

: Vous devez prendre en charge toutes les variations (jusqu'à quatre) des cas de test ci-dessous. Donc, si un scénario de test indique action1: Create file A; action2: Update file B, ce scénario de test devrait également contenir les mêmes résultats pour action1: Create file B; action2: Update file A; action1: Update file B; action2: Create file A; et 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
la source
2
Je pense qu'il y aura une solution à 1 octet si je peux juste trouver les bonnes méthodes d'entrée / sortie (peut-être une sorte de masquage de bits)
Expired Data
2
@ExpiredData Modifié quelques parties des sorties possibles, qu'elles doivent être cohérentes, mais pas nécessairement uniques. Et aussi que les entrées doivent être cohérentes.
Kevin Cruijssen
1
@Arnauld Ah, j'ai exclu tous les B/Bcas dans mon comptage , car je les ai considérés comme similaires A/A. C'est de là que vient la différence. Mais je suppose que la réflexion est incorrecte si vous avez une valeur spécifique pour les fichiers ..
Kevin Cruijssen

Réponses:

8

JavaScript (ES6), 36 octets

Sans table de consultation

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

Essayez-le en ligne!

E / S

  • m08
  • uneUNE0248
  • FF
  • 028

Comment?

2

Si les fichiers sont identiques, nous devons retourner:

  • 2
  • 8
  • m
  • 0

4×4

a ^ AuneUNE? ? a * A & 8 : a & 4mise à jour? ? m:une

CRU0248C00000R20280U408m080008


JavaScript (ES6),  46 45  40 octets

Avec une table de consultation

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

Essayez-le en ligne!

E / S

  • 1
  • 0123
  • Fichiers: tous les entiers
  • 01
Arnauld
la source
4

Retina 0.8.2 , 53 octets

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

Essayez-le en ligne! Le lien inclut une suite de tests. Prend l'entrée sous la forme d'une chaîne de 5 caractères, deux caractères représentant les noms de fichier, puis deux caractères de CRUD, puis Lou U(verrouillé / déverrouillé) et génère l'un de VPE(valide / problème / erreur). Explication:

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

Des noms de fichiers différents sont toujours valables, tout comme deux lectures. Chose ennuyeuse, c'est le seul test qui m'oblige à utiliser un en-tête. (Il en coûterait un octet supplémentaire pour rendre l'en-tête inutile.)

..DD.
P

Deux suppressions sont toujours un problème.

..UUL
E

Deux mises à jour verrouillées sont une erreur.

.+[CD].+
E

Toute autre création ou suppression est une erreur.

..+
P

Tout le reste est un problème.

Neil
la source
3

Octave , 96 octets

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

Essayez-le en ligne!

Cela peut certainement être plus court, mais je n'ai pas le temps pour le moment

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]

Entrée comme a = [fichier, action], b = [fichier2, action2], c = verrou

Données expirées
la source