Giải mã chmod


26

Thử thách

Cho một số cấp phép bát phân ba chữ số, xuất ra các quyền mà nó cấp.

chmod

Trên hệ điều hành UNIX, quyền của tệp được thay đổi bằng chmodlệnh. Có một vài cách khác nhau để sử dụng chmod, nhưng cách chúng ta sẽ tập trung vào hôm nay là sử dụng quyền bát phân.

Ba chữ số trong số quyền cho biết một người khác nhau:

  • Chữ số đầu tiên thể hiện quyền cho người dùng
  • Chữ số thứ hai thể hiện các quyền cho nhóm
  • Chữ số cuối cùng đại diện cho các quyền cho người khác

Tiếp theo, mỗi chữ số biểu thị một quyền như dưới đây trong:

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

Đầu vào

Đầu vào sẽ là số có ba chữ số dưới dạng chuỗi, ví dụ:

133

hoặc là

007

Điều này sẽ được thông qua hoặc thông qua STDIN hoặc thông qua các đối số chức năng.

Đầu ra

Đầu ra của bạn phải là các quyền khác nhau cho mỗi người dùng, nhóm và những người khác. Bạn phải hiển thị thông tin này như vậy:

User:   ddd
Group:  ddd
Others: ddd

Nơi có ba không gian sau User, hai không gian sau Groupvà một không gian sau Others. Bạn thay thế dddbằng thông tin quyền.

Đầu ra của bạn có thể là STDOUT hoặc dưới dạng chuỗi trả về.

Ví dụ

Đầu vào: 666

Đầu ra:

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

Đầu vào: 042

Đầu ra:

User:   None
Group:  Read only
Others: Write only

Đầu vào: 644

Đầu ra:

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

Chiến thắng

Mã ngắn nhất tính bằng byte thắng.


Các thông số kỹ thuật của đầu vào là gì?
Jonathan Allan

@Jonathan ALLan Chỉ là số có ba chữ số
Phân rã Beta

Bạn có nghĩa là chỉ một số nguyên, vì vậy 042 sẽ được nhận là 42?
Jonathan Allan

2
@Jonathan Không, đó là đầu vào chuỗi nên là 042
Beta Decay

1
Đầu ra trông đúng với một ký tự tab, vậy tại sao không sử dụng nó? Chỉ cần các ngôn ngữ hình phạt cần nhiều byte hơn để đệm một chuỗi?
Tít

Câu trả lời:


3

05AB1E , 89 87 byte

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

Triệu tập mã hóa Cthulhu . Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


14

Javascript (ES6), 165 161 byte

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`
`

Chỉnh sửa: +1 byte để thực hiện quy tắc "không có tab"

Ví dụ

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


Bạn có thể thu được một vài byte bằng cách sắp xếp lại mảng (và có thể tách các số khỏi chuỗi). +1 cho ý tưởng.
Tít

@Titus - Tôi phải thừa nhận rằng tôi không thấy sự sắp xếp lại giúp tiết kiệm một số byte. Ngoài ra, các số phải được coi là chuỗi để replace()hoạt động trên chúng mà không ép buộc. Nhưng tôi có thể thiếu quan điểm của bạn.
Arnauld

@Titus - Một cái gì đó như 'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)có thể làm việc. Đó có phải là những gì bạn có trong tâm trí?
Arnauld

Tôi đã hiểu lầm họ; nghĩ rằng chúng là giá trị bát phân. :) Nhưng ý tưởng mới của bạn cũng không tệ.
Tít

Đầu ra thử thách yêu cầu khoảng trắng thay vì các tab như hiện tại được viết.
Mwr247

13

GNU sed, 187 163 158 (157 + 1) byte

Chạy với -r (ERE regrec). Tệp không chứa dòng mới.

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

Cách tiếp cận đẹp nhưng bạn có thể lưu khoảng 20 byte bằng cách xóa các chữ số khi bạn thêm andhoặc only.
Neil

@ Không có :) kết hợp đề xuất của bạn cho một tiết kiệm rất đáng kể.
FireFly

1
Dòng đầu tiên có thể chỉ là : s/(.)(.)/User: \1\nGroup: \2\nOthers: /. Một số byte khác có thể được lưu bằng cách chuyển sang Perl, có \d\K.
ninjalj

