Дозволи файлів


26

Дозволи файлів

Адаптовано з UIL - програмування з інформатики з безкоштовним відповіддю на запитання «Карла» на район 2018 року.

Вступ

В операційних системах, схожих на UNIX, кожен файл, каталог або посилання "належать" користувачеві, який є членом "групи", і має певні "дозволи", представлені десятизначним рядком, наприклад " drwxrwxrwx ". Перший символ - "d", "-" або "l" (каталог, файл або посилання), після чого три набори значень "rwx", що вказують на "читання, запис, виконання" дозволів. Перший набір - це права користувача, середній встановлює права групи, а третій - всі інші права на цей об’єкт.

Дозвіл, якому відмовлено в будь-якому з цих прав, представлено символом "-" замість "r", "w" або "x". Наприклад, рядок дозволу каталогу зразка буде "drwxr - r--", вказуючи на повні права каталогів для користувача, але права "лише для читання" для члена групи та всіх інших.

Кожна комбінація "rwx" також може бути представлена ​​восьмеричним значенням (0-7) з найбільш значущим бітом, що представляє дозвіл на читання, наступним найбільш значущим бітом, що представляє дозвіл на запис, і найменшим значущим бітом, що представляє дозвіл на виконання.

Виклик

З огляду на чотирисимвольний рядок коду, що складається з символу: 'D', 'F' або 'L', а потім трицифрове восьмизначне ціле значення, як 664, виводить отриману рядок 10 символів, що представляє значення дозволу вказано.

Вхідні дані

Ваша програма чи функція можуть або читати вхід зі стандартного в (вводиться чотири символи, необов'язково, після них новий рядок), або передаватися в якості аргументу.

Ваша програма може приймати великі або малі введення, але вони повинні бути узгодженими (або всі вхідні великі, або всі вхідні малі).

Вихідні дані

Ваша програма повинна надрукувати результуючу рядок з десяти символів, яка представляє значення дозволу, вказане в точно вказаному вище форматі. Допускається прошивання білого простору.

Випробування

In: F664Out: -rw-rw-r--
In: D775Out: drwxrwxr-x
In: L334Out: l-wx-wxr--
In: F530Out: -r-x-wx---
In: D127Out:d--x-w-rwx

Оцінка та правила


Зачекайте що, попросили вчора і відповідь прийняли вже? Це означає, що більше відповідей не очікується чи що?
Ніт

1
@Nit Більше відповідей завжди вітається, незалежно від того, приймається відповідь.
isaacg

1
@Nit Я працював на мобільному телефоні і намагався спростувати відповідь, що не пов’язана між собою (з тих пір її видалено). Я випадково натиснув кнопку прийняти відповідь жирним пальцем. Я не міг зрозуміти, як це не прийняти, тому просто змінив прийняту відповідь на найкоротший на даний момент.
Біллілегота

2
@Nit я маю на увазі ... він прийняв відповідь Денніса, так що він, чесно, може бути правильним.
Чарівна урва восьминога

Відповіді:


7

Желе , 19 байт

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

Спробуйте в Інтернеті!

Як це працює

“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 байти

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

Правильний інструмент для роботи?

Дякуємо Деннісу за збереження 5 байт та HTNW за збереження одного.

Спробуйте в Інтернеті!

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 -

Ну це було швидко. Звичайно, правильний інструмент для роботи.
Біллілегота

chmod ${1:1} a>a;stat -c%A a|sed "s/-/\L${1:0:1}/;s/f/-/"економить два байти.
Денніс

Виходжуючи @Dennis, я думаю, що ви можете поголити ще одного, trа не y:chmod ${1:1} a>a;stat -c%A a|sed s/./\\L${1:0:1}/|tr f -
HTNW

2
Чи законно вважати, що файлу немає, aі користувач має дозвіл на його створення або є файл, aі користувач може його написати? Тому що, якщо є файл, що aналежить rootдозволам 700, це не повинно працювати.
NoOneIsHere

2
@NoOneIsHere Хоча дозволи, зокрема, ніколи не з'являлися до обговорення, спільнота вирішила, що створення тимчасових файлів у поточному каталозі дозволено за замовчуванням . За розширенням ми можемо вважати, що це можливо.
Денніс

10

Python 2 , 78 байт

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

Вводиться як символ і три вставки.
Спробуйте в Інтернеті!

Пояснення

[a,'-'][a=='f']приймає або вхідний символ, або -, якщо символ є f.
'-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]є по суті восьмеричним перетворенням для отримання rwxрядка.



5

Сітківка 0,8,2 , 43 байти

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

Спробуйте в Інтернеті! Посилання включає тестові випадки. Вводить малі регістри. Пояснення:

\d
$&r$&w$&x

Triplicate кожної цифри, суфікс з r, wі x.

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

Змініть всі неправильні букви на -s.

\d

Видаліть усі цифри, що залишилися


4

Сітківка , 51 байт

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

Спробуйте в Інтернеті!

Не маю ідеї, як користуватися Retina, тому, будь ласка, дайте мені знати, як це зробити краще. Я просто подумав, що спробую вивчити хоча б одну мову, яка не є Pyth.

Пояснення:

Замініть fна -(залишаючи dта lбез змін), а потім замініть кожну цифру відповідною rwx.


: / Я можу дійти до цього, але не далі. а розумний спосіб - супер незмінний
лише для ASCII

Це було б стільки гольфістів з деякими потрійними / логічними або / операторами додавання та обрізки
лише для ASCII

@ ASCII-тільки Ваша ідея була дуже приємною, я використав її для цієї відповіді :)
Лев

