ถอดรหัส chmod


26

ท้าทาย

กำหนดหมายเลขการอนุญาตเลขฐานแปดสามหลักให้ส่งออกการอนุญาตที่ได้รับ

chmod

บน UNIX OS การอนุญาตของไฟล์จะเปลี่ยนไปโดยใช้chmodคำสั่ง มีวิธีการใช้ chmod ที่แตกต่างกันเล็กน้อย แต่วิธีที่เราจะเน้นในวันนี้คือการใช้การอนุญาตแบบฐานแปด

ตัวเลขสามหลักในหมายเลขสิทธิ์แสดงถึงบุคคลอื่น:

  • ตัวเลขตัวแรกแสดงถึงการอนุญาตสำหรับผู้ใช้
  • ตัวเลขตัวที่สองหมายถึงการอนุญาตสำหรับกลุ่ม
  • ตัวเลขสุดท้ายแสดงสิทธิ์ของผู้อื่น

ถัดไปแต่ละหลักหมายถึงสิทธิ์ที่แสดงด้านล่างใน:

Key: number | permission

7 | Read Write and Execute
6 | Read and Write
5 | Read and Execute
4 | Read only
3 | Write and Execute
2 | Write only
1 | Execute only
0 | None

อินพุต

อินพุตจะเป็นตัวเลขสามหลักเป็นสตริงเช่น:

133

หรือ

007

สิ่งนี้จะถูกส่งผ่าน STDIN หรือผ่านอาร์กิวเมนต์ของฟังก์ชัน

เอาท์พุต

ผลลัพธ์ของคุณควรได้รับการอนุญาตแตกต่างกันสำหรับผู้ใช้แต่ละคนกลุ่มและคนอื่น คุณต้องแสดงข้อมูลเช่นนี้:

User:   ddd
Group:  ddd
Others: ddd

ในกรณีที่มีสามช่องหลังจากที่Userสองหลังจากที่ช่องว่างและเป็นหนึ่งในช่องว่างหลังGroup Othersคุณแทนที่dddด้วยข้อมูลสิทธิ์

เอาต์พุตของคุณอาจเป็น STDOUT หรือเป็นสตริงที่ส่งคืน

ตัวอย่าง

อินพุต: 666

เอาท์พุท:

User:   Read and Write
Group:  Read and Write
Others: Read and Write

อินพุต: 042

เอาท์พุท:

User:   None
Group:  Read only
Others: Write only

อินพุต: 644

เอาท์พุท:

User:   Read and Write
Group:  Read only
Others: Read only

การชนะ

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


อะไรคือคุณสมบัติของอินพุตหรือไม่
Jonathan Allan

@JanathanAllan เพียงแค่ตัวเลขสามหลัก
Beta Decay

คุณหมายถึงเป็นจำนวนเต็มทศนิยมเท่านั้นดังนั้น 042 จึงจะได้รับเป็น 42
Jonathan Allan

2
@ Jonathan ไม่เป็นอินพุตสตริงดังนั้นมันจึงเป็น 042
Beta Decay

1
เอาต์พุตดูเหมาะสมกับอักขระแท็บดังนั้นทำไมไม่ใช้มัน? เพียงเพื่อลงโทษภาษาที่ต้องการไบต์มากขึ้นเพื่อแพ็คสตริง?
ติตัส

คำตอบ:


3

05AB1E , 89 87 ไบต์

”‚Ý:‚Ù:ˆ†:”ð¡v”Šª0ÍÃ20‡í20‡í1ÍÃ0‚Ø20‚Ø1ÍÃ0‚Ø1‡í0‚؇í1ÍÔ2ð'€É«:1ð'€ƒ«:0ð«¡¹Nèèð3N-×ìyì,

เรียกการเข้ารหัสคธูลู ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


14

Javascript (ES6), 165 161 ไบต์

n=>[0,1,2].map(i=>(s='User:  3Group: 68Others:58None576Read48Write476Execute475and4576only'.split(/(\d+)/))[i*2]+s[n[i]*2+1].replace(/./g,c=>' '+s[c*2])).join`
`

แก้ไข: +1 ไบต์เพื่อทำตามกฎ "ไม่มีแท็บ"

ตัวอย่าง

let f =
n=>[0,1,2].map(i=>(s='User:  3Group: 68Others:58None576Read48Write476Execute475and4576only'.split(/(\d+)/))[i*2]+s[n[i]*2+1].replace(/./g,c=>' '+s[c*2])).join`
`
console.log(f("666"));
console.log(f("042"));
console.log(f("644"));
console.log(f("137"));


คุณสามารถได้รับสองสามไบต์โดยจัดเรียงอาร์เรย์ใหม่ (และอาจแยกตัวเลขออกจากสตริง) +1 สำหรับแนวคิด
ติตัส

@Titus - ฉันต้องยอมรับว่าฉันไม่เห็นการจัดเรียงใหม่ที่ช่วยประหยัดบางไบต์ นอกจากนี้ตัวเลขที่ได้จะถือว่าเป็นสตริงเพื่อให้replace()การทำงานของพวกเขาโดยไม่ต้อง coercing แต่ฉันอาจพลาดจุดของคุณ
Arnauld

@Titus - บางสิ่งบางอย่าง'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)อาจทำงานได้ นั่นคือสิ่งที่คุณมีในใจ?
Arnauld

ฉันเข้าใจผิดพวกเขา; คิดว่าพวกเขาเป็นค่าแปด :) แต่ความคิดใหม่ของคุณก็ไม่เลวเหมือนกัน
ติตัส

เอาต์พุต Challenge ต้องใช้ช่องว่างแทนแท็บตามที่เขียนไว้ในปัจจุบัน
Mwr247

13

รุ่น GNU, 187 163 158 (157 + 1) ไบต์

รันด้วย-r (ERE regexp) ไฟล์ไม่มีการขึ้นบรรทัดใหม่

s/(.)(.)/User:   \1\nGroup:  \2\nOthers: /g
s/[4-7]/Read &/g
s/[2367]/Write &/g
s/[1357]/Execute &/g
s/(\w) (\w+) [1-7]/\1 and \2/g
s/[1-7]/only/g
s/0/None/g