@ninjalj điểm tốt. Tôi sẽ gắn bó với sed vì tôi không biết Perl, và tôi chắc chắn sẽ có những thủ thuật khác để kéo nó đến ngắn hơn, bên ngoài các thay thế s ///.
FireFly

6

C # 214 byte

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

Thạch , 100 91 85 byte

Hầu như chắc chắn có thể chơi được - 91 byte, cái gì?! 8 tháng và 6 byte khôn ngoan!
- 1. nén chuỗi nhiều hơn;
- 2. loại bỏ sự suy giảm sau quy tắc bằng 48 vì lập chỉ mục là mô-đun;
- 3. sử dụng chuỗi ngầm tốt hơn).

-9 byte với sự trợ giúp của @Lynn đang chạy nén chuỗi cho tôi

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

Kiểm tra nó tại TryItOnline

Làm sao?

,“£ɱ~» - 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

Octave, 185 byte

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

Tạo hàm ẩn danh lấy đầu vào dưới dạng chuỗi: '042'. Chuyển đổi nó thành một mảng : (56-'042)' = [0 4 2]. Sử dụng điều này như nhiều chỉ mục ô để lập chỉ mục cho mảng ô Read Write and Execute','Read and Write', .... Sử dụng fprintfđể sản xuất các ba chuỗi, với các chuyên mục thích hợp: User:, Group:Others:.

Tôi cố gắng tìm kiếm một cách để lưu trữ Execute, Write, Readnhư lời riêng biệt và concatenate khi cần thiết, nhưng điều này hóa ra còn so với phương pháp ngây thơ.

Ví dụ:

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

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


2
Bạn có thể lưu một vài byte bằng cách sử dụng strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')thay cho mảng ô theo nghĩa đen
Luis Mendo

4

PowerShell v2 +, 189 168 byte

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

Vòng lặp thông qua đầu vào $args[0]như một char-array. Mỗi lần lặp, chúng tôi lập chỉ mục thành một mảng với$i++ (mặc định là 0) để chọn User, Grouphoặc Others, concatenate rằng với dấu hai chấm và một tab, và concatenate rằng với một chỉ số mảng.

Đây là phép màu. Chúng tôi ngầm định charchuyển thành một intvà trừ 48(nghĩa là biến ASCII 48( "0") thành 0), chọn từ ngữ thích hợp làm một mảng củaint s. Mảng đó sau đó được sử dụng làm chỉ mục vào 'None','Read','Write','Execute','only','and'mảng. Do mặc định $ofs(Dấu tách trường đầu ra) là một khoảng trắng, nên điều này sẽ chèn chính xác các khoảng trắng giữa các thành phần mảng khi được xâu chuỗi (xảy ra khi nó nối với bên trái).

Ba chuỗi này được để lại trên đường ống và đầu ra thông qua ẩn Write-Outputxảy ra khi hoàn thành chương trình.

Thí dụ

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

3

Rơm , 193 byte

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

Dùng thử trực tuyến

Đẩy 3 lần một bảng chuyển đổi trên ngăn xếp thứ nhất, chuyển sang ngăn xếp thứ hai, chuyển đổi từng số bằng bảng hội thoại và in.


2

Haskell, 186 byte

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

Thí dụ:

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

Chỉ sử dụng khúc dạo đầu. Tôi làm đúng chứ hả?

Ung dung:

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

Python 2, 190 185 byte

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

Để lại một khoảng trống ở cuối nếu Execute hoặc Write nằm ở cuối dòng nhưng tôi không thấy rằng điều này không được phép.

EDIT đã lưu 5 byte bằng cách thay đổi phạm vi (3) thành 0,1,2 và kiểm tra số byte trên máy tính xách tay Linux của tôi thay vì Windows của tôi (\ n = \ r \ n hoặc ngược lại. Tôi không bao giờ có thể nhớ được).


2

Python 2, 240 239 238 237 228 byte

Tôi nghĩ cuối cùng tôi cũng cho thứ golf lạnh này đi. Hy vọng dấu vết khoảng trắng được cho phép. (đã sửa và trong quá trình lưu một byte)

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

Chào mừng bạn đến với PPCG, và câu trả lời đầu tiên tốt đẹp!
Sản phẩm ETH

Tôi đã xấu hổ thay thế phạm vi (3) trong câu trả lời Python 2 của tôi thành 0,1,2 sau khi đọc qua mã của bạn. Câu trả lời tốt đẹp. +1
ElPedro

2

PHP, 169 159 byte

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

lấy chuỗi làm đối số dòng lệnh : php -r '<code>' <argument>,
in một dòng mới hàng đầu thay vì theo sau

Cảm ơn Jörg đã chỉ ra lỗi của tôi - và cho \t.

PHP, 169 byte

với hạn chế mới: (cấm ký tự tab)

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

Đây là 1 byte ngắn hơn so với str_pad, bởi vì nó cần thêm trống.

phá vỡ

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
}