4

JavaScript (ES6), 63 байти

Очікує введення рядка в малі літери.

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

Спробуйте в Інтернеті!

Прокоментував

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

Вугілля деревне , 27 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

 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 байт

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

Спробуйте в Інтернеті!

Закінчився досить схожим за концепцією відповіді Mnemonic на Python 2. f створює тип файлу, решта - це отримання дозволів з восьмеричного числа. Цей дійсно змусив мене побажати & був битовим і оператором, включеним у прелюдію.


2
Ви можете використовувати divзамість quot.
німі

4

Java 8, 100 байт

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

Спробуйте в Інтернеті.

Порт відповіді Retina @Neil .

Пояснення:

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

Це розумно! ;)
Олів'є Грегоар

@ OlivierGrégoire Ну, головним чином, тому, що це економить на зворотному виступі та циклі. Шкода, що три особи, .replaceAllяк і раніше, мають менше байтів, ніж цикл із .replaceAllдоданими returnта String-масивами. Але, звичайно, заслуга йде про Ніла , який відповів на Retina, який я використовував як базу для порту.
Kevin Cruijssen

3

Желе , 21 байт

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

Повна програма для друку на STDOUT. (Як монодійна посилання, повернене значення - це список, що містить символ і список з трьох списків символів.)

Спробуйте в Інтернеті! Або дивіться тестовий набір .

Як?

Ḣ⁾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)


3

Сітківка , 38 байт

Натхненний коментарем лише від ASCII .

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

Спробуйте в Інтернеті!

Ідея полягає в перетворенні кожної цифри в одинарну (за замовчуванням одинарна цифра у Retina є _) з трьома ведучими -, а потім перетворення двійкових цифр від найбільшої до найменш значущої.


2

Python 3 , 71 байт

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

Спробуйте в Інтернеті!

Python 3.3+ має для цього вбудований, хоча через необхідність імпорту та відмінності у очікуваному форматі введення це не дуже зручно для гольфу.


2

Tcl , 139 байт

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

Спробуйте в Інтернеті!


Tcl , 144 байти

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

Спробуйте в Інтернеті!

Tcl , 149 байт

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

Спробуйте в Інтернеті!

Tcl , 150 байт

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

Спробуйте в Інтернеті!

