Dekode chmod

26

Tantangan

Diberi nomor izin oktal tiga digit, keluarkan izin yang diberikannya.

chmod

Pada UNIX OS, izin file diubah menggunakan chmodperintah. Ada beberapa cara menggunakan chmod, tetapi cara yang akan kita fokuskan hari ini adalah menggunakan izin oktal.

Tiga digit dalam nomor izin mewakili orang yang berbeda:

  • Digit pertama mewakili izin untuk pengguna
  • Digit kedua mewakili izin untuk grup
  • Digit terakhir mewakili izin untuk orang lain

Selanjutnya, setiap digit mewakili izin seperti yang ditunjukkan di bawah ini di:

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

Memasukkan

Input akan berupa angka tiga digit sebagai string, misalnya:

133

atau

007

Ini akan diteruskan baik melalui STDIN atau melalui argumen fungsi.

Keluaran

Output Anda haruslah izin yang berbeda untuk masing-masing pengguna, grup, dan yang lainnya. Anda harus menampilkan informasi ini seperti:

User:   ddd
Group:  ddd
Others: ddd

Di mana ada tiga spasi setelahnya User, dua spasi setelah Groupdan satu spasi sesudahnya Others. Anda ganti ddddengan informasi izin.

Output Anda mungkin ke STDOUT atau sebagai string yang dikembalikan.

Contohnya

Input: 666

Keluaran:

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

Input: 042

Keluaran:

User:   None
Group:  Read only
Others: Write only

Input: 644

Keluaran:

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

Kemenangan

Kode terpendek dalam byte menang.

Peluruhan Beta
sumber
Apa spesifikasi inputnya?
Jonathan Allan
@JonathanAllan Hanya nomor tiga digit
Peluruhan Beta
Maksud Anda sebagai bilangan bulat desimal saja, jadi 042 akan diterima sebagai 42?
Jonathan Allan
2
@ Jonathan Tidak, ini input string jadi 042
Beta Decay
1
Outputnya terlihat benar dengan karakter tab, jadi mengapa tidak menggunakannya? Hanya untuk bahasa hukuman yang membutuhkan lebih banyak byte untuk mengisi string?
Titus

Jawaban:

3

05AB1E , 89 87 byte

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

Memanggil penyandian Cthulhu . Menggunakan pengkodean CP-1252 . Cobalah online!

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

Sunting: +1 byte untuk memenuhi aturan "no tab"

Contohnya

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

Arnauld
sumber
Anda bisa mendapatkan beberapa byte dengan mengatur ulang array (dan mungkin memisahkan angka dari string). +1 untuk gagasan itu.
Titus
@Itus - Saya harus mengakui bahwa saya gagal melihat pengaturan ulang yang menghemat beberapa byte. Juga, nomor-nomor tersebut harus diperlakukan sebagai string sehingga dapat replace()bekerja pada mereka tanpa paksaan. Tapi saya mungkin kehilangan poin Anda.
Arnauld
@ Bib - Sesuatu seperti 'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)mungkin bekerja. Apakah itu yang ada dalam pikiran Anda?
Arnauld
Saya salah paham terhadap mereka; mengira itu adalah nilai oktal. :) Tapi ide baru Anda juga tidak buruk.
Titus
Output tantangan membutuhkan spasi alih-alih tab seperti saat ini sedang ditulis.
Mwr247
13

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

Jalankan dengan -r (ERE regexp). File tidak mengandung baris baru.

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
FireFly
sumber
Pendekatan yang bagus tetapi Anda dapat menyimpan sekitar 20 byte dengan menghapus digit saat Anda menambahkan andatau only.
Neil
@Neil there :) memasukkan saran Anda untuk penghematan yang sangat signifikan.
FireFly
1
Baris pertama bisa saja: s/(.)(.)/User: \1\nGroup: \2\nOthers: /. Beberapa byte lagi dapat disimpan dengan porting ke Perl, yang memiliki \ddan \K.
ninjalj
@ninjalj poin bagus. Saya akan tetap pada sed karena saya tidak tahu Perl, dan saya yakin akan ada trik lain untuk menarik di sana untuk membuatnya lebih pendek, di luar penggantian.
FireFly
6

