Permissões de arquivo
Adaptado da pergunta de resposta livre UIL - Computer Science Programming "Carla" para o Distrito de 2018.
Introdução
Nos sistemas operacionais do tipo UNIX, cada arquivo, diretório ou link é "de propriedade" de um "usuário", membro de um "grupo" e possui determinadas "permissões" representadas por uma cadeia de dez caracteres, como " drwxrwxrwx ". O primeiro caractere é 'd', '-' ou 'l' (diretório, arquivo ou link), seguido por três conjuntos de valores "rwx", indicando permissões "ler, escrever, executar". O primeiro conjunto são os direitos do usuário, o meio define os direitos do grupo e o terceiro os direitos de todos os demais sobre esse objeto.
A permissão negada para qualquer um desses direitos é representada por um '-' no lugar de 'r', 'w' ou 'x'. Por exemplo, uma sequência de permissões de diretório de exemplo seria "drwxr - r--", indicando direitos completos de diretório para o usuário, mas direitos "somente leitura" para o membro do grupo e todos os outros.
Cada combinação "rwx" também pode ser representada por um valor octal (0-7) com o bit mais significativo representando permissão de leitura, o próximo bit mais significativo representando permissão de gravação e o bit menos significativo representando permissão de execução.
Desafio
Dada uma sequência de código de quatro caracteres composta por um caractere: 'D', 'F' ou 'L', seguida por um valor inteiro octal de três dígitos, como 664, gera a sequência de 10 caracteres resultante que representa o valor da permissão indicado.
Entrada
Seu programa ou função pode ler a entrada do padrão em (quatro caracteres serão inseridos, opcionalmente seguidos por uma nova linha) ou receber a entrada como argumento.
Seu programa pode aceitar entradas em maiúsculas ou minúsculas, mas deve ser consistente (todas as entradas são maiúsculas ou todas as minúsculas).
Saída
Seu programa deve imprimir a sequência de dez caracteres resultante que representa o valor da permissão indicado no formato exato especificado acima. O espaço em branco restante é permitido.
Casos de teste
Entrada: F664
Saída: -rw-rw-r--
Entrada: D775
Saída: drwxrwxr-x
Entrada: L334
Saída: l-wx-wxr--
Entrada: F530
Saída: -r-x-wx---
Entrada: D127
Saída:d--x-w-rwx
Pontuação e Regras
- São proibidos os orifícios padrão .
- Regras padrão se .
- Forneça um link para testar seu código e também uma explicação.
- Isso é código-golfe , então a resposta mais curta em bytes vence!
Respostas:
Geléia , 19 bytes
Experimente online!
Como funciona
fonte
bater,
5953 bytesFerramenta certa para o trabalho?
Agradecemos a Dennis por salvar 5 bytes e o HTNW por salvar um.
Experimente online!
fonte
chmod ${1:1} a>a;stat -c%A a|sed "s/-/\L${1:0:1}/;s/f/-/"
salva dois bytes.tr
invés dey
:chmod ${1:1} a>a;stat -c%A a|sed s/./\\L${1:0:1}/|tr f -
a
e que o usuário tenha permissão para criá-lo ou que haja um arquivoa
gravável pelo usuário? Porque se houver um arquivoa
pertencente aroot
com permissões700
, isso não deve funcionar.Python 2 , 78 bytes
Toma entrada como um caractere e três polegadas.
Experimente online!
Explicação
[a,'-'][a=='f']
pega o caractere de entrada ou-
, se o caractere forf
.'-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]
é essencialmente uma conversão octal para obter arwx
string.fonte
Perl 5 com
-p
, 37 bytesRecebe entrada em minúsculas.
Experimente online!
fonte
Retina 0.8.2 , 43 bytes
Experimente online! O link inclui casos de teste. Recebe entrada em minúsculas. Explicação:
Triplicar cada dígito, com o sufixo com
r
,w
ex
.Altere todas as letras incorretas para
-
s.Exclua os dígitos restantes.
fonte
Retina , 51 bytes
Experimente online!
Não faço ideia de como usar o Retina, então, deixe-me saber como fazer isso melhor. Imaginei que tentaria aprender pelo menos um idioma que não é Pyth.
Explicação:
Substitua
f
por-
(deixandod
el
inalterado) e substitua cada dígito pelo apropriadorwx
.fonte
JavaScript (ES6), 63 bytes
Espera a sequência de entrada em minúsculas.
Experimente online!
Comentado
fonte
Carvão , 27 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
fonte
Haskell ,
848381 bytesExperimente online!
Acabou sendo bastante semelhante em conceito à resposta Python 2 do Mnemonic. f cria o tipo de arquivo, o restante são as permissões de obtenção do número octal. Este realmente me fez desejar & foi um bit a bit e operador incluído no prelúdio.
fonte
div
vez dequot
.Java 8, 100 bytes
Experimente online.
Porto da resposta Retina de @Neil .
Explicação:
fonte
.replaceAll
ainda têm menos bytes do que um loop com.replaceAll
e adicionadosreturn
e String-array. Mas é claro que o crédito é para Neil , que é a resposta Retina que eu usei como base para a porta.Gelatina , 21 bytes
Um programa completo de impressão em STDOUT. (Como um link monádico, o valor retornado é uma lista que contém um caractere e uma lista de três listas de caracteres.)
Experimente online! Ou veja a suíte de testes .
Quão?
fonte
Perl 6
-p
, 37 bytesExperimente online!
Solução Perl 5 do Porto de Dom Hastings.
fonte
Retina , 38 bytes
Inspirado por um comentário apenas do ASCII .
Experimente online!
A ideia é converter cada dígito em unário (o dígito unário padrão na Retina é
_
) com três iniciais-
e, em seguida, converter dígitos binários do mais para o menos significativo.fonte
Python 3 , 71 bytes
Experimente online!
O Python 3.3+ tem um built-in para isso, embora devido à necessidade de importação e diferenças no formato de entrada esperado, ele não seja muito favorável ao golfe.
fonte
Tcl , 139 bytes
Experimente online!
Tcl , 144 bytes
Experimente online!
Tcl , 149 bytes
Experimente online!
Tcl , 150 bytes
Experimente online!
Tcl , 180 bytes
Experimente online!
Ainda muito não-destruído!fonte
Java (JDK 10) , 118 bytes
Experimente online!
Créditos
fonte
fdl
, pode alterarvar r=s[0]<70?"d":s[0]<72?"-":"l";
paravar r=s[0]=='f'?"-":s[0]+"";
para salvar 6 bytes. Além disso,.toCharArray()
pode ser.split("")
para salvar um adicional de 4 bytes.""+
posteriormente para "converter" achar
em aString
);) Obrigado!Excel, 224 bytes
Feito em 4 etapas:
E 3 vezes:
Tentando ser mais inteligente, adiciona
25 bytes
por conjunto de direitos, 75 no total:fonte
05AB1E ,
3427 bytesExperimente online!
Golfed down 7 bytes por @MagicOctopusUrn
fonte
ćls8βbvyi…rwx3*Nèë'-}J'f'-:
por 7 menos ...f
, estou apenas substituindo todosf
na string final por-
.i <CODE FOR TRUE> ë <CODE FOR FALSE> }
Python 2 , 238 bytes
Experimente online!
Eu tinha assumido que isso seria uma gota no balde, mas eu estava realmente errado. Provavelmente deveria ter percebido que um lambda não era a melhor ideia em algum momento.
fonte
APL + WIN, 55 bytes
Solicita a sequência de entrada com caracteres iniciais minúsculos:
Explicação:
fonte
Python 3 , 77 bytes
Experimente online!
fonte
J ,
5752 bytes5 bytes salvos graças ao FrownyFrog!
Experimente online!
Mais uma solução longa ... não sei como
}
trabalhar em verbos tácitos e é por isso que usei muito mais tempo{"0 1&.|:
para a seleção.Explicação:
@}.
Largue o primeiro símbolo e,.&.":
converte o restante em uma lista de dígitos desimais]:#:
converta cada dígito em uma lista de dígitos binários (e limpe o garfo)('-',:'rwx')
cria uma tabela de 2 linhas e usa 0 para selecionar da primeira linha / 1 - da segunda{"0 1&.|:~
usa os dígitos binários para selecionar na tabela acima[:,
nivela o resultado('d-l'{~'DFL'i.{.)
formata o primeiro símbolo,
anexa o símbolo fisrt à lista de permissõesfonte
1#:@}."."0
('d-l'{~'DFL'i.{.)
→-&.('-DLld'i.{.)
i.
e&.
muito obrigado! A propósito, você pode me explicar como usar os}
verbos select em tácito?2 2 2&#:`('-',:'rwx'"_)}@"."0@}.
é exatamente o mesmo comprimento333
:)PHP, 68 bytes
converte
f
em entrada minúscula em sublinhado e cada número octal em seurwx
equivalente, usando sublinhados em vez de hífens (para salvar a necessidade de aspas) e, em seguida, substitui o_
por-
.Execute como pipe
-nF
ou experimente online .fonte
C (gcc) ,
109104 bytesPelo menos C pode converter entrada octal .... :-)
Edit: eu percebi que o modificador de tamanho não era estritamente necessário, e que
putchar()
é menor queprintf()
neste caso!Experimente online!
Original:
Experimente online!
fonte