Tcl , 180 байт

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

Спробуйте в Інтернеті!

Ще дуже невольф!


2

Java (JDK 10) , 118 байт

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

Спробуйте в Інтернеті!

Кредити


2
Якщо ви приймаєте вхід як малі fdl, ви можете змінити var r=s[0]<70?"d":s[0]<72?"-":"l";на, var r=s[0]=='f'?"-":s[0]+"";щоб зберегти 6 байт. Також .toCharArray()можна .split("")зберегти додаткові 4 байти.
Кевін Кройсейсен

2
@KevinCruijssen Ваша ідея змусила мене зберегти 13 байт, а не 10 (так як ""+пізніше я міг видалити "введення" charв а String);) Дякую!
Олів'є Грегоар

2

Excel, 224 байти

=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 етапи:

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

І 3 рази:

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

Намагаючись бути розумнішими, додає 25 bytesза набір прав, всього 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 байт

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

Спробуйте в Інтернеті!

Поле на 7 байтів від @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.

ćls8βbvyi…rwx3*Nèë'-}J'f'-:на 7 менше ...
Чарівна восьминога урна

В основному просто інше впорядкування з використанням операторів if, а замість того, щоб видаляти fI, я просто замінюю всі fв остаточному рядку на -.
Чарівна восьминога урна

i <CODE FOR TRUE> ë <CODE FOR FALSE> }
Чарівна урва восьминога

@MagicOctopusUrn Приємно!
Гено Раклін Ашер

1

Python 2 , 238 байт

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

Спробуйте в Інтернеті!

Я припускав, що це буде крапля відра, але я дійсно помилявся. Напевно, мав би зрозуміти, що лямбда в якийсь момент не була найкращою ідеєю.


: | занадто багато вбудованих = занадто довгі
лише для ASCII

1

APL + WIN, 55 байт

Підказки до рядка введення з нижнього регістру провідних символів:

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

Пояснення:

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 байти

5 байт збережено завдяки FrownyFrog!

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

Спробуйте в Інтернеті!

Ще одне довге рішення ... Я не знаю, як змусити }працювати над мовчазними дієсловами, і тому я використовував набагато довше{"0 1&.|: для вибору.

Пояснення:

@}. Відкиньте перший символ і

,.&.": перетворіть решту у список десяткових цифр

]:#: перетворити кожну цифру у список двійкових цифр (і обмежити вилку)

('-',:'rwx') створює таблицю з 2 рядками та за допомогою 0 вибирайте її з першого рядка / 1 - з другого

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

{"0 1&.|:~ використовує двійкові цифри для вибору з наведеної вище таблиці

[:, згладжує результат

('d-l'{~'DFL'i.{.) формує перший символ

, додає символ fisrt до списку дозволів


1
Вхід - це вже рядок, вам потрібно1#:@}."."0
FrownyFrog

1
Здається, це працює: ('d-l'{~'DFL'i.{.)-&.('-DLld'i.{.)
FrownyFrog

@FrownyFrog Дуже приємне використання i.та &.велике спасибі! До речі, чи можете ви пояснити мені, як користуватися виділенням }у мовчазних дієсловах?
Гален Іванов,

1
2 2 2&#:`('-',:'rwx'"_)}@"."0@}.точно такої ж довжини
FrownyFrog

Однак це не зламається 333:)
FrownyFrog

1

PHP, 68 байт

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

переводить fна введення підкреслення і кожне восьмерочне число в його rwxеквівалент, використовуючи підкреслення замість тире (щоб зберегти потребу в лапках), а потім замінює_ з- .

Запустіть як трубу -nFабо спробуйте в Інтернеті .


1

C (gcc) , 109 104 байт

Принаймні, C може перетворити восьмеричний вхід .... :-)

Редагувати: Я зрозумів, що модифікатор розміру не є строго необхідним, і putchar()це коротше, ніж 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)]));}

Спробуйте в Інтернеті!

Оригінал:

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

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.