C # 214 Bytes

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']}";}
pinkfloydx33
sumber
6

Jelly , 100 91 85 byte

Hampir pasti golf - 91 byte, apa ?! 8 bulan dan 6 byte kebijaksanaan!
- 1. lebih banyak kompresi string;
- 2. menghapus penurunan post-ordinal sebanyak 48 karena pengindeksan bersifat modular;
- 3. gunakan chaining diam-diam lebih baik).

-9 byte dengan bantuan jenis @Lynn menjalankan kompresi string untuk saya

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

Uji di TryItOnline

Bagaimana?

,“£ɱ~» - 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
Jonathan Allan
sumber
4

Oktaf, 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})

Buat fungsi anonim yang mengambil input sebagai string: '042'. Dikonversi ke array: (56-'042)' = [0 4 2]. Gunakan ini sebagai beberapa indeks sel untuk mengindeks array sel Read Write and Execute','Read and Write', .... Penggunaan fprintfuntuk output tiga senar, dengan kategori yang sesuai: User:, Group:dan Others:.

Saya mencoba menemukan cara untuk menyimpan Execute, Write, Readsebagai kata-kata dan concatenate terpisah sesuai kebutuhan, tapi ini ternyata lebih lama dari pendekatan naif.

Contoh:

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

Cobalah online.

Stewie Griffin
sumber
2
Anda dapat menyimpan beberapa byte menggunakan strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')alih-alih literal array sel
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]]}

Loop melalui input $args[0]sebagai char-array. Setiap iterasi, kami indeks ke array dengan $i++(default 0) untuk memilih User, Groupatau Others, concatenate yang dengan usus besar dan tab, dan concatenate bahwa dengan indeks array yang lain.

Ini keajaibannya. Kami secara implisit melemparkan charke intdan kurangi 48(yaitu, mengubah ASCII 48( "0") menjadi 0), memilih kata-kata yang tepat sebagai array dari ints. Array itu kemudian digunakan sebagai indeks ke dalam 'None','Read','Write','Execute','only','and'array. Karena default $ofs(Output Field Separator) adalah spasi, ini dengan benar menyisipkan spasi di antara elemen-elemen array ketika dirangkai (yang terjadi ketika digabungkan ke kiri).

Tiga string ini ditinggalkan di jalur pipa, dan output melalui implisit Write-Outputterjadi pada penyelesaian program.

Contoh

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

Sedotan , 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: ),+>

Cobalah online

Tekan 3 kali tabel konversi pada tumpukan pertama, beralih ke tumpukan kedua, konversi setiap nomor menggunakan tabel percakapan dan cetak.

TuxCrafting
sumber
2

Haskell, 186 Bytes

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

Contoh:

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

Hanya Prelude yang digunakan. Apakah saya melakukan ini dengan benar?

Tidak Disatukan:

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

Meninggalkan ruang tambahan jika Jalankan atau Tulis ada di akhir baris tetapi saya tidak melihat bahwa ini tidak diizinkan.

EDIT Menyimpan 5 byte dengan mengubah rentang (3) menjadi 0,1,2 dan memeriksa jumlah byte pada laptop Linux saya, bukan pada Windows saya (\ n = \ r \ n atau sebaliknya. Saya tidak pernah dapat mengingat yang mana).

ElPedro
sumber
2

Python 2, 240 239 238 237 228 byte

Saya pikir saya akhirnya akan mencoba golf yang dingin ini. Semoga trailing whitespace diizinkan. (diperbaiki, dan dalam proses menyimpan 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
Jack Greenhill
sumber
Selamat datang di PPCG, dan jawaban pertama yang bagus!
ETHproduk
Saya tanpa malu-malu mengganti kisaran (3) dalam Python 2 saya jawaban menjadi 0,1,2 setelah membaca kode Anda. Jawaban bagus. +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]," ";}

