Quyền tập tin


26

Quyền tập tin

Được chuyển thể từ UIL - Câu hỏi trả lời miễn phí về lập trình khoa học máy tính "Carla" cho Quận 2018.

Giới thiệu

Trong các hệ điều hành giống như UNIX, mỗi tệp, thư mục hoặc liên kết được "sở hữu" bởi "người dùng", là thành viên của "nhóm" và có "quyền" nhất định được biểu thị bằng chuỗi mười ký tự như " drwxrwxrwx ". Ký tự đầu tiên là 'd', '-' hoặc 'l' (thư mục, tệp hoặc liên kết), theo sau là ba bộ giá trị "rwx", biểu thị quyền "đọc, ghi, thực thi". Bộ đầu tiên là quyền của người dùng, bộ giữa là quyền của nhóm và quyền thứ ba của mọi người khác đối với đối tượng đó.

Quyền bị từ chối đối với bất kỳ quyền nào trong số này được thể hiện bằng '-' thay cho 'r', 'w' hoặc 'x'. Ví dụ: chuỗi quyền của thư mục mẫu sẽ là "drwxr - r--", biểu thị quyền thư mục đầy đủ cho người dùng, nhưng quyền "chỉ đọc" cho thành viên nhóm và tất cả những người khác.

Mỗi kết hợp "rwx" cũng có thể được biểu thị bằng một giá trị bát phân (0-7) với bit quan trọng nhất biểu thị quyền đọc, bit quan trọng nhất tiếp theo biểu thị quyền ghi và bit quan trọng nhất biểu thị quyền thực thi.

Thử thách

Cho một chuỗi mã gồm bốn ký tự được tạo thành từ một ký tự: 'D', 'F' hoặc 'L', theo sau là một giá trị số nguyên bát phân ba chữ số, như 664, xuất ra chuỗi 10 ký tự đại diện cho giá trị quyền chỉ ra.

Đầu vào

Chương trình hoặc chức năng của bạn có thể đọc đầu vào từ tiêu chuẩn trong (bốn ký tự sẽ được nhập, theo sau là một dòng mới) hoặc được chuyển qua đầu vào dưới dạng đối số.

Chương trình của bạn có thể chấp nhận đầu vào chữ hoa hoặc chữ thường nhưng phải nhất quán (tất cả các đầu vào là chữ hoa hoặc tất cả các đầu vào là chữ thường).

Đầu ra

Chương trình của bạn phải in chuỗi mười ký tự kết quả thể hiện giá trị quyền được chỉ định theo định dạng chính xác được chỉ định ở trên. Đuôi trắng không gian được cho phép.

Các trường hợp thử nghiệm

In: F664Out: -rw-rw-r--
In: D775Out: drwxrwxr-x
In: L334Out: l-wx-wxr--
In: F530Out: -r-x-wx---
In: D127Out: Out:d--x-w-rwx

Ghi điểm và nội quy


Chờ gì, hỏi hôm qua và trả lời đã chấp nhận chưa? Điều này có nghĩa là không có nhiều câu trả lời được mong đợi hay những gì?
Nit

1
@Nit Nhiều câu trả lời luôn được chào đón, bất kể câu trả lời có được chấp nhận hay không.
isaacg

1
@Nit Tôi đã ở trên điện thoại di động và cố gắng đưa ra một câu trả lời không liên quan (đã bị xóa từ đó). Tôi vô tình nhấn nút chấp nhận bằng ngón tay mập. Tôi không thể tìm ra cách không chấp nhận vì vậy tôi chỉ thay đổi câu trả lời được chấp nhận thành câu trả lời ngắn nhất hiện tại.
Billylegota

2
@ Ý tôi là ... anh ấy đã chấp nhận câu trả lời của Dennis, vì vậy anh ấy thành thật có thể đúng.
Bạch tuộc ma thuật Urn

Câu trả lời:


7

Thạch , 19 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

“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.

16

bash, 59 53 byte

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

Công cụ phù hợp cho công việc?

Cảm ơn Dennis vì đã lưu 5 byte và HTNW để lưu một byte .

Hãy thử trực tuyến!

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 -

Vâng, đó là nhanh chóng. Chắc chắn là công cụ phù hợp cho công việc.
Billylegota

chmod ${1:1} a>a;stat -c%A a|sed "s/-/\L${1:0:1}/;s/f/-/"tiết kiệm hai byte.
Dennis

Ra khỏi @Dennis, tôi nghĩ bạn có thể tắt thêm một lần nữa trthay vì y:chmod ${1:1} a>a;stat -c%A a|sed s/./\\L${1:0:1}/|tr f -
HTNW

2
Có hợp pháp không khi cho rằng không có tệp avà người dùng có quyền tạo tệp đó hoặc có tệp ađó và người dùng có thể ghi được không? Bởi vì nếu có một tệp được asở hữu bởi rootcác quyền 700, thì điều này sẽ không hoạt động.
NoOneIsHãy

