chmod 디코딩


26

도전

3 자리 8 진 권한 번호가 주어지면 부여한 권한을 출력하십시오.

chmod

UNIX OS에서 파일 권한은 chmod명령을 사용하여 변경됩니다 . chmod를 사용하는 방법은 거의 없지만 오늘날 우리가 집중할 방법은 8 진 권한을 사용하는 것입니다.

권한 번호의 세 자리 숫자는 다른 사람을 나타냅니다.

  • 첫 번째 숫자는 사용자 의 권한을 나타냅니다
  • 두 번째 숫자는 그룹 의 권한을 나타냅니다.
  • 마지막 숫자는 다른 사람 의 권한을 나타냅니다.

다음으로 각 숫자는 아래에 표시된대로 권한을 나타냅니다.

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

입력

입력은 문자열로 된 3 자리 숫자입니다. 예 :

133

또는

007

이것은 STDIN 또는 함수 인수를 통해 전달됩니다.

산출

출력은 사용자, 그룹 및 다른 사용자마다 다른 권한이어야합니다. 이 정보를 다음과 같이 표시해야합니다.

User:   ddd
Group:  ddd
Others: ddd

뒤에 3 개의 공백이있는 경우 뒤에 User2 개의 공백이 Group있고 뒤에 1 개의 공백이 Others있습니다. 당신은 대체 ddd권한 정보.

출력은 STDOUT 또는 리턴 된 문자열 일 수 있습니다.

입력 : 666

산출:

User:   Read and Write
Group:  Read and Write
Others: Read and Write

입력 : 042

산출:

User:   None
Group:  Read only
Others: Write only

입력 : 644

산출:

User:   Read and Write
Group:  Read only
Others: Read only

승리

바이트 단위의 가장 짧은 코드가 이깁니다.


입력 사양은 무엇입니까?
Jonathan Allan

@JonathanAllan 세 자리 숫자
Beta Decay

십진 정수만 의미하므로 042는 42로 수신됩니까?
Jonathan Allan

2
@Jonathan 아니요, 문자열 입력이므로 042입니다
Beta Decay

1
출력은 탭 문자로 올바르게 보이므로 사용하지 않는 이유는 무엇입니까? 문자열을 채우기 위해 더 많은 바이트가 필요한 언어를 처벌하는 것입니까?
Titus

답변:


3

05AB1E , 89 87 바이트

”‚Ý:‚Ù:ˆ†:”ð¡v”Šª0ÍÃ20‡í20‡í1ÍÃ0‚Ø20‚Ø1ÍÃ0‚Ø1‡í0‚؇í1ÍÔ2ð'€É«:1ð'€ƒ«:0ð«¡¹Nèèð3N-×ìyì,

크 툴후 인코딩을 소환합니다 . CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


14

자바 (ES6) 165 161 바이트

n=>[0,1,2].map(i=>(s='User:  3Group: 68Others:58None576Read48Write476Execute475and4576only'.split(/(\d+)/))[i*2]+s[n[i]*2+1].replace(/./g,c=>' '+s[c*2])).join`
`

편집 : "탭 없음"규칙을 이행하기 위해 +1 바이트

let f =
n=>[0,1,2].map(i=>(s='User:  3Group: 68Others:58None576Read48Write476Execute475and4576only'.split(/(\d+)/))[i*2]+s[n[i]*2+1].replace(/./g,c=>' '+s[c*2])).join`
`
console.log(f("666"));
console.log(f("042"));
console.log(f("644"));
console.log(f("137"));


배열을 재정렬하고 문자열에서 숫자를 분리하여 몇 바이트를 얻을 수 있습니다. 아이디어에 +1
Titus

@Titus-나는 약간의 바이트를 절약하는 재 배열을 보지 못한다는 것을 인정했다. 또한 숫자는 문자열로 취급되어 replace()강요없이 작동합니다. 그러나 나는 당신의 요점이 빠져있을 수 있습니다.
Arnauld

@Titus-같은 'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)것이 효과가있을 수 있습니다. 그게 당신이 생각한 것입니까?
Arnauld

나는 그들을 오해하고 있었다. 8 진수 값이라고 생각했습니다. :) 그러나 새로운 아이디어도 나쁘지 않습니다.
Titus

챌린지 출력에는 현재 작성된 탭 대신 공백이 필요합니다.
Mwr247

13

GNU sed, 187163158 (157 + 1) 바이트

-r (ERE regexp)로 실행하십시오 . 파일에 후행 줄 바꿈이 없습니다.

s/(.)(.)/User:   \1\nGroup:  \2\nOthers: /g
s/[4-7]/Read &/g
s/[2367]/Write &/g
s/[1357]/Execute &/g
s/(\w) (\w+) [1-7]/\1 and \2/g
s/[1-7]/only/g
s/0/None/g

니스 접근하지만 당신은 당신이 추가 할 때 숫자를 제거하여 20 바이트에 대해 저장할 수 있습니다 and또는 only.
Neil

@Neil there :)은 매우 중요한 저장을 위해 제안을 통합했습니다.
FireFly

