Dosya izinleri


26

Dosya izinleri

UIL - Bilgisayar Bilimleri Programlama 2018 Bölgesi için ücretsiz cevap sorusu "Carla" dan uyarlanmıştır.

Giriş

UNIX benzeri işletim sistemlerinde, her dosya, dizin veya bağlantı, "gruba" üye olan ve "on karakterli bir dize tarafından temsil edilen" "karakterlere" sahip "belirli" izinlere "sahip" drwxrwxrwx". İlk karakter 'd', '-' veya 'l' (dizin, dosya veya link), ardından "okuma, yazma, yürütme" izinlerini gösteren üç "rwx" değeri kümesidir. İlk set kullanıcının hakları, orta grubun haklarını ve üçüncü herkesin bu nesneye ilişkin haklarını ifade eder.

Bu haklardan herhangi biri için reddedilen izin, 'r', 'w' veya 'x' yerine '-' ile temsil edilir. Örneğin, örnek bir dizin izni dizesi, "drwxr - r--" olur, kullanıcı için tam dizin haklarını belirtir, ancak grup üyesi ve diğerleri için "salt okunur" haklar olur.

Her "rwx" kombinasyonu ayrıca, okuma iznini temsil eden en önemli bit, yazma iznini temsil eden bir sonraki en önemli bit ve yürütme iznini temsil eden en küçük bit olan bir sekizli değer (0-7) ile temsil edilebilir.

Meydan okuma

'D', 'F' veya 'L' karakterinden oluşan dört karakterli bir kod dizisi verildiğinde, ardından 664 gibi üç basamaklı bir sekizli tam sayı değeri, izin değerini temsil eden sonuçtaki 10 karakter dizesini verir. belirtilen.

Giriş

Programınız veya işleviniz girişi standart olarak okuyabilir (dört karakter girilir, isteğe bağlı olarak yeni bir satır girilir) veya girişi argüman olarak geçirir.

Programınız büyük veya küçük harfleri kabul edebilir ancak tutarlı olmalıdır (tüm girişler büyük harf veya tüm girişler küçük harf).

Çıktı

Programınız, yukarıda belirtilen biçimde belirtilen izin değerini temsil eden sonuçtaki on karakter dizisini yazdırmalıdır. Beyaz boşluk bırakmaya izin verilir.

Test Kılıfları

Giriş: F664Çıkış: Giriş -rw-rw-r--
: D775Çıkış: Giriş drwxrwxr-x
: L334Çıkış: Giriş l-wx-wxr--
: F530Çıkış: Giriş -r-x-wx---
: D127Çıkış:d--x-w-rwx

Puanlama ve Kurallar


Neyi bekleyin, dün sordum ve cevap çoktan kabul edildi mi? Bu daha fazla cevap beklenmeyeceği anlamına mı geliyor, yoksa ne?
Nit

1
@Nit Daha fazla cevap, bir cevap kabul edilip edilmediğine bakılmaksızın her zaman beklerim.
isaacg

1
@Nit mobildeydim ve ilgisiz bir cevabı (o zamandan beri kaldırıldı) düşürmeye çalışıyordum. Yanlışlıkla cevabı kabul et butonuna şişko parmağımla çarptım. Nasıl kabul edilmeyeceğini bulamadım, bu yüzden kabul edilen cevabı şimdiki en kısa cevap olarak değiştirdim.
Billylegota

2
@Yani demek istediğim ... bir Dennis cevabı kabul etti, bu yüzden dürüstçe doğru olabilir.
Magic Octopus Urn,

Yanıtlar:


7

Jöle , 19 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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

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

16

bash, 59 53 bayt

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

İş için doğru araç?

Dennis'e 5 byte kaydettiği ve HTNW'yi kaydettiği için teşekkürler .

Çevrimiçi deneyin!

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 -

Peki bu hızlıydı. Kesinlikle iş için doğru araç.
Billylegota

chmod ${1:1} a>a;stat -c%A a|sed "s/-/\L${1:0:1}/;s/f/-/"iki bayt kaydeder.
Dennis,

@Dennis gidiyor, sanırım şu tryerine bir tanesini daha tıraş edersiniz y:chmod ${1:1} a>a;stat -c%A a|sed s/./\\L${1:0:1}/|tr f -
HTNW

2
Dosya olmadığını ave kullanıcının izin verme yetkisine sahip olduğunu varsaymak yasal mı yoksa dosya mı var ave kullanıcı tarafından yazılabilir mi? Çünkü izinlere asahip bir dosya varsa , bu çalışmamalıdır. root700
NoOneIsHere

