O desafio
Dada uma sequência que indica a notação simbólica da permissão UNIX de um arquivo e sua propriedade (ID do usuário e ID do grupo), decida se um determinado usuário A
tem permissão para lê-lo / gravá-lo / executá-lo.
Permissões no sistema UNIX
No UNIX, cada arquivo possui três classes de permissões ( usuário , grupo e outras ) e propriedade, incluindo a qual usuário e a qual grupo pertence.
A notação simbólica consiste em dez caracteres. O primeiro personagem não é importante nesse desafio. Os nove caracteres restantes estão em três conjuntos de três caracteres, representando permissões de usuário, grupo e outras classes. Os caracteres em cada conjunto indicam se a leitura / gravação / execução é permitida. Se permitido, será r
, w
ou x
. Caso contrário, será -
.
Note-se que setuid , setgid e sticky bit pode mudar o terceiro carácter de cada conjunto para s
, S
, t
ou T
. Aqui está uma regra simples: se o caractere estiver em letra minúscula, a permissão será definida; caso contrário, não é.
(Para os detalhes da notação simbólica de permissões, consulte aqui .)
Todo usuário tem seu ID de usuário e todo grupo tem seu ID de grupo. Todos os IDs serão números inteiros não negativos. Um usuário pertencerá a pelo menos um grupo. Se um usuário A
quiser obter acesso a um arquivo, o sistema verificará suas permissões da seguinte maneira:
Se o arquivo pertencer ao usuário
A
, verifique as permissões da classe de usuário .Se o arquivo não pertence
A
, masA
pertence ao grupo ao qual ele pertence, verifique as permissões da classe do grupo .Caso contrário, verifique as permissões de outras classes.
No entanto, há uma exceção: se o ID do usuário for 0 (superusuário), eles terão permissão para fazer qualquer coisa !
Especificações
- Seu programa / função deve aceitá-los como entrada em qualquer formato razoável:
- Permissões em notação simbólica .
- ID do usuário e ID do grupo ao qual o arquivo pertence.
- O ID do usuário
A
e uma lista de IDs de grupo aos quaisA
pertence. - Tipo de acesso. Você pode usar três valores diferentes de um dígito ou um caractere para leitura, gravação e execução.
- Retorna /
A
gera um valor verdadeiro, se tiver permissão para acessar o arquivo, ou um valor falso, se não tiver. - Você pode assumir que o primeiro caractere da notação será sempre
-
(arquivo regular). - Isso é código-golfe , então o menor em bytes vence!
Casos de teste
O formato aqui é [permissions, user ID of file, group ID of file, user ID of A, group IDs of A, type(r/w/x)]
.
[-rwx------, 13, 15, 13, [15, 24], r]: True # user
[-rwxr-xr-x, 13, 24, 24, [15, 24], w]: False # group
[-rwxr-Sr-T, 13, 15, 24, [15, 35], x]: False # group
[-rwsr-xr-t, 13, 15, 24, [24, 35], x]: True # others
[----------, 13, 15, 0, [0, 1, 2], r]: True # superuser
[----------, 13, 15, 1, [0, 1, 2], r]: False # others
[----rwxrwx, 13, 15, 13, [15, 24], r]: False # user
fonte
Java (OpenJDK 8) , 60 bytes
Experimente online!
O mapeamento para o tipo é o seguinte:
1
meiosr
,2
meiosw
e3
meiosx
.fonte
Pitão,
2221 bytesExperimente online. Suíte de teste.
Aceita entrada como seis linhas:
Explicação
fonte