Izin File

26

Izin File

Diadaptasi dari UIL - Pemrograman Ilmu Komputer, pertanyaan respons bebas "Carla" untuk Distrik 2018.

pengantar

Dalam sistem operasi mirip UNIX, setiap file, direktori, atau tautan "dimiliki" oleh "pengguna", yang merupakan anggota "grup", dan memiliki "izin" tertentu yang diwakili oleh string sepuluh karakter seperti " drwxrwxrwx ". Karakter pertama adalah 'd', '-', atau 'l' (direktori, file, atau tautan), diikuti oleh tiga set nilai "rwx", yang menunjukkan izin "baca, tulis, jalankan". Set pertama adalah hak pengguna, set tengah hak grup, dan hak semua orang ketiga untuk objek itu.

Izin yang ditolak untuk hak-hak ini diwakili oleh '-' menggantikan 'r', 'w', atau 'x'. Misalnya, string izin direktori sampel adalah "drwxr - r--", yang menunjukkan hak direktori lengkap untuk pengguna, tetapi hak "hanya baca" untuk anggota grup dan semua yang lain.

Setiap kombinasi "rwx" juga dapat diwakili oleh nilai oktal (0-7) dengan bit paling signifikan yang mewakili izin baca, bit paling signifikan berikutnya yang mewakili izin menulis, dan bit paling signifikan yang mewakili izin eksekusi.

Tantangan

Diberikan string kode empat karakter yang terdiri dari karakter: 'D', 'F', atau 'L', diikuti oleh nilai integer oktal tiga digit, seperti 664, menghasilkan string karakter 10 yang dihasilkan yang mewakili nilai izin ditunjukkan.

Memasukkan

Program atau fungsi Anda dapat membaca input dari standar dalam (empat karakter akan dimasukkan, opsional diikuti oleh baris baru) atau diteruskan input sebagai argumen.

Program Anda dapat menerima input huruf besar atau kecil tetapi harus konsisten (semua input huruf besar atau semua input huruf kecil).

Keluaran

Program Anda harus mencetak string sepuluh karakter yang dihasilkan yang mewakili nilai izin yang ditunjukkan dalam format persis yang ditentukan di atas. Ruang putih berlayar diperbolehkan.

Uji Kasus

Masuk: F664Keluar: -rw-rw-r--
Masuk: D775Keluar: drwxrwxr-x
Masuk: L334Keluar: l-wx-wxr--
Masuk: F530Keluar: -r-x-wx---
Masuk: D127Keluar:d--x-w-rwx

Penilaian dan Aturan

Billylegota
sumber
Tunggu apa, tanya kemarin dan jawaban sudah diterima? Apakah ini berarti tidak ada lagi jawaban yang diharapkan atau apa?
Nit
1
@Nit Lebih banyak jawaban selalu diterima, terlepas dari apakah jawaban diterima.
isaacg
1
@Nit saya di ponsel dan mencoba untuk downvote jawaban yang tidak berhubungan (yang telah dihapus sejak itu). Saya tidak sengaja menekan tombol terima jawab dengan jari gemuk saya. Saya tidak tahu bagaimana cara tidak menerima jadi saya hanya mengubah jawaban yang diterima menjadi yang terpendek seperti yang sekarang.
Billylegota
2
@Tapi maksud saya ... dia menerima jawaban Dennis, jadi dia jujur ​​mungkin benar.
Magic Gurita Guci

Jawaban:

7

Jelly , 19 byte

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

Cobalah online!

Bagaimana itu bekerja

“rwx“-”Œp⁺;Ṁ⁾f-yị@~  Main link. Argument: s (string)

