Uprawnienia do plików

26

Uprawnienia do plików

Zaadaptowano z bezpłatnej odpowiedzi na pytanie „Carla” z UIL - Computer Science Programming dla dystryktu 2018.

Wprowadzenie

W systemach operacyjnych typu UNIX każdy plik, katalog lub łącze jest „własnością” „użytkownika”, który jest członkiem „grupy” i ma pewne „uprawnienia” reprezentowane przez ciąg dziesięciu znaków, taki jak „ drwxrwxrwx ". Pierwszym znakiem jest „d”, „-” lub „l” (katalog, plik lub link), a następnie trzy zestawy wartości „rwx”, wskazujące uprawnienia „odczyt, zapis, wykonanie”. Pierwszy zestaw to prawa użytkownika, środkowy zestaw prawa grupy, a trzeci prawa wszystkich innych do tego obiektu.

Odmowa dostępu do któregokolwiek z tych praw jest reprezentowana przez „-” zamiast „r”, „w” lub „x”. Na przykład przykładowy ciąg uprawnień do katalogu to „drwxr - r--”, wskazujący pełne uprawnienia do katalogu dla użytkownika, ale uprawnienia „tylko do odczytu” dla członka grupy i wszystkich innych.

Każda kombinacja „rwx” może być również reprezentowana przez wartość ósemkową (0–7) z najbardziej znaczącym bitem reprezentującym uprawnienie do odczytu, kolejnym najbardziej znaczącym bitem reprezentującym uprawnienie do zapisu i najmniej znaczącym bitem reprezentującym uprawnienie do wykonania.

Wyzwanie

Biorąc pod uwagę czteroznakowy ciąg kodu składający się ze znaku: „D”, „F” lub „L”, po którym następuje trzycyfrowa liczba ósemkowa, np. 664, zwraca wynikowy ciąg 10 znaków reprezentujący wartość uprawnień wskazany.

Wkład

Twój program lub funkcja może albo odczytać dane wejściowe ze standardowego wejścia (zostaną wprowadzone cztery znaki, opcjonalnie po nich nowa linia), albo przekazać dane wejściowe jako argument.

Twój program może przyjmować duże lub małe litery, ale musi być spójny (wszystkie dane wejściowe są pisane wielkimi literami lub wszystkie dane wejściowe są pisane małymi literami).

Wydajność

Twój program musi wydrukować wynikowy ciąg dziesięciu znaków reprezentujący wartość uprawnień wskazaną w dokładnie określonym formacie określonym powyżej. Dozwolone jest ogonowanie białych znaków.

Przypadki testowe

W: F664OUT: -rw-rw-r--
IN: D775OUT: drwxrwxr-x
IN: L334OUT: l-wx-wxr--
IN: F530OUT: -r-x-wx---
w: D127Out:d--x-w-rwx

Punktacja i zasady

Billylegota
źródło
Poczekaj co, zapytałeś wczoraj i odpowiedź już przyjęta? Czy to oznacza, że ​​nie należy się już spodziewać odpowiedzi?
Nit
1
@Nit Więcej odpowiedzi są zawsze mile widziane, niezależnie od tego, czy odpowiedź zostanie zaakceptowana.
isaacg
1
@Nit Byłem na telefonie komórkowym i próbowałem głosować na niezwiązaną z tym odpowiedź (która została usunięta). Przypadkowo wcisnąłem gruby palec przycisk akceptacji odpowiedzi. Nie mogłem wymyślić, jak go nie zaakceptować, więc właśnie zmieniłem zaakceptowaną odpowiedź na najkrótszą.
Billylegota,
2
@Nit Mam na myśli ... przyjął odpowiedź Dennisa, więc szczerze mówiąc, może mieć rację.
Magic Octopus Urn

Odpowiedzi:

7

Galaretka , 19 bajtów

“rwx“-”Œp⁺;Ṁ⁾f-yị@~

Wypróbuj online!

Jak to działa

“rwx“-”Œp⁺;Ṁ⁾f-yị@~  Main link. Argument: s (string)