2
@HayırOnlarHere Tartışmada özellikle izinler hiç gelmediyse, topluluk geçerli dizinde geçici dosyalar oluşturmaya varsayılan olarak izin verildiğine karar verdi . Ek olarak, bunun mümkün olduğunu varsayabiliriz.
Dennis,

10

Python 2,78 bayt

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

Girdiyi karakter ve üç inç olarak alır.
Çevrimiçi deneyin!

açıklama

[a,'-'][a=='f']Girdi karakterini veya -karakter ise onu alır f.
'-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]aslında rwxdize almak için sekizli bir dönüşümdür .



5

Retina 0.8.2 , 43 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Küçük harfle giriş yapar. Açıklama:

\d
$&r$&w$&x

Her basamağı üçlü kopyalayın r, wve ile soneki x.

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

Tüm yanlış harfleri -s olarak değiştirin.

\d

Kalan basamakları silin.


4

Retina , 51 bayt

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

Çevrimiçi deneyin!

Retina'nın nasıl kullanılacağı hakkında hiçbir fikrim yok, bu yüzden lütfen bunu nasıl daha iyi yapacağımı söyleyin. Sadece Pyth olmayan bir dil öğrenmeye çalışacağımı düşündüm.

Açıklama:

Yerine file -(ayrılan dve ldeğişmemiş), daha sonra uygun olan her bir basamak yerine rwx.


: / Bu kadar ileri gidebilirim ama daha fazla değil. ve akıllı yol süper ungolfy
ASCII-sadece

Bir çeşit üçlü / mantıksal ve / ekleme ve süsleme operatörleri ile çok daha golfçü olurdu
ASCII-sadece

@ ASCII-only Fikriniz oldukça güzeldi, bu cevap için kullandım :)
Leo

4

JavaScript (ES6), 63 bayt

Giriş dizesini küçük harf olarak bekler.

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

Çevrimiçi deneyin!

Yorumlananlar

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

4

Kömür , 27 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

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

4

Haskell , 84 83 81 bayt

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

Çevrimiçi deneyin!

Kavramı Mnemonic'in Python 2 cevabına oldukça benzeyen sona erdi. f dosya tipini yaratır, gerisi sekizlik sayıdan izin alır. Bu gerçekten bana dilek tuttu & bitwise ve operatör prelude dahil.


2
Sen kullanabilirsiniz divyerine quot.
nimi

4

Java 8, 100 bayt

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

Çevrimiçi deneyin.

Port @Neil 'ın Retina cevap .

Açıklama:

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

Bu akıllı! ;)
Olivier Grégoire

@ OlivierGrégoire Şey, temel olarak iade beyanından ve döngülerden tasarruf ettiği için. Çok kötü üç ayrı .replaceAllhala azdır ile bir döngü daha bayt .replaceAlleklenmiş ve returnve tabii Dize-dizi .. Ama kredi gider Neil ben limana üs olarak kullanılan Retina cevap budur.
Kevin Cruijssen

3

Jöle , 21 bayt

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

STDOUT'a tam program baskısı. (Monadik bir bağlantı olarak dönüş değeri bir karakter içeren bir liste ve üç karakter listesinin bir listesidir.)

Çevrimiçi deneyin! Veya test odasına bakın .

Nasıl?

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



2

Python 3 , 71 bayt

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

Çevrimiçi deneyin!

Python 3.3+ bunun için yerleşik bir yapıya sahiptir, ancak bir ithalat ihtiyacına ve beklenen giriş biçimindeki farklılıklara bağlı olarak çok golf dostu değildir.


2

Tcl , 139 bayt

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

Çevrimiçi deneyin!


Tcl , 144 bayt

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

Çevrimiçi deneyin!

Tcl , 149 bayt

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

Çevrimiçi deneyin!

Tcl , 150 bayt

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

Çevrimiçi deneyin!

Tcl , 180 bayt

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

Çevrimiçi deneyin!

Hala çok unungolfed!


2

Java (JDK 10) , 118 bayt

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

Çevrimiçi deneyin!

Kredi


2
Girdiyi küçük harf olarak fdlaldığınızda, 6 byte değerini kaydetmek var r=s[0]<70?"d":s[0]<72?"-":"l";için ' var r=s[0]=='f'?"-":s[0]+"";yi değiştirebilirsiniz . Ayrıca, ek bir 4 bayt kaydetmek .toCharArray()olabilir .split("").
Kevin Cruijssen

