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:
- Válido : as duas ações de ambos os usuários podem ser executadas simultaneamente, sem que ocorram problemas.
- 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.
- 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
/1
para o modo de bloqueio &31
(terceira ação: Atualização; arquivo: 1) &21
(segunda ação: Leitura; arquivo: 1);true
/false
para 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
/B
em um caso de teste e1
/2
em 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 e4
/1
em 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 é código-golfe , 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
B/B
casos 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 ..