Để tạo mảng cho $n, sử dụng:

$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 (['Người dùng', 'Nhóm', 'Người khác'] dưới dạng $ i => $ u) {echo "\\ n $ u: \\ t"; lưu một số byte và đầu ra cho 3,4,6 là sai
Jörg Hülsermann

1
Đây là thứ tự đúng [5,33,34,66,35,67,131,531] ý tưởng hay
Jörg Hülsermann

Tôi đã quên 'Người dùng' cho Người dùng để lưu lại 6 byte tiếp theo mà bạn muốn đánh bại JavaScript
Jörg Hülsermann

@ JörgHülsermann: Dù sao thì tôi cũng đã chấp nhận "\ t"; cảm ơn. +1 cho điều đó :) Mắt tốt trên 33!
Tít

1
Đối với 346 đầu ra của chúng tôi là Người dùng: Nhóm Đọc và Viết: Chỉ thực hiện Khác: Viết và Thực hiện nó nên Người dùng: Viết và Thực thi Nhóm: Chỉ đọc Khác: Đọc và Viết
Jörg Hülsermann

2

bash - 221 213 byte

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

Không rõ liệu điều này có thể được cô đọng thêm nữa hay không, ít nhất là không thay đổi căn bản cách tiếp cận ở đây (tách đầu vào và sử dụng nó làm chỉ mục cho mảng ${b}chứa các chuỗi tương ứng).


1
Nó ngắn hơn với \ onlynội tuyến mở rộng. grep -o .<<<$1ngắn hơn echo $1|grep -o ., nhưng đọc đầu vào từ stdin với while read -n1 cthì tốt hơn. Các chỉ mục mảng có bối cảnh arithmethic trong bash, vì vậy ${l[z++]}hoạt động. lsẽ ngắn hơn dưới dạng một chuỗi, sẽ được truy cập dưới dạng ${l:z++*8:8}(offset và độ dài có bối cảnh arithmethic). Một byte khác có thể được thay đổi bằng cách đọc toàn bộ chế độ c, mở rộng "Người dùng:", ... nội tuyến và sử dụng hợp lý các mở rộng tham số.
ninjalj

1
Để có kết quả cuối cùng của: 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}]}"(thay thế \ n bằng các dòng mới theo nghĩa đen).
ninjalj

1

Java 7, 300 284 byte

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

Tiếp cận trực tiếp cho bây giờ. Sẽ cố gắng đưa ra một cách tiếp cận chung chung hơn để sử dụng lại các từ.

Các trường hợp bất ngờ & thử nghiệm:

Hãy thử nó ở đây.

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

Đầu ra:

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

Groovy, 217 207 205 byte

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

vô dụng:

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

Toán học, 211 byte

{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}&

Việc triển khai đơn giản (có thể dễ dàng đánh bại): không tính toán bất cứ điều gì, chỉ cần mã cứng cho mỗi đầu ra có thể. Đầu vào là một số nguyên; xuất ra mỗi dòng với một không gian dấu và tổng thể dòng mới.

IntegerDigits[#,10,3]đưa ra ba chữ số của đầu vào (ngay cả khi có các số 0 đứng đầu). Mỗi chữ số chỉ ra một đối số của "hàm"

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

với 0 chỉ tên chính của hàm. ""<>nối tất cả các chuỗi trong một danh sách (danh sách). "\n"&~Array~3sản xuất ba dòng mới.


Tôi chỉ nhận thấy rằng câu trả lời Python 2 của tôi gần giống với câu trả lời của bạn, thậm chí sử dụng cùng tên biến. Tôi thực sự đã không nhìn thấy bạn trước khi tôi đăng!
ElPedro

1
đừng lo lắng! Tôi nghĩ rằng sự phù hợp của tên biến là khá nhiều được mong đợi trong tình huống này :)
Greg Martin