“rwx“-”              Set the return value to ["rwx, "-"].
       Œp            Take the Cartesian product, yielding ["r-", "w-", "x-"].
         ⁺           Take the Cartesian product, yielding
                     ["rwx", "rw-", "r-x", "r--", "-wx", "-w-", "--x", "---"].
          ;Ṁ         Append the maximum of s (the letter).
            ⁾f-y     Translate 'f' to '-'.
                  ~  Map bitwise NOT over s.
                     This maps the letter to 0, because it cannot be cast to int,
                     and each digit d to ~d = -(d+1).
                ị@   Retrieve the results from the array to the left at the indices
                     calculated to the right.
                     Indexing is modular and 1-based, so the letter from s is at
                     index 0, "---" at index -1, ..., and "rwx" at index -8.
Dennis
sumber
16

bash, 59 53 byte

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

Alat yang tepat untuk pekerjaan itu?

Terima kasih kepada Dennis untuk menghemat 5 byte dan HTNW karena telah menghemat satu.

Cobalah online!

chmod ${1:1} a>a;  # call chmod with the input with its first character removed
                   # note that the redirection creates the file a *before* the
                   #   chmod is run, because of the way bash works
stat -c%A a|       # get the human readable access rights
sed s/./${1:0:1}/  # replace the first character with the first char of input
|tr f -            # transliterate, replacing f with -
Gagang pintu
sumber
Ya itu cepat. Tentunya alat yang tepat untuk pekerjaan itu.
Billylegota
chmod ${1:1} a>a;stat -c%A a|sed "s/-/\L${1:0:1}/;s/f/-/"menghemat dua byte.
Dennis
Pergi @ Dennis, saya pikir Anda dapat mencukur satu lagi dengan trbukannya y:chmod ${1:1} a>a;stat -c%A a|sed s/./\\L${1:0:1}/|tr f -
HTNW
2
Apakah sah untuk menganggap tidak ada file adan pengguna memiliki izin untuk membuatnya atau ada file adan dapat ditulisi oleh pengguna? Karena jika ada file yang adimiliki oleh rootdengan izin 700, ini seharusnya tidak berfungsi.
NoOneIsHere
2
@NoOneIsHere Meskipun izin tidak pernah muncul dalam diskusi, komunitas memutuskan bahwa membuat file sementara di direktori saat ini diizinkan secara default . Dengan ekstensi, kita dapat mengasumsikan bahwa itu mungkin.
Dennis
10

Python 2 , 78 byte

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

Mengambil input sebagai karakter dan tiga int.
Cobalah online!

Penjelasan

[a,'-'][a=='f']mengambil karakter input atau -, jika karakter tersebut f.
'-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]pada dasarnya adalah konversi oktal untuk mendapatkan rwxstring.


sumber
5

Perl 5 dengan -p, 37 byte

s/\d/(<{-,r}{-,w}{-,x}>)[$&]/ge;y;f;-

Mengambil input dalam huruf kecil.

Cobalah online!

Dom Hastings
sumber
5

Retina 0.8.2 , 43 byte

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

Cobalah online! Tautan termasuk kasus uji. Mengambil input dalam huruf kecil. Penjelasan:

\d
$&r$&w$&x

Rangkap tiga setiap digit, sufiks dengan r, wdan x.

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

Ubah semua huruf yang salah menjadi -s.

\d

Hapus digit yang tersisa.

Neil
sumber
4

Retina , 51 byte

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

Cobalah online!

Tidak tahu cara menggunakan Retina, jadi tolong beri tahu saya cara melakukan ini dengan lebih baik. Saya pikir saya akan mencoba belajar setidaknya satu bahasa yang bukan Pyth.

Penjelasan:

Ganti fdengan -(meninggalkan ddan ltidak berubah), lalu ganti setiap digit dengan yang sesuai rwx.


sumber
: / Saya bisa sampai sejauh ini tetapi tidak lebih jauh. dan cara yang cerdas adalah super ungolfy
ASCII
Akan jauh lebih pegolf dengan operator ternary / logis atau / tambah dan langsing
ASCII-only
@ ASCII-only Ide Anda cukup bagus, saya sudah menggunakannya untuk jawaban ini :)
Leo
4

JavaScript (ES6), 63 byte

Mengharapkan string input dalam huruf kecil.

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

Cobalah online!

Berkomentar

s => s.replace(   // replace in the input string s
  /\d|f/g, c =>   //   each character c which is either a digit or the letter 'f'
    1 / c ?       //   if c is a digit:
      s[c & 4] +  //     append '-' or 'r'
      s[c & 2] +  //     append '-' or 'w'
      s[c & 1]    //     append '-' or 'x'
    :             //   else:
      '-',        //     just replace 'f' with '-'
  s = '-xw-r'     //   s holds the permission characters
)                 // end of replace()
Arnauld
sumber
4

Arang , 27 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

 S                          Input string
