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:
- Valido : entrambe le azioni di entrambi gli utenti possono essere eseguite contemporaneamente senza che si verifichino problemi.
- 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.
- 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 e1/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 quindi4/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 è code-golf , 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
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 ..