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 Atem 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, wou 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, tou 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 Aquiser 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, masApertence 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
Ae uma lista de IDs de grupo aos quaisApertence. - 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 /
Agera 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