क्या मुझे अनुमति है?


10

चुनौती

किसी फ़ाइल की UNIX अनुमति और उसके स्वामित्व (उपयोगकर्ता आईडी और समूह आईडी) के प्रतीकात्मक संकेतन को इंगित करने वाली एक स्ट्रिंग को देखते हुए, यह तय करें कि किसी दिए गए उपयोगकर्ता Aको इसे पढ़ने / लिखने / निष्पादित करने की अनुमति है या नहीं।

संबंधित

UNIX सिस्टम में अनुमतियाँ

UNIX में, हर फ़ाइल में अनुमतियों ( उपयोगकर्ता , समूह और अन्य ) और स्वामित्व के तीन वर्ग होते हैं , जिसमें उपयोगकर्ता और कौन सा समूह शामिल है।

प्रतीकात्मक अंकन में दस वर्ण होते हैं। इस चुनौती में पहला चरित्र महत्वपूर्ण नहीं है। शेष नौ वर्ण उपयोगकर्ता, समूह और अन्य वर्ग की अनुमतियों का प्रतिनिधित्व करते हुए तीन वर्णों के तीन सेटों में हैं। प्रत्येक सेट में वर्ण इंगित करता है कि क्या पठन / लेखन / निष्पादन की अनुमति है। यदि अनुमति दी जाती है, तो यह होगा r, wया x। नहीं तो होगा -

ध्यान दें कि setuid , setgid और चिपचिपा सा करने के लिए प्रत्येक सेट के तीसरे चरित्र को बदल सकता है s, S, tया T। यहां एक सरल नियम है: यदि चरित्र लोअरकेस अक्षर है, तो अनुमति निर्धारित है; अन्यथा, यह नहीं है।

(अनुमतियों के सांकेतिक अंकन के विवरण के लिए, कृपया यहाँ देखें ।)

हर यूजर की अपनी यूजर आईडी होती है, और हर ग्रुप की अपनी ग्रुप आईडी होती है। सभी आईडी गैर-नकारात्मक पूर्णांक होंगे। एक उपयोगकर्ता कम से कम एक समूह का होगा। यदि कोई उपयोगकर्ता Aकिसी फ़ाइल तक पहुँच प्राप्त करना चाहता है, तो सिस्टम उनकी अनुमतियों की जाँच निम्नानुसार करेगा:

  • यदि फ़ाइल उपयोगकर्ता की है A, तो उपयोगकर्ता वर्ग की अनुमतियों की जाँच करें

  • यदि फ़ाइल से संबंधित नहीं है A, लेकिन Aसमूह से संबंधित है , जो फ़ाइल से संबंधित है, तो समूह वर्ग की अनुमतियों की जांच करें ।

  • अन्यथा, अन्य वर्ग की अनुमतियों की जाँच करें ।

हालांकि, एक अपवाद है: यदि उपयोगकर्ता आईडी 0 (सुपरयूज़र) है, तो उन्हें कुछ भी करने की अनुमति है !

विशेष विवरण

  • आपके कार्यक्रम / समारोह को इन्हें किसी भी उचित प्रारूप में इनपुट के रूप में लेना चाहिए:
    • प्रतीकात्मक संकेतन में अनुमतियाँ ।
    • उपयोगकर्ता आईडी और समूह आईडी जो फ़ाइल से संबंधित है।
    • उपयोगकर्ता आईडी A, और समूह आईडी की एक सूची जो कि Aसंबंधित है।
    • पहुंच का प्रकार। आप पढ़ने, लिखने और निष्पादित करने के लिए किसी भी तीन अलग-अलग एक-अंकीय या एक-वर्ण मान का उपयोग कर सकते हैं।
  • यदि 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

जावास्क्रिप्ट (ईएस 6), 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

पायथन 2 , 76 70 67 63 59 58 56 55 52 52 49 बाइट्स

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

इसे ऑनलाइन आज़माएं!

3पढ़ने के लिए, 2लिखने के 1लिए और निष्पादन के लिए टाइप करता है



1
सुपर आईडी होना जरूरी नहीं है कि ग्रुप आईडी 0. मैंने इसे परीक्षण मामलों में जोड़ा है।
कोलेरा सु

@ColeraSu आह मैं गलत, उपयोगकर्ता आईडी नकारात्मक हो सकता है?
TFeld

यूआईडी और जीआईडी ​​दोनों गैर-नकारात्मक होंगे।
कोलेरा सु


1

पायथ, 22 21 बाइट्स

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

इसे ऑनलाइन आज़माएं। परीक्षण सूट।

छह लाइनों के रूप में इनपुट लेता है:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.