2
@NoOneIsHere Mặc dù các quyền đặc biệt không bao giờ xuất hiện trong cuộc thảo luận, cộng đồng đã quyết định rằng việc tạo các tệp tạm thời trong thư mục hiện tại được cho phép theo mặc định . Bằng cách mở rộng, chúng ta có thể cho rằng nó có thể.
Dennis

10

Python 2 , 78 byte

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

Lấy đầu vào là một ký tự và ba số nguyên.
Hãy thử trực tuyến!

Giải trình

[a,'-'][a=='f']lấy ký tự đầu vào hoặc -, nếu ký tự là f.
'-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]về cơ bản là một chuyển đổi bát phân để có được rwxchuỗi.



5

Võng mạc 0.8.2 , 43 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Đưa đầu vào trong trường hợp thấp hơn. Giải trình:

\d
$&r$&w$&x

Nhân ba chữ số, nhập vào r, wx.

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

Thay đổi tất cả các chữ cái không chính xác thành -s.

\d

Xóa mọi chữ số còn lại.


4

Võng mạc , 51 byte

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

Hãy thử trực tuyến!

Không biết làm thế nào để sử dụng Retina, vì vậy xin vui lòng cho tôi biết làm thế nào để làm điều này tốt hơn. Tôi chỉ hình dung rằng tôi sẽ cố gắng học ít nhất một ngôn ngữ không phải là Pyth.

Giải trình:

Thay thế fbằng -(để lại dlkhông thay đổi), sau đó thay thế từng chữ số bằng chữ số thích hợp rwx.


: / Tôi có thể đi xa như thế này nhưng không còn nữa. và cách thông minh là siêu vô dụng
ASCII - chỉ

Nó sẽ trở nên golf hơn rất nhiều với một số loại toán tử ternary / logic hoặc / add và trim
ASCII-only

@ ASCII-only Ý tưởng của bạn khá hay, tôi đã sử dụng nó cho câu trả lời này :)
Leo

4

JavaScript (ES6), 63 byte

Mong đợi chuỗi đầu vào bằng chữ thường.

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

Hãy thử trực tuyến!

Đã bình luận

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()

4

Than , 27 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

 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

4

Haskell , 84 83 81 byte

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

Hãy thử trực tuyến!

Cuối cùng, khái niệm này khá giống với câu trả lời Python 2 của Mnemonic. f tạo loại tệp, phần còn lại là các quyền được lấy từ số bát phân. Điều này thực sự khiến tôi ước & là một bitwise và toán tử được bao gồm trong khúc dạo đầu.


2
Bạn có thể sử dụng divthay vì quot.
nimi

4

Java 8, 100 byte

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

Hãy thử trực tuyến.

Cổng câu trả lời Retina của @Neil .

Giải trình:

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

Điều này thật thông minh! ;)
Olivier Grégoire

@ OlivierGrégoire Vâng, chủ yếu là vì nó tiết kiệm cho câu lệnh return và các vòng lặp. Quá tệ, ba cá nhân .replaceAllvẫn còn ít byte hơn một vòng lặp có .replaceAllthêm returnvà mảng Chuỗi .. Nhưng tất nhiên tín dụng thuộc về Neil , câu trả lời Retina mà tôi đã sử dụng làm cơ sở để chuyển từ.
Kevin Cruijssen

3

Thạch , 21 byte

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

Một chương trình in đầy đủ đến STDOUT. (Là một liên kết đơn âm, giá trị trả về là một danh sách chứa một ký tự và một danh sách gồm ba danh sách các ký tự.)

Hãy thử trực tuyến! Hoặc xem bộ thử nghiệm .

Làm sao?

Ḣ⁾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)


3

Võng mạc , 38 byte

Lấy cảm hứng từ một nhận xét từ chỉ ASCII .

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

Hãy thử trực tuyến!

Ý tưởng là chuyển đổi từng chữ số thành unary (chữ số unary mặc định trong Retina _) với ba chữ số hàng đầu -, sau đó chuyển đổi các chữ số nhị phân từ nhiều nhất sang ít quan trọng nhất.


2

Python 3 , 71 byte

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

Hãy thử trực tuyến!

Python 3.3+ được tích hợp sẵn cho điều đó, mặc dù do nhu cầu nhập khẩu và sự khác biệt trong định dạng đầu vào dự kiến, nó không thân thiện với golf.


2

Tcl , 139 byte

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}}] ""}

Hãy thử trực tuyến!


Tcl , 144 byte

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}}] ""}

Hãy thử trực tuyến!

Tcl , 149 byte

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}}}] ""}

Hãy thử trực tuyến!

Tcl , 150 byte

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}}}] ""}

