CRUD multiutente: valido, problema o errore?


13

Introduzione :

Hai mai usato Dropbox con altre persone ed entrambi hai modificato lo stesso file? Hai mai avuto un'applicazione multiutente con un database relazionale e due persone stavano modificando (o peggio, una stava cancellando e l'altra modificando) lo stesso oggetto? Bene, simuliamolo con questa sfida (una specie di).

Per il bene di questa sfida, abbiamo solo due utenti e uno o due file rilevanti. Entrambi gli utenti hanno in generale i privilegi di CRUD (Crea, Leggi, Aggiorna ed Elimina) tutti i file.

Sfida:

Ingresso:

Avremo alcuni input (il formato di input è flessibile e è consentito qualsiasi formato ragionevole):

1) Modalità di blocco (on / off) : Kinda la differenza tra blocco della concorrenza ottimistico e pessimistico .
Ad entrambi gli utenti è consentito CRUD (Crea, Leggi, Aggiorna ed Elimina) tutto, ma a volte possono verificarsi errori o problemi. A seconda della modalità di blocco, un problema quando è spento, potrebbe essere un errore quando è acceso. Questo è spiegato di seguito nella sezione Output .

2 e 3) Due azioni dell'utente . Queste azioni consistono sempre di due cose: cosa fa l'utente (Crea, Leggi, Aggiorna o Elimina) e per quale file.

Produzione:

Avremo tre possibili uscite:

  1. Valido : entrambe le azioni di entrambi gli utenti possono essere eseguite contemporaneamente senza che si verifichino problemi.
  2. Errore : entrambe le azioni di entrambi gli utenti non possono essere eseguite contemporaneamente e causano un errore per uno degli utenti (l'utente non è rilevante per questa sfida). Questo può accadere quando:
    • un utente legge o aggiorna un file che l'altro utente elimina;
    • entrambi gli utenti aggiornano lo stesso file con la modalità di blocco attivata;
    • un utente crea un file, che l'altro utente legge / aggiorna / elimina (ciò significa che il file esiste già, quindi non può essere creato);
    • entrambi gli utenti Crea lo stesso file.
  3. Problema : entrambe le azioni di entrambi gli utenti possono essere eseguite contemporaneamente, ma possono causare problemi imprevisti. Questo può accadere quando:
    • entrambi gli utenti aggiornano un file quando la modalità di blocco è disattivata;
    • un utente aggiorna un file che l'altro utente legge;
    • entrambi gli utenti Elimina lo stesso file (praticamente ciò causerà un errore per il secondo utente, ma poiché verrà comunque eliminato come desidera l'utente, sarà un problema anziché un errore per il bene di questa sfida)

Regole della sfida:

  • Tutti gli input e gli output sono flessibili e tutti dovrebbero dichiarare quale hanno usato nella loro risposta!
    Input di esempio: 0/ 1per modalità di blocco & 31(terza azione: Aggiornamento; file: 1) & 21(seconda azione: Lettura; file: 1); true/ falseper la modalità di blocco & ['C','A'](azione: Crea; file: A) & ['D','B'](azione: Elimina; file: B); ecc.
    Output di esempio: null/ true/ false(null = valido; true = errore; false = problema); -1/ 0/ 1(-1 = errore; 0 = problema; 1 = valido); ecc. Tuttavia, le tre possibili uscite devono essere uniche e distinte per i tre tipi di uscita.
  • Ciò che i file vengono chiamati è irrilevante, come si può vedere anche dagli esempi di input sopra. Quindi sentiti libero di usare qualsiasi tipo di nome di file nelle tue risposte composto da una singola lettera (ASCII) o cifra. Devono tuttavia essere coerenti in tutti i casi di test, quindi non è possibile utilizzare A/ Bin un caso di test e 1/ 2in un altro.
  • Le quattro azioni per CRUD devono essere anche valori unici e coerenti. Quindi non è possibile utilizzare 'D'/ 'C'in un caso di test e quindi 4/ 1in un altro caso di test.
  • Puoi presumere che il file scelto da un utente esista sempre quando desidera leggerlo, aggiornarlo o eliminarlo.

Regole generali:

  • Questo è , quindi vince la risposta più breve in byte.
    Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione.
  • Le regole standard si applicano alla tua risposta con le regole I / O predefinite , quindi puoi utilizzare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
  • Le scappatoie predefinite sono vietate.
  • Se possibile, aggiungi un link con un test per il tuo codice (ad es. TIO ).
  • Inoltre, si consiglia vivamente di aggiungere una spiegazione per la risposta.

Tutti i possibili casi di test (in cui le azioni possono essere nell'ordine di input ):

: è necessario supportare tutte (fino a quattro) varianti dei casi di test seguenti. Quindi, se si afferma un caso di prova action1: Create file A; action2: Update file B, anche quel caso di prova dovrebbe contenere gli stessi risultati action1: Create file B; action2: Update file A; action1: Update file B; action2: Create file A; e 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
Sento che ci sarà una soluzione da 1 byte se riesco a trovare i giusti metodi di input / output (forse una sorta di mascheramento dei bit)
Expired Data

2
@ExpiredData Modificato alcune parti dei possibili output, che devono essere coerenti, ma non necessariamente univoci. E anche che gli input devono essere coerenti.
Kevin Cruijssen,

1
@Arnauld Ah, ho escluso tutti i B/Bcasi nel mio conteggio , poiché li ho considerati simili A/A. Ecco da dove viene la differenza. Ma immagino che pensare in modo errato se si dispone di un valore specifico per i file ..
Kevin Cruijssen

Risposte:


8

JavaScript (ES6), 36 byte

Senza una tabella di ricerca

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

Provalo online!

I / O

  • m08
  • aA0248
  • fF
  • 028

Come?

2

Se i file sono identici, dobbiamo restituire:

  • 2
  • 8
  • m
  • 0

4×4

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

CRUD0248C00000R20280U408m0D80008


JavaScript (ES6),  46 45  40 byte

Con una tabella di ricerca

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

Provalo online!

I / O

  • 1
  • 0123
  • File: qualsiasi numero intero
  • 01

4

Retina 0.8.2 , 53 byte

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

Provalo online! Il link include la suite di test. Accetta l'input come una stringa di 5 caratteri, due caratteri che rappresentano i nomi dei file, quindi due caratteri da CRUD, quindi Lo U(bloccato / sbloccato) e ne genera uno di VPE(valido / problema / errore). Spiegazione:

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

Nomi di file diversi sono sempre validi, così come due letture. Stranamente, questo è l'unico test che mi costringe a usare un'intestazione. (Costerebbe un byte in più per rendere inutile l'intestazione.)

..DD.
P

Due eliminazioni sono sempre un problema.

..UUL
E

Due aggiornamenti bloccati sono un errore.

.+[CD].+
E

Qualsiasi altra creazione o eliminazione è un errore.

..+
P

Tutto il resto è un problema.


3

Ottava , 96 byte

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

Provalo online!

Sicuramente può essere più breve, ma al momento non ho tempo per farlo

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]

Immettere come a = [file, azione], b = [file2, azione2], c = blocco

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.