Desafio
Dado um número de permissões octais de três dígitos, produza as permissões que ele concede.
chmod
Nos sistemas operacionais UNIX, as permissões de arquivo são alteradas usando o chmod
comando Existem algumas maneiras diferentes de usar o chmod, mas o que focaremos hoje é o uso de permissões octais.
Os três dígitos no número de permissões representam uma pessoa diferente:
- O primeiro dígito representa as permissões para o usuário
- O segundo dígito representa as permissões para o grupo
- O último dígito representa as permissões para outros
Em seguida, cada dígito representa uma permissão, como mostrado abaixo em:
Key: number | permission
7 | Read Write and Execute
6 | Read and Write
5 | Read and Execute
4 | Read only
3 | Write and Execute
2 | Write only
1 | Execute only
0 | None
Entrada
A entrada será o número de três dígitos como uma sequência, por exemplo:
133
ou
007
Isso será passado via STDIN ou através de argumentos de função.
Saída
Sua saída deve ter as permissões diferentes para cada usuário, grupo e outros. Você deve exibir essas informações da seguinte maneira:
User: ddd
Group: ddd
Others: ddd
Onde existem três espaços depois User
, dois espaços depois Group
e um espaço depois Others
. Você substitui ddd
pelas informações de permissões.
Sua saída pode ser para STDOUT ou como uma string retornada.
Exemplos
Entrada: 666
Saída:
User: Read and Write
Group: Read and Write
Others: Read and Write
Entrada: 042
Saída:
User: None
Group: Read only
Others: Write only
Entrada: 644
Saída:
User: Read and Write
Group: Read only
Others: Read only
Ganhando
O código mais curto em bytes vence.
Respostas:
05AB1E ,
8987 bytesConvoca a codificação Cthulhu .Usa a codificação CP-1252 . Experimente online!fonte
Javascript (ES6),
165161 bytesEditar: +1 byte para cumprir a regra "sem separadores"
Exemplos
fonte
replace()
funcionem neles sem coagir. Mas posso estar perdendo o seu ponto.'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)
pode funcionar. É isso que você tinha em mente?GNU sed,
187 163158 (157 + 1) bytesExecute com -r (ERE regexp). O arquivo não contém nenhuma nova linha à direita.
fonte
and
ouonly
.s/(.)(.)/User: \1\nGroup: \2\nOthers: /
. Mais alguns bytes podem ser salvos portando para Perl, que possui\d
e\K
.C # 214 bytes
fonte
Geléia ,
100 9185 bytesQuase certamente jogável - 91 bytes, o que ?!8 meses e 6 bytes de sabedoria!- 1. mais compressão de strings;
- 2. remova o decremento pós-ordinal em 48, pois a indexação é modular;
- 3. use melhor encadeamento tácito).
-9 bytes com a ajuda do @Lynn executando compressões de string para mim
Teste em TryItOnline
Quão?
fonte
Oitava, 185 bytes
Crie uma função anônima que aceite a entrada como uma sequência: '042'. Convertê-lo para um array:
(56-'042)' = [0 4 2]
. Use isso como vários índices de célula para indexar a matriz de célulasRead Write and Execute','Read and Write', ...
. Usosfprintf
para a saída dos três cordas, com as categorias apropriadas:User:
,Group:
eOthers:
.Eu tentei encontrar uma maneira de loja
Execute
,Write
,Read
como palavras e concatenar separados, conforme necessário, mas esta acabou por mais tempo do que a abordagem ingênua.Exemplos:
Experimente online.
fonte
strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')
em vez do literal matriz de célulaPowerShell v2 +,
189168 bytesFaz
$args[0]
umchar
loop através da entrada como uma matriz. A cada iteração, indexamos em uma matriz com$i++
(o padrão é0
) para selecionarUser
,Group
ouOthers
, concatenar isso com dois pontos e uma guia, e concatenar isso com outro índice de matriz.Aqui está a mágica. Nós convertemos implicitamente o
char
para anint
e subtraímos48
(ie, transformando ASCII48
("0"
) em0
), escolhendo a expressão apropriada como uma matriz deint
s. Essa matriz é subseqüentemente usada como índice na'None','Read','Write','Execute','only','and'
matriz. Como o padrão$ofs
(Separador de campo de saída) é um espaço, ele insere corretamente espaços entre os elementos da matriz quando for stringizado (o que acontece quando concatenado à esquerda).Essas três seqüências são deixadas no pipeline e a saída via implícita
Write-Output
acontece na conclusão do programa.Exemplo
fonte
Palha , 193 bytes
Experimente online
Empurre 3 vezes uma tabela de conversão na primeira pilha, alterne para a segunda pilha, converta cada número usando a tabela de conversação e imprima.
fonte
Haskell, 186 bytes
Exemplo:
Apenas Prelude usado. Estou fazendo isso certo?
Ungolfed:
fonte
Python 2,
190185 bytesDeixa um espaço à direita se Execute or Write estiver no final da linha, mas não vi que isso não fosse permitido.
EDIT Salvei 5 bytes alterando o intervalo (3) para 0,1,2 e verificando a contagem de bytes no meu laptop Linux em vez do meu no Windows (\ n = \ r \ n ou o contrário. Nunca me lembro qual).
fonte
Python 2,
240239238237228 bytesEu pensei em finalmente dar uma chance a essa coisa de golfe frio.
Esperamos que o espaço em branco à direita seja permitido.(fixo e, no processo, salvou um byte)fonte
PHP,
169159 bytesleva string como argumento de linha de comando:
php -r '<code>' <argument>
,imprime uma nova linha líder em vez de uma fuga
Obrigado a Jörg por apontar meus erros - e pela
\t
.PHP, 169 bytes
com a nova restrição: (caractere de tabulação proibido)
Este é 1 byte mais curto do que com
str_pad
, devido ao espaço em branco adicional necessário.demolir
Para criar a matriz para
$n
, use isto:fonte
33
!bash -
221213 bytesGNU bash, version 4.3.46
Não está claro se isso pode ser condensado ainda mais, pelo menos não sem alterar fundamentalmente a abordagem aqui (dividindo a entrada e usando-a como um índice para a matriz
${b}
que contém as seqüências correspondentes).fonte
\ only
o inline expandido.grep -o .<<<$1
é mais curto queecho $1|grep -o .
, mas ler a entrada de stdin comwhile read -n1 c
é melhor. Os índices de matriz têm um contexto aritmético no bash, portanto${l[z++]}
funciona.l
seria mais curto como uma string, que seria acessada como${l:z++*8:8}
(deslocamento e comprimento têm contexto aritmético). Outro byte pode ser exibido lendo todo o modoc
, expandindo "Usuário:", ... inline e fazendo uso criterioso das expansões de parâmetros.a=" and ";x=Execute;w=Write;r=Read;b=(None $x\ only $w\ only "$w$a$x" $r\ only "$r$a$x" "$r$a$w" "$r $w$a$x");read c;echo "User: ${b[${c%??}]}\nGroup: ${b[${c:1:1}]}\nOthers: ${b[${c:2}]}"
(substitua \ n por novas linhas literais).Java 7,
300284 bytesAbordagem direta por enquanto. Tentará criar uma abordagem mais genérica para reutilizar as palavras.
Casos não testados e de teste:
Experimente aqui.
Saída:
fonte
Groovy,
217207205 bytesungolfed:
fonte
Mathematica, 211 bytes
Uma implementação direta (provavelmente facilmente superável): não calcula nada, apenas codifica cada saída possível. Entrada é um número inteiro; gera cada linha com um espaço à direita e uma nova linha à direita no geral.
IntegerDigits[#,10,3]
fornece os três dígitos da entrada (mesmo se houver zeros à esquerda). Cada dígito indica um argumento da "função"com 0 indicando o próprio nome da função.
""<>
concatena todas as seqüências de caracteres em uma lista (de listas)."\n"&~Array~3
produz as três novas linhas.fonte
Java 7, 278
Golfe:
Ungolfed:
Saída:
fonte
Python 3.5, 3.6 -
235232228216 bytes(deve funcionar em todos os Python 3.x)
Portanto, a entrada está em STDIN aqui (salva uma importação ☺).
Utilizando tuplas, omitindo espaços sempre que possível e precedência do operador em que você normalmente colocaria parênteses para deixar suas intenções claras.
Uso da amostra:
Sem golfe:
fonte
Lote, 280 bytes
A codificação das seqüências foi 47 bytes mais curta do que tentar reuni-las. Teria 267 bytes se as guias fossem legais.
fonte
C #
307241210 bytesstring X(string s){var z="User: ,Group: ,Others:,5,34,14,123,04,023,021,0123,Read,Write,and,Execute,only,None".Split(',');return string.Join("\n",s.Zip(z,(a,b)=>b+z[a-45].Aggregate("",(x,y)=>x+" "+z[y-37])));}
Formatado
fonte
C #, 322
337 348bytesCom certeza essa não é a versão mais curta, mas tentei resolver esse problema usando operadores bit a bit, já que os
chmod
valores são realmente sinalizadores de bit. Também C # provavelmente não é a melhor linguagem de golfe: Dungolfed: (com comentários)
Esta é a minha primeira vez no código de golfe, então por favor me diga, se eu fiz alguma coisa errada :)
EDIT 1:
Salvou alguns bytes substituindo
s[i]-'0'
pors[i]&7
(no final) e salvando a contagem da lista na variável:EDIT 2:
Alterado para expressão lambda:
fonte
Javascript,
213209208188186 bytesEconomizou 20 bytes graças ao Dada!
fonte
function b(p){a=" and ";r="Read";w="Write";e="Execute";v=";";o=" only";c=["None",e+o,w+o,w+a+e,r+o,r+a+e,r+a+w,r+" "+w+a+e];return"User: "+c[p[0]]+"\nGroup: "+c[p[1]]+"\nOthers: "+c[p[2]]}
.Visual Basic, 606 bytes
fonte
Cristal,
200194 bytesretorna a sequência resultante para uma determinada sequência octal como uma sequência. por exemplo:
m("670")
resultados para:User: Read and Write\nGroup: Read Write and Execute\nOthers: None
.Experimente online .
fonte
C #, 371 bytes
fonte
Python 3.5 -
370294243 bytesGolfe:
Verificação de tamanho:
Sem golfe:
Saída de amostra:
fonte
import sys
e apenas tornando o programa uma função anônima (lambda o:
...).F #,
204203 bytesmeu primeiro golfe, por favor, perdoe os erros;)
A versão golfada (com base em 1: 1 na resposta de pinkfloydx33 ):
A versão não destruída:
Exemplo de uso:
Isso é apenas para verificar se eu poderia 'melhorar' a resposta de pinkfloydx33 - não aceito nenhum crédito pelo algoritmo
fonte
PHP, 199 bytes
PHP, 189 bytes com \ t
fonte
echo str_pad("$u:",8)
vez deecho"$u:".str_repeat(" ",3-$i)
(-9); isso torna$i=>
obsoleto (-4). Nas duas versões: use em$a[$z-1]="and $a[$z-1]";
vez de{$a[]=$a[$z-1];$a[$z-1]="and";}
(-7) e emelse$a[]=$a?Only:None;
vez deelseif($z<1)$a[]=None;else$a[]=Only;
(-14). Transforme-seif(1<$z=count($a))$a[$z-1]="and $a[$z-1]";else$a[]=$a?Only:None;
emif($x=array_pop($a))$a[]=$a?"and $x":"$x Only";else$a[]=None;
(-3) e depois em$a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None;
(-10)if(4&$m=$argv[1][$i])
em vez de$m=$argv[1][$i];if(4&$m)
(-3) OU substitua$m=;if();if();if();
com um loop:foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;
(-7)Python 3, 191 bytes
destroçado
fonte
Javascript (ES6), 159 bytes
Exemplo:
fonte