Reto
Dado un número de permisos octales de tres dígitos, genera los permisos que otorga.
chmod
En sistemas operativos UNIX, los permisos de los archivos se cambian con el chmod
comando Hay pocas formas diferentes de usar chmod, pero la que nos centraremos hoy es usar permisos octales.
Los tres dígitos en el número de permisos representan a una persona diferente:
- El primer dígito representa los permisos para el usuario.
- El segundo dígito representa los permisos para el grupo.
- El último dígito representa los permisos para otros.
A continuación, cada dígito representa un permiso como se muestra a continuación en:
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
La entrada será el número de tres dígitos como una cadena, por ejemplo:
133
o
007
Esto se transmitirá a través de STDIN o mediante argumentos de función.
Salida
Su salida debe ser los diferentes permisos para cada uno de los usuarios, el grupo y los demás. Debe mostrar esta información así:
User: ddd
Group: ddd
Others: ddd
Donde hay tres espacios después User
, dos espacios después Group
y un espacio después Others
. Reemplaza ddd
con la información de permisos.
Su salida puede ser STDOUT o como una cadena devuelta.
Ejemplos
Entrada: 666
Salida:
User: Read and Write
Group: Read and Write
Others: Read and Write
Entrada: 042
Salida:
User: None
Group: Read only
Others: Write only
Entrada: 644
Salida:
User: Read and Write
Group: Read only
Others: Read only
Victorioso
El código más corto en bytes gana.
Respuestas:
05AB1E ,
8987 bytesInvoca la codificación Cthulhu .Utiliza la codificación CP-1252 . Pruébalo en línea!fuente
Javascript (ES6),
165161 bytesEditar: +1 byte para cumplir con la regla de "no tab"
Ejemplos
fuente
replace()
funcionen en ellos sin coacción. Pero puedo estar perdiendo tu punto.'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)
podría funcionar. ¿Eso es lo que tenías en mente?GNU sed,
187163158(157 + 1) bytesEjecutar con -r (ERE regexp). El archivo no contiene una nueva línea final.
fuente
and
oonly
.s/(.)(.)/User: \1\nGroup: \2\nOthers: /
. Se podrían guardar algunos bytes más portando a Perl, que tiene\d
y\K
.C # 214 bytes
fuente
Jalea ,
100 9185 bytesCasi seguro golfable - 91 bytes, ¿qué?¡8 meses y 6 bytes de sabiduría!- 1. más compresión de cuerda;
- 2. eliminar el decremento post-ordinal en 48 ya que la indexación es modular;
- 3. use un mejor encadenamiento tácito).
-9 bytes con la amable ayuda de @Lynn ejecutando compresiones de cadena para mí
Pruébelo en TryItOnline
¿Cómo?
fuente
Octava, 185 bytes
Cree una función anónima que tome la entrada como una cadena: '042'. Convertirlo en una matriz:
(56-'042)' = [0 4 2]
. Use esto como múltiples índices de celdas para indexar la matriz de celdas conRead Write and Execute','Read and Write', ...
. Usosfprintf
para dar salida a las tres cadenas, con las categorías apropiadas:User:
,Group:
yOthers:
.He intentado encontrar una manera de almacenar
Execute
,Write
,Read
como palabras separadas y concatenar como sea necesario, pero esto resultó más largo que el enfoque ingenuo.Ejemplos:
Pruébalo en línea.
fuente
strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')
lugar del literal de matriz de celdasPowerShell v2 +,
189168bytesRecorre la entrada
$args[0]
en forma dechar
matriz. Cada iteración, indexamos en una matriz con$i++
(por defecto0
) para seleccionarUser
,Group
oOthers
, concatenar eso con dos puntos y una pestaña, y concatenar eso con otro índice de matriz.Aquí está la magia. Implícitamente convertimos
char
a anint
y restamos48
(es decir, convertir ASCII48
("0"
) en0
), eligiendo la redacción adecuada como una matriz deint
s. Esa matriz se utiliza posteriormente como el índice en la'None','Read','Write','Execute','only','and'
matriz. Como el valor predeterminado$ofs
(Separador de campo de salida) es un espacio, esto inserta correctamente espacios entre los elementos de la matriz cuando se encadena (lo que ocurre cuando se concatena a la izquierda).Estas tres cadenas se dejan en la tubería, y la salida por vía implícita
Write-Output
ocurre al finalizar el programa.Ejemplo
fuente
Paja , 193 bytes.
Pruébalo en línea
Presione 3 veces una tabla de conversión en la primera pila, cambie a la segunda pila, convierta cada número usando la tabla de conversación e imprima.
fuente
Haskell, 186 bytes
Ejemplo:
Solo Preludio usado. ¿Lo estoy haciendo bien?
Sin golf:
fuente
Python 2,
190185 bytesDeja un espacio final si Ejecutar o Escribir están al final de la línea, pero no vi que esto no estaba permitido.
EDITAR Guarde 5 bytes cambiando el rango (3) a 0,1,2 y verificando el recuento de bytes en mi computadora portátil Linux en lugar de mi Windows (\ n = \ r \ n o al revés. Nunca puedo recordar cuál).
fuente
Python 2,
240239238237228 bytesPensé que finalmente le daría una oportunidad a esta cosa fría del golf.
Esperemos que se permita el espacio en blanco al final.(arreglado, y en el proceso guardado un byte)fuente
PHP,
169159 bytestoma cadena como argumento de la línea de comandos:
php -r '<code>' <argument>
,imprime una nueva línea que lleva en lugar de uno de fuga
Gracias a Jörg por señalar mis errores, y por el
\t
.PHP, 169 bytes
con la nueva restricción: (carácter de tabulación prohibido)
Esto es 1 byte más corto que con
str_pad
, debido al espacio en blanco adicional que requeriría.Descompostura
Para crear la matriz para
$n
, use esto:fuente
33
!bash
221213 bytesGNU bash, version 4.3.46
No está claro si esto se puede condensar más, al menos no sin cambiar fundamentalmente el enfoque aquí (dividir la entrada y usarla como un índice para la matriz
${b}
que contiene las cadenas correspondientes).fuente
\ only
línea expandida.grep -o .<<<$1
es más corto queecho $1|grep -o .
, pero leer la entrada de stdin conwhile read -n1 c
es mejor. Los índices de matriz tienen contexto aritmético en bash, por lo que${l[z++]}
funciona.l
sería más corto como una cadena, a la que se accedería como${l:z++*8:8}
(desplazamiento y longitud tienen contexto aritmético). Se puede cambiar otro byte leyendo todo el modoc
, expandiendo "Usuario:", ... en línea y haciendo un uso juicioso de las expansiones 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}]}"
(reemplace \ n con nuevas líneas literales).Java 7,
300284 bytesEnfoque directo por ahora. Intentará idear un enfoque más genérico para reutilizar las palabras.
Sin golf y casos de prueba:
Pruébalo aquí
Salida:
fuente
Groovy,
217207205 bytessin golf:
fuente
Mathematica, 211 bytes
Una implementación sencilla (probablemente fácil de superar): no computa nada, solo codifica cada salida posible. La entrada es un entero; genera cada línea con un espacio final y una nueva línea general en general.
IntegerDigits[#,10,3]
da los tres dígitos de la entrada (incluso si hay ceros a la izquierda). Cada dígito indica un argumento de la "función"con 0 indicando el nombre de la función en sí.
""<>
concatena todas las cadenas en una lista (de listas)."\n"&~Array~3
produce las tres nuevas líneas.fuente
Java 7, 278
Golfizado:
Sin golf:
Salida:
fuente
Python 3.5, 3.6 -
235232228216 bytes(debería funcionar en todos los Python 3.x)
Entonces la entrada está en STDIN aquí (guarda una importación ☺).
Haciendo uso de tuplas, omitiendo espacios donde sea posible y precedencia del operador donde normalmente pondría paréntesis para aclarar sus intenciones.
Uso de la muestra:
Sin golf:
fuente
Lote, 280 bytes
Codificar las cadenas fue 47 bytes más corto que intentar juntarlas. Hubiera sido 267 bytes si las pestañas fueran legales.
fuente
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])));}
Formateado
fuente
C #, 322
337 348bytesEsa no es la versión más corta, pero intenté resolver este problema utilizando operadores bit a bit ya que los
chmod
valores son en realidad indicadores de bits. Además, C # probablemente no sea el mejor lenguaje de golf: Dsin golf: (con comentarios)
Este es mi primer código de golf, así que dígame si hice algo mal :)
EDITAR 1:
Se guardaron algunos bytes reemplazándolos
s[i]-'0'
pors[i]&7
(al final) y guardando el recuento de la lista en la variable:EDITAR 2:
Cambiado a la expresión lambda:
fuente
Javascript,
213209208188186 bytes¡Ahorró 20 bytes gracias a Dada!
fuente
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
fuente
Cristal,
200194 Bytesdevuelve la cadena resultante para una secuencia octal dada como una cadena. por ejemplo:
m("670")
resultados a:User: Read and Write\nGroup: Read Write and Execute\nOthers: None
.Pruébalo en línea .
fuente
C #, 371 bytes
fuente
Python 3.5 -
370294243 bytesGolfizado:
Comprobación de tamaño:
Sin golf:
Salida de muestra:
fuente
import sys
y simplemente haciendo que el programa sea una función anónima (lambda o:
...).F #,
204203bytesmi primer golf, así que perdone cualquier error;)
La versión golfizada (basada en 1: 1 en la respuesta de pinkfloydx33 ):
La versión sin golf:
Ejemplo de uso:
Esto es solo para verificar si puedo 'mejorar' la respuesta de pinkfloydx33 : no me atribuyo ningún crédito por el algoritmo
fuente
PHP, 199 bytes
PHP, 189 Bytes con \ t
fuente
echo str_pad("$u:",8)
lugar deecho"$u:".str_repeat(" ",3-$i)
(-9); esto hace$i=>
obsoleto (-4). En ambas versiones: use en$a[$z-1]="and $a[$z-1]";
lugar de{$a[]=$a[$z-1];$a[$z-1]="and";}
(-7) y enelse$a[]=$a?Only:None;
lugar deelseif($z<1)$a[]=None;else$a[]=Only;
(-14). Conviértaseif(1<$z=count($a))$a[$z-1]="and $a[$z-1]";else$a[]=$a?Only:None;
enif($x=array_pop($a))$a[]=$a?"and $x":"$x Only";else$a[]=None;
(-3) y luego en$a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None;
(-10)if(4&$m=$argv[1][$i])
lugar de$m=$argv[1][$i];if(4&$m)
(-3) O reemplazar$m=;if();if();if();
con un bucle:foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;
(-7)Python 3, 191 bytes
sin golf
fuente
Javascript (ES6), 159 bytes
Ejemplo:
fuente