mengambil string sebagai argumen baris perintah: php -r '<code>' <argument>,
mencetak baris baru terkemuka bukan satu membuntuti

Terima kasih kepada Jörg karena menunjukkan bug saya - dan untuk \t.

PHP, 169 byte

dengan batasan baru: (karakter tab dilarang)

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

Ini lebih pendek 1 byte daripada dengan str_pad, karena tambahan kosong yang diperlukan.

kerusakan

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
}

Untuk membuat array $n, gunakan ini:

$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,";}
Titus
sumber
1
foreach (['Pengguna', 'Grup', 'Lainnya'] sebagai $ i => $ u) {echo "\\ n $ u: \\ t"; menghemat beberapa byte dan output untuk 3,4,6 salah
Jörg Hülsermann
1
Ini adalah urutan yang tepat [5,33,34,66,35,67,131,531] ide bagus
Jörg Hülsermann
Saya lupa 'Pengguna' ke Pengguna untuk exmple menyimpan 6 Bytes berikutnya yang ingin Anda kalahkan JavaScript melakukannya
Jörg Hülsermann
@ JörgHülsermann: Saya toh akan mengadopsi "\ t"; Terima kasih. +1 untuk itu :) Baik 33!
Titus
1
untuk 346 output kami adalah Pengguna: Grup Baca dan Tulis: Eksekusi yang lain: Tulis dan Eksekusi seharusnya Pengguna: Grup Tulis dan Eksekusi: Hanya Baca Lainnya: Baca dan Tulis
Jörg Hülsermann
2

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

Tidak jelas apakah ini dapat dipadatkan lebih lanjut, setidaknya bukan tanpa secara mendasar mengubah pendekatan di sini (memisahkan input dan menggunakannya sebagai indeks ke array ${b}yang menyimpan string yang sesuai).

bingkai
sumber
1
Lebih pendek dengan \ onlyinline yang diperluas. grep -o .<<<$1lebih pendek dari echo $1|grep -o ., tetapi membaca input dari stdin dengan while read -n1 clebih baik. Indeks array memiliki konteks aritmatika dalam bash, jadi ${l[z++]}berfungsi. lakan lebih pendek sebagai string, yang akan diakses sebagai ${l:z++*8:8}(offset dan panjang memiliki konteks aritmethic). Byte lain dapat ditambahkan dengan membaca seluruh mode dalam c, memperluas "Pengguna:", ... sebaris dan memanfaatkan secara bijaksana ekspansi parameter.
ninjalj
1
Untuk hasil akhir dari: 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}]}"(ganti \ n dengan baris baru literal).
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";}

Pendekatan langsung untuk saat ini. Akan mencoba memunculkan pendekatan yang lebih umum untuk menggunakan kembali kata-kata.

Kasus yang tidak disatukan & uji:

Coba di sini.

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

Keluaran:

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
Kevin Cruijssen
sumber
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])}}

ungolfed:

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])
  }
}
norganos
sumber
1

Mathematica, 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}&

Implementasi langsung (mungkin mudah dikalahkan): tidak menghitung apa pun, hanya kode-keras setiap output yang mungkin. Input adalah bilangan bulat; output setiap baris dengan spasi tambahan, dan baris baru tambahan secara keseluruhan.