“rwx“-”              Set the return value to ["rwx, "-"].
       Œp            Take the Cartesian product, yielding ["r-", "w-", "x-"].
         ⁺           Take the Cartesian product, yielding
                     ["rwx", "rw-", "r-x", "r--", "-wx", "-w-", "--x", "---"].
          ;Ṁ         Append the maximum of s (the letter).
            ⁾f-y     Translate 'f' to '-'.
                  ~  Map bitwise NOT over s.
                     This maps the letter to 0, because it cannot be cast to int,
                     and each digit d to ~d = -(d+1).
                ị@   Retrieve the results from the array to the left at the indices
                     calculated to the right.
                     Indexing is modular and 1-based, so the letter from s is at
                     index 0, "---" at index -1, ..., and "rwx" at index -8.
Dennis
źródło
16

bash, 59 53 bajtów

chmod ${1:1} a>a;stat -c%A a|sed s/./${1:0:1}/|tr f -

Odpowiednie narzędzie do pracy?

Podziękowania dla Dennisa za zapisanie 5 bajtów i HTNW za zapisanie jednego.

Wypróbuj online!

chmod ${1:1} a>a;  # call chmod with the input with its first character removed
                   # note that the redirection creates the file a *before* the
                   #   chmod is run, because of the way bash works
stat -c%A a|       # get the human readable access rights
sed s/./${1:0:1}/  # replace the first character with the first char of input
|tr f -            # transliterate, replacing f with -
Klamka
źródło
Cóż, to było szybkie. Z pewnością odpowiednie narzędzie do pracy.
Billylegota
chmod ${1:1} a>a;stat -c%A a|sed "s/-/\L${1:0:1}/;s/f/-/"oszczędza dwa bajty.
Dennis
Schodzili @Dennis, myślę, że można golić się jedną z bardziej trzamiast y:chmod ${1:1} a>a;stat -c%A a|sed s/./\\L${1:0:1}/|tr f -
HTNW
2
Czy można założyć, że nie ma pliku, aa użytkownik ma pozwolenie na jego utworzenie, czy plik aistnieje i użytkownik może zapisywać? Bo jeśli istnieje plik awłasność rootz uprawnieniami 700, to nie powinno działać.
NoOneIsHere
2
@NoOneIsHere Podczas gdy w szczególności uprawnienia nigdy nie pojawiły się w dyskusji, społeczność zdecydowała, że tworzenie plików tymczasowych w bieżącym katalogu jest domyślnie dozwolone . Przez rozszerzenie możemy założyć, że jest to możliwe.
Dennis
10

Python 2 , 78 bajtów

lambda a,*b:[a,'-'][a=='f']+''.join('-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]for x in b)

Pobiera dane wejściowe jako znak i trzy liczby całkowite.
Wypróbuj online!

Wyjaśnienie

[a,'-'][a=='f']przyjmuje znak wejściowy lub -, jeśli znak jest f.
'-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]jest zasadniczo konwersją ósemkową, aby uzyskać rwxciąg.


źródło
5

Perl 5 z -p, 37 bajtów

s/\d/(<{-,r}{-,w}{-,x}>)[$&]/ge;y;f;-

Pobiera dane pisane małymi literami.

Wypróbuj online!

Dom Hastings
źródło
5

Retina 0.8.2 , 43 bajty

\d
$&r$&w$&x
f|[0-3]r|[0145]w|[0246]x
-
\d

Wypróbuj online! Link zawiera przypadki testowe. Wprowadza dane pisane małymi literami. Wyjaśnienie:

\d
$&r$&w$&x

Potrójnie każdą cyfrę, z przyrostkiem r, wi x.

f|[0-3]r|[0145]w|[0246]x
-

Zmień wszystkie niepoprawne litery na -s.

\d

Usuń pozostałe cyfry.

Neil
źródło
4

Siatkówka , 51 bajtów

f
-
0
---
1
--x
2
-w-
3
-wx
4
r--
5
r-x
6
rw-
7
rwx

Wypróbuj online!

Nie mam pojęcia, jak korzystać z Retina, więc daj mi znać, jak to zrobić lepiej. Pomyślałem, że spróbuję nauczyć się co najmniej jednego języka, który nie jest Pyth.

Wyjaśnienie:

Wymienić fz -(pozostawiając di lniezmieniony), następnie zastąpić każdą cyfrę z odpowiednio rwx.


źródło
: / Mogę dostać w miarę tego , ale nie dalej. a sprytny sposób jest super niemądry
tylko ASCII,
Byłoby tak dużo golfistów z jakimś trójskładnikowym / logicznym lub / dodającym i trymującym operatorem
tylko ASCII
@ Tylko ASCII Twój pomysł był całkiem fajny, wykorzystałem go do tej odpowiedzi :)
Leo
4

JavaScript (ES6), 63 bajty

Oczekuje, że ciąg wejściowy pisany małymi literami.

s=>s.replace(/\d|f/g,c=>1/c?s[c&4]+s[c&2]+s[c&1]:'-',s='-xw-r')

Wypróbuj online!

Skomentował

s => s.replace(   // replace in the input string s
  /\d|f/g, c =>   //   each character c which is either a digit or the letter 'f'
    1 / c ?       //   if c is a digit:
      s[c & 4] +  //     append '-' or 'r'
      s[c & 2] +  //     append '-' or 'w'
      s[c & 1]    //     append '-' or 'x'
    :             //   else:
      '-',        //     just replace 'f' with '-'
  s = '-xw-r'     //   s holds the permission characters
)                 // end of replace()
Arnauld
źródło
4

Węgiel drzewny , 27 bajtów

FS≡ιdιlιf¦-⭆rwx⎇§↨⁺⁸Iι²⊕λκ-

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

 S                          Input string
F                           Loop over characters
   ι                        Current character
  ≡                         Switch
    d                       Literal `d`
     ι                      Implicitly print current character
      l                     Literal `l`
       ι                    Implicitly print current character
        f                   Literal `f`
         ¦                  (Separator between string literals)
          -                 Implicitly print literal `-`
                            Implicit default case
            rwx             Literal `rwx`
           ⭆                Map over characters
                     ι      Input character
                    I       Cast to integer
                   ⁸        Literal 8
                  ⁺         Sum
                      ²     Literal 2
                 ↨          Base conversion
                        λ   Inner index
                       ⊕    Incremented
                §           Index into base conversion
                         κ  Inner character
                          - Literal `-`
               ⎇            Ternary
                            Implicitly print
Neil
źródło
4

Haskell , 84 83 81 bajtów

f 'f'='-'
f y=y
t#n=f t:((\x->["-r"!!div x 4,"-w-w"!!div x 2,"-x"!!mod x 2])=<<n)

Wypróbuj online!

Skończyło się, że jest bardzo podobny w koncepcji do odpowiedzi Python 2 na Mnemonic. f tworzy typ pliku, reszta to uprawnienia z liczby ósemkowej. Ten naprawdę sprawił, że marzyłem i był trochę rozmyślny, a operator zawarty w preludium.

Aoemica
źródło
2
Możesz użyć divzamiast quot.
nimi
4

Java 8, 100 bajtów

s->s.replaceAll("(\\d)","$1r$1w$1x").replaceAll("f|[0-3]r|[0145]w|[0246]x","-").replaceAll("\\d","")

Wypróbuj online.

Port odpowiedzi Retina @Neil .

Wyjaśnienie:

s->                                 // Method with String as both parameter and return-type
  s.replaceAll("(\\d)","$1r$1w$1x") //  Replace every digit `d` with 'drdwdx'
   .replaceAll("f                   //  Replace every "f",
                |[0-3]r             //  every "0r", "1r", "2r", "3r",
                |[0145]w            //  every "0w", "1w", "4w", "5w",
                |[0246]x",          //  and every "0x", "2x", "4x", "6x"
               "-")                 //  with a "-"
   .replaceAll("\\d","")            //  Remove any remaining digits
Kevin Cruijssen
źródło
To jest mądre! ;)
Olivier Grégoire
@ OlivierGrégoire Cóż, głównie dlatego, że oszczędza na instrukcji return i pętlach. Szkoda, że ​​trzy osoby .replaceAllto wciąż mniej bajtów niż pętla zi .replaceAlldodana returni tablica ciągów. Ale oczywiście należy się Neilowi , który odpowiada na pytanie Retina, z którego korzystałem jako bazę do portu.
Kevin Cruijssen
3

