私は許可を持っていますか?

チャレンジ

ファイルのUNIX権限とその所有権(ユーザーIDとグループID)の記号表記を示す文字列が与えられた場合、与えられたユーザー
A に読み取り/書き込み/実行権限があるかどうかを決定します。


関連

UNIXシステムでのアクセス許可

UNIXでは、すべてのファイルに3つの権限クラス( user
グループothers )と所有権。

記号表記は10文字で構成されています。このチャレンジでは、最初の文字は重要ではありません。残りの9文字は、ユーザー、グループ、その他のクラスのアクセス許可を表す3文字の3つの文字セットです。各セットの文字は、読み取り/書き込み/実行が許可されているかどうかを示します。許可されている場合は、
rw または x になります。それ以外の場合は、
- になります。

setuidsetgidsticky bit
は各セットの3番目の文字を sSt または
T
簡単なルールは次のとおりです。文字が小文字の場合、権限が設定されます。そうでなければ、そうではありません。

(アクセス許可の記号表記の詳細については、こちらを参照してください)。

すべてのユーザーはユーザーIDを持ち、すべてのユーザーはグループIDを持ちます。すべてのIDは、負ではない整数になります。ユーザーは少なくとも1つのグループに所属します。ユーザが
A ファイルにアクセスしたい場合、システムは次のようにアクセス権をチェックします:

  • ファイルが A
    に属している場合は、ユーザークラスのアクセス許可を確認します。

  • ファイルが A に属していないが、 A
    がそのファイルが属するグループに属している場合は、 group クラス

  • それ以外の場合は、他人クラスの権限を確認してください。

ただし、ユーザーIDが0(スーパーユーザー)の場合は、何かを実行する権限があります。

仕様

  • Your program/function should take these as input in any
    reasonable format:

    • Permissions in symbolic notation.
    • User ID and group ID which the file belongs to.
    • The user ID of A, and a list of group IDs which
      A belongs to.
    • Type of access. You can use any three different one-digit or
      one-character values for read, write and execute.
  • Return/output a truthy value if A has permission
    to access the file, or a falsy value if not.
  • You can assume that the first character of the notation will
    always be - (regular file).
  • This is ,
    so the shortest in bytes wins!

テストケース

ここでのフォーマットは
[許可、ファイルのユーザID、ファイルのグループID、AのユーザID、AのグループID、タイプ(r/w/x)]
です。

[-rwx------, 13, 15, 13, [15, 24], r]: True   # user
[-rwxr-xr-x, 13, 24, 24, [15, 24], w]: False  # group 
[-rwxr-Sr-T, 13, 15, 24, [15, 35], x]: False  # group
[-rwsr-xr-t, 13, 15, 24, [24, 35], x]: True   # others
[----------, 13, 15, 0, [0, 1, 2], r]: True   # superuser
[----------, 13, 15, 1, [0, 1, 2], r]: False  # others
[----rwxrwx, 13, 15, 13, [15, 24], r]: False  # user
ベストアンサー

JavaScript(ES6)、 61 51 50バイト

チャレンジに記載されている順序で入力として6つの異なるパラメータを取得します。 write または
3 の場合は 12
実行のために。 0 または 1 を返します。

(p,u,g,a,G,P)=>!a|p[u-a?6-3*G.includes(g)+P:P]>'Z'

テストケース

<div class=”snippet” data-lang=”js” data-hide=”true”
data-console=”true” data-babel=”false”> <div
class=”snippet-code snippet-currently-hidden”>

let f =

(p,u,g,a,G,P)=>!a|p[u-a?6-3*G.includes(g)+P:P]>'Z'

//            p             u   g   a   G          P
console.log(f('-rwx------', 13, 15, 13, [15, 24],  1))//True  (user)
console.log(f('-rwxr-xr-x', 13, 24, 24, [15, 24],  2))//False (group)
console.log(f('-rwxr-Sr-T', 13, 15, 24, [15, 35],  3))//False (group)
console.log(f('-rwsr-xr-t', 13, 15, 24, [24, 35],  3))//True  (others)
console.log(f('----------', 13, 15,  0, [0, 1, 2], 1))//True  (superuser)
console.log(f('----------', 13, 15,  1, [0, 1, 2], 1))//False (others)
console.log(f('----rwxrwx', 13, 15, 13, [15, 24],  1))//False (user)

</div> </div>

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です