Hãy thử trực tuyến!

Tcl , 180 byte

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}}}] ""}

Hãy thử trực tuyến!

Vẫn còn vô duyên!


2

Java (JDK 10) , 118 byte

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;}

Hãy thử trực tuyến!

Tín dụng


2
Khi bạn lấy đầu vào như thường fdl, bạn có thể thay đổi var r=s[0]<70?"d":s[0]<72?"-":"l";để var r=s[0]=='f'?"-":s[0]+"";tiết kiệm 6 byte. Ngoài ra, .toCharArray()có thể .split("")để lưu thêm 4 byte.
Kevin Cruijssen

2
@KevinCruijssen Ý tưởng của bạn khiến tôi tiết kiệm được 13 byte chứ không phải 10 (vì tôi có thể loại bỏ phần ""+sau để "bỏ" a charthành a String);) Cảm ơn!
Olivier Grégoire

2

Excel, 224 byte

=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")

Thực hiện trong 4 giai đoạn:

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

Và 3 lần:

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

Cố gắng để thông minh hơn, thêm vào 25 bytesmỗi bộ quyền, tổng cộng 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","-")

2

05AB1E , 34 27 byte

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

Hãy thử trực tuyến!

Được đánh xuống 7 byte bởi @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.

ćls8βbvyi…rwx3*Nèë'-}J'f'-:cho 7 ít hơn ...
Bạch tuộc ma thuật Urn

Về cơ bản chỉ là một thứ tự khác bằng cách sử dụng các câu lệnh if và thay vì loại bỏ ftôi chỉ thay thế tất cả ftrong chuỗi cuối cùng bằng -.
Bạch tuộc ma thuật Urn

i <CODE FOR TRUE> ë <CODE FOR FALSE> }
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Đẹp!
Geno Racklin Asher

1

Python 2 , 238 byte

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:])

Hãy thử trực tuyến!

Tôi đã cho rằng đây sẽ là một giọt trong xô, nhưng tôi đã thực sự sai. Có lẽ nên nhận ra rằng lambda không phải là ý tưởng tốt nhất vào một lúc nào đó.


: | quá nhiều nội dung = quá dài
ASCII-chỉ

1

APL + THẮNG, 55 byte

Lời nhắc cho chuỗi đầu vào với chữ thường viết thường:

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

Giải trình:

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'


1

J , 57 52 byte

5 byte được lưu nhờ FrownyFrog!

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

Hãy thử trực tuyến!

Còn một giải pháp dài nữa ... Tôi không biết làm thế nào để thực hiện }công việc trong các động từ ngầm và đó là lý do tại sao tôi sử dụng lâu hơn {"0 1&.|:để lựa chọn.

Giải trình:

@}. Thả biểu tượng đầu tiên và

,.&.": chuyển đổi phần còn lại thành một danh sách các chữ số tối thiểu

]:#: chuyển đổi từng chữ số thành một danh sách các chữ số nhị phân (và giới hạn ngã ba)

('-',:'rwx') tạo bảng 2 hàng và sử dụng 0 để chọn từ hàng đầu tiên / 1 - từ bảng thứ hai

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

{"0 1&.|:~ sử dụng các chữ số nhị phân để chọn từ bảng trên

[:, làm phẳng kết quả

('d-l'{~'DFL'i.{.) định dạng ký hiệu đầu tiên

, nối biểu tượng fisrt vào danh sách quyền


1
Đầu vào đã là một chuỗi, bạn cần1#:@}."."0
FrownyFrog

1
Điều này dường như hoạt động: ('d-l'{~'DFL'i.{.)-&.('-DLld'i.{.)
FrownyFrog

@FrownyFrog Sử dụng rất hay i.&.Cảm ơn rất nhiều! Nhân tiện, bạn có thể giải thích cho tôi cách sử dụng select }trong các động từ ngầm không?
Galen Ivanov

1
2 2 2&#:`('-',:'rwx'"_)}@"."0@}.có cùng độ dài
FrownyFrog

Tuy nhiên, nó không bị 333
hỏng

1

PHP, 68 byte

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

dịch ftrong đầu vào chữ thường thành dấu gạch dưới và mỗi số bát phân rwxtương đương với nó , sử dụng dấu gạch dưới thay vì dấu gạch ngang (để tiết kiệm nhu cầu báo giá), sau đó thay thế _bằng -.

Chạy như ống với -nFhoặc thử trực tuyến .


1

C (gcc) , 109 104 byte

Ít nhất C có thể chuyển đổi đầu vào bát phân .... :-)

Chỉnh sửa: Tôi nhận ra rằng công cụ sửa đổi kích thước không được yêu cầu nghiêm ngặt và nó putchar()ngắn hơn printf()trong trường hợp này!

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)]));}

Hãy thử trực tuyến!

Nguyên:

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)]));}

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.