F                           Loop over characters
   ι                        Current character
  ≡                         Switch
    d                       Literal `d`
     ι                      Implicitly print current character
      l                     Literal `l`
       ι                    Implicitly print current character
        f                   Literal `f`
         ¦                  (Separator between string literals)
          -                 Implicitly print literal `-`
                            Implicit default case
            rwx             Literal `rwx`
           ⭆                Map over characters
                     ι      Input character
                    I       Cast to integer
                   ⁸        Literal 8
                  ⁺         Sum
                      ²     Literal 2
                 ↨          Base conversion
                        λ   Inner index
                       ⊕    Incremented
                §           Index into base conversion
                         κ  Inner character
                          - Literal `-`
               ⎇            Ternary
                            Implicitly print
Neil
sumber
4

Haskell , 84 83 81 byte

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

Cobalah online!

Akhirnya menjadi sangat mirip dalam konsep dengan jawaban Python 2 Mnemonic. f menciptakan jenis file, sisanya adalah mendapat izin dari nomor oktal. Yang ini benar-benar membuat saya berharap & agak bitwise dan operator termasuk dalam pembukaan.

aoemica
sumber
2
Anda bisa menggunakan divbukan quot.
nimi
4

Java 8, 100 byte

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

Cobalah online.

Pelabuhan @ Neil 's Retina jawabannya .

Penjelasan:

s->                                 // Method with String as both parameter and return-type
  s.replaceAll("(\\d)","$1r$1w$1x") //  Replace every digit `d` with 'drdwdx'
   .replaceAll("f                   //  Replace every "f",
                |[0-3]r             //  every "0r", "1r", "2r", "3r",
                |[0145]w            //  every "0w", "1w", "4w", "5w",
                |[0246]x",          //  and every "0x", "2x", "4x", "6x"
               "-")                 //  with a "-"
   .replaceAll("\\d","")            //  Remove any remaining digits
Kevin Cruijssen
sumber
Ini pintar! ;)
Olivier Grégoire
@ OlivierGrégoire Yah, terutama karena menghemat pada pernyataan kembali dan loop. Sayang sekali tiga orang .replaceAllmasih kurang byte daripada satu lingkaran dengan .replaceAlldan ditambahkan returndan String-array .. Tapi kredit tentu saja pergi ke Neil , siapa jawaban Retina saya gunakan sebagai basis untuk port dari.
Kevin Cruijssen
3

Jelly , 21 byte

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

Program pencetakan lengkap untuk STDOUT. (Sebagai tautan monadik, nilai balik adalah daftar yang berisi karakter dan daftar tiga daftar karakter.)

Cobalah online! Atau lihat test-suite .

Bagaimana?

Ḣ⁾f-yɓOBṫ€4a“rwx”o”-ṭ | Main Link: list of characters
Ḣ                     | head & pop (get the 1st character and modify the list)
 ⁾f-                  | list of characters = ['f', '-']
    y                 | translate (replacing 'f' with '-'; leaving 'd' and 'l' unaffected)
     ɓ                | (call that X) new dyadic chain: f(modified input; X)
      O               | ordinals ('0'->48, '1'->59, ..., '7'->55 -- notably 32+16+value)
       B              | convert to binary (vectorises) (getting three lists of six 1s and 0s)
        ṫ€4           | tail €ach from index 4 (getting the three least significant bits)
           “rwx”      | list of characters ['r', 'w', 'x']
          a           | logical AND (vectorises) (1s become 'r', 'w', or 'x'; 0s unaffected)
                 ”-   | character '-'
                o     | logical OR (vectorises) (replacing any 0s with '-'s)
                   ṭ  | tack (prepend the character X) 
                      | implicit print (smashes everything together)
Jonathan Allan
sumber
3

Perl 6 -p , 37 byte

s:g[\d]=[X~]('-'X <r w x>)[$/];s/f/-/

Cobalah online!

Solusi Port 5 Dom Hastings 'Perl 5.

nwellnhof
sumber
3

Retina , 38 byte

Terinspirasi oleh komentar dari ASCII saja .

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

Cobalah online!

Idenya adalah mengubah setiap digit menjadi unary (digit unary default di Retina adalah _) dengan tiga digit terdepan -, dan kemudian mengonversi angka biner dari yang paling ke yang paling tidak signifikan.

Leo
sumber
2

Python 3 , 71 byte

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

Cobalah online!

Python 3.3+ memiliki built-in untuk itu, meskipun karena kebutuhan untuk impor, dan perbedaan dalam format input yang diharapkan, itu tidak terlalu ramah golf.

