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:
- Valide : les deux actions des deux utilisateurs peuvent être effectuées simultanément sans aucun problème.
- 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.
- 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
/1
pour le mode de verrouillage &31
(troisième action: mise à jour; fichier: 1) &21
(deuxième action: lecture; fichier: 1);true
/false
pour 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
/B
dans un cas de test et1
/2
dans 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, puis4
/1
dans 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 code-golf , 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
la source
B/B
cas dans mon comptage , car je les ai considérés comme similairesA/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 ..Réponses:
JavaScript (ES6), 36 octets
Sans table de consultation
Essayez-le en ligne!
E / S
Comment?
Si les fichiers sont identiques, nous devons retourner:
JavaScript (ES6),
46 4540 octetsAvec une table de consultation
Essayez-le en ligne!
E / S
la source
Retina 0.8.2 , 53 octets
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
, puisL
ouU
(verrouillé / déverrouillé) et génère l'un deVPE
(valide / problème / erreur). Explication: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.)
Deux suppressions sont toujours un problème.
Deux mises à jour verrouillées sont une erreur.
Toute autre création ou suppression est une erreur.
Tout le reste est un problème.
la source
Octave , 96 octets
Essayez-le en ligne!
Cela peut certainement être plus court, mais je n'ai pas le temps pour le moment
Entrée comme a = [fichier, action], b = [fichier2, action2], c = verrou
la source