1
첫 번째 줄은 다음과 같습니다 s/(.)(.)/User: \1\nGroup: \2\nOthers: /. 좀 더 바이트가 펄에 포팅에 의해 저장 될 수있다 \d\K.
ninjalj

@ninjalj 좋은 지적. 나는 Perl을 알지 못했기 때문에 sed를 고수 할 것이며, s /// 교체 외부에서 더 짧게 만들기 위해 다른 트릭이있을 것이라고 확신합니다.
FireFly

6

C # 214 바이트

string h(string y){string e="Execute ",r="Read ",w="Write ",O="Only",a="and ";var z=new[]{"None",e+O,w+O,w+a+e,r+O,r+a+e,r+a+w,r+w+a+e};return$"User:   {z[y[0]-'0']}\nGroup:  {z[y[1]-'0']}\nOthers: {z[y[2]-'0']}";}

6

젤리 , 100 91 85 바이트

거의 확실하게 골프를 탈 수 있습니다-91 바이트, 무엇?! 8 개월 6 지혜 바이트!
-1. 더 많은 문자열 압축;
-2. 인덱싱이 모듈 식이므로 사후 감소를 48만큼 줄입니다.
-3. 더 나은 암묵적 체인 사용).

@Lynn이 문자열 압축을 실행하는 데 도움이되는 9 바이트

,“£ɱ~»
Ñ
ṖK,“ and”,Ṫ
LĿK
7RBUT€Uị“ØJƓ“¥Ị£“¤/¡»Ç€“¡*g»ṭ
“ṖŒhJ"ỵd¡»ḲðJ4_⁶ẋ⁸,"j€”:ż⁹Oị¢¤Y

TryItOnline 에서 테스트

방법?

,“£ɱ~» - Link 1: pair with the string "Only"

Ñ - Link 2: call next link

ṖK,“ and”,Ṫ - Link 3: insert " and" between the last two elements of x
Ṗ           - x[:-1]
 K          - join with spaces
   “ and”   - the string " and"
          Ṫ - x[-1]
  ,      ,  - pair

LĿK - Link 4: call appropriate link and add missing spaces
L   - length
 Ŀ  - call link at that index
  K - join the result with spaces