วิธีการที่ดี แต่คุณสามารถบันทึกประมาณ 20 ไบต์โดยการเอาตัวเลขเมื่อคุณเพิ่มหรือand only
Neil

@ ไม่มีนั่น :) รวมข้อเสนอแนะของคุณไว้เพื่อการบันทึกที่สำคัญมาก
FireFly

1
บรรทัดแรกอาจเป็นเพียง: s/(.)(.)/User: \1\nGroup: \2\nOthers: /. บางไบต์จะถูกบันทึกไว้โดยย้ายไป Perl ซึ่งมีและ\d \K
ninjalj

@ninjalj จุดที่ดี ฉันจะติดใจเพราะฉันไม่รู้จัก Perl และฉันแน่ใจว่าจะมีเทคนิคอื่น ๆ ที่จะดึงไปที่นั่นเพื่อทำให้สั้นยิ่งขึ้นนอกเหนือจากการเปลี่ยน s ///
FireFly

6

C # 214 ไบต์

string h(string y){string e="Execute ",r="Read ",w="Write ",O="Only",a="and ";var z=new[]{"None",e+O,w+O,w+a+e,r+O,r+a+e,r+a+w,r+w+a+e};return$"User:   {z[y[0]-'0']}\nGroup:  {z[y[1]-'0']}\nOthers: {z[y[2]-'0']}";}

6

เยลลี่ , 100 91 85 ไบต์

สามารถเล่นกอล์ฟได้เกือบแน่นอน - 91 ไบต์อะไรนะ! 8 เดือนกับ 6 ภูมิปัญญาไบต์!
- 1. การบีบอัดสตริงเพิ่มเติม
- 2. ลบการลดลงของ post-ordinal 48 เนื่องจากการทำดัชนีเป็นโมดุล
- 3. ใช้การผูกมัดที่ดีกว่าโดยปริยาย)

-9 bytes ด้วยความช่วยเหลือจาก @Lynn ที่ใช้การบีบอัดสตริงสำหรับฉัน

,“£ɱ~»
Ñ
ṖK,“ and”,Ṫ
LĿK
7RBUT€Uị“ØJƓ“¥Ị£“¤/¡»Ç€“¡*g»ṭ
“ṖŒhJ"ỵd¡»ḲðJ4_⁶ẋ⁸,"j€”:ż⁹Oị¢¤Y

ทดสอบที่TryItOnline

อย่างไร?

,“£ɱ~» - Link 1: pair with the string "Only"

Ñ - Link 2: call next link

ṖK,“ and”,Ṫ - Link 3: insert " and" between the last two elements of x
Ṗ           - x[:-1]
 K          - join with spaces
   “ and”   - the string " and"
          Ṫ - x[-1]
  ,      ,  - pair

LĿK - Link 4: call appropriate link and add missing spaces
L   - length
 Ŀ  - call link at that index
  K - join the result with spaces