IntegerDigits[#,10,3]memberikan tiga digit input (bahkan jika ada nol di depan). Setiap digit menunjukkan argumen dari "fungsi"

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

dengan 0 menunjukkan nama fungsi itu sendiri. ""<>merangkai semua string dalam daftar (daftar). "\n"&~Array~3menghasilkan tiga baris baru.

Greg Martin
sumber
Saya hanya memperhatikan bahwa jawaban Python 2 saya hampir identik dengan jawaban Anda, bahkan menggunakan nama variabel yang sama. Jujur saya belum melihat milik Anda sebelum saya diposting!
ElPedro
1
jangan khawatir! Saya pikir pencocokan nama variabel cukup banyak yang diharapkan dalam situasi ini :)
Greg Martin
Kira kamu benar. Nama-nama variabel agak dapat diprediksi ☺
ElPedro
btw, +1 karena kami berpikir dengan cara yang sama :-)
ElPedro
1
btw, saya tidak tahu Mathematica tapi saya pikir Anda mungkin bisa kehilangan satu byte dengan menghapus spasi dari "hanya". Itu akan selalu berada di akhir garis sehingga tidak membutuhkan ruang tambahan.
ElPedro
1

Java 7, 278

Golf:

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

Tidak Disatukan:

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

Keluaran:

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

sumber
1

Python 3.5, 3.6 - 235 232 228 216 byte

(harus bekerja pada semua Python 3.x)

Jadi inputnya ada di STDIN di sini (menyimpan impor ☺).

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

Memanfaatkan tuple, menghilangkan spasi di mana mungkin dan prioritas operator di mana Anda biasanya meletakkan tanda kurung untuk memperjelas niat Anda.

Penggunaan sampel:

$ 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

Tidak golf:

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"
    ))
Jonas Schäfer
sumber
1

Batch, 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

Hardcoding string adalah 47 byte lebih pendek daripada mencoba untuk menyatukannya. Akan menjadi 267 byte jika tab legal.

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

Diformat

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

C #, 322 337 348 byte

Itu pasti bukan versi terpendek, tapi saya mencoba memecahkan masalah ini menggunakan operator bitwise karena chmodnilainya sebenarnya adalah flag bit. Juga C # mungkin bukan bahasa golf terbaik: 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: (dengan komentar)

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
}

Ini adalah golf kode waktu pertama saya, jadi tolong beritahu saya, jika saya melakukan kesalahan :)

EDIT 1:

Menyimpan beberapa byte dengan menggantinya s[i]-'0'dengan s[i]&7(di bagian paling akhir) dan menyimpan daftar menjadi variabel:

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:

Diubah ke ekspresi 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)));}
Stefan
sumber
1

Javascript, 213 209 208 188 186 bytes

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

Disimpan 20 byte berkat Dada!

Paul Schmitz
sumber
3
Saya mungkin salah, tetapi bukankah array Anda berada di urutan yang berlawanan? Jika saya memanggil b ("000"), itu mengembalikan "Baca Tulis dan Jalankan" sementara orang bisa mengharapkan "Tidak ada" ...
Dada
Dan saya cukup yakin ini bisa lebih golf. Misalnya, versi 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, 606 Bytes

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
polyglotrealIknow
sumber
1
Selamat datang di PPCG! Bagus jawaban pertama BTW :)
Beta Decay
1

Crystal, 200 194 Bytes

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

mengembalikan string yang dihasilkan untuk urutan oktal tertentu sebagai string. misalnya: m("670")hasil untuk: User: Read and Write\nGroup: Read Write and Execute\nOthers: None.

Cobalah online .

Domii
sumber
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));
}
Alireza Tabatabaeian
sumber
4
Ini kode-golf, jadi Anda harus golf kode Anda. Juga, tambahkan header dengan nama bahasa dan bytecount.
TuxCrafting
Saya telah menambahkan jumlah byte Anda, yang merupakan skor Anda. Anda harus mendapatkan skor Anda serendah mungkin untuk menang
Beta Decay
Misalnya, Anda menyingkirkan semua spasi putih yang tidak perlu di setiap fungsi
Beta Decay
1
@BetaDecay Terima kasih, saya baru di komunitas ini dan saya pikir saya lebih baik menggunakan php sebagai gantinya yang bisa mengarah ke lebih banyak kode compacts.
Alireza Tabatabaeian
1
@Alireza Itu ide yang bagus. Meskipun di situs ini, kami ingin melihat jawaban singkat di Java dan C # :)
Beta Decay
0