Galaretka , 21 bajtów

Ḣ⁾f-yɓOBṫ€4a“rwx”o”-ṭ

Pełny program drukujący do STDOUT. (Jako monadyczny link zwracana jest lista zawierająca znak i lista trzech list znaków).

Wypróbuj online! Lub zobacz zestaw testowy .

W jaki sposób?

Ḣ⁾f-yɓOBṫ€4a“rwx”o”-ṭ | Main Link: list of characters
Ḣ                     | head & pop (get the 1st character and modify the list)
 ⁾f-                  | list of characters = ['f', '-']
    y                 | translate (replacing 'f' with '-'; leaving 'd' and 'l' unaffected)
     ɓ                | (call that X) new dyadic chain: f(modified input; X)
      O               | ordinals ('0'->48, '1'->59, ..., '7'->55 -- notably 32+16+value)
       B              | convert to binary (vectorises) (getting three lists of six 1s and 0s)
        ṫ€4           | tail €ach from index 4 (getting the three least significant bits)
           “rwx”      | list of characters ['r', 'w', 'x']
          a           | logical AND (vectorises) (1s become 'r', 'w', or 'x'; 0s unaffected)
                 ”-   | character '-'
                o     | logical OR (vectorises) (replacing any 0s with '-'s)
                   ṭ  | tack (prepend the character X) 
                      | implicit print (smashes everything together)