2
Fikrin bana 13 bayt kursağında @KevinCruijssen değil 10 (ı kaldırmak olabilir çünkü ""+bir "döküm" üzerine sonradan charbir içine String);) teşekkürler!
Olivier Grégoire

2

Excel, 224 bayt

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

4 aşamada yapılır:

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

Ve 3 kez:

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

Daha akıllı olmaya çalışıyorum, 25 bytesher bir hak kümesi için, toplam 75

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

2

05AB1E , 34 27 bayt

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

Çevrimiçi deneyin!

@MagicOctopusUrn tarafından 7 bayt aşağı Golfed


ć                           # Remove head from string.
 ls                         # Lowercase swap.
   8βb                      # Octal convert to binary.
      vy                    # For each...
        i        ë  }
         …rwx3*Nè           # If true, push the correct index of rwx.
                  '-        # Else push '-'.
                     J      # Repeatedly join stack inside the loop.
                      'f'-: # Repeatedly replace 'f' with '-' inside the loop.

ćls8βbvyi…rwx3*Nèë'-}J'f'-:için daha az 7 ...
Sihirli Ahtapot Vazosu

Temelde if ifadelerini kullanarak sadece farklı bir sipariş ve kaldırmak yerine son dizgede fhepsini değiştiriyorum . f-
Sihirli Ahtapot Urn

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

@ MagicOctopusUrn Güzel!
Geno Racklin Asher

1

Python 2,238 bayt

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

Çevrimiçi deneyin!

Bunun kovada bir damla olacağını düşünmüştüm, ama gerçekten yanılmışım. Muhtemelen bir lambdanın bir noktada en iyi fikir olmadığını anlamalıydı.


: | çok fazla sayıda yerleşik yapı yok = çok uzun
yalnızca ASCII

1

APL + WIN, 55 bayt

Önde gelen karakter küçük harfli girdi dizgisi ister:

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

Açıklama:

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

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

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

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

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

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


1

J , 57 52 bayt

FrownyFrog sayesinde 5 bayt kurtarıldı!

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

Çevrimiçi deneyin!

Yine bir başka uzun çözüm ... }Tacik fiillerde nasıl çalışacağımı bilmiyorum ve bu yüzden {"0 1&.|:seçim için daha uzun süre kullandım .

Açıklama:

@}. İlk sembolü bırak ve

,.&.": geri kalanını desimal basamakların listesine dönüştür

]:#: her basamağı ikili basamakların listesine dönüştürün (ve çatalı işaretleyin)

('-',:'rwx') 2 sıralı bir tablo oluşturur ve ilk sırasından / 1 - ikinci sırasından seçim yapmak için 0'ı kullanın.

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

{"0 1&.|:~ Yukarıdaki tablodan seçim yapmak için ikili rakamları kullanır.

[:, sonucu düzleştirir

('d-l'{~'DFL'i.{.) ilk sembolü biçimlendirir

, fisrt simgesini izinler listesine ekler.


1
Giriş zaten bir dizedir, ihtiyacınız var1#:@}."."0
FrownyFrog

1
Bu iş gibi görünüyor: ('d-l'{~'DFL'i.{.)-&.('-DLld'i.{.)
FrownyFrog 29:18

@ FrownyFrog Çok hoş bir kullanım i.ve &.çok teşekkürler! Bu arada, bana seçmeli }zımni fiillerin nasıl kullanılacağını açıklayabilir misiniz ?
Galen Ivanov

1
2 2 2&#:`('-',:'rwx'"_)}@"."0@}.tam olarak aynı uzunluktadır
FrownyFrog

Ancak kırılmaz 333:)
FrownyFrog

1

PHP, 68 bayt

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

çevirir falt çizgi ve her sekizlik sayıya küçük girişte rwxçizgi yerine tire (tırnak ihtiyacını kaydetmek için), sonra yerini kullanarak, eşdeğer _ile -.

Pipe ile çalıştırın -nFveya çevrimiçi deneyin .


1

C (gcc) , 109 104 bayt

En azından C sekizli girişi dönüştürebilir .... :-)

Düzenleme: Boyut değiştiricisinin kesinlikle gerekli olmadığını ve bunun bu durumda putchar()olduğundan daha kısa olduğunu anladım printf()!

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

Çevrimiçi deneyin!

Orijinal:

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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.