7RBUT€Uị“ØJƓ“¥Ị£“¤/¡»Ç€“¡*g»ṭ - Link 5: construct all 8 cases
7R                            - range of 7: [1,2,3,4,5,6,7]
  B                           - binary (vectorises): [[1],[1,0],[1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
   U                          - reverse (vectorises): [[1],[0,1],[1,1],[0,0,1],[1,0,1],[0,1,1],[1,1,1]]
    T€                        - indexes of truthy values for each: [[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
      U                       - reverse (vectorises): [[1],[2],[2,1],[3],[3, 1],[3,2],[3,2,1]]
        “ØJƓ“¥Ị£“¤/¡»         - list of strings: ["Execute","Write","Read"]
       ị                      - item at index (vectorises): [["Execute"],["Write"],["Write","Execute"],["Read"],["Read","Execute",["Read","Write"],["Read","Write","Execute"]]
                     ǀ       - call the previous link for each
                       “¡*g»  - the string "None"
                            ṭ - tack (Jelly is 1-based so the 8th item will be indexed as 0)

“ṖŒhJ"ỵd¡»ḲðJṚ⁶ẋ⁸,"j€”:ż⁹Oị¢¤Y - Main Link: parse input and make the result. e.g.: "042"
“ṖŒhJ"ỵd¡»                     - dictionary compression of "User Group Others"
          Ḳ                    - split at spaces -> ["User","Group","Others"]
           ð                   - dyadic chain separation, call that g (input as right)
            J                  - range of length of g -> [1,2,3]
             Ṛ                 - reverse -> [3,2,1]
              ⁶                - literal space
               ẋ               - repeat -> ["   ","  "," "]
                ⁸              - chain's left argument, g
                  "            - zip with:
                 ,             -   pair -> [["User","   "],["Group","  "],["Others"," "]]
                     ”:        - literal ':'
                   j€          - join for €ach -> ["User:   ","Group:  ","Others: "]
                            ¤  - nilad followed by link(s) as a nilad:
                        ⁹      - chain's right argument, the input string -> "042"
                         O     -   cast to ordinal (vectorises) -> [48, 52, 50]
                           ¢   -   call last link (5) as a nilad  -> ["Execute Only","Write Only","Write and Execute","Read Only","Read and Execute","Read and Write","Read Write and Execute","None"]
                          ị    -   index into (1-based & modular) -> ["None","Read Only","Write Only"]
                       ż       - zip together -> [["User:   ","None"],["Group:  ","Read Only"],["Others: ","Write Only"]]
                             Y - join with line feeds -> ["User:   ","None",'\n',"Group:  ","Read Only",'\n',"Others: ","Write Only"]
                               - implicit print:
                                             >>>User:   None
                                             >>>Group:  Read Only
                                             >>>Others: Write Only

4

옥타브, 185 바이트

@(n)fprintf('User:   %s\nGroup:  %s\nOthers: %s',{'Read Write and Execute','Read and Write','Read and Execute','Read only','Write and Execute','Write only','Execute only','None'}{56-n})

입력을 문자열로 사용하는 익명 함수를 작성하십시오 ( '042'). 그것을 배열로 변환하십시오 : (56-'042)' = [0 4 2]. 을 사용하여 셀형 배열을 인덱싱하려면 여러 셀 인덱스로 사용하십시오 Read Write and Execute','Read and Write', .... 용도 fprintf출력에 대한 적절한 범주와 세 개의 문자열, : User:, Group:Others:.

내가 저장하는 방법을 찾는 시도 Execute, Write,Read 필요, 그러나 이것은 순진한 접근 방식보다 더 오래 알고 보니 별도의 단어와 합칠 수있다.

예 :

1> f('000')
User:   None
Group:  None
Others: None
2> f('042')
User:   None
Group:  Read only
Others: Write only

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


2
strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')셀 배열 리터럴 대신 사용하여 몇 바이트를 절약 할 수 있습니다.
Luis Mendo

4

PowerShell v2 +, 189 168 바이트

[char[]]$args[0]|%{('User','Group','Others')[$i++]+":`t"+('None','Read','Write','Execute','only','and')[(0,(3,4),(2,4),(2,5,3),(1,4),(1,5,3),(1,5,2),(1,2,5,3))[$_-48]]}

입력 $args[0]char-array 로 반복합니다 . 와 배열로 반복 할 때마다, 우리 지수 $i++(기본값하는 0선택) User, Group또는Others , 합칠 콜론과 탭을 CONCATENATE와 그 다른 배열 인덱스가.

여기 마술이 있습니다. 우리는 묵시적 char으로 int를 빼고 48(즉, ASCII 48( "0")를로 변환 0) 적절한 배열을 ints 배열로 선택합니다 . 그 배열은 이후 배열에 대한 색인으로 사용됩니다 'None','Read','Write','Execute','only','and'. 기본값 이후$ofs (Output Field Separator)은 공백이므로 문자열 화 될 때 배열 요소 사이에 공백을 올바르게 삽입합니다 (왼쪽에 연결될 때 발생 함).

이 세 문자열은 파이프 라인에 남아 있으며 암시 적을 통해 출력됩니다. Write-Output 은 프로그램 완료시 발생합니다.

PS C:\Tools\Scripts\golfing> .\decode-the-chmod.ps1 '123'
User:   Execute only
Group:  Write only
Others: Write and Execute

3

밀짚 , 193 바이트

((01234567)((None)(Execute only)(Write only)(Write and Execute)(Read only)(Read and Execute)(Read and Write)(Read Write and Execute)))::~<:{-¢(User:   ),+>
>}:{-¢(Group:  ),+>
>}-¢(Others: ),+>

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

첫 번째 스택에서 변환 테이블을 3 번 누르고 두 번째 스택으로 전환하고 대화 테이블을 사용하여 각 숫자를 변환 한 후 인쇄하십시오.


2

하스켈, 186 바이트

s=zip(words"7654 6 7632 753 7531 0 421")(words"Read and Write and Execute None only")
m c=mapM_(\(x,y)->putStrLn(x++unwords[b|(a,b)<-s,elem y a]))$zip["User:   ","Group:  ","Others: "]c

예:

Prelude> :r
[1 of 1] Compiling Main             ( decCh.hs, interpreted )
Ok, modules loaded: Main.
*Main> m "654"
User:   Read and Write
Group:  Read and Execute
Others: Read only

Prelude 만 사용되었습니다. 내가 올바르게하고 있습니까?

언 골프 드 :

s = zip (words "7654 6 7632 753 7531 0 421")
        (words "Read and Write and Execute None only")

ps y = unwords [b|(a,b)<-s,elem y a] -- build permissions string
pp (x,y) = putStrLn $ x ++ ps y -- print user + permission

m c =   let up = zip ["User:   ","Group:  ","Others: "] c -- pair user and permission
        in mapM_ pp up --print each

2

파이썬 2, 190 185 바이트

def f(i):
 r,w,a,x,o,g="Read ","Write ","and ","Execute ","only",["User:  ","Group: ","Others:"];p=["None",x+o,w+o,w+a+x,r+o,r+a+x,r+a+w,r+w+a+x]
 for z in 0,1,2:print g[z],p[int(i[z])]

실행 또는 쓰기가 줄 끝에 있으면 후행 공백이 남지만 이것이 허용되지 않는 것을 보지 못했습니다.

편집 range (3)을 0,1,2로 변경하고 내 Windows 랩톱 대신 (\ n = \ r \ n 또는 다른 방법으로 내 리눅스 랩톱에서 바이트 수를 확인하여 5 바이트를 절약했습니다. 기억할 수는 없습니다).


2

파이썬 2 240 239 238 237 228 바이트

나는 마침내이 차가운 골프를 줄 것이라고 생각했다. 희망적으로 공백이 허용됩니다. (고정 및 프로세스에서 바이트 저장)

i=0
def a(b):
 for d in 4,2,1:
    if b&d:yield('Execute','Write','Read')[d/2]
for k in raw_input():
 b,q=list(a(int(k))),' and';e=len(b)
 if e:b[~e/2]+=(' only',q,q)[e-1]
 print'UGOsrteohrue:pr :s  :'[i::3],' '.join(b)or None;i+=1

PPCG에 오신 것을 환영합니다.
ETHproductions

코드를 읽은 후 Python 2 답변의 range (3)을 0,1,2로 뻔뻔스럽게 바꿨습니다. 좋은 대답입니다. +1
ElPedro

2

PHP, 169 159 바이트

foreach([User,Group,Others]as$i=>$u){echo"
$u: ";for($n=[5,33,34,66,35,67,131,531][$i]];$n;$n>>=3)echo["and",Execute,Write,Read,only,None][$n&7]," ";}

문자열을 명령 행 인수로 사용합니다. php -r '<code>' <argument>,
후행 한 대신 선도적 인 개행 문자를 출력

내 버그를 지적 해준 Jörg에게 감사드립니다 \t.

PHP, 169 바이트

새로운 제한 사항 : (탭 문자 금지)

foreach(['User:  ','Group: ','Others:']as$i=>$u){echo"
$u";for($n=[5,33,34,66,35,67,131,531][$argv[1][$i]];$n;$n>>=3)echo' ',['and',Read,Write,Execute,only,None][$n&7];}

이것은 str_pad추가 공백이 필요하기 때문에 with보다 1 바이트 더 짧습니다 .

고장

foreach([User,Group,Others]as$i=>$u)
{
    echo"\n$u:\t";                      // print newline, who, blanks
    for($n=[5,33,34,66,35,67,131,531]   // octal values for words indexes
        [$argv[1][$i]]                  // (last word=highest digit)
        ;$n;$n>>=3)                     // while value has bits left
        echo['and',Execute,Write,Read,only,None][$n&7]," "; // print that word
}

에 대한 배열을 만들려면 다음을 $n사용하십시오.

$b=[[5],[1,4],[2,4],[2,0,1],[3,4],[3,0,1],[3,0,2],[3,2,0,1]];
foreach($b as$i=>$a){for($v=$j=0;$a;$j+=3)$v+=array_shift($a)<<$j;echo"$v,";}

1
foreach ([ '사용자', '그룹', '기타'] as $ i => $ u) {echo "\\ n $ u : \\ t"; 일부 바이트 저장 및 3,4,6의 출력이 잘못
요 르그 Hülsermann

1
이것은 올바른 순서이다 [5,33,34,66,35,67,131,531] 좋은 생각
Jörg Hülsermann

난 당신이 자바 스크립트를 이길 원하는 다음 6 바이트를 exmple 저장하기 위해 사용자에게 '사용자'를 잊었
Jörg Hülsermann

@ JörgHülsermann : 어쨌든 "\ t"를 채택하려고했습니다. 감사. +1 :) 좋은 눈 33!
Titus

1
346의 경우 출력은 User : Read and Write Group : Execute only 기타 : Write and Execute User : Write and Execute Group : Read Only 기타 : 읽기 및 쓰기
Jörg Hülsermann

2

배쉬- 221 213 바이트

GNU bash, version 4.3.46

l=("User:   " "Group:  " "Others: ")
o=\ only;a=" and ";x=Execute;w=Write;r=Read
b=(None "$x$o" "$w$o" "$w$a$x" "$r$o" "$r$a$x" "$r$a$w" "$r $w$a$x")
for c in `echo $1|grep -o .`;{ echo "${l[$((z++))]}${b[$c]}";}

적어도 여기에서 접근 방식을 근본적으로 변경하지 않고 (입력을 나누고 ${b}해당 문자열을 보유하는 배열의 색인으로 사용하지 않음) 이것이 더 이상 압축 될 수 있는지 확실하지 않습니다 .


1
\ only인라인 확장으로 짧아집니다 . grep -o .<<<$1보다 짧지 만 echo $1|grep -o .stdin에서 입력을 읽는 while read -n1 c것이 좋습니다. 배열 인덱스는 bash에 산술 문맥을 가지고 있으므로 ${l[z++]}작동합니다. (오프셋과 길이는 산술 문맥을 가짐) l로 액세스되는 문자열보다 짧습니다 ${l:z++*8:8}. 에서 전체 모드를 읽고 c"User :", ... 인라인을 확장하고 매개 변수 확장을 신중하게 사용하면 다른 바이트를 줄일 수 있습니다 .
ninjalj

1
최종 결과 : 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}]}"(\ n을 리터럴 개행 문자로 바꾸십시오).
ninjalj

1

자바 7, 300 284 바이트

String c(String s){char[]a=s.toCharArray();return"User:   "+f(a[0])+"Group:  "+f(a[1])+"Others: "+f(a[2]);}String f(int i){return new String[]{"None","Execute only","Write only","Write and Execute","Read only","Read and Execute","Read and Write","Read Write and Execute"}[i%48]+"\n";}

지금 바로 접근하십시오. 단어를 재사용하는보다 일반적인 접근 방식을 생각해냅니다.

언 골프 및 테스트 사례 :

여기에서 시도하십시오.

class M{
  static String c(String s){
    char[] a = s.toCharArray();
    return "User:   " + f(a[0]) + "Group:  " + f(a[1]) + "Others: " + f(a[2]);
  }

  static String f(int i){
    return new String[]{ "None", "Execute only", "Write only", "Write and Execute", "Read only", "Read and Execute", "Read and Write", "Read Write and Execute" }
      [i % 48] + "\n";
  }

  public static void main(String[] a){
    System.out.println(c("666"));
    System.out.println(c("042"));
    System.out.println(c("644"));
  }
}

산출:

User:   Read and Write
Group:  Read and Write
Others: Read and Write

User:   None
Group:  Read only
Others: Write only

User:   Read and Write
Group:  Read only
Others: Read only

1

당연, 217 (207) 205 바이트

def c(m){def i=0,e='Execute',w='Write',r='Read',o=' only',a=' and ';m.each{println(['User:   ','Group:  ','Others: '][i++]+['None',"$e$o","$w$o","$w$a$e","$r$o","$r$a$e","$r$a$w","$r $w$a$e"][it as int])}}

언 골프 :

def c(m) {
  def i=0,e='Execute',w='Write',r='Read',o=' only',a=' and ';
  m.each{
    println(['User:   ','Group:  ','Others: '][i++]+['None',"$e$o","$w$o","$w$a$e","$r$o","$r$a$e","$r$a$w","$r $w$a$e"][it as int])
  }
}

1

수학, 211 바이트

{r,w,e,o,a}={"Read ","Write ","Execute ","only ","and "};""<>Transpose@{{"User:   ","Group:  ","Others: "},"None"[{e,o},{w,o},{w,a,e},{r,o},{r,a,e},{r,a,w},{r,w,a,e}][[#]]&/@IntegerDigits[#,10,3],"\n"&~Array~3}&

간단한 구현 (아마도 쉽게 이길 수 있음) : 아무것도 계산하지 않고 가능한 각 출력을 하드 코딩합니다. 입력은 정수입니다. 후행 공백과 전반적으로 후행 줄 바꿈을 사용하여 각 행을 출력합니다.

IntegerDigits[#,10,3]입력의 3 자리 숫자를 제공합니다 (앞에 0이있는 경우에도). 각 숫자는 "기능"의 인수를 나타냅니다

"None"[{e,o},{w,o},{w,a,e},{r,o},{r,a,e},{r,a,w},{r,w,a,e}]

함수 이름 자체를 나타내는 0. ""<>목록의 모든 문자열을 목록으로 연결합니다. "\n"&~Array~3세 줄 바꿈을 생성합니다.


방금 Python 2 답변이 동일한 변수 이름을 사용하더라도 귀하의 답변과 거의 동일하다는 것을 알았습니다. 게시하기 전에 솔직히 당신을 보지 못했습니다!
ElPedro

1
걱정 마! 나는이 상황에서 변수 이름의 일치가 거의 예상된다고 생각한다. :)
Greg Martin

당신 말이 맞아 변수 이름은 약간 예측 가능했습니다.
ElPedro

btw, +1 cos 우리는 같은 방식으로 생각합니다 :-)
ElPedro

1
btw, Mathematica는 모르지만 "only"에서 공백을 제거하면 바이트를 잃을 수 있다고 생각합니다. 항상 줄 끝에 있으므로 후행 공백이 필요하지 않습니다.
ElPedro

1

자바 7, 278

골프 :

String f(String i){String o="";for(int n=0;n<i.length();)o+=(n<1?"User:   ":n<2?"Group:  ":"Others: ")+new String[]{"None","Execute only","Write only","Write and Execute","Read only","Read and Execute","Read and Write","Read Write and Execute"}[i.charAt(n++)-48]+"\n";return o;}

언 골프 드 :

  String f(String i) {
    String o = "";
    for (int n = 0; n < i.length();)
      o += (n < 1 ? "User:   " : n < 2 ? "Group:  " : "Others: ")
        + new String[] { "None", "Execute only", "Write only", "Write and Execute", "Read only", "Read and Execute",
            "Read and Write", "Read Write and Execute" }[i.charAt(n++) - 48]
        + "\n";
    return o;
  }

산출:

User:   Read and Write
Group:  Read and Write
Others: Read and Write

User:   None
Group:  Read only
Others: Write only

User:   Read and Write
Group:  Read only
Others: Read only

1

파이썬 3.5, 3.6-235 232 228 216 바이트

(모든 Python 3.x에서 작동해야 함)

따라서 입력은 STDIN에 있습니다 (수입 ☺ 저장).

a=input()
r=range
for i in r(3):
 p=int(a[i]);x=[["Read","Write","Execute"][j]for j in r(3)if 4>>j&p]
 if x[1:]:x[-1:-1]="and",
 if len(x)==1:x+="only",
 print(["User:  ","Group: ","Others:"][i]," ".join(x)or"None")

튜플을 사용하고, 가능한 경우 공간을 생략하고, 의도를 명확하게하기 위해 일반적으로 괄호를 사용하는 연산자 우선 순위를 지정하십시오.

샘플 사용법 :

$ echo -n '666' | python3 golf2.py
User:   Read and Write
Group:  Read and Write
Others: Read and Write
$ echo -n '644' | python3 golf2.py
User:   Read and Write
Group:  Read only
Others: Read only
$ echo '042' | python3 golf2.py
User:   None
Group:  Read only
Others: Write only
$ echo '123' | python3 golf2.py
User:   Execute only
Group:  Write only
Others: Write and Execute
$ echo -n '777' | python3 golf2.py
User:   Read Write and Execute
Group:  Read Write and Execute
Others: Read Write and Execute

언 골프 :

input_perms = list(map(int, input()))

entities = ["User", "Group", "Others"]
perm_names = ["Read", "Write", "Execute"]

for i in range(3):
    bits = input_perms[i]
    perms = [
        perm_names[j]
        for j in range(3)
        if (1 << (2-j)) & bits
    ]

    if len(perms) > 1:
        perms.insert(-1, "and")
    if len(perms) == 1:
        perms.append("only")

    print("{:7} {}".format(
        entities[i]+":",
        " ".join(perms) or "None"
    ))

1

배치, 280 바이트

@echo off
set/pc=
call:l "User:   " %c:~0,1%
call:l "Group:  " %c:~1,1%
call:l "Others: " %c:~2,1%
exit/b
:l
for %%s in (None.0 Execute.1 Write.2 "Write and Execute.3" Read.4 "Read and Execute.5" "Read and Write.6" "Read Write and Execute.7") do if %%~xs==.%2 echo %~1%%~ns

문자열을 하드 코딩하는 것은 함께 묶으려고하는 것보다 47 바이트 더 짧았습니다. 탭이 합법적이라면 267 바이트가되었을 것입니다.


1

C 번호 307 241 210 바이트

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

형식화

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

1

C #, 322 322373748 바이트

확실히 가장 짧은 버전은 아니지만 chmod값은 실제로 비트 플래그 이므로 비트 연산자를 사용 하여이 문제를 해결하려고했습니다 . 또한 C #은 아마도 최고의 골프 ​​언어는 아닙니다 : D

string P(string s){Func<int,string>X=p=>{var a=new List<string>();if((p&4)>0)a.Add("Read");if((p&2)>0)a.Add("Write");if((p&1)>0)a.Add("Execute");return a.Count>1?string.Join(" ",a.Take(a.Count-1))+" and "+a.Last():a.Count>0?a.First()+" only":"none";};return string.Join("\n",(new[]{"User:   ","Group:  ","Others: "}).Select((c,i)=>c+X(s[i]-'0')));}

ungolfed : (댓글 포함)

string P(string s)
{
    // Function that determines the permissions represented by a single digit (e.g. 4 => "Read only")
    Func<int, string> X = p => 
    {
        var a = new List<string>();         // temporary storage for set permissions
        if ((p & 4) > 0) a.Add("Read");     // Read bit set
        if ((p & 2) > 0) a.Add("Write");    // Write bit set
        if ((p & 1) > 0) a.Add("Execute");  // Execute bit set

        // actually just Output formatting ... Takes a lot of bytes *grr*
        return a.Count > 1 
            ? string.Join(" ", a.Take(a.Count - 1)) + " and " + a.Last() 
            : a.Count > 0 
                ? a.First() + " only" 
                : "none";
    };

    // Actual result:
    return string.Join("\n", (new[] { "User:   ", "Group:  ", "Others: " })
        .Select((c, i) => c + X(s[i] - '0'))); // Map "User, .." to its permissions by using above function
}

이것은 내 첫 번째 코드 골프이므로 잘못 언급 한 경우 알려주십시오. :)

편집 1 :

s[i]-'0's[i]&7(바로) 교체 하고 목록을 변수에 저장 하여 일부 바이트를 저장했습니다.

string P(string s){Func<int,string>X=p=>{var a=new List<string>();if((p&4)>0)a.Add("Read");if((p&2)>0)a.Add("Write");if((p&1)>0)a.Add("Execute");var c=a.Count;return c>1?string.Join(" ",a.Take(c-1))+" and "+a.Last():c>0?a[0]+" only":"none";};return string.Join("\n",(new[]{"User:   ","Group:  ","Others: "}).Select((c,i)=>c+X(s[i]&7)));}

편집 2 :

람다 식으로 변경 :

s=>{Func<int,string>X=p=>{var a=new List<string>();if((p&4)>0)a.Add("Read");if((p&2)>0)a.Add("Write");if((p&1)>0)a.Add("Execute");var c=a.Count;return c>1?string.Join(" ",a.Take(c-1))+" and "+a.Last():c>0?a[0]+" only":"none";};return string.Join("\n",(new[]{"User:   ","Group:  ","Others: "}).Select((c,i)=>c+X(s[i]&7)));}

1

자바 스크립트, 213 209 208 188 186 바이트

function(d){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[d[0]]+"\nGroup: "+c[d[1]]+"\nOthers: "+c[d[2]]}

Dada 덕분에 20 바이트를 절약했습니다!


3
내가 틀렸을 수도 있지만 배열이 반대 순서가 아니어야합니까? b ( "000")을 호출하면 "읽기 쓰기 및 실행"이 반환되지만 "없음"을 기대할 수 있습니다.
Dada

그리고 나는 이것이 더 골프 될 수 있다고 확신합니다. 예를 들어, 191 바이트 버전 : 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]]}.
Dada

1

비쥬얼 베이직, 606 바이트

imports System.Collections
module h
sub main()
Dim i As String=console.readline()
Dim s=new Stack(new String(){"Others: ","Group:  ","User:   "})
for each j as Char in i
dim t=new Stack()
if((asc(j) MOD 2)=1)then t.push("Execute")
if(asc(j)=50 or asc(j)=51 or asc(j)=54 or asc(j)=55)then t.push("Write")
if(asc(J)>51)then t.push("Read")
if t.count=3 then
w(s.pop+t.pop+" "+t.pop+" and "+t.pop)
else
if t.count=2 then
w(s.pop+t.pop+" and "+t.pop)
else
if t.count=0 then
w(s.pop+"None")
else
w(s.pop+t.pop+" only")
end if
end if
end if
next
end sub
sub w(s As String)
console.writeline(s)
end sub
end module

1
PPCG에 오신 것을 환영합니다! 멋진 첫 번째 답변 BTW :)
Beta Decay

1

수정, 200 194 바이트

def m(y)y=y.chars.map &.to_i
a=" and "
o=" only"
r="Read"
w="Write"
x="Execute"
c=["None",x+o,w+o,w+a+x,r+o,r+a+x,r+a+w,r+" "+w+a+x]
"User:   "+c[y[0]]+"
Group:  "+c[y[1]]+"
Others: "+c[y[2]]end

주어진 8 진 시퀀스에 대한 결과 문자열을 문자열로 반환합니다. 예 : m("670")결과 : User: Read and Write\nGroup: Read Write and Execute\nOthers: None.

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


0

C #, 371 바이트

public String[] a = {"none","Execute only","Write only","Write and Execute","Read only","Read and Execute","Read and Write","Read Write and Execute"};
public String pA(int i){return a[i];}
public int d(int n,int i){
  n=n/Math.pow(10,i);
  return n%=10;
}
public void main(int i){
  Console.Write("User:\t{0}\nGroup:\t{1},Others:\t{2}",pA(d(i,0)),pA(d(i,1)),pA(d(i,2));
}

4
이것은 코드 골프이므로 코드를 골프화해야합니다. 또한 언어 이름과 바이트 수를 가진 헤더를 추가하십시오.
TuxCrafting

나는 당신의 바이트 수, 당신의 점수를 추가했습니다. 승리하려면 가능한 한 낮은 점수를 얻어야합니다
Beta Decay

예를 들어, 각 기능에서 불필요한 공백을 모두 제거합니다
Beta Decay

1
@BetaDecay 고마워, 나는이 커뮤니티에 처음 왔고 더 컴팩트 한 코드로 이어질 수있는 PHP를 대신 사용하는 것이 좋습니다.
Alireza Tabatabaeian

1
@Alireza 좋은 생각입니다. 이 사이트에서는 Java와 C #에서 짧은 답변을보고 싶습니다.)
Beta Decay

0

파이썬 3.5 - (370) 294 243 바이트

골프 :

import sys
a=lambda o: [print(('User:  ','Group: ','Others:')[n],('None','Execute only','Write only','Write and Execute','Read only','Read and Execute','Read and Write','Read Write and Execute')[int(o[n])]) for n in range(0,3)]
a(sys.argv[1])

사이즈 확인 :

$ du -b OctalToHuman.py 
243     OctalToHuman.py

언 골프 :

#!/usr/bin/env python3
from sys import argv as ARGS

types = ('User:  ', 'Group: ', 'Others:')
perms = ('None','Execute only','Write only','Write and Execute','Read only','Read and Execute','Read and Write','Read Write and Execute')

def convert(octal_string):
    for n in range(0,3):
        print(types[n], perms[int(octal_string[n])])

if __name__ == '__main__':
    convert(ARGS[1])

샘플 출력 :

$ python ./OctalToHuman.py 666
User:   Read and Write
Group:  Read and Write
Others: Read and Write

$ python ./OctalToHuman.py 042
User:   None
Group:  Read only
Others: Write only

$ python ./OctalToHuman.py 644
User:   Read and Write
Group:  Read only
Others: Read only

이것은 승리 기준에 대한 심각한 경쟁자가 아닙니다. 우리는 우승 기준에 대한 점수를 최적화하기 위해 모든 답변을 요구합니다 (예를 들어, 이와 같은 코드 골프 도전에서 제출은 프로그램의 바이트 수를 최소화하기 위해 진지하게 시도해야 함).
Mego

를 제거 import sys하고 프로그램을 익명 함수 ( lambda o:...)로 만들어서 몇 바이트를 절약 할 수 있습니다 .
NoOneIsHere9

0

F 번호, 204 203 바이트

내 첫 번째 골프, 그래서 실수를 용서해주십시오;)
골프 버전 (pinkfloydx33 의 답변 에 1 : 1 기반 ) :

fun(y:string)->let e,r,w,o,a="Execute ","Read ","Write ","only","and ";let z=["None";e+o;w+o;w+a+e;r+o;r+a+e;r+a+w;r+w+a+e;];let(!-)a=z.[int y.[a]-48];sprintf"User:   %s\nGroup:  %s\nOthers: %s"!-0!-1!-2

언 골프 버전 :

fun (y : string) ->
    let e, r, w, o, a = "Execute ", "Read ", "Write ", "only", "and "
    let z = [
                "None";
                e + o;
                w + o;
                w + a + e;
                r + o;
                r + a + e;
                r + a + w;
                r + w + a + e;
            ]
    let (!-) a = z.[int(y.[a]) - 48]
    sprintf "User:   %s\nGroup:  %s\nOthers: %s" !-0 !-1 !-2

사용법 예 :

let k =  ...... // function definition goes here

printf"%s"<|k"755"
printf"%s"<|k"042"
// etc ...


이것은 pinkfloydx33의 답변을 '개선'할 수 있는지 여부를 확인하는 것입니다 -알고리즘에 대한 크레딧을 얻지 않습니다.


0

PHP, 199 바이트

foreach([User,Group,Others]as$i=>$u){$a=[];foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;$a[]=($x=array_pop($a))?$a?"and $x":"$x only":None;echo str_pad("\n$u:",9).join(" ",$a);}

PHP, \ 1과 189 바이트

foreach([User,Group,Others]as$i=>$u){$a=[];foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;$a[]=($x=array_pop($a))?$a?"and $x":"$x only":None;echo"\n$u:\t".join(" ",$a);}

안녕하세요, 탭 대신 공백을 사용해야합니다
Beta Decay

이 경우 \ t는 str_repeat ( "", 3- $ i) 또는 str_pad ( "", 3- $ i, "")처럼 보이지만 내 생각에는 중요하지 않습니다. 나는 이길 기회가 없습니다. 또 다른 공간 cs.tut.fi/~jkorpela/chars/spaces.html
요 르그 Hülsermann

1
저장하려면 13 + 34 바이트입니다. 긴 버전 : (-9) echo str_pad("$u:",8)대신 사용 echo"$u:".str_repeat(" ",3-$i); 이것은 $i=>더 이상 사용되지 않습니다 (-4). 사용 : 두 버전의 $a[$z-1]="and $a[$z-1]";대신 {$a[]=$a[$z-1];$a[$z-1]="and";}(-7)와 else$a[]=$a?Only:None;대신 elseif($z<1)$a[]=None;else$a[]=Only;(-14). 돌려 if(1<$z=count($a))$a[$z-1]="and $a[$z-1]";else$a[]=$a?Only:None;if($x=array_pop($a))$a[]=$a?"and $x":"$x Only";else$a[]=None;(-3) 다음에 $a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None;(-10)
디도

@Titus echo str_pad ( "$ u :", 8), $ a [$ z-1] = "and $ a [$ z-1]";, else $ a [] = $ a? Only : None; $ i => 더 이상 사용되지 않습니다. $ m = $ argv [1] [$ i]가 필요합니다. 나머지는 우선 다른 방법으로 시도합니다. 의견을 보내 주셔서 감사합니다
Jörg Hülsermann

1
더 많은 아이디어 : (-3) if(4&$m=$argv[1][$i])대신 또는 루프로 교체 : (-7)$m=$argv[1][$i];if(4&$m)$m=;if();if();if();foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;
Titus

0

파이썬 3, 191 바이트

def d(n):a,b,c,d,e=' and ',' only',"Execute","Write","Read";l=["None",c+b,d+b,d+a+c,e+b,e+a+c,e+a+d,e+" "+d+a+c];y,u,i=map(int,n);return"User:   %s\nGroup:  %s\nOthers: %s\n"%(l[y],l[u],l[i])

언 골프

def d(n):
    a,b,c,d,e=' and ',' only',"Execute","Write","Read"
    l=["None",c+b,d+b,d+a+c,e+b,e+a+c,e+a+d,e+" "+d+a+c]
    y,u,i=map(int,n)
    return"User:   %s\nGroup:  %s\nOthers: %s\n"%(l[y],l[u],l[i])

1
PPCG에 오신 것을 환영합니다! 좋은 첫 포스트!
Rɪᴋᴇʀ

흠, 나는 단지 191을 얻을 때 중재자가 151 바이트를 얻는 방법이 매우 궁금합니다. : D 실수입니까? 편집 확인
Aleksandr Smirnov

그건 나였 어, 미안 편집 내용에 오타가있었습니다. 지금 수정했습니다.
Rɪᴋᴇʀ

0

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

a=>`User:  ${(b=[' None',(c=' Execute')+(d=' only'),(e=' Write')+d,f=e+(g=' and')+c,(h=' Read')+d,h+g+c,h+g+e,h+f])[a[0]]}\nGroup: ${b[a[1]]}\nOthers:`+b[a[2]]

예:

(a=>`User:  ${(b=[' None',(c=' Execute')+(d=' only'),(e=' Write')+d,f=e+(g=' and')+c,(h=' Read')+d,h+g+c,h+g+e,h+f])[a[0]]}\nGroup: ${b[a[1]]}\nOthers:`+b[a[2]])("042")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.