Python 3.5 - 370 294 243 byte

Golf:

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

Periksa ukuran:

$ du -b OctalToHuman.py 
243     OctalToHuman.py

Tidak golf:

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

Output sampel:

$ 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
sinar
sumber
Ini bukan pesaing serius untuk kriteria kemenangan. Kami meminta semua jawaban untuk melakukan upaya serius dalam mengoptimalkan skor mereka untuk kriteria yang menang (misalnya, dalam tantangan kode golf seperti ini, pengajuan harus melakukan upaya serius untuk meminimalkan jumlah byte program).
Mego
Anda dapat menyimpan beberapa byte dengan menghapus import sys, dan hanya membuat program fungsi anonim ( lambda o:...).
NoOneIsHere
0

F #, 204 203 Bytes

golf pertama saya, jadi tolong maafkan kesalahan apa pun;)
Versi golf (berdasarkan 1: 1 pada jawaban 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

Versi ungolfed:

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

Contoh penggunaan:

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

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


Ini semata-mata untuk memeriksa, apakah saya bisa 'meningkatkan' jawaban pinkfloydx33 - Saya tidak menerima kredit apa pun untuk algoritme

tidak diketahui6656
sumber
0

PHP, 199 Bytes

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 Bytes dengan \ 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);}
Jörg Hülsermann
sumber
Hai, Anda harus menggunakan spasi alih-alih tab
Beta Decay
Dalam hal ini sepertinya str_repeat ("", 3- $ i) atau str_pad ("", 3- $ i, "") tetapi tidak masalah dengan ide saya, saya tidak memiliki kesempatan untuk menang. Jika saya harus mengambil ruang lain cs.tut.fi/~jkorpela/chars/spaces.html
Jörg Hülsermann
1
13 + 34 byte untuk disimpan. Dalam versi panjang: Gunakan echo str_pad("$u:",8)alih-alih echo"$u:".str_repeat(" ",3-$i)(-9); ini membuat $i=>usang (-4). Di kedua versi: Gunakan $a[$z-1]="and $a[$z-1]";bukannya {$a[]=$a[$z-1];$a[$z-1]="and";}(-7) dan else$a[]=$a?Only:None;bukannya elseif($z<1)$a[]=None;else$a[]=Only;(-14). Berubah if(1<$z=count($a))$a[$z-1]="and $a[$z-1]";else$a[]=$a?Only:None;menjadi if($x=array_pop($a))$a[]=$a?"and $x":"$x Only";else$a[]=None;(-3) dan kemudian menjadi $a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None;(-10)
Titus
@Titus echo str_pad ("$ u:", 8), $ a [$ z-1] = "dan $ a [$ z-1]" ;, selain itu $ a [] = $ a? Hanya: Tidak Ada; Selesai $ i => usang saya tidak dapat melakukannya maka $ m = $ argv [1] [$ i] diperlukan. Untuk sisanya saya akan coba dulu dengan cara lain. Terima kasih atas masukannya
Jörg Hülsermann
1
Lebih banyak ide: if(4&$m=$argv[1][$i])alih-alih $m=$argv[1][$i];if(4&$m)(-3) ATAU ganti $m=;if();if();if();dengan lingkaran: foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;(-7)
Titus
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])

ungolfed

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])
Aleksandr Smirnov
sumber
1
Selamat datang di PPCG! posting pertama yang bagus!
R
Hmm, saya sangat ingin tahu bagaimana moderator mendapat 151bytes ketika saya hanya mendapatkan 191: D Apakah itu kesalahan? Periksa hasil edit
Aleksandr Smirnov
Itu aku, maaf. Saya mengetik di edit. Diperbaiki sekarang
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]]

Contoh:

(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")
Ian
sumber