파일 권한


26

파일 권한

2018 지구에 대한 UIL-컴퓨터 과학 프로그래밍 무료 응답 질문 "Carla"에서 채택되었습니다.

소개

UNIX와 유사한 운영 체제에서 각 파일, 디렉토리 또는 링크는 "그룹"의 구성원 인 "사용자"가 "소유"하고 "10"문자열 (예 : ")과 같은 특정"권한 "을 갖습니다. drwxrwxrwx ". 첫 번째 문자는 'd', '-'또는 'l'(디렉토리, 파일 또는 링크)이며 "읽기, 쓰기, 실행"권한을 나타내는 "rwx"값의 세 세트가 뒤 따릅니다. 첫 번째는 사용자의 권리, 중간은 그룹의 권리, 그리고 세 번째는 해당 개체에 대한 다른 모든 권리입니다.

이러한 권한에 대해 거부 된 권한은 'r', 'w'또는 'x'대신 '-'로 표시됩니다. 예를 들어, 샘플 디렉토리 권한 문자열은 "drwxr--r--"이며 사용자에 대한 전체 디렉토리 권한을 나타내지 만 그룹 구성원 및 기타 모든 사용자에 대한 "읽기 전용"권한을 나타냅니다.

각 "rwx"조합은 읽기 권한을 나타내는 최상위 비트, 쓰기 권한을 나타내는 다음 최상위 비트 및 실행 권한을 나타내는 최하위 비트를 갖는 8 진수 값 (0-7)으로 나타낼 수도 있습니다.

도전

'D', 'F'또는 'L'문자로 구성된 4 자리 코드 문자열이 주어진 후 664와 같이 3 자리 8 진 정수 값이 뒤에 오는 경우 권한 값을 나타내는 결과 10 개의 문자열을 출력합니다. 가리키는.

입력

프로그램 또는 함수는 표준 입력을 읽거나 (4 개의 문자를 입력하고 선택적으로 개행 문자를 입력합니다) 입력을 인수로 전달할 수 있습니다.

프로그램은 대문자 또는 소문자 입력을 허용 할 수 있지만 일관성이 있어야합니다 (모든 입력이 대문자이거나 모든 입력이 소문자 임).

산출

프로그램은 위에 지정된 정확한 형식으로 표시된 권한 값을 나타내는 결과 10 자 문자열을 인쇄해야합니다. 후미 공백이 허용됩니다.

테스트 사례

입력 : F664출력 : -rw-rw-r--
입력 : D775출력 drwxrwxr-x
: L334출력 l-wx-wxr--
: F530출력 -r-x-wx---
: D127출력 : 출력 : 출력 : 출력 :d--x-w-rwx

채점 및 규칙

  • 표준 루프 홀 은 금지되어 있습니다.
  • 표준 규칙이 적용됩니다.
  • 코드를 테스트하고 설명하는 링크를 제공하십시오.
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다!

어제 물어 보니 이미 답변을 수락 했습니까? 이것은 더 이상 응답이 예상되지 않거나 무엇을 의미합니까?
Nit

1
@Nit 답변의 수락 여부에 관계없이 더 많은 답변을 항상 환영합니다.
isaacg

1
@Nit 나는 모바일에 있었고 관련이없는 답변을 줄이려고했습니다 (이후 제거되었습니다). 실수로 뚱뚱한 손가락으로 응답 응답 버튼을 쳤습니다. 수락하지 않는 방법을 알 수 없으므로 수락 된 답변을 가장 짧은 답변으로 변경했습니다.
Billylegota

2
@Nit 내 말은 ... 그는 Dennis 답변을 수락 했으므로 정직하게 맞습니다.
Magic Octopus Urn

답변:


7

젤리 , 19 바이트

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

온라인으로 사용해보십시오!

작동 원리

“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 바이트

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

작업에 적합한 도구?

5 바이트를 절약 해 준 Dennis 와 1 개를 절약 해 준 HTNW 에게 감사드립니다 .

온라인으로 사용해보십시오!

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 -

글쎄요. 확실히 작업에 적합한 도구입니다.
Billylegota

chmod ${1:1} a>a;stat -c%A a|sed "s/-/\L${1:0:1}/;s/f/-/"2 바이트를 절약합니다.
Dennis

trychmod ${1:1} a>a;stat -c%A a|sed s/./\\L${1:0:1}/|tr f -
@Dennis를 떠나서

2
파일이없고 a사용자가 파일 을 만들 수있는 권한이 있거나 파일이 a있고 사용자가 쓸 수 있다고 가정하는 것이 합법적 인가요? 파일이있는 경우 때문에 a소유 root권한이 700, 문제가 해결되지해야합니다.
NoOneIsHere 여기

2
@NoOneIsHere 토론에서 특히 권한이 나타나지 않았지만 커뮤니티는 현재 디렉토리에 임시 파일만드는 것이 기본적으로 허용 된다고 결정했습니다 . 확장하여 가능하다고 가정 할 수 있습니다.
Dennis

10

파이썬 2 , 78 바이트

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

문자와 3 개의 정수로 입력을받습니다.
온라인으로 사용해보십시오!

설명

[a,'-'][a=='f']입력 문자를 사용하거나 -문자가 인 경우을 사용합니다 f.
'-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]본질적으로 rwx문자열 을 얻기위한 8 진 변환 입니다.



5

레티 나 0.8.2 , 43 바이트

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

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 소문자로 입력합니다. 설명:

\d
$&r$&w$&x

r, w및을 접미어로하여 각 숫자를 세 번 반복 x합니다.

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

잘못된 문자를 모두 -s로 변경하십시오 .

\d

나머지 숫자를 삭제하십시오.


4

레티 나 , 51 바이트

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

온라인으로 사용해보십시오!

Retina를 사용하는 방법을 모르므로 더 잘하는 방법을 알려주십시오. 방금 Pyth가 아닌 적어도 하나의 언어를 배우려고한다고 생각했습니다.

설명:

교체 f-(이탈 dl변경 예), 해당 각 자리를 대체 rwx.


: / 나는 이것 까지는 얻을 수 있지만 더 이상 은 얻을 수 없습니다. 그리고 현명한 방법은 슈퍼 ungolfy입니다
ASCII 전용

그것은 어떤 종류의 삼항 / 논리 또는 / 추가 및 다듬기 연산자를 사용하면 훨씬 더 골치 거리가 될 것입니다
ASCII 전용

@ ASCII-only 당신의 아이디어는 꽤 좋았습니다. 저는 이 답변에 사용했습니다 :)
Leo

