Défi
Étant donné un nombre d'autorisations octal à trois chiffres, affichez les autorisations qu'il accorde.
chmod
Sous UNIX OS, les autorisations de fichier sont modifiées à l'aide de chmod
commande. Il y a peu de façons différentes d'utiliser chmod, mais celle sur laquelle nous nous concentrerons aujourd'hui utilise les autorisations octales.
Les trois chiffres du numéro d'autorisation représentent une personne différente:
- Le premier chiffre représente les autorisations pour l' utilisateur
- Le deuxième chiffre représente les autorisations pour le groupe
- Le dernier chiffre représente les autorisations pour les autres
Ensuite, chaque chiffre représente une autorisation comme indiqué ci-dessous dans:
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
Contribution
L'entrée sera le nombre à trois chiffres sous forme de chaîne, par exemple:
133
ou
007
Cela sera transmis via STDIN ou via des arguments de fonction.
Sortie
Votre sortie doit être les différentes autorisations pour chacun des utilisateurs, le groupe et les autres. Vous devez afficher ces informations comme suit:
User: ddd
Group: ddd
Others: ddd
Où il y a trois espaces après User
, deux espaces après Group
et un espace après Others
. Vous remplacez ddd
par les informations sur les autorisations.
Votre sortie peut être vers STDOUT ou sous forme de chaîne renvoyée.
Exemples
Entrée: 666
Sortie:
User: Read and Write
Group: Read and Write
Others: Read and Write
Entrée: 042
Sortie:
User: None
Group: Read only
Others: Write only
Entrée: 644
Sortie:
User: Read and Write
Group: Read only
Others: Read only
Gagnant
Le code le plus court en octets gagne.
Réponses:
05AB1E ,
8987 octetsInvoque l' encodage Cthulhu .Utilise l' encodage CP-1252 . Essayez-le en ligne!la source
Javascript (ES6),
165161 octetsModifier: +1 octet pour respecter la règle "sans tabulation"
Exemples
la source
replace()
fonctionne sans contrainte. Mais je manque peut-être votre point.'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)
pourrait fonctionner. Est-ce ce que tu avais en tête?GNU sed,
187163(157 + 1) octetsExécutez avec -r (expression rationnelle ERE). Le fichier ne contient aucune nouvelle ligne de fin.
la source
and
ouonly
.s/(.)(.)/User: \1\nGroup: \2\nOthers: /
. Quelques octets supplémentaires pourraient être enregistrés en portant sur Perl, qui a\d
et\K
.C # 214 octets
la source
Gelée ,
100 9185 octetsPresque certainement jouable au golf - 91 octets, quoi?!8 mois et 6 octets de sagesse!- 1. plus de compression de cordes;
- 2. supprimer le décrément post-ordinal de 48 car l'indexation est modulaire;
- 3. utiliser un meilleur chaînage tacite).
-9 octets avec l'aimable aide de @Lynn exécutant des compressions de chaînes pour moi
Testez-le sur TryItOnline
Comment?
la source
Octave, 185 octets
Créez une fonction anonyme qui prend l'entrée sous forme de chaîne: '042'. Convertir à un tableau:
(56-'042)' = [0 4 2]
. Utilisez-le comme plusieurs indices de cellule pour indexer le tableau de cellules avecRead Write and Execute','Read and Write', ...
. Les utilisationsfprintf
à produire les trois chaînes, avec les catégories appropriées:User:
,Group:
etOthers:
.J'ai essayé de trouver un moyen de stocker
Execute
,Write
,Read
comme des mots séparés et concaténer au besoin, mais se sont avérés plus que l'approche naïve.Exemples:
Essayez-le en ligne.
la source
strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')
au lieu du littéral de tableau de cellulesPowerShell v2 +,
189168octetsBoucle à travers l'entrée
$args[0]
sous forme dechar
tableau. Chaque itération, nous index dans un tableau avec$i++
(par défaut0
) pour sélectionnerUser
,Group
ouOthers
, concaténer que par deux points et une languette, et que concaténer avec un autre indice de tableau.Voici la magie. Nous transcrivons implicitement le
char
dans unint
et soustrayons48
(c'est-à-dire, transformons ASCII48
("0"
) en0
), en choisissant la formulation appropriée comme un tableau deint
s. Ce tableau est ensuite utilisé comme index dans le'None','Read','Write','Execute','only','and'
tableau. Depuis la valeur par défaut$ofs
(Output Field Separator) est un espace, cela insère correctement les espaces entre les éléments du tableau lors de la chaîne (ce qui se produit lorsqu'il concatène à gauche).Ces trois chaînes sont laissées sur le pipeline et sorties via implicite
Write-Output
se produit à la fin du programme.Exemple
la source
Paille , 193 octets
Essayez-le en ligne
Appuyez 3 fois sur une table de conversion sur la première pile, passez à la deuxième pile, convertissez chaque nombre à l'aide de la table de conversation et imprimez.
la source
Haskell, 186 octets
Exemple:
Seul Prelude a été utilisé. Suis-je en train de faire ça?
Non golfé:
la source
Python 2,
190185 octetsLaisse un espace de fin si Execute ou Write sont à la fin de la ligne mais je n'ai pas vu que cela n'était pas autorisé.
EDIT Sauvegardé 5 octets en changeant la plage (3) à 0,1,2 et en vérifiant le nombre d'octets sur mon ordinateur portable Linux au lieu de mon ordinateur Windows (\ n = \ r \ n ou l'inverse. Je ne me souviens jamais lequel).
la source
Python 2,
240239238237228 octetsJ'ai pensé que j'allais enfin essayer ce golf froid.
Espérons que les espaces vides soient autorisés.(corrigé, et dans le processus enregistré un octet)la source
PHP,
169159 octetsprend la chaîne comme argument de ligne de commande:
php -r '<code>' <argument>
,imprime un premier saut de ligne au lieu d'une fuite
Merci à Jörg d'avoir signalé mes bugs - et pour le
\t
.PHP, 169 octets
avec la nouvelle restriction: (caractère de tabulation interdit)
C'est 1 octet plus court qu'avec
str_pad
, à cause du blanc supplémentaire qu'il nécessiterait.panne
Pour créer le tableau pour
$n
, utilisez ceci:la source
33
!bash -
221213 octetsGNU bash, version 4.3.46
On ne sait pas encore si cela peut être condensé, du moins pas sans changer fondamentalement l'approche ici (fractionner l'entrée et l'utiliser comme index du tableau
${b}
qui contient les chaînes correspondantes).la source
\ only
une ligne élargie.grep -o .<<<$1
est plus court queecho $1|grep -o .
, mais ilwhile read -n1 c
est préférable de lire l'entrée de stdin avec . Les index de tableau ont un contexte arithmétique dans bash, donc ça${l[z++]}
marche.l
serait plus court comme une chaîne, qui serait accessible en tant que${l:z++*8:8}
(décalage et longueur ont un contexte arithmétique). Un autre octet peut être affiché en lisant l'intégralité du mode dansc
, en développant "User:", ... en ligne et en utilisant judicieusement les extensions de paramètres.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}]}"
(remplacez \ n par des retours à la ligne littéraux).Java 7,
300284 octetsApproche directe pour l'instant. J'essaierai de trouver une approche plus générique pour réutiliser les mots.
Cas non testés et testés:
Essayez-le ici.
Sortie:
la source
Groovy,
217207205 octetsnon golfé:
la source
Mathematica, 211 octets
Une implémentation simple (probablement facilement battable): ne calcule rien, juste code dur chaque sortie possible. L'entrée est un entier; sort chaque ligne avec un espace de fin et une nouvelle ligne de fin globale.
IntegerDigits[#,10,3]
donne les trois chiffres de l'entrée (même s'il y a des zéros en tête). Chaque chiffre indique un argument de la "fonction"avec 0 indiquant le nom de la fonction elle-même.
""<>
concatène toutes les chaînes d'une liste (de listes)."\n"&~Array~3
produit les trois nouvelles lignes.la source
Java 7, 278
Golfé:
Non golfé:
Sortie:
la source
Python 3.5, 3,6 -
235232228216 216 octets(devrait fonctionner sur tous les Python 3.x)
Donc, l'entrée est sur STDIN ici (enregistre une importation ☺).
Utiliser des tuples, en omettant les espaces lorsque cela est possible et la priorité de l'opérateur où vous mettriez normalement des parenthèses pour clarifier vos intentions.
Exemple d'utilisation:
Non-golfé:
la source
Lot, 280 octets
Le codage en dur des chaînes était 47 octets plus court que d'essayer de les assembler. Aurait été de 267 octets si les tabulations étaient légales.
la source
C #
307241210 octetsstring 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])));}
Formaté
la source
C #, 322
337 348octetsCe n'est certainement pas la version la plus courte, mais j'ai essayé de résoudre ce problème en utilisant des opérateurs au niveau du bit car les
chmod
valeurs sont en fait des indicateurs de bit. De plus, C # n'est probablement pas le meilleur langage de golf: Dnon golfé: (avec commentaires)
C'est mon premier code de golf, alors dites-moi si j'ai mal fait :)
EDIT 1:
Enregistré quelques octets en remplaçant
s[i]-'0'
pars[i]&7
(à la toute fin) et en enregistrant le nombre de listes dans la variable:EDIT 2:
Modifié en expression lambda:
la source
Javascript,
213209208188186 octetsÉconomisé 20 octets grâce à Dada!
la source
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 octets
la source
Cristal,
200194 octetsrenvoie la chaîne résultante pour une séquence octale donnée sous forme de chaîne. par exemple:
m("670")
résultats à:User: Read and Write\nGroup: Read Write and Execute\nOthers: None
.Essayez-le en ligne .
la source
C #, 371 octets
la source
Python 3,5 -
370294243 octetsGolfé:
Vérification de la taille:
Non-golfé:
Exemple de sortie:
la source
import sys
et en faisant simplement du programme une fonction anonyme (lambda o:
...).F #,
204203 octetsmon premier golf, alors pardonnez toutes les erreurs;)
La version golfée (basée 1: 1 sur la réponse de pinkfloydx33 ):
La version non golfée:
Exemple d'utilisation:
C'est uniquement pour vérifier si je pouvais "améliorer" la réponse de pinkfloydx33 - je ne prends aucun crédit pour l'algorithme
la source
PHP, 199 octets
PHP, 189 octets avec \ t
la source
echo str_pad("$u:",8)
au lieu deecho"$u:".str_repeat(" ",3-$i)
(-9); cela rend$i=>
obsolète (-4). Dans les deux versions: utilisez$a[$z-1]="and $a[$z-1]";
au lieu de{$a[]=$a[$z-1];$a[$z-1]="and";}
(-7) etelse$a[]=$a?Only:None;
au lieu deelseif($z<1)$a[]=None;else$a[]=Only;
(-14). Transformezif(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) puis en$a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None;
(-10)if(4&$m=$argv[1][$i])
au lieu de$m=$argv[1][$i];if(4&$m)
(-3) OU remplacez$m=;if();if();if();
par une boucle:foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;
(-7)Python 3, 191 octets
non golfé
la source
Javascript (ES6), 159 octets
Exemple:
la source