7RBUT€Uị“ØJƓ“¥Ị£“¤/¡»Ç€“¡*g»ṭ - Link 5: construct all 8 cases
7R                            - range of 7: [1,2,3,4,5,6,7]
  B                           - binary (vectorises): [[1],[1,0],[1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
   U                          - reverse (vectorises): [[1],[0,1],[1,1],[0,0,1],[1,0,1],[0,1,1],[1,1,1]]
    T€                        - indexes of truthy values for each: [[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
      U                       - reverse (vectorises): [[1],[2],[2,1],[3],[3, 1],[3,2],[3,2,1]]
        “ØJƓ“¥Ị£“¤/¡»         - list of strings: ["Execute","Write","Read"]
       ị                      - item at index (vectorises): [["Execute"],["Write"],["Write","Execute"],["Read"],["Read","Execute",["Read","Write"],["Read","Write","Execute"]]
                     ǀ       - call the previous link for each
                       “¡*g»  - the string "None"
                            ṭ - tack (Jelly is 1-based so the 8th item will be indexed as 0)

“ṖŒhJ"ỵd¡»ḲðJṚ⁶ẋ⁸,"j€”:ż⁹Oị¢¤Y - Main Link: parse input and make the result. e.g.: "042"
“ṖŒhJ"ỵd¡»                     - dictionary compression of "User Group Others"
          Ḳ                    - split at spaces -> ["User","Group","Others"]
           ð                   - dyadic chain separation, call that g (input as right)
            J                  - range of length of g -> [1,2,3]
             Ṛ                 - reverse -> [3,2,1]
              ⁶                - literal space
               ẋ               - repeat -> ["   ","  "," "]
                ⁸              - chain's left argument, g
                  "            - zip with:
                 ,             -   pair -> [["User","   "],["Group","  "],["Others"," "]]
                     ”:        - literal ':'
                   j€          - join for €ach -> ["User:   ","Group:  ","Others: "]
                            ¤  - nilad followed by link(s) as a nilad:
                        ⁹      - chain's right argument, the input string -> "042"
                         O     -   cast to ordinal (vectorises) -> [48, 52, 50]
                           ¢   -   call last link (5) as a nilad  -> ["Execute Only","Write Only","Write and Execute","Read Only","Read and Execute","Read and Write","Read Write and Execute","None"]
                          ị    -   index into (1-based & modular) -> ["None","Read Only","Write Only"]
                       ż       - zip together -> [["User:   ","None"],["Group:  ","Read Only"],["Others: ","Write Only"]]
                             Y - join with line feeds -> ["User:   ","None",'\n',"Group:  ","Read Only",'\n',"Others: ","Write Only"]
                               - implicit print:
                                             >>>User:   None
                                             >>>Group:  Read Only
                                             >>>Others: Write Only

4

อ็อกเทฟ 185 ไบต์

@(n)fprintf('User:   %s\nGroup:  %s\nOthers: %s',{'Read Write and Execute','Read and Write','Read and Execute','Read only','Write and Execute','Write only','Execute only','None'}{56-n})

สร้างฟังก์ชั่นที่ไม่ระบุชื่อที่รับอินพุตเป็นสตริง: '042' แปลงเป็นอาร์เรย์: (56-'042)' = [0 4 2]. Read Write and Execute','Read and Write', ...ใช้สิ่งนี้เป็นดัชนีมือถือหลายที่ดัชนีอาร์เรย์เซลล์ที่มี ใช้fprintfการส่งออกทั้งสามสายกับประเภทที่เหมาะสม: User:, และGroup:Others:

ฉันพยายามหาวิธีที่จะเก็บExecute, Write, Readเป็นคำที่แยกต่างหากและ concatenate ตามความจำเป็น แต่เปิดออกมานานกว่าวิธีการที่ไร้เดียงสา

ตัวอย่าง:

1> f('000')
User:   None
Group:  None
Others: None
2> f('042')
User:   None
Group:  Read only
Others: Write only

ลองออนไลน์


2
คุณสามารถบันทึกไม่กี่ไบต์โดยใช้strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')แทนตัวอักษรอาร์เรย์ของเซลล์
Luis Mendo

4

PowerShell v2 +, 189 168 ไบต์

[char[]]$args[0]|%{('User','Group','Others')[$i++]+":`t"+('None','Read','Write','Execute','only','and')[(0,(3,4),(2,4),(2,5,3),(1,4),(1,5,3),(1,5,2),(1,2,5,3))[$_-48]]}

วนซ้ำผ่านอินพุต$args[0]เป็นchar-array แต่ละซ้ำดัชนีเราเข้าแถวกับ$i++(ค่าเริ่มต้น0) เพื่อเลือกUser, GroupหรือOthers, concatenate กับลำไส้ใหญ่และแท็บและ concatenate ที่มีค่าดัชนีอาร์เรย์อีก

นี่คือความมหัศจรรย์ เราส่งคำcharสั่ง a ไปยังintและลบ48(เช่นเปลี่ยน ASCII 48( "0") เป็น0) โดยเลือกคำที่เหมาะสมเป็นอาร์เรย์ของints อาร์เรย์นั้นจะถูกใช้เป็นดัชนีใน'None','Read','Write','Execute','only','and'อาร์เรย์ เนื่องจากค่าเริ่มต้น$ofs(ตัวคั่นฟิลด์ผลลัพธ์) เป็นช่องว่างสิ่งนี้จะแทรกช่องว่างระหว่างองค์ประกอบอาเรย์อย่างถูกต้องเมื่อเกิดการทำให้เป็นสตริง (ซึ่งเกิดขึ้นเมื่อเชื่อมต่อทางด้านซ้าย)

สามสตริงเหล่านี้จะถูกทิ้งไว้ที่ไพพ์ไลน์และเอาต์พุตผ่านทาง implicit Write-Outputเกิดขึ้นเมื่อโปรแกรมเสร็จสิ้น

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\decode-the-chmod.ps1 '123'
User:   Execute only
Group:  Write only
Others: Write and Execute

3

สตรอเบอร์รี่ , 193 ไบต์

((01234567)((None)(Execute only)(Write only)(Write and Execute)(Read only)(Read and Execute)(Read and Write)(Read Write and Execute)))::~<:{-¢(User:   ),+>
>}:{-¢(Group:  ),+>
>}-¢(Others: ),+>

ลองออนไลน์

กด 3 เท่าของตารางการแปลงบนสแต็กแรกสลับเป็นสแต็กที่สองแปลงแต่ละตัวเลขโดยใช้ตารางการสนทนาและพิมพ์


2

Haskell, 186 ไบต์

s=zip(words"7654 6 7632 753 7531 0 421")(words"Read and Write and Execute None only")
m c=mapM_(\(x,y)->putStrLn(x++unwords[b|(a,b)<-s,elem y a]))$zip["User:   ","Group:  ","Others: "]c

ตัวอย่าง:

Prelude> :r
[1 of 1] Compiling Main             ( decCh.hs, interpreted )
Ok, modules loaded: Main.
*Main> m "654"
User:   Read and Write
Group:  Read and Execute
Others: Read only

โหมโรงเท่านั้นที่ใช้ ฉันทำสิ่งนี้ถูกไหม?

Ungolfed:

s = zip (words "7654 6 7632 753 7531 0 421")
        (words "Read and Write and Execute None only")

ps y = unwords [b|(a,b)<-s,elem y a] -- build permissions string
pp (x,y) = putStrLn $ x ++ ps y -- print user + permission

m c =   let up = zip ["User:   ","Group:  ","Others: "] c -- pair user and permission
        in mapM_ pp up --print each

2

Python 2, 190 185 ไบต์

def f(i):
 r,w,a,x,o,g="Read ","Write ","and ","Execute ","only",["User:  ","Group: ","Others:"];p=["None",x+o,w+o,w+a+x,r+o,r+a+x,r+a+w,r+w+a+x]
 for z in 0,1,2:print g[z],p[int(i[z])]

ออกจากพื้นที่ต่อท้ายหากดำเนินการหรือเขียนอยู่ที่ท้ายบรรทัด แต่ฉันไม่เห็นว่าสิ่งนี้ไม่ได้รับอนุญาต

แก้ไขบันทึก 5 ไบต์ด้วยการเปลี่ยนช่วง (3) เป็น 0,1,2 และตรวจสอบจำนวนไบต์บนแล็ปท็อป Linux ของฉันแทน Windows หนึ่ง (\ n = \ r \ n หรือวิธีอื่น ๆ ฉันไม่สามารถจำได้)


2

Python 2, 240 239 238 237 228 ไบต์

ฉันคิดว่าในที่สุดฉันก็จะออกไปเล่นกอล์ฟเย็น หวังว่าจะอนุญาตช่องว่างต่อท้ายได้ (คงที่และในกระบวนการบันทึกเป็นไบต์)

i=0
def a(b):
 for d in 4,2,1:
    if b&d:yield('Execute','Write','Read')[d/2]
for k in raw_input():
 b,q=list(a(int(k))),' and';e=len(b)
 if e:b[~e/2]+=(' only',q,q)[e-1]
 print'UGOsrteohrue:pr :s  :'[i::3],' '.join(b)or None;i+=1

ยินดีต้อนรับสู่ PPCG และคำตอบแรกที่ดี!
ETHproductions

ฉันเปลี่ยนช่วง (3) ใน Python 2 ของฉันอย่างไร้คำตอบเป็น 0,1,2 หลังจากอ่านโค้ดของคุณ คำตอบที่ดี +1
ElPedro

2

PHP, 169 159 ไบต์

foreach([User,Group,Others]as$i=>$u){echo"
$u: ";for($n=[5,33,34,66,35,67,131,531][$i]];$n;$n>>=3)echo["and",Execute,Write,Read,only,None][$n&7]," ";}

ใช้เวลาสตริงเป็นอาร์กิวเมนต์บรรทัดคำสั่ง: php -r '<code>' <argument>,
พิมพ์ชั้นนำขึ้นบรรทัดใหม่แทนการลากหนึ่ง

ขอขอบคุณที่Jörgสำหรับการชี้ให้เห็นข้อบกพร่องของฉัน - \tและสำหรับ

PHP, 169 ไบต์

ด้วยข้อ จำกัด ใหม่: (ห้ามใช้อักขระแท็บ)

foreach(['User:  ','Group: ','Others:']as$i=>$u){echo"
$u";for($n=[5,33,34,66,35,67,131,531][$argv[1][$i]];$n;$n>>=3)echo' ',['and',Read,Write,Execute,only,None][$n&7];}

นี่คือ 1 ไบต์ที่สั้นกว่าด้วยstr_padเนื่องจากจะต้องมีช่องว่างเพิ่มเติม

ทำให้พังถล่ม

foreach([User,Group,Others]as$i=>$u)
{
    echo"\n$u:\t";                      // print newline, who, blanks
    for($n=[5,33,34,66,35,67,131,531]   // octal values for words indexes
        [$argv[1][$i]]                  // (last word=highest digit)
        ;$n;$n>>=3)                     // while value has bits left
        echo['and',Execute,Write,Read,only,None][$n&7]," "; // print that word
}

ในการสร้างอาร์เรย์ให้$nใช้:

$b=[[5],[1,4],[2,4],[2,0,1],[3,4],[3,0,1],[3,0,2],[3,2,0,1]];
foreach($b as$i=>$a){for($v=$j=0;$a;$j+=3)$v+=array_shift($a)<<$j;echo"$v,";}

1
foreach ([ 'ผู้ใช้', 'กลุ่ม', 'อื่น ๆ'] เป็น $ i => $ U) {echo "\\ N $ U: \\ T"; บันทึกไบต์และผลลัพธ์สำหรับ 3,4,6 ไม่ถูกต้อง
JörgHülsermann

1
นี่คือคำสั่งที่ถูกต้อง [5,33,34,66,35,67,131,531] ความคิดที่ดี
JörgHülsermann

ฉันลืม 'ผู้ใช้' ให้กับผู้ใช้สำหรับ exmple บันทึก 6 ไบต์ถัดไปที่คุณต้องการเอาชนะ JavaScript ทำ
JörgHülsermann

@ JörgHülsermann: ฉันกำลังจะใช้ "\ t" อยู่ดี ขอบคุณ +1 สำหรับที่ :) ตาดี33!
ติตัส

1
สำหรับ 346 ผลลัพธ์ของเราคือผู้ใช้: อ่านและเขียนกลุ่ม: ดำเนินการเท่านั้นอื่น ๆ : เขียนและดำเนินการควรใช้ผู้ใช้: เขียนและดำเนินการกลุ่ม: อ่านอย่างเดียวอื่น ๆ : อ่านและเขียน
JörgHülsermann

2

ทุบตี - 221 213 ไบต์

GNU bash, version 4.3.46

l=("User:   " "Group:  " "Others: ")
o=\ only;a=" and ";x=Execute;w=Write;r=Read
b=(None "$x$o" "$w$o" "$w$a$x" "$r$o" "$r$a$x" "$r$a$w" "$r $w$a$x")
for c in `echo $1|grep -o .`;{ echo "${l[$((z++))]}${b[$c]}";}

ไม่ชัดเจนว่าสิ่งนี้จะรวมตัวกันเพิ่มเติมใด ๆ อย่างน้อยก็ไม่ได้โดยไม่ต้องเปลี่ยนวิธีการที่นี่ (แยกอินพุตและใช้มันเป็นดัชนีไปยังอาร์เรย์${b}ที่มีสตริงที่สอดคล้องกัน)


1
มันสั้นลงด้วยการ\ onlyขยายแบบอินไลน์ grep -o .<<<$1สั้นกว่าecho $1|grep -o .แต่การอ่านอินพุตจาก stdin ด้วยwhile read -n1 cจะดีกว่า ดัชนีอาร์เรย์มีบริบททางคณิตศาสตร์ในทุบตีดังนั้น${l[z++]}ทำงาน lจะสั้นกว่าเป็นสตริงซึ่งจะเข้าถึงได้เป็น${l:z++*8:8}(ออฟเซ็ตและความยาวมีบริบททางคณิตศาสตร์) ไบต์อื่นสามารถ sh? aved โดยการอ่านโหมดทั้งหมดในcขยาย "ผู้ใช้:", ... แบบอินไลน์และการใช้การขยายพารามิเตอร์อย่างรอบคอบ
ninjalj

1
สำหรับผลลัพธ์สุดท้ายของ: a=" and ";x=Execute;w=Write;r=Read;b=(None $x\ only $w\ only "$w$a$x" $r\ only "$r$a$x" "$r$a$w" "$r $w$a$x");read c;echo "User: ${b[${c%??}]}\nGroup: ${b[${c:1:1}]}\nOthers: ${b[${c:2}]}"(แทนที่ \ n ด้วยบรรทัดใหม่ตามตัวอักษร)
ninjalj

1

Java 7, 300 284 ไบต์

String c(String s){char[]a=s.toCharArray();return"User:   "+f(a[0])+"Group:  "+f(a[1])+"Others: "+f(a[2]);}String f(int i){return new String[]{"None","Execute only","Write only","Write and Execute","Read only","Read and Execute","Read and Write","Read Write and Execute"}[i%48]+"\n";}

วิธีการโดยตรงสำหรับตอนนี้ จะพยายามคิดหาวิธีทั่วไปที่จะนำคำมาใช้ซ้ำ

กรณีที่ไม่ได้รับการทดสอบ &:

ลองที่นี่

class M{
  static String c(String s){
    char[] a = s.toCharArray();
    return "User:   " + f(a[0]) + "Group:  " + f(a[1]) + "Others: " + f(a[2]);
  }

  static String f(int i){
    return new String[]{ "None", "Execute only", "Write only", "Write and Execute", "Read only", "Read and Execute", "Read and Write", "Read Write and Execute" }
      [i % 48] + "\n";
  }

  public static void main(String[] a){
    System.out.println(c("666"));
    System.out.println(c("042"));
    System.out.println(c("644"));
  }
}

เอาท์พุท:

User:   Read and Write
Group:  Read and Write
Others: Read and Write

User:   None
Group:  Read only
Others: Write only

User:   Read and Write
Group:  Read only
Others: Read only

1

Groovy, 217 207 205 ไบต์

def c(m){def i=0,e='Execute',w='Write',r='Read',o=' only',a=' and ';m.each{println(['User:   ','Group:  ','Others: '][i++]+['None',"$e$o","$w$o","$w$a$e","$r$o","$r$a$e","$r$a$w","$r $w$a$e"][it as int])}}

ungolfed:

def c(m) {
  def i=0,e='Execute',w='Write',r='Read',o=' only',a=' and ';
  m.each{
    println(['User:   ','Group:  ','Others: '][i++]+['None',"$e$o","$w$o","$w$a$e","$r$o","$r$a$e","$r$a$w","$r $w$a$e"][it as int])
  }
}

1

Mathematica, 211 ไบต์

{r,w,e,o,a}={"Read ","Write ","Execute ","only ","and "};""<>Transpose@{{"User:   ","Group:  ","Others: "},"None"[{e,o},{w,o},{w,a,e},{r,o},{r,a,e},{r,a,w},{r,w,a,e}][[#]]&/@IntegerDigits[#,10,3],"\n"&~Array~3}&

การใช้งานที่ตรงไปตรงมา (อาจเอาชนะได้ง่าย): ไม่คำนวณอะไรเลยเพียงแค่ใส่โค้ดที่ยากที่สุดในแต่ละเอาต์พุต อินพุตเป็นจำนวนเต็ม เอาต์พุตแต่ละบรรทัดด้วยช่องว่างต่อท้ายและการขึ้นบรรทัดใหม่โดยรวม

IntegerDigits[#,10,3]ให้ตัวเลขสามหลักของอินพุต (แม้ว่าจะมีศูนย์นำหน้า) แต่ละหลักหมายถึงการโต้แย้งของ "ฟังก์ชั่น"

"None"[{e,o},{w,o},{w,a,e},{r,o},{r,a,e},{r,a,w},{r,w,a,e}]

ด้วย 0 ระบุชื่อฟังก์ชั่นของตัวเอง ""<>เชื่อมสตริงทั้งหมดในรายการ (ของรายการ) "\n"&~Array~3สร้างสามบรรทัดใหม่


ฉันเพิ่งสังเกตเห็นว่าคำตอบ Python 2 ของฉันเกือบจะเหมือนกันกับคุณแม้ใช้ชื่อตัวแปรเดียวกัน ฉันไม่เคยเห็นคุณอย่างจริงใจก่อนโพสต์!
ElPedro

1
ไม่ต้องห่วง! ผมคิดว่าการจับคู่ชื่อตัวแปรสวยมากเป็นที่คาดว่าในสถานการณ์เช่นนี้ :)
เกร็กมาร์ติน

เดาว่าคุณพูดถูก ชื่อตัวแปรสามารถคาดเดาได้เล็กน้อย☺
ElPedro

btw, +1 cos เราคิดเหมือนกัน :-)
ElPedro

1
btw ฉันไม่รู้ Mathematica แต่ฉันคิดว่าคุณอาจจะสูญเสีย byte โดยการลบช่องว่างออกจาก "เท่านั้น" มันจะอยู่ที่ท้ายบรรทัดเสมอดังนั้นไม่จำเป็นต้องมีช่องว่างต่อท้าย
ElPedro

1

Java 7, 278

แข็งแรงเล่นกอล์ฟ:

String f(String i){String o="";for(int n=0;n<i.length();)o+=(n<1?"User:   ":n<2?"Group:  ":"Others: ")+new String[]{"None","Execute only","Write only","Write and Execute","Read only","Read and Execute","Read and Write","Read Write and Execute"}[i.charAt(n++)-48]+"\n";return o;}

Ungolfed:

  String f(String i) {
    String o = "";
    for (int n = 0; n < i.length();)
      o += (n < 1 ? "User:   " : n < 2 ? "Group:  " : "Others: ")
        + new String[] { "None", "Execute only", "Write only", "Write and Execute", "Read only", "Read and Execute",
            "Read and Write", "Read Write and Execute" }[i.charAt(n++) - 48]
        + "\n";
    return o;
  }

เอาท์พุท:

User:   Read and Write
Group:  Read and Write
Others: Read and Write

User:   None
Group:  Read only
Others: Write only

User:   Read and Write
Group:  Read only
Others: Read only

1

Python 3.5, 3.6 - 235 232 228 216 ไบต์

(ควรทำงานกับ Python 3.x ทั้งหมด)

ดังนั้นอินพุตอยู่ที่ STDIN ที่นี่ (บันทึกการนำเข้า☺)

a=input()
r=range
for i in r(3):
 p=int(a[i]);x=[["Read","Write","Execute"][j]for j in r(3)if 4>>j&p]
 if x[1:]:x[-1:-1]="and",
 if len(x)==1:x+="only",
 print(["User:  ","Group: ","Others:"][i]," ".join(x)or"None")

การใช้ประโยชน์จากสิ่งอันดับ, เว้นช่องว่างที่เป็นไปได้และผู้ประกอบการที่มีความสำคัญที่คุณมักจะใส่วงเล็บเพื่อให้ความตั้งใจของคุณชัดเจน

ตัวอย่างการใช้งาน:

$ echo -n '666' | python3 golf2.py
User:   Read and Write
Group:  Read and Write
Others: Read and Write
$ echo -n '644' | python3 golf2.py
User:   Read and Write
Group:  Read only
Others: Read only
$ echo '042' | python3 golf2.py
User:   None
Group:  Read only
Others: Write only
$ echo '123' | python3 golf2.py
User:   Execute only
Group:  Write only
Others: Write and Execute
$ echo -n '777' | python3 golf2.py
User:   Read Write and Execute
Group:  Read Write and Execute
Others: Read Write and Execute

ยกเลิกแข็งแรงเล่นกอล์ฟ:

input_perms = list(map(int, input()))

entities = ["User", "Group", "Others"]
perm_names = ["Read", "Write", "Execute"]

for i in range(3):
    bits = input_perms[i]
    perms = [
        perm_names[j]
        for j in range(3)
        if (1 << (2-j)) & bits
    ]

    if len(perms) > 1:
        perms.insert(-1, "and")
    if len(perms) == 1:
        perms.append("only")

    print("{:7} {}".format(
        entities[i]+":",
        " ".join(perms) or "None"
    ))

1

แบตช์ 280 ไบต์

@echo off
set/pc=
call:l "User:   " %c:~0,1%
call:l "Group:  " %c:~1,1%
call:l "Others: " %c:~2,1%
exit/b
:l
for %%s in (None.0 Execute.1 Write.2 "Write and Execute.3" Read.4 "Read and Execute.5" "Read and Write.6" "Read Write and Execute.7") do if %%~xs==.%2 echo %~1%%~ns

Hardcoding สตริงนั้นสั้นกว่า 47 ไบต์เมื่อพยายามรวมเข้าด้วยกัน น่าจะเป็น 267 ไบต์หากแท็บถูกกฎหมาย


1

C # 307 241 210 ไบต์

string X(string s){var z="User: ,Group: ,Others:,5,34,14,123,04,023,021,0123,Read,Write,and,Execute,only,None".Split(',');return string.Join("\n",s.Zip(z,(a,b)=>b+z[a-45].Aggregate("",(x,y)=>x+" "+z[y-37])));}

ที่จัดรูปแบบ

string X(string s)
{
    var z = "User:  ,Group: ,Others:,5,34,14,123,04,023,021,0123,Read,Write,and,Execute,only,None".Split(',');
    return string.Join("\n", s.Zip(z, (a, b) => b + z[a - 45].Aggregate("", (x, y) => x + " " + z[y - 37])));
}

1

C #, 322 337 348ไบต์

นั่นไม่ใช่รุ่นที่สั้นที่สุด แต่ฉันพยายามแก้ไขปัญหานี้โดยใช้ตัวดำเนินการบิตเนื่องจากchmodค่าเป็นบิตแฟล็ก นอกจากนี้ C # อาจไม่ใช่ภาษากอล์ฟที่ดีที่สุด: D

string P(string s){Func<int,string>X=p=>{var a=new List<string>();if((p&4)>0)a.Add("Read");if((p&2)>0)a.Add("Write");if((p&1)>0)a.Add("Execute");return a.Count>1?string.Join(" ",a.Take(a.Count-1))+" and "+a.Last():a.Count>0?a.First()+" only":"none";};return string.Join("\n",(new[]{"User:   ","Group:  ","Others: "}).Select((c,i)=>c+X(s[i]-'0')));}

ungolfed: (มีความคิดเห็น)

string P(string s)
{
    // Function that determines the permissions represented by a single digit (e.g. 4 => "Read only")
    Func<int, string> X = p => 
    {
        var a = new List<string>();         // temporary storage for set permissions
        if ((p & 4) > 0) a.Add("Read");     // Read bit set
        if ((p & 2) > 0) a.Add("Write");    // Write bit set
        if ((p & 1) > 0) a.Add("Execute");  // Execute bit set

        // actually just Output formatting ... Takes a lot of bytes *grr*
        return a.Count > 1 
            ? string.Join(" ", a.Take(a.Count - 1)) + " and " + a.Last() 
            : a.Count > 0 
                ? a.First() + " only" 
                : "none";
    };

    // Actual result:
    return string.Join("\n", (new[] { "User:   ", "Group:  ", "Others: " })
        .Select((c, i) => c + X(s[i] - '0'))); // Map "User, .." to its permissions by using above function
}

นี่เป็นครั้งแรกที่ฉันตีกอล์ฟดังนั้นโปรดบอกฉันถ้าฉันทำอะไรผิด :)

แก้ไข 1:

บันทึกบางไบต์โดยแทนที่s[i]-'0'ด้วยs[i]&7(ที่ท้ายสุด) และบันทึกรายการนับเป็นตัวแปร:

string P(string s){Func<int,string>X=p=>{var a=new List<string>();if((p&4)>0)a.Add("Read");if((p&2)>0)a.Add("Write");if((p&1)>0)a.Add("Execute");var c=a.Count;return c>1?string.Join(" ",a.Take(c-1))+" and "+a.Last():c>0?a[0]+" only":"none";};return string.Join("\n",(new[]{"User:   ","Group:  ","Others: "}).Select((c,i)=>c+X(s[i]&7)));}

แก้ไข 2:

เปลี่ยนเป็นการแสดงออกแลมบ์ดา:

s=>{Func<int,string>X=p=>{var a=new List<string>();if((p&4)>0)a.Add("Read");if((p&2)>0)a.Add("Write");if((p&1)>0)a.Add("Execute");var c=a.Count;return c>1?string.Join(" ",a.Take(c-1))+" and "+a.Last():c>0?a[0]+" only":"none";};return string.Join("\n",(new[]{"User:   ","Group:  ","Others: "}).Select((c,i)=>c+X(s[i]&7)));}

1

Javascript, 213 209 208 188 186 ไบต์

function(d){a=" and ";r="Read";w="Write";e="Execute";v=";";o=" only";c=["None",e+o,w+o,w+a+e,r+o,r+a+e,r+a+w,r+" "+w+a+e];return"User: "+c[d[0]]+"\nGroup: "+c[d[1]]+"\nOthers: "+c[d[2]]}

บันทึก 20 ไบต์ขอบคุณ Dada!


3
ฉันอาจเข้าใจผิด แต่อาร์เรย์ของคุณไม่ควรอยู่ในลำดับที่ตรงกันข้าม ถ้าฉันโทร b ("000") มันจะส่งกลับ "อ่านเขียนและดำเนินการ" ในขณะที่ใครจะคาดหวังว่า "ไม่มี" ...
Dada

และฉันค่อนข้างแน่ใจว่านี่จะเป็นกอล์ฟได้มากกว่านี้ ยกตัวอย่างเช่นรุ่น 191 function b(p){a=" and ";r="Read";w="Write";e="Execute";v=";";o=" only";c=["None",e+o,w+o,w+a+e,r+o,r+a+e,r+a+w,r+" "+w+a+e];return"User: "+c[p[0]]+"\nGroup: "+c[p[1]]+"\nOthers: "+c[p[2]]}ไบต์:
Dada

1

Visual Basic, 606 ไบต์

imports System.Collections
module h
sub main()
Dim i As String=console.readline()
Dim s=new Stack(new String(){"Others: ","Group:  ","User:   "})
for each j as Char in i
dim t=new Stack()
if((asc(j) MOD 2)=1)then t.push("Execute")
if(asc(j)=50 or asc(j)=51 or asc(j)=54 or asc(j)=55)then t.push("Write")
if(asc(J)>51)then t.push("Read")
if t.count=3 then
w(s.pop+t.pop+" "+t.pop+" and "+t.pop)
else
if t.count=2 then
w(s.pop+t.pop+" and "+t.pop)
else
if t.count=0 then
w(s.pop+"None")
else
w(s.pop+t.pop+" only")
end if
end if
end if
next
end sub
sub w(s As String)
console.writeline(s)
end sub
end module

1
ยินดีต้อนรับสู่ PPCG! คำตอบแรกที่ดี BTW :)
Beta Decay

1

คริสตัล200 194 ไบต์

def m(y)y=y.chars.map &.to_i
a=" and "
o=" only"
r="Read"
w="Write"
x="Execute"
c=["None",x+o,w+o,w+a+x,r+o,r+a+x,r+a+w,r+" "+w+a+x]
"User:   "+c[y[0]]+"
Group:  "+c[y[1]]+"
Others: "+c[y[2]]end

ส่งคืนสตริงผลลัพธ์สำหรับลำดับเลขฐานแปดที่กำหนดเป็นสตริง เช่น: m("670")ผลลัพธ์ไปที่: User: Read and Write\nGroup: Read Write and Execute\nOthers: None.

ลองมันออนไลน์


0

C #, 371 ไบต์

public String[] a = {"none","Execute only","Write only","Write and Execute","Read only","Read and Execute","Read and Write","Read Write and Execute"};
public String pA(int i){return a[i];}
public int d(int n,int i){
  n=n/Math.pow(10,i);
  return n%=10;
}
public void main(int i){
  Console.Write("User:\t{0}\nGroup:\t{1},Others:\t{2}",pA(d(i,0)),pA(d(i,1)),pA(d(i,2));
}

4
นี่คือรหัสกอล์ฟดังนั้นคุณต้องตีรหัสของคุณ นอกจากนี้ให้เพิ่มส่วนหัวด้วยชื่อภาษาและ bytecount
TuxCrafting

ฉันได้เพิ่มจำนวนไบต์ซึ่งเป็นคะแนนของคุณ คุณต้องได้คะแนนต่ำที่สุดเท่าที่จะทำได้
Beta Decay

ตัวอย่างเช่นคุณกำจัดช่องว่างที่ไม่จำเป็นทั้งหมดในแต่ละฟังก์ชั่น
Beta Decay

1
@BetaDecay ขอบคุณฉันยังใหม่กับชุมชนนี้และฉันคิดว่าฉันควรที่จะใช้ php แทนซึ่งอาจนำไปสู่การกระชับรหัสเพิ่มเติม
Alireza Tabatabaeian

1
@Alireza นั่นเป็นความคิดที่ดี ถึงแม้ว่าในเว็บไซต์นี้เราชอบที่จะเห็นคำตอบสั้น ๆ ใน Java และ C # :)
Beta Decay

0

Python 3.5 - 370 294 243 ไบต์

แข็งแรงเล่นกอล์ฟ:

import sys
a=lambda o: [print(('User:  ','Group: ','Others:')[n],('None','Execute only','Write only','Write and Execute','Read only','Read and Execute','Read and Write','Read Write and Execute')[int(o[n])]) for n in range(0,3)]
a(sys.argv[1])

ตรวจสอบขนาด:

$ du -b OctalToHuman.py 
243     OctalToHuman.py

ยกเลิกแข็งแรงเล่นกอล์ฟ:

#!/usr/bin/env python3
from sys import argv as ARGS

types = ('User:  ', 'Group: ', 'Others:')
perms = ('None','Execute only','Write only','Write and Execute','Read only','Read and Execute','Read and Write','Read Write and Execute')

def convert(octal_string):
    for n in range(0,3):
        print(types[n], perms[int(octal_string[n])])

if __name__ == '__main__':
    convert(ARGS[1])

ตัวอย่างผลลัพธ์:

$ python ./OctalToHuman.py 666
User:   Read and Write
Group:  Read and Write
Others: Read and Write

$ python ./OctalToHuman.py 042
User:   None
Group:  Read only
Others: Write only

$ python ./OctalToHuman.py 644
User:   Read and Write
Group:  Read only
Others: Read only

นี่ไม่ใช่คู่แข่งที่ร้ายแรงสำหรับเกณฑ์การชนะ เราต้องการคำตอบทั้งหมดเพื่อพยายามอย่างจริงจังในการปรับคะแนนให้เหมาะสมสำหรับเกณฑ์การชนะ (ตัวอย่างเช่นในการแข่งขันกอล์ฟรหัสเช่นนี้การส่งต้องพยายามอย่างจริงจังเพื่อลดจำนวนไบต์ของโปรแกรม)
Mego

คุณสามารถบันทึกได้ไม่กี่ไบต์โดยการลบimport sysและเพียงแค่ทำให้โปรแกรมเป็นฟังก์ชันที่ไม่ระบุตัวตน ( lambda o:... )
NoOne อยู่ที่นี่

0

F #, 204 203 ไบต์

กอล์ฟครั้งแรกของฉันดังนั้นโปรดให้อภัยข้อผิดพลาดใด ๆ ;)
รุ่น golfed (ตาม 1: 1 ตามคำตอบของ pinkfloydx33 ):

fun(y:string)->let e,r,w,o,a="Execute ","Read ","Write ","only","and ";let z=["None";e+o;w+o;w+a+e;r+o;r+a+e;r+a+w;r+w+a+e;];let(!-)a=z.[int y.[a]-48];sprintf"User:   %s\nGroup:  %s\nOthers: %s"!-0!-1!-2

เวอร์ชันที่ไม่ดีงาม:

fun (y : string) ->
    let e, r, w, o, a = "Execute ", "Read ", "Write ", "only", "and "
    let z = [
                "None";
                e + o;
                w + o;
                w + a + e;
                r + o;
                r + a + e;
                r + a + w;
                r + w + a + e;
            ]
    let (!-) a = z.[int(y.[a]) - 48]
    sprintf "User:   %s\nGroup:  %s\nOthers: %s" !-0 !-1 !-2

ตัวอย่างการใช้งาน:

let k =  ...... // function definition goes here

printf"%s"<|k"755"
printf"%s"<|k"042"
// etc ...


นี่เป็นเพียงการตรวจสอบว่าฉันสามารถ 'ปรับปรุง' คำตอบของ pinkfloydx33 - ฉันไม่ได้ใช้เครดิตสำหรับอัลกอริทึม


0

PHP, 199 ไบต์

foreach([User,Group,Others]as$i=>$u){$a=[];foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;$a[]=($x=array_pop($a))?$a?"and $x":"$x only":None;echo str_pad("\n$u:",9).join(" ",$a);}

PHP, 189 ไบต์พร้อม \ t

foreach([User,Group,Others]as$i=>$u){$a=[];foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;$a[]=($x=array_pop($a))?$a?"and $x":"$x only":None;echo"\n$u:\t".join(" ",$a);}

สวัสดีคุณควรใช้ช่องว่างแทนแท็บ
เบต้าการสลายตัว

ในกรณีนี้ \ t ดูเหมือน str_repeat ("", 3- $ i) หรือ str_pad ("", 3- $ i, "") แต่ไม่สำคัญกับความคิดของฉันฉันไม่มีโอกาสชนะถ้าฉันควรใช้ อีกพื้นที่cs.tut.fi/~jkorpela/chars/spaces.html
JörgHülsermann

1
13 + 34 ไบต์เพื่อบันทึก ในเวอร์ชั่นยาว: ใช้echo str_pad("$u:",8)แทนecho"$u:".str_repeat(" ",3-$i)(-9); การแสดงนี้$i=>ล้าสมัย (-4) ในทั้งสองเวอร์ชัน: ใช้$a[$z-1]="and $a[$z-1]";แทน{$a[]=$a[$z-1];$a[$z-1]="and";}(-7) และelse$a[]=$a?Only:None;แทนelseif($z<1)$a[]=None;else$a[]=Only;(-14) เปลี่ยนif(1<$z=count($a))$a[$z-1]="and $a[$z-1]";else$a[]=$a?Only:None;เป็นif($x=array_pop($a))$a[]=$a?"and $x":"$x Only";else$a[]=None;(-3) แล้วเปลี่ยนเป็น$a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None; (-10)
ติตัส

@Titus echo str_pad ("$ u:", 8), $ a [$ z-1] = "และ $ a [$ z-1]";, อื่น $ a [] = $ a เท่านั้น: ไม่มี; เสร็จสิ้น $ i => ล้าสมัยฉันไม่สามารถทำได้ $ m = $ argv [1] [$ i] จำเป็น สำหรับส่วนที่เหลือฉันจะลองวิธีอื่นก่อน ขอบคุณสำหรับข้อมูลเข้า
JörgHülsermann

1
แนวคิดเพิ่มเติม: if(4&$m=$argv[1][$i])แทน$m=$argv[1][$i];if(4&$m)(-3) หรือแทนที่$m=;if();if();if();ด้วยการวนซ้ำ:foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s; (-7)
ติตัส

0

Python 3, 191 ไบต์

def d(n):a,b,c,d,e=' and ',' only',"Execute","Write","Read";l=["None",c+b,d+b,d+a+c,e+b,e+a+c,e+a+d,e+" "+d+a+c];y,u,i=map(int,n);return"User:   %s\nGroup:  %s\nOthers: %s\n"%(l[y],l[u],l[i])

ungolfed

def d(n):
    a,b,c,d,e=' and ',' only',"Execute","Write","Read"
    l=["None",c+b,d+b,d+a+c,e+b,e+a+c,e+a+d,e+" "+d+a+c]
    y,u,i=map(int,n)
    return"User:   %s\nGroup:  %s\nOthers: %s\n"%(l[y],l[u],l[i])

1
ยินดีต้อนรับสู่ PPCG! โพสต์แรกที่ดี!
Rɪᴋᴇʀ

อืมฉันสงสัยมากว่าผู้ดูแลรับ 151bytes เมื่อฉันได้เพียง 191: D มันผิดพลาดหรือไม่? ตรวจสอบการแก้ไข
Aleksandr Smirnov

นั่นคือฉันขอโทษ ฉันพิมพ์ผิดในการแก้ไข แก้ไขแล้ว
Rɪᴋᴇʀ

0

Javascript (ES6), 159 ไบต์

a=>`User:  ${(b=[' None',(c=' Execute')+(d=' only'),(e=' Write')+d,f=e+(g=' and')+c,(h=' Read')+d,h+g+c,h+g+e,h+f])[a[0]]}\nGroup: ${b[a[1]]}\nOthers:`+b[a[2]]

ตัวอย่าง:

(a=>`User:  ${(b=[' None',(c=' Execute')+(d=' only'),(e=' Write')+d,f=e+(g=' and')+c,(h=' Read')+d,h+g+c,h+g+e,h+f])[a[0]]}\nGroup: ${b[a[1]]}\nOthers:`+b[a[2]])("042")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.