Kirill L.
sumber
2

Tcl , 139 byte

proc P s {join [lmap c [split $s ""] {expr {[regexp \\d $c]?"[expr $c&4?"r":"-"][expr $c&2?"w":"-"][expr $c&1?"x":"-"]":$c==f?"-":$c}}] ""}

Cobalah online!


Tcl , 144 byte

proc P s {join [lmap c [split $s ""] {expr {[regexp \\d $c]?[list [expr $c&4?"r":"-"][expr $c&2?"w":"-"][expr $c&1?"x":"-"]]:$c==f?"-":$c}}] ""}

Cobalah online!

Tcl , 149 byte

proc P s {join [lmap c [split $s ""] {if [regexp \\d $c] {list [expr $c&4?"r":"-"][expr $c&2?"w":"-"][expr $c&1?"x":"-"]} {expr {$c==f?"-":$c}}}] ""}

Cobalah online!

Tcl , 150 byte

proc P s {join [lmap c [split $s ""] {if [regexp \\d $c] {set v [expr $c&4?"r":"-"][expr $c&2?"w":"-"][expr $c&1?"x":"-"]} {expr {$c==f?"-":$c}}}] ""}

Cobalah online!

Tcl , 180 byte

proc P s {join [lmap c [split $s ""] {if [regexp \\d $c] {[set R regsub] (..)1 [$R (.)1(.) [$R 1(..) [$R -all 0 [format %03b $c] -] r\\1] \\1w\\2] \\1x} {expr {$c==f?"-":$c}}}] ""}

Cobalah online!

Masih sangat ungolfed!

sergiol
sumber
2

Java (JDK 10) , 118 byte

s->{var r=s[0]=='f'?"-":""+s[0];var z="-xw r".split("");for(int i=0;++i<4;)r+=z[s[i]&4]+z[s[i]&2]+z[s[i]&1];return r;}

Cobalah online!

Kredit

Olivier Grégoire
sumber
2
Ketika Anda mengambil input sebagai huruf kecil fdl, Anda dapat mengubah var r=s[0]<70?"d":s[0]<72?"-":"l";ke var r=s[0]=='f'?"-":s[0]+"";untuk menyimpan 6 byte. Juga, .toCharArray()dapat .split("")menyimpan tambahan 4 byte.
Kevin Cruijssen
2
@KevinCruijssen Gagasan Anda membuat saya menghemat 13 byte, bukan 10 (karena saya bisa menghapusnya ""+nanti untuk "melemparkan" charke a String);) Terima kasih!
Olivier Grégoire
2

Excel, 224 byte

=IF(LEFT(A1,1)="f","-",LEFT(A1,1))&CHOOSE(MID(A1,2,1)+1,"---","--x","-w-","-wx","r--","r-x","rw-","rwx")&CHOOSE(MID(A1,3,1)+1,"---","--x","-w-","-wx","r--","r-x","rw-","rwx")&CHOOSE(MID(A1,4,1)+1,"---","--x","-w-","-wx","r--","r-x","rw-","rwx")

Dilakukan dalam 4 tahap:

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

Dan 3 kali:

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

Berusaha lebih pintar, menambah 25 bytesper set hak, total 75:

IF(INT(MID(A1,2,1))>3,"r","-")&IF(MOD(MID(A1,2,1),4)>1,"w","-")&IF(ISODD(MID(A1,2,1)),"x","-")
Wernisch
sumber
2

05AB1E , 34 27 byte

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

Cobalah online!

Dipotong turun 7 byte oleh @MagicOctopusUrn


ć                           # Remove head from string.
 ls                         # Lowercase swap.
   8βb                      # Octal convert to binary.
      vy                    # For each...
        i        ë  }
         …rwx3*Nè           # If true, push the correct index of rwx.
                  '-        # Else push '-'.
                     J      # Repeatedly join stack inside the loop.
                      'f'-: # Repeatedly replace 'f' with '-' inside the loop.
Geno Racklin Asher
sumber
ćls8βbvyi…rwx3*Nèë'-}J'f'-:untuk 7 kurang ...
Sihir Octopus Mm
Pada dasarnya hanya urutan yang berbeda menggunakan pernyataan if, dan bukannya menghapus, fsaya hanya mengganti semua yang ada fdi string akhir dengan -.
Magic Octopus Mm
i <CODE FOR TRUE> ë <CODE FOR FALSE> }
Magic Octopus Mm
@MagicOctopusUrn Bagus!
Geno Racklin Asher
1