4

자바 스크립트 (ES6), 63 바이트

입력 문자열이 소문자로 예상됩니다.

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

온라인으로 사용해보십시오!

댓글

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

, 27 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

 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

하스켈 , 84 83 81 바이트

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

온라인으로 사용해보십시오!

Mnemonic의 Python 2 답변과 개념이 비슷했습니다. f는 파일 형식을 만들고 나머지는 8 진수에서 권한을 가져옵니다. 이것은 정말로 나를 소원하게 만들었고 전주곡에 비트와 연산자가 포함되었습니다.


2
div대신 사용할 수 있습니다 quot.
nimi

4

자바 8, 100 바이트

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

온라인으로 사용해보십시오.

@Neil 포트 의 Retina 답변 .

설명:

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

똑똑하다! ;)
Olivier Grégoire

@ OlivierGrégoire 글쎄, 주로 return 문과 루프를 저장하기 때문입니다. 너무 나쁜 세 개인 .replaceAll은 여전히 ​​루프가 .replaceAll있고 추가 된 return문자열 보다 문자열 바이트가 적습니다 .하지만 당연히 크레딧은 Neil 에게 갑니다 .Retina는 포트 기반으로 사용했습니다.
Kevin Cruijssen

3

젤리 , 21 바이트

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

STDOUT에 전체 프로그램 인쇄. 모나드 링크로서 리턴 값은 문자를 포함하는 목록과 세 개의 문자 목록으로 구성됩니다.

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

방법?

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




2

Tcl , 139 바이트

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

온라인으로 사용해보십시오!


Tcl , 144 바이트

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

온라인으로 사용해보십시오!

Tcl , 149 바이트

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

온라인으로 사용해보십시오!

Tcl , 150 바이트

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

온라인으로 사용해보십시오!

Tcl , 180 바이트

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

온라인으로 사용해보십시오!

여전히 매우 골퍼!


2

