Permisos de archivo
Adaptado de la UIL - Programa de Ciencias de la Computación pregunta de respuesta gratuita "Carla" para el Distrito 2018.
Introducción
En los sistemas operativos tipo UNIX, cada archivo, directorio o enlace es "propiedad" de un "usuario", que es miembro de un "grupo" y tiene ciertos "permisos" representados por una cadena de diez caracteres como " drwxrwxrwx ". El primer carácter es 'd', '-' o 'l' (directorio, archivo o enlace), seguido de tres conjuntos de valores "rwx", que indican permisos de "lectura, escritura, ejecución". El primer conjunto son los derechos del usuario, el medio establece los derechos del grupo y el tercero los derechos de todos los demás sobre ese objeto.
El permiso denegado para cualquiera de estos derechos está representado por un '-' en lugar de 'r', 'w' o 'x'. Por ejemplo, una cadena de permiso de directorio de muestra sería "drwxr - r--", que indica derechos de directorio completos para el usuario, pero derechos de "solo lectura" para el miembro del grupo y todos los demás.
Cada combinación "rwx" también se puede representar mediante un valor octal (0-7) con el bit más significativo que representa el permiso de lectura, el siguiente bit más significativo que representa el permiso de escritura y el bit menos significativo que representa el permiso de ejecución.
Reto
Dada una cadena de código de cuatro caracteres compuesta por un carácter: 'D', 'F' o 'L', seguido de un valor entero octal de tres dígitos, como 664, genera la cadena de 10 caracteres resultante que representa el valor del permiso indicado.
Entrada
Su programa o función puede leer la entrada del estándar en (se ingresarán cuatro caracteres, opcionalmente seguidos de una nueva línea) o pasar la entrada como argumento.
Su programa puede aceptar entradas en mayúsculas o minúsculas, pero debe ser coherente (todas las entradas son mayúsculas o todas las entradas son minúsculas).
Salida
Su programa debe imprimir la cadena de diez caracteres resultante que representa el valor de permiso indicado en el formato exacto especificado anteriormente. Se permite el espacio en blanco de cola.
Casos de prueba
Entrada: F664
Salida: -rw-rw-r--
Entrada: D775
Salida: drwxrwxr-x
Entrada: L334
Salida: l-wx-wxr--
Entrada: F530
Salida: -r-x-wx---
Entrada: D127
Salida:d--x-w-rwx
Puntaje y Reglas
- Los agujeros de bucle estándar están prohibidos.
- Aplican reglas estándar .
- Proporcione un enlace para probar su código, así como una explicación.
- Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Respuestas:
Jalea , 19 bytes
Pruébalo en línea!
Cómo funciona
fuente
bash,
5953 bytes¿Herramienta adecuada para el trabajo?
Gracias a Dennis por guardar 5 bytes y HTNW por guardar uno.
Pruébalo en línea!
fuente
chmod ${1:1} a>a;stat -c%A a|sed "s/-/\L${1:0:1}/;s/f/-/"
Guarda dos bytes.tr
lugar dey
:chmod ${1:1} a>a;stat -c%A a|sed s/./\\L${1:0:1}/|tr f -
a
y que el usuario tiene permiso para crearlo o que existe el archivoa
y el usuario puede escribirlo? Porque si hay un archivoa
propiedad deroot
con permisos700
, esto no debería funcionar.Python 2 , 78 bytes
Toma entrada como personaje y tres entradas.
Pruébalo en línea!
Explicación
[a,'-'][a=='f']
toma el carácter de entrada o-
, si el carácter esf
.'-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]
es esencialmente una conversión octal para obtener larwx
cadena.fuente
Perl 5 con
-p
37 bytesToma entrada en minúsculas.
Pruébalo en línea!
fuente
Retina 0.8.2 , 43 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Toma entrada en minúsculas. Explicación:
Por triplicado cada dígito, con sufijo
r
,w
yx
.Cambia todas las letras incorrectas a
-
s.Eliminar los dígitos restantes.
fuente
Retina , 51 bytes
Pruébalo en línea!
No tengo idea de cómo usar Retina, así que hágame saber cómo hacerlo mejor. Solo pensé que intentaría aprender al menos un idioma que no sea Pyth.
Explicación:
Reemplace
f
con-
(saliented
yl
sin cambios), luego reemplace cada dígito con el apropiadorwx
.fuente
JavaScript (ES6), 63 bytes
Espera la cadena de entrada en minúsculas.
Pruébalo en línea!
Comentado
fuente
Carbón , 27 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
fuente
Haskell ,
848381 bytesPruébalo en línea!
Terminó siendo bastante similar en concepto a la respuesta de Python 2 de Mnemonic. f crea el tipo de archivo, el resto son los permisos obtenidos del número octal. Este realmente me hizo desear y fue un bit a bit y operador incluido en el preludio.
fuente
div
lugar dequot
.Java 8, 100 bytes
Pruébalo en línea.
Puerto de la respuesta de Retina de @Neil .
Explicación:
fuente
.replaceAll
sean aún menos bytes que un bucle con.replaceAll
y agregadosreturn
y String-array ... Pero el crédito, por supuesto, corresponde a Neil , cuya respuesta Retina usé como base para el puerto.Jalea , 21 bytes
Un programa completo de impresión a STDOUT. (Como enlace monádico, el valor de retorno es una lista que contiene un carácter y una lista de tres listas de caracteres).
Pruébalo en línea! O vea el conjunto de pruebas .
¿Cómo?
fuente
Perl 6
-p
, 37 bytesPruébalo en línea!
Solución Perl 5 del puerto de Dom Hastings.
fuente
Retina , 38 bytes
Inspirado en un comentario de solo ASCII .
Pruébalo en línea!
La idea es convertir cada dígito a unario (el dígito unario predeterminado en Retina es
_
) con tres iniciales-
, y luego convertir los dígitos binarios del más significativo al menos significativo.fuente
Python 3 , 71 bytes
Pruébalo en línea!
Python 3.3+ tiene una función incorporada para eso, aunque debido a la necesidad de una importación y las diferencias en el formato de entrada esperado, no es muy amigable para el golf.
fuente
Tcl , 139 bytes
Pruébalo en línea!
Tcl , 144 bytes
Pruébalo en línea!
Tcl , 149 bytes
Pruébalo en línea!
Tcl , 150 bytes
Pruébalo en línea!
Tcl , 180 bytes
Pruébalo en línea!
Todavía muy poco golfista!fuente
Java (JDK 10) , 118 bytes
Pruébalo en línea!
Créditos
fuente
fdl
, puede cambiarvar r=s[0]<70?"d":s[0]<72?"-":"l";
avar r=s[0]=='f'?"-":s[0]+"";
para guardar 6 bytes. Además,.toCharArray()
puede ser.split("")
guardar 4 bytes adicionales.""+
siguiente para "convertir" achar
en aString
);) ¡Gracias!Excel, 224 bytes
Hecho en 4 etapas:
Y 3 veces:
Intentando ser más inteligente, agrega
25 bytes
por conjunto de derechos, 75 en total:fuente
05AB1E ,
3427 bytesPruébalo en línea!
Golfed 7 bytes por @MagicOctopusUrn
fuente
ćls8βbvyi…rwx3*Nèë'-}J'f'-:
por 7 menos ...f
solo estoy reemplazando todosf
los de la cadena final con-
.i <CODE FOR TRUE> ë <CODE FOR FALSE> }
Python 2 , 238 bytes
Pruébalo en línea!
Asumí que esto sería una gota en el cubo, pero me equivoqué. Probablemente debería haberse dado cuenta de que una lambda no era la mejor idea en algún momento.
fuente
APL + WIN, 55 bytes
Solicita una cadena de entrada con minúsculas de caracteres iniciales:
Explicación:
fuente
Python 3 , 77 bytes
Pruébalo en línea!
fuente
J ,
5752 bytes¡5 bytes guardados gracias a FrownyFrog!
Pruébalo en línea!
Sin embargo, otra solución larga ... No sé cómo hacer que el
}
trabajo en verbos tácitos y por eso usé mucho más tiempo{"0 1&.|:
para la selección.Explicación:
@}.
Suelta el primer símbolo y,.&.":
convertir el resto a una lista de dígitos desimales]:#:
Convierta cada dígito en una lista de dígitos binarios (y tape la bifurcación)('-',:'rwx')
crea una tabla de 2 filas y usa 0 para seleccionar desde su primera fila / 1 - desde su segunda{"0 1&.|:~
usa los dígitos binarios para seleccionar de la tabla de arriba[:,
aplana el resultado('d-l'{~'DFL'i.{.)
formatea el primer símbolo,
agrega el símbolo fisrt a la lista de permisosfuente
1#:@}."."0
('d-l'{~'DFL'i.{.)
→-&.('-DLld'i.{.)
i.
y&.
muchas gracias! Por cierto, ¿puedes explicarme cómo usar select}
en los verbos tácitos?2 2 2&#:`('-',:'rwx'"_)}@"."0@}.
tiene exactamente la misma longitud333
:)PHP, 68 bytes
se traduce
f
en una entrada en minúscula al guión bajo y cada número octal a surwx
equivalente, usando guiones bajos en lugar de guiones (para ahorrar la necesidad de comillas), luego reemplaza_
con-
.Ejecutar como tubería con
-nF
o probarlo en línea .fuente
C (gcc) ,
109104bytesAl menos C puede convertir la entrada octal .... :-)
Editar: me di cuenta de que el modificador de tamaño no era estrictamente necesario, ¡y eso
putchar()
es más corto queprintf()
en este caso!Pruébalo en línea!
Original:
Pruébalo en línea!
fuente