ファイル許可


26

ファイル許可

UIL-コンピューターサイエンスプログラミング2018年地区の無料回答質問「カーラ」からの適応。

前書き

UNIXライクなオペレーティングシステムでは、各ファイル、ディレクトリ、またはリンクは「グループ」のメンバーである「ユーザー」によって「所有」され、「」などの10文字の文字列で表される特定の「許可」を持ちます。 drwxrwxrwx」。最初の文字は「d」、「-」、または「l」(ディレクトリ、ファイル、またはリンク)であり、「読み取り、書き込み、実行」権限を示す「rwx」値のセットが3つ続きます。最初のセットはユーザーの権利、中央のセットはグループの権利、3番目はそのオブジェクトに対する他の全員の権利です。

これらの権利のいずれかに対して拒否された許可は、「r」、「w」、または「x」の代わりに「-」で表されます。たとえば、サンプルのディレクトリパーミッション文字列は「drwxr--r--」で、ユーザーには完全なディレクトリ権限を示しますが、グループメンバーおよびその他すべてには「読み取り専用」権限を示します。

各「rwx」の組み合わせは、8ビット値(0〜7)で表すこともできます。最上位ビットは読み取り許可、次の最上位ビットは書き込み許可、最下位ビットは実行許可を表します。

チャレンジ

文字「D」、「F」、または「L」で構成され、その後に664などの3桁の8進整数値が続く4文字のコード文字列がある場合、許可値を表す結果の10文字の文字列を出力します示された。

入力

プログラムまたは関数は、標準入力(4文字が入力され、オプションで改行が続く)から入力を読み取るか、入力を引数として渡すことができます。

プログラムは大文字または小文字の入力を受け入れますが、一貫している必要があります(すべての入力が大文字であるか、すべての入力が小文字である)。

出力

プログラムは、上記で指定した正確な形式で示された許可値を表す結果の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

スコアリングとルール

  • 標準の抜け穴は禁止されています。
  • 標準ルールが適用されます。
  • コードをテストするためのリンクと説明を提供してください。
  • これはなので、バイト単位の最短回答が勝ちです!

何を待って、昨日尋ねると答えはすでに受け入れられましたか?これは、これ以上の回答が期待されないことを意味していますか?
NIT

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バイトを保存してくれたDennisと、1バイトを保存してくれた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/-/"2バイト節約します。
デニス

@Dennisオフに行く、私はあなたがより多くのものをオフに剃ることができると思いtr代わりにychmod ${1:1} a>a;stat -c%A a|sed s/./\\L${1:0:1}/|tr f -
HTNW

2
ファイルがなくa、ユーザーがそれを作成する許可を持っている、またはファイルがaあり、ユーザーが書き込み可能であると想定するのは正当ですか?permissions で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)

入力を文字および3つの整数として受け取ります。
オンラインでお試しください!

説明

[a,'-'][a=='f']入力文字を使用する-か、文字がf
'-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]本質的には、rwx文字列を取得するための8進数の変換です。



5

Retina 0.8.2、43バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。小文字で入力します。説明:

\d
$&r$&w$&x

各数字を3つずつ、接尾辞としてrwおよびを付け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ではない言語を少なくとも1つは学ぼうと思ったところです。

説明:

元に戻しf-(残しdl変わらず)、その後、適切で各桁を交換してくださいrwx


:/私は限り取得することができ、このしかし、誰さらに。そしてスマートな方法はスーパーungolfy
ASCIIのみ

これは、三元/論理的または追加/トリム事業者のいくつかの種類とそんなにgolfierだろう
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

Haskell84 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はファイルタイプを作成し、残りは8進数からのアクセス許可です。これは本当に私に希望を与え、プレリュードに含まれるビットごとの演算子でした。


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の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まあ、それは主にreturnステートメントとループを節約するからです。あまりにも悪い3人は.replaceAllまだ少ないとのループよりもバイトであり.replaceAll、コメントを追加returnし、文字列、配列..しかし、当然の信用はに行くニール Iからポートにベースとして使用網膜の答えです。
ケビンクルーッセン

3

ゼリー、21 バイト

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

STDOUTへの完全なプログラム印刷。(モナドリンクとして、戻り値は文字と3つの文字リストのリストを含むリストです。)

オンラインでお試しください!または、テストスイートを参照してください。

どうやって?

Ḣ⁾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バイト

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";to var r=s[0]=='f'?"-":s[0]+"";を変更して6バイト節約できます。また、追加の4バイトを保存する.toCharArray()こともでき.split("")ます。
ケビンCruijssen

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

05AB1E34 27バイト

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

オンラインでお試しください!

@MagicOctopusUrnによって7バイトのゴルフ


ć                           # 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ステートメントを使用した異なる順序で、削除する代わりに、最後の文字列のfすべてをで置き換えます。f-
魔法のタコ

i <CODE FOR TRUE> ë <CODE FOR FALSE> }
魔法のタコ

よろしくお願いします!
ジェノラックリンアッシャー

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

J57 52バイト

FrownyFrogのおかげで5バイト節約されました!

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

オンラインでお試しください!

さらに別の長い解決策...私は作り方がわかりません }暗黙の動詞で仕事、それは私がずっと長く使用した理由です{"0 1&.|:、選択に。

説明:

@}. 最初のシンボルをドロップして

,.&.": 残りを小数点以下の数字のリストに変換します

]:#: 各桁を2進数のリストに変換します(そして、フォークをキャップします)。

('-',:'rwx') 2行のテーブルを作成し、0を使用して最初の行から選択する/ 1-2番目の行から選択する

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

{"0 1&.|:~ 2進数を使用して、上の表から選択します

[:, 結果を平坦化します

('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小文字の入力をアンダースコアに変換し、8進数ごとにrwx同等の値に変換します。ダッシュの代わりにアンダースコアを使用して(引用符の必要性を節約するため)、次に_-

パイプとして実行する-nF、オンラインで試してください


1

C(gcc)109 104バイト

少なくともCは8進数の入力を変換できます。...:-)

編集:サイズ修飾子は厳密には必要ではなく、この場合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)]));}

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.