Jonathan Allan
źródło
3

Perl 6 -p , 37 bajtów

s:g[\d]=[X~]('-'X <r w x>)[$/];s/f/-/

Wypróbuj online!

Rozwiązanie Perla 5 dla Port Hastingsa.

nwellnhof
źródło
3

Siatkówka , 38 bajtów

Zainspirowany komentarzem z ASCII-only .

\d
---$&*
---____
r--
--__
w-
-_
x
f
-

Wypróbuj online!

Pomysł polega na zamianie każdej cyfry na jednoargumentową (domyślną cyfrą jednoargumentową w Retina _) z trzema wiodącymi -, a następnie konwertowaniem cyfr binarnych z największej na najmniej znaczącą.

Lew
źródło
2

Python 3 , 71 bajtów

lambda s:("-"+s)[s[0]!="f"]+stat.filemode(int(s[1:],8))[1:]
import stat

Wypróbuj online!

Python 3.3+ ma do tego wbudowane, chociaż ze względu na konieczność importu i różnice w oczekiwanym formacie wejściowym nie jest zbyt przyjazny dla golfa.

Kirill L.
źródło
2

Tcl , 139 bajtów

proc P s {join [lmap c [split $s ""] {expr {[regexp \\d $c]?"[expr $c&4?"r":"-"][expr $c&2?"w":"-"][expr $c&1?"x":"-"]":$c==f?"-":$c}}] ""}

Wypróbuj online!


Tcl , 144 bajty

proc P s {join [lmap c [split $s ""] {expr {[regexp \\d $c]?[list [expr $c&4?"r":"-"][expr $c&2?"w":"-"][expr $c&1?"x":"-"]]:$c==f?"-":$c}}] ""}

Wypróbuj online!

Tcl , 149 bajtów

proc P s {join [lmap c [split $s ""] {if [regexp \\d $c] {list [expr $c&4?"r":"-"][expr $c&2?"w":"-"][expr $c&1?"x":"-"]} {expr {$c==f?"-":$c}}}] ""}

Wypróbuj online!

Tcl , 150 bajtów

proc P s {join [lmap c [split $s ""] {if [regexp \\d $c] {set v [expr $c&4?"r":"-"][expr $c&2?"w":"-"][expr $c&1?"x":"-"]} {expr {$c==f?"-":$c}}}] ""}

Wypróbuj online!

Tcl , 180 bajtów

