Файловые права


26

Файловые права

Адаптировано из UIL - Computer Science Programming бесплатный ответ на вопрос «Карла» для 2018 округа.

Введение

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

Разрешение, в котором отказано для любого из этих прав, обозначается символом «-» вместо «r», «w» или «x». Например, примерная строка разрешений для каталога будет «drwxr - r--», указывая полные права на каталог для пользователя, но права «только для чтения» для члена группы и всех остальных.

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

Вызов

При наличии четырехсимвольной кодовой строки, состоящей из символа: 'D', 'F' или 'L', за которым следует трехзначное восьмеричное целочисленное значение, например 664, выведите итоговую строку из 10 символов, которая представляет значение разрешения указано.

вход

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

Ваша программа может принимать прописные или строчные буквы, но они должны быть согласованными (либо все входы прописными, либо все строчные).

Выход

Ваша программа должна распечатать получившуюся десятисимвольную строку, которая представляет значение разрешения, указанное в точном формате, указанном выше. Хвостовой пробел разрешен.

Тестовые случаи

Вход: F664Выход: -rw-rw-r--
Вход: D775Выход: drwxrwxr-x
Вход: L334Выход: l-wx-wxr--
Вход: F530Выход: -r-x-wx---
Вход: D127Выход:d--x-w-rwx

Подсчет очков и правила


Подождите, что, спросил вчера, и ответ уже принят? Значит ли это, что больше ответов не ожидается или как?
Нить

1
@Nit Больше ответов всегда приветствуются, независимо от того, принят ли ответ.
Исаак

1
@Nit Я был на мобильном телефоне и пытался опровергнуть несвязанный ответ (который был удален с тех пор). Я случайно нажал на кнопку подтверждения ответа толстым пальцем. Я не мог понять, как отказаться, поэтому я просто изменил принятый ответ на самый короткий на данный момент.
Биллилегота

2
@ Нет, я имею в виду ... он принял ответ Денниса, так что он, честно говоря, может быть прав.
Волшебная урна осьминога

Ответы:


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

Утроить каждую цифру с суффиксом 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-only Ваша идея была довольно хороша, я использовал ее для этого ответа :)
Лев

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's 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","")

Попробуйте онлайн.

Порт ответа @Neil 's Retina .

Объяснение:

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, который я использовал в качестве базы для переноса.
Кевин Круйссен

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 (так как я мог удалить ""+позже, чтобы "привести" a charв a 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.


По сути, это просто другой порядок с использованием операторов if, и вместо удаления fя просто заменяю все 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') создает таблицу из двух строк и использует 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.и &.большое спасибо! Кстати, вы можете объяснить мне, как использовать select }в молчаливых глаголах?
Гален Иванов

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.