許可はありますか?


10

チャレンジ

ファイルのUNIXパーミッションとその所有権(ユーザーIDとグループID)の記号表記を示す文字列を指定しAて、特定のユーザーがファイルの読み取り/書き込み/実行のパーミッションを持っているかどうかを判断します。

関連

UNIXシステムでの権限

UNIXでは、すべてのファイルは、パーミッション(3つのクラスがあるユーザーグループ、および他のどのグループには属しているユーザーを含む)と所有権を、。

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

そのノートのsetuidsetgidの及びスティッキービットは、各セットの3番目の文字を変更することができるsStまたはT。単純なルールは次のとおりです。文字が小文字の場合、権限が設定されます。そうでなければ、そうではありません。

(権限の記号表記の詳細については、こちらを参照してください。)

すべてのユーザーにはユーザーIDがあり、すべてのグループにはグループIDがあります。すべてのIDは負でない整数になります。ユーザーは少なくとも1つのグループに属します。ユーザーAがファイルへのアクセスを取得したい場合、システムは次のようにユーザーの権限を確認します。

  • ファイルがuser Aに属している場合は、userクラスの権限を確認してください。

  • ファイルがに属していないが、ファイルAA属するグループに属している場合は、グループクラスの権限を確認してください。

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

ただし、例外が1つあります。ユーザーIDが0(スーパーユーザー)の場合、ユーザーは何でも実行する権限を持っています

仕様書

  • プログラム/関数は、これらを適切な形式の入力として受け取る必要があります。
    • 記号表記のアクセス許可。
    • ファイルが属するユーザーIDとグループID。
    • のユーザーID A、およびA所属するグループIDのリスト。
    • アクセスのタイプ。読み取り、書き込み、実行には、3つの異なる1桁または1文字の値を使用できます。
  • Aファイルへのアクセス権限がある場合は真の値を返し、そうでない場合は偽の値を返す/出力します。
  • 表記の最初の文字は常に-(通常のファイル)であると想定できます。
  • これはなので、バイト単位での最短が勝ちます!

テストケース

ここのフォーマットは[permissions, user ID of file, group ID of file, user ID of A, group IDs of A, type(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

回答:


6

JavaScript(ES6)、61 51 50バイト

チャレンジで説明されている順序で、6つの異なるパラメーターを入力として受け取ります。最後のパラメータがあることを期待1するために読み取り2ために書き込みまたは3のために実行します0またはを返します1

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

テストケース


2

パイソン276 70 67 63 59 58の 56 55 52 49 48バイト

lambda p,u,g,A,G,t:A*'_'<p[~(u==A)*3*(g in G)-t]

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

3読み取り、2書き込み、および1実行の場合と同様にタイプを取得します



1
グループIDを0にするためにスーパーユーザーである必要はありません。テストケースに追加しました。
Colera Su、2017

@ColeraSuああ、誤解しました。ユーザーIDを負にできますか?
TFeld 2017年

UIDとGIDはどちらも負ではありません。
Colera Su、2017


1

Pyth、22 21バイト

|!Q}@@c3tw*nEQ-2}EEEG

オンラインでお試しください。 テストスイート。

入力を6行として受け取ります。

user id
permissions
file user id
file group
user groups
permission (0 = read, 1 = write, 2 = execute)

説明

|!Q}@@c3tw*nEQ-2}EEEG     Implicit: read user id to Q
 !Q                       True if user id is 0, false otherwise
|                         If true, just return it
         w                Read permission string
        -                 Omit first -
      c3                  Split in 3 parts
            E             Read file user id
           n Q            See if it doesn't equal Q
                          -> False (0) if user matches, true (1) otherwise
                 E        Read file group
                  E       Read user groups
                }         -> True (1) if group matches, false (0) otherwise
              -2          Subtract from 2
                          -> 1 if group matches, 2 otherwise
          *               Multiply the two numbers
                          -> 0 if user matches, 1 if group matches, 2 otherwise
     @                    Take correct part of permission string
    @                     Take correct character of that part
   }                G     See if it is in lowercase alphabet
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.