proc P s {join [lmap c [split $s ""] {if [regexp \\d $c] {[set R regsub] (..)1 [$R (.)1(.) [$R 1(..) [$R -all 0 [format %03b $c] -] r\\1] \\1w\\2] \\1x} {expr {$c==f?"-":$c}}}] ""}

Wypróbuj online!

Wciąż bardzo nie golfisty!

sergiol
źródło
2

Java (JDK 10) , 118 bajtów

s->{var r=s[0]=='f'?"-":""+s[0];var z="-xw r".split("");for(int i=0;++i<4;)r+=z[s[i]&4]+z[s[i]&2]+z[s[i]&1];return r;}

Wypróbuj online!

Kredyty

Olivier Grégoire
źródło
2
Jeśli wziąć wejście jako małe litery fdl, można zmienić var r=s[0]<70?"d":s[0]<72?"-":"l";, aby var r=s[0]=='f'?"-":s[0]+"";zaoszczędzić 6 bajtów. Ponadto, .toCharArray()można .split("")zapisać dodatkowe 4 bajty.
Kevin Cruijssen
2
@KevinCruijssen Twój pomysł zmusił mnie do zaoszczędzenia 13 bajtów, a nie 10 (ponieważ mogłem ""+później usunąć „cast” a chardo a String);) Dzięki!
Olivier Grégoire
2

Excel, 224 bajty

=IF(LEFT(A1,1)="f","-",LEFT(A1,1))&CHOOSE(MID(A1,2,1)+1,"---","--x","-w-","-wx","r--","r-x","rw-","rwx")&CHOOSE(MID(A1,3,1)+1,"---","--x","-w-","-wx","r--","r-x","rw-","rwx")&CHOOSE(MID(A1,4,1)+1,"---","--x","-w-","-wx","r--","r-x","rw-","rwx")

Sporządzono w 4 etapach:

IF(LEFT(A1,1)="f","-",LEFT(A1,1))    Replace "f" with "-".

I 3 razy:

CHOOSE(MID(A1,2,1)+1,"---","--x","-w-","-wx","r--","r-x","rw-","rwx")

Starając się być mądrzejszym, dodaje 25 bytesza zestaw uprawnień, łącznie 75:

IF(INT(MID(A1,2,1))>3,"r","-")&IF(MOD(MID(A1,2,1),4)>1,"w","-")&IF(ISODD(MID(A1,2,1)),"x","-")
Wernisch
źródło
2

05AB1E , 34 27 bajtów

ćls8βbvyi…rwx3*Nèë'-}J'f'-:

Wypróbuj online!

Grał w golfa o 7 bajtów przez @MagicOctopusUrn


ć                           # Remove head from string.
 ls                         # Lowercase swap.
   8βb                      # Octal convert to binary.
      vy                    # For each...
        i        ë  }
         …rwx3*Nè           # If true, push the correct index of rwx.
                  '-        # Else push '-'.
                     J      # Repeatedly join stack inside the loop.
                      'f'-: # Repeatedly replace 'f' with '-' inside the loop.
Geno Racklin Asher
źródło
ćls8βbvyi…rwx3*Nèë'-}J'f'-:za 7 mniej ...
Magic Octopus Urn
Zasadniczo po prostu inna kolejność przy użyciu instrukcji if i zamiast usuwania po fprostu zastępuję wszystkie fw ostatnim ciągu na -.
Magic Octopus Urn
i <CODE FOR TRUE> ë <CODE FOR FALSE> }
Magic Octopus Urn
@MagicOctopusUrn Nice!
Geno Racklin Asher
1

Python 2 , 238 bajtów

lambda m,r=str.replace,s=str.split,j="".join,b=bin,i=int,z=str.zfill,g=lambda h,y:y if int(h)else "-":r(m[0],"f","-")+j(j([g(z(s(b(i(x)),"b")[1],3)[0],"r"),g(z(s(b(i(x)),"b")[1],3)[1],"w"),g(z(s(b(i(x)),"b")[1],3)[2],"x")])for x in m[1:])

Wypróbuj online!

Zakładałem, że to będzie kropla w wiadrze, ale rzeczywiście się myliłem. Prawdopodobnie powinien był zdać sobie sprawę, że lambda w pewnym momencie nie była najlepszym pomysłem.