Python 2 , 238 byte

lambda m,r=str.replace,s=str.split,j="".join,b=bin,i=int,z=str.zfill,g=lambda h,y:y if int(h)else "-":r(m[0],"f","-")+j(j([g(z(s(b(i(x)),"b")[1],3)[0],"r"),g(z(s(b(i(x)),"b")[1],3)[1],"w"),g(z(s(b(i(x)),"b")[1],3)[2],"x")])for x in m[1:])

Cobalah online!

Saya mengira ini adalah setetes air dalam ember, tapi ternyata saya salah. Mungkin seharusnya menyadari bahwa lambda bukanlah ide terbaik.

Lirik
sumber
: | terlalu banyak bawaan = terlalu lama
ASCII
1

APL + WIN, 55 byte

Anjuran untuk string input dengan huruf kecil karakter utama:

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

Penjelasan:

9⍴69 74 75 create a vector of ascii character codes for rwx -46, index origin 1

1↓t←⎕ prompt for input and drop first character

,⍉(3⍴2)⊤⍎¨⍕ create a 9 element vector by concatenating the binary representation for each digit 

46+(,⍉(3⍴2)⊤⍎¨⍕1↓t←⎕)×9⍴69 74 75 multiply the two vectors and add 46

⎕av[.....] convert back from ascii code to characters, 46 being '-'

('dl-'['dlf'⍳↑t]), append first character from input swapping '-' for 'f'
Graham
sumber
1

J , 57 52 byte

5 byte disimpan berkat FrownyFrog!

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

Cobalah online!

Namun solusi panjang lainnya ... Saya tidak tahu cara membuat }kata kerja diam-diam dan itu sebabnya saya menggunakan lebih lama {"0 1&.|:untuk seleksi.

Penjelasan:

@}. Jatuhkan simbol pertama dan

,.&.": mengonversi sisanya ke daftar angka desimal

]:#: konversi setiap digit ke daftar digit biner (dan tutup garpu)

('-',:'rwx') membuat tabel 2-baris dan menggunakan 0 untuk memilih dari baris pertama / 1 - dari yang kedua

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

{"0 1&.|:~ menggunakan digit biner untuk memilih dari tabel di atas

[:, ratakan hasilnya

('d-l'{~'DFL'i.{.) memformat simbol pertama

, menambahkan simbol fisrt ke daftar izin

Galen Ivanov
sumber
1
Masukan sudah berupa string, Anda perlu1#:@}."."0
FrownyFrog
1
Ini sepertinya berhasil: ('d-l'{~'DFL'i.{.)-&.('-DLld'i.{.)
FrownyFrog
@FrownyFrog Penggunaan yang sangat bagus i.dan &.Terima kasih banyak! Ngomong-ngomong, bisakah Anda menjelaskan kepada saya bagaimana menggunakan }kata kerja select in tacit?
Galen Ivanov
1
2 2 2&#:`('-',:'rwx'"_)}@"."0@}.panjangnya persis sama
FrownyFrog
Namun itu tidak berhenti 333:)
FrownyFrog
1

PHP, 68 byte

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

menerjemahkan fdalam huruf kecil input ke garis bawah dan setiap angka oktal untuk rwxsetara, menggunakan garis bawah alih-alih tanda hubung (untuk menyimpan kebutuhan akan tanda kutip), lalu ganti _dengan -.

Jalankan sebagai pipa dengan -nFatau coba online .

Titus
sumber
1

C (gcc) , 109 104 byte

Setidaknya C dapat mengonversi input oktal .... :-)

Sunting: Saya menyadari bahwa pengubah ukuran tidak sepenuhnya diperlukan, dan itu putchar()lebih pendek daripada printf()dalam kasus ini!

f(a,b){char*s="-xwr";scanf("%c%o",&a,&b);putchar(a-70?a:*s);for(a=9;~--a;putchar(s[(1&b>>a)*(a%3+1)]));}

Cobalah online!

Asli:

f(a,b){char*s="-xwr";scanf("%c%3o",&a,&b);putchar(a-70?a:*s);for(a=9;~--a;printf("%c",s[(1&b>>a)*(a%3+1)]));}

Cobalah online!

ErikF
sumber