CRUD para vários usuários: válido, problema ou erro?

13

Introdução :

Já usou o Dropbox com outras pessoas e vocês dois modificaram o mesmo arquivo? Já teve um aplicativo multiusuário com um banco de dados relacional e duas pessoas estavam modificando (ou pior, uma foi excluindo e a outra modificando) o mesmo objeto? Bem, vamos simular isso com esse desafio (mais ou menos).

Para enfrentar esse desafio, temos apenas dois usuários e um ou dois arquivos relevantes. Ambos os usuários têm em geral privilégios para CRUD (criar, ler, atualizar e excluir) todos os arquivos.

Desafio:

Entrada:

Teremos algumas entradas (o formato da entrada é flexível e qualquer formato razoável é permitido):

1) Modo de bloqueio (ativado / desativado) : tipo de diferença entre o bloqueio de simultaneidade otimista e pessimista .
Ambos os usuários têm permissão para CRUD (criar, ler, atualizar e excluir) tudo, mas às vezes erros ou problemas podem ocorrer. Dependendo do modo de bloqueio, um problema ao ser desligado pode ser um erro ao ser ligado. Isso é explicado abaixo na seção Saída .

2 e 3) Duas ações do usuário . Essas ações sempre consistem em duas coisas: O que o usuário faz (Criar, Ler, Atualizar ou Excluir) e para qual arquivo.

Resultado:

Teremos três saídas possíveis:

  1. Válido : as duas ações de ambos os usuários podem ser executadas simultaneamente, sem que ocorram problemas.
  2. Erro : as duas ações de ambos os usuários não podem ser executadas simultaneamente e causam um erro para um dos usuários (usuário irrelevante para esse desafio). Isso pode ocorrer quando:
    • um usuário lê ou atualiza um arquivo que o outro usuário exclui;
    • ambos os usuários Atualize o mesmo arquivo com o modo de bloqueio ativado;
    • um usuário Cria um arquivo, que o outro usuário Lê / Atualiza / Exclui (significa que o arquivo já existe, portanto não pode ser criado);
    • ambos os usuários Crie o mesmo arquivo.
  3. Problema : As duas ações de ambos os usuários podem ser executadas simultaneamente, mas podem causar problemas inesperados. Isso pode ocorrer quando:
    • ambos os usuários Atualizam um arquivo quando o modo de bloqueio está desativado;
    • um usuário Atualiza um arquivo que o outro usuário lê;
    • ambos os usuários Exclua o mesmo arquivo (praticamente isso causará um erro para o segundo usuário, mas, como ainda será excluído como o usuário desejar, será um problema em vez de um erro para o desafio)

Regras do Desafio:

  • Todas as entradas e saídas são flexíveis, e todos devem indicar qual deles usaram em sua resposta!
    Exemplo de entradas: 0/ 1para o modo de bloqueio & 31(terceira ação: Atualização; arquivo: 1) & 21(segunda ação: Leitura; arquivo: 1); true/ falsepara o modo de bloqueio & ['C','A'](ação: Criar; arquivo: A) & ['D','B'](ação: Excluir; arquivo: B); etc.
    Exemplo de saídas: null/ true/ false(nulo = válido; verdadeiro = erro; falso = problema); -1/ 0/ 1(-1 = erro; 0 = problema; 1 = válido); etc. As três saídas possíveis precisam ser únicas e distintas para os três tipos de saída.
  • O nome dos arquivos é irrelevante, o que também pode ser visto nos exemplos de entrada acima. Portanto, sinta-se à vontade para usar qualquer tipo de nome de arquivo em suas respostas, consistindo em uma única letra ou dígito (ASCII). No entanto, eles precisam ser consistentes em todos os seus casos de teste; portanto, você não pode usar A/ Bem um caso de teste e 1/ 2em outro.
  • As quatro ações para CRUD também devem ser valores únicos e consistentes. Portanto, você não pode usar 'D'/ 'C'em um caso de teste e 4/ 1em outro caso de teste.
  • Você pode supor que o arquivo escolhido por um usuário sempre exista quando ele desejar ler, atualizar ou excluir.

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
  • Além disso, é altamente recomendável adicionar uma explicação para sua resposta.

Todos os casos de teste possíveis (onde as ações podem estar na ordem de entrada ):

: você deve suportar todas (até quatro) variações dos casos de teste abaixo. Portanto, se um caso de teste declarar action1: Create file A; action2: Update file B, esse caso de teste também deve conter os mesmos resultados para 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
Kevin Cruijssen
fonte
2
Eu sinto que haverá uma solução 1 byte se eu só posso chegar com os métodos corretos de entrada / saída (talvez algum tipo de bit de mascaramento)
dados expirados
2
@ExpiredData Alterou algumas partes das saídas possíveis, que precisam ser consistentes, mas não necessariamente únicas. E também que as entradas precisam ser consistentes.
Kevin Cruijssen 04/07/19
11
@ Arnauld Ah, excluí todos os B/Bcasos na minha contagem , já que os considerava semelhantes A/A. É daí que vem a diferença. Mas eu acho que o pensamento é incorretamente se você tiver um valor específico para os arquivos ..
Kevin Cruijssen

Respostas:

8

JavaScript (ES6), 36 bytes

Sem uma tabela de pesquisa

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

Experimente online!

I / O

  • Modo de bloqueio ( ): = Ligado, = Desligadom08
  • aA0248
  • fF
  • 028

Como?

2

Se os arquivos forem idênticos, precisamos retornar:

  • 2
  • 8
  • m
  • 0

4×4

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

CRUD0248C00000R20280U408m0D80008


JavaScript (ES6),  46 45  40 bytes

Com uma tabela de pesquisa

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

Experimente online!

I / O

  • 1
  • 0123
  • Arquivos: qualquer número inteiro
  • 01
Arnauld
fonte
4

Retina 0.8.2 , 53 bytes

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

Experimente online! O link inclui o conjunto de testes. Recebe a entrada como uma sequência de 5 caracteres, dois caracteres representando os nomes dos arquivos, dois caracteres de CRUD, então Lou U(bloqueado / desbloqueado) e gera um de VPE(válido / problema / erro). Explicação:

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

Nomes de arquivos diferentes sempre são válidos, assim como duas leituras. Irritantemente, este é o único teste que me obriga a usar um cabeçalho. (Custaria um byte extra para tornar o cabeçalho desnecessário.)

..DD.
P

Duas exclusões são sempre um problema.

..UUL
E

Duas atualizações bloqueadas são um erro.

.+[CD].+
E

Qualquer outra criação ou exclusão é um erro.

..+
P

Tudo o resto é um problema.

Neil
fonte
3

Oitava , 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]

Experimente online!

Definitivamente pode ser mais curto, mas não tenho tempo agora para fazer isso

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]

Insira como a = [arquivo, ação], b = [arquivo2, ação2], c = bloqueio

Dados expirados
fonte