LyricLy
źródło
: | zbyt wiele wbudowanych = za długie
tylko ASCII
1

APL + WIN, 55 bajtów

Monity o ciąg wejściowy z małymi literami wiodącymi:

('dl-'['dlf'⍳↑t]),⎕av[46+(,⍉(3⍴2)⊤⍎¨⍕1↓t←⎕)×9⍴69 74 75]

Wyjaśnienie:

9⍴69 74 75 create a vector of ascii character codes for rwx -46, index origin 1

1↓t←⎕ prompt for input and drop first character

,⍉(3⍴2)⊤⍎¨⍕ create a 9 element vector by concatenating the binary representation for each digit 

46+(,⍉(3⍴2)⊤⍎¨⍕1↓t←⎕)×9⍴69 74 75 multiply the two vectors and add 46

⎕av[.....] convert back from ascii code to characters, 46 being '-'

('dl-'['dlf'⍳↑t]), append first character from input swapping '-' for 'f'
Graham
źródło
1

J , 57 52 bajtów

5 bajtów zapisanych dzięki FrownyFrog!

-&.('-DLld'i.{.),[:,('-',:'rwx'){"0 1&.|:~1#:@}."."0

Wypróbuj online!

Jeszcze jedno długie rozwiązanie ... Nie wiem, jak zrobić }pracę z czasownikami milczącymi i dlatego użyłem dużo dłużej {"0 1&.|:do selekcji.

Wyjaśnienie:

@}. Upuść pierwszy symbol i

,.&.": przekonwertować resztę na listę cyfr dziesiętnych

]:#: zamień każdą cyfrę na listę cyfr binarnych (i zamknij widelec)

('-',:'rwx') tworzy tabelę 2-rzędową i użyj 0, aby wybrać z pierwszego wiersza / 1 - z drugiego wiersza

   '-',:'rwx'
---
rwx

{"0 1&.|:~ używa cyfr binarnych, aby wybrać z powyższej tabeli

[:, spłaszcza wynik

('d-l'{~'DFL'i.{.) formatuje pierwszy symbol

, dołącza symbol fisrt do listy uprawnień

Galen Iwanow
źródło
1
Dane wejściowe są już ciągiem, którego potrzebujesz1#:@}."."0
FrownyFrog
1
To wydaje się działać: ('d-l'{~'DFL'i.{.)-&.('-DLld'i.{.)
FrownyFrog
@FrownyFrog Bardzo miłe użytkowanie i.i &.wielkie dzięki! Nawiasem mówiąc, czy możesz mi wyjaśnić, jak używać wyboru }w milczących czasownikach?
Galen Iwanow
1
2 2 2&#:`('-',:'rwx'"_)}@"."0@}.ma dokładnie taką samą długość
FrownyFrog
Jednak się nie psuje 333:)
FrownyFrog
1

PHP, 68 bajtów

<?=strtr(strtr($argn,[f=>_,___,__x,_w_,_wx,r__,r_x,rw_,rwx]),_,"-");

przekłada fsię małymi wejście do podkreślenia i każdej liczby ósemkowej na jej rwxrównowartość, za pomocą podkreślenia zamiast kreski (zapisać potrzebę cudzysłowów), a następnie zastępuje _się -.

Uruchom jako potok z -nFlub spróbuj online .

Tytus
źródło
1

C (gcc) , 109 104 bajtów

Przynajmniej C może konwertować dane ósemkowe .... :-)

Edycja: Zdałem sobie sprawę, że modyfikator rozmiaru nie był bezwzględnie wymagany i putchar()jest krótszy niż printf()w tym przypadku!

f(a,b){char*s="-xwr";scanf("%c%o",&a,&b);putchar(a-70?a:*s);for(a=9;~--a;putchar(s[(1&b>>a)*(a%3+1)]));}

Wypróbuj online!

Oryginalny:

f(a,b){char*s="-xwr";scanf("%c%3o",&a,&b);putchar(a-70?a:*s);for(a=9;~--a;printf("%c",s[(1&b>>a)*(a%3+1)]));}

Wypróbuj online!

ErikF
źródło