자바 (JDK 10) , 118 바이트

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

온라인으로 사용해보십시오!

크레딧


2
입력을 소문자로 사용하면를 6 바이트를 저장 하도록 fdl변경할 수 있습니다 . 또한 추가 4 바이트를 저장할 수 있습니다 . var r=s[0]<70?"d":s[0]<72?"-":"l";var r=s[0]=='f'?"-":s[0]+"";.toCharArray().split("")
Kevin Cruijssen

2
여러분의 아이디어는 나에게 13 바이트를 저장했다 @KevinCruijssen,하지 (10) (필자는 제거 할 수 있기 때문에 ""+는 "캐스트"로에 이상이 charString);) 감사합니다!
Olivier Grégoire

2

엑셀, 224 바이트

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

4 단계로 완료 :

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

그리고 3 번 :

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

더 똑똑해 지려고 노력하면 25 bytes권리 집합 당 총 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 바이트

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

온라인으로 사용해보십시오!

@MagicOctopusUrn에 의해 7 바이트 골프


ć                           # 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'-:7 이하를
매직 문어 Urn

기본적으로 if 문을 사용하는 다른 순서로, 제거하는 대신 최종 문자열의 f모든을로 바꿉니다 . f-
Magic Octopus Urn

i <CODE FOR TRUE> ë <CODE FOR FALSE> }
Magic Octopus Urn

트윗 담아 가기
Geno Racklin Asher

1

파이썬 2 , 238 바이트

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

온라인으로 사용해보십시오!

나는 이것이 양동이에서 떨어질 것이라고 생각했지만 실제로 틀렸다. 람다는 어떤 시점에서는 최고의 아이디어가 아니라는 것을 깨달았을 것입니다.


: | 너무 많은 내장 = 너무 길다
ASCII 전용

1

APL + WIN, 55 바이트

앞에 소문자가있는 입력 문자열을 묻는 메시지가 표시됩니다.

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

설명:

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 바이트

FrownyFrog 덕분에 5 바이트가 절약되었습니다!

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

온라인으로 사용해보십시오!

그러나 또 다른 긴 해결책은 ... }어묵 어 동사에서 일하는 방법을 모르겠 기 때문에 {"0 1&.|:선택에 더 오래 사용했습니다 .

설명:

@}. 첫 번째 심볼을 버리고

,.&.": 나머지는 원하는 숫자 목록으로 변환

]:#: 각 자릿수를 이진 자릿수 목록으로 변환하고 포크를 씌 웁니다.

('-',:'rwx') 2 행 테이블을 작성하고 0을 사용하여 첫 번째 행에서 선택 / 1-두 번째 행에서 선택

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

{"0 1&.|:~ 이진수를 사용하여 위 표에서 선택

[:, 결과를 평평하게하다

('d-l'{~'DFL'i.{.) 첫 번째 기호의 형식을 지정합니다

, 권한 목록에 fisrt 기호를 추가합니다


1
입력은 이미 문자열입니다.1#:@}."."0
FrownyFrog

1
이것은 작동하는 것 같습니다 : ('d-l'{~'DFL'i.{.)-&.('-DLld'i.{.)
FrownyFrog

@FrownyFrog 아주 좋은 사용 i.&.감사합니다! 그건 그렇고, }어휘 동사에서 select를 사용하는 방법을 설명해 주 시겠습니까?
Galen Ivanov

1
2 2 2&#:`('-',:'rwx'"_)}@"."0@}.정확히 같은 길이입니다
FrownyFrog

그러나 그것은 깨지지 않습니다 333:)
FrownyFrog

1

PHP, 68 바이트

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

대시 대신 밑줄을 사용하여 따옴표 f를 밑줄로, 모든 8 진수를 소문자로 변환 rwx한 다음 (따옴표 필요를 저장하기 위해)_ 와 함께 -.

파이프로 실행 -nF하거나 온라인으로 사용해보십시오 .


1

C (gcc) , 109104 바이트

적어도 C는 8 진수 입력을 변환 할 수 있습니다 .... :-)

편집 : 크기 수정자가 엄격하게 필요하지 않다는 것을 깨달았 putchar()습니다 printf().이 경우 보다 짧습니다 !

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

온라인으로 사용해보십시오!

기발한:

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

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.