Đoán bạn đúng. Tên biến có thể dự đoán được một chút ☺
ElPedro

btw, +1 cos chúng tôi nghĩ giống như vậy :-)
ElPedro

1
Tuy nhiên, tôi không biết Mathicala nhưng tôi nghĩ bạn có thể mất một byte bằng cách xóa khoảng trắng khỏi "chỉ". Nó sẽ luôn ở cuối dòng nên không cần dấu cách.
ElPedro

1

Java 7, 278

Chơi gôn

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

Ung dung:

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

Đầu ra:

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

Python 3.5, 3.6 - 235 232 228 216 byte

(nên hoạt động trên tất cả Python 3.x)

Vì vậy, đầu vào là trên STDIN ở đây (lưu nhập import).

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

Sử dụng các bộ dữ liệu, bỏ qua các khoảng trắng nếu có thể và ưu tiên toán tử nơi bạn thường đặt dấu ngoặc đơn để làm rõ ý định của mình.

Sử dụng mẫu:

$ 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

Chưa chơi gôn:

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

Mẻ, 280 byte

@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

Mã hóa chuỗi ngắn hơn 47 byte so với cố gắng ghép chúng lại với nhau. Sẽ là 267 byte nếu các tab là hợp pháp.


1

C # 307 241 210 byte

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

Định dạng

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 337 348 byte

Đó chắc chắn không phải là phiên bản ngắn nhất, nhưng tôi đã thử giải quyết vấn đề này bằng cách sử dụng các toán tử bitwise vì các chmodgiá trị thực sự là các cờ bit. Ngoài ra C # có lẽ không phải là ngôn ngữ chơi golf tốt nhất: 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')));}

vô dụng: (có ý kiến)

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
}

Đây là lần đầu tiên tôi chơi golf mã, vì vậy xin vui lòng cho tôi biết, nếu tôi đã làm sai :)

CHỈNH SỬA 1:

Đã lưu một số byte bằng cách thay thế s[i]-'0'bằng s[i]&7(ở cuối) và lưu danh sách đếm vào biến:

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

EDIT 2:

Thay đổi thành biểu thức lambda:

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

Javascript, 213 209 208 188 186 byte

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

Đã lưu 20 byte nhờ Dada!


3
Tôi có thể nhầm, nhưng không nên mảng của bạn theo thứ tự ngược lại? Nếu tôi gọi b ("000"), nó sẽ trả về "Đọc ghi và thực thi" trong khi người ta có thể mong đợi "Không" ...
Dada

Và tôi khá chắc chắn rằng điều này có thể được chơi golf nhiều hơn. Ví dụ: phiên bản 191 byte : 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

Visual Basic, 60 byte

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
Chào mừng đến với PPCG! Câu trả lời đầu tiên rất hay BTW :)
Beta Decay

1

Pha lê, 200 194 byte

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

trả về chuỗi kết quả cho chuỗi bát phân đã cho dưới dạng chuỗi. ví dụ:m("670") kết quả để : User: Read and Write\nGroup: Read Write and Execute\nOthers: None.

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


0

C #, 371 byte

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
Đây là mã golf, vì vậy bạn phải đánh golf mã của mình. Ngoài ra, thêm một tiêu đề với tên của ngôn ngữ và bytecount.
Thiền từ

Tôi đã thêm số byte của bạn, đó là điểm số của bạn. Bạn cần lấy số điểm của mình càng thấp càng tốt để giành chiến thắng
Beta Decay

Ví dụ: bạn thoát khỏi tất cả các khoảng trắng không cần thiết trong mỗi chức năng
Beta Decay

1
@BetaDecay Cảm ơn, tôi mới tham gia cộng đồng này và tôi nghĩ rằng tốt hơn tôi nên sử dụng php thay vào đó có thể dẫn đến nhiều mã nhỏ gọn hơn.
Alireza Tabatabaeian

1
@Alireza Đó là một ý tưởng tốt. Mặc dù trên trang web này, chúng tôi muốn thấy các câu trả lời ngắn bằng Java và C # :)
Beta Decay

0

Con trăn 3.5 - 370 294 243 byte

Chơi gôn

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

Kiểm tra kích thước:

$ du -b OctalToHuman.py 
243     OctalToHuman.py

Chưa chơi gôn:

#!/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])

Đầu ra mẫu:

$ 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

Đây không phải là một ứng cử viên nghiêm trọng cho các tiêu chí chiến thắng. Chúng tôi yêu cầu tất cả các câu trả lời để thực hiện một nỗ lực nghiêm túc trong việc tối ưu hóa điểm số của họ cho các tiêu chí chiến thắng (ví dụ: trong các thử thách chơi gôn như bài này, bài nộp phải thực hiện một nỗ lực nghiêm túc để giảm thiểu số byte của chương trình).
Mego

Bạn có thể lưu khá nhiều byte bằng cách xóa import sysvà chỉ làm cho chương trình trở thành một hàm ẩn danh ( lambda o:...).
NoOneIsHãy

0

F #, 204 203 byte

Golf đầu tiên của tôi, vì vậy xin vui lòng tha thứ cho bất kỳ sai lầm nào;)
Phiên bản golf (dựa trên 1: 1 câu trả lời của Pinkfloydx33 ):

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

Phiên bản chưa được chỉnh sửa:

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

Ví dụ sử dụng:

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

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


Điều này chỉ để kiểm tra xem liệu tôi có thể 'cải thiện' câu trả lời của Pinkfloydx33 hay không - tôi không nhận bất kỳ tín dụng nào cho thuật toán


0

PHP, 199 byte

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, 189 byte với \ t

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

Xin chào, bạn nên sử dụng khoảng trắng thay vì các tab
Beta Decay

Trong trường hợp này \ t trông giống như str numpeat ("", 3- $ i) hoặc str_pad ("", 3- $ i, "") nhưng không thành vấn đề với ý tưởng của tôi, tôi không có cơ hội chiến thắng. Nếu tôi nên lấy một không gian khác cs.tut.fi/~jkorpela/chars/spaces.html
Jörg Hülsermann

1
13 + 34 byte để lưu. Trong phiên bản dài: Sử dụng echo str_pad("$u:",8)thay vì echo"$u:".str_repeat(" ",3-$i)(-9); điều này làm cho $i=>lỗi thời (-4). Trong cả hai phiên bản: Sử dụng $a[$z-1]="and $a[$z-1]";thay vì {$a[]=$a[$z-1];$a[$z-1]="and";}(-7) và else$a[]=$a?Only:None;thay vì elseif($z<1)$a[]=None;else$a[]=Only;(-14). Biến if(1<$z=count($a))$a[$z-1]="and $a[$z-1]";else$a[]=$a?Only:None;thành if($x=array_pop($a))$a[]=$a?"and $x":"$x Only";else$a[]=None;(-3) và sau đó thành $a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None;(-10)
Tít

@Titus echo str_pad ("$ u:", 8), $ a [$ z-1] = "và $ a [$ z-1]";, khác $ a [] = $ a? Chỉ: Không; Xong $ i => lỗi thời Tôi không thể làm được thì $ m = $ argv [1] [$ i] là cần thiết. Đối với phần còn lại tôi sẽ thử cách khác trước. Cảm ơn bạn đã đóng góp
Jörg Hülsermann

1
Thêm ý tưởng: if(4&$m=$argv[1][$i])thay vì $m=$argv[1][$i];if(4&$m)(-3) HOẶC thay thế $m=;if();if();if();bằng một vòng lặp: foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;(-7)
Tít

0

Python 3, 191 byte

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

vô dụng

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
Chào mừng đến với PPCG! bài viết đầu tiên tốt đẹp!
Rɪᴋᴇʀ

Hmm, tôi rất tò mò làm thế nào người điều hành có được 151byte khi tôi chỉ nhận được 191: D Có phải là lỗi không? Kiểm tra các chỉnh sửa
Aleksandr Smirnov

Đó là tôi, xin lỗi. Tôi đánh máy trong bản chỉnh sửa. Đã sửa bây giờ.
Rɪᴋᴇʀ

0

Javascript (ES6), 159 byte

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

Thí dụ:

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