chmodをデコードします


26

チャレンジ

3桁の8進数の許可番号を指定し、付与する許可を出力します。

chmod

UNIX OSでは、chmodコマンドを使用してファイル許可を変更します。chmodを使用する方法はいくつかありますが、今日注目するのは8進数のアクセス許可を使用することです。

許可番号の3桁は別の人を表しています:

  • 最初の数字は、ユーザーの権限を表します
  • 2桁目はグループの権限を表します
  • 最後の数字は、他の人の許可を表します

次に、以下に示すように、各数字は許可を表します。

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

入力

入力は、文字列としての3桁の数字になります。例:

133

または

007

これは、STDINまたは関数の引数を介して渡されます。

出力

出力は、ユーザー、グループ、およびその他のユーザーごとに異なるアクセス許可である必要があります。この情報は次のように表示する必要があります。

User:   ddd
Group:  ddd
Others: ddd

Userに3つのスペースがあり、後に2つのスペースがあり、後Groupに1つのスペースがある場合Othersddd許可情報に置き換えます。

出力は、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

勝ち

バイト単位の最短コードが優先されます。


入力の仕様は何ですか?
ジョナサンアラン

@JonathanAllan 3桁の数字
ベータ崩壊

10進整数のみを意味するので、042は42として受信されますか?
ジョナサンアラン

2
@ジョナサンいいえ、それは文字列入力ですので、042
Beta Decay

1
出力はタブ文字で正しく見えるので、なぜそれを使用しないのですか?文字列を埋め込むためにより多くのバイトを必要とするペナルティ言語だけに?
タイタス

回答:


3

05AB1E89 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()強制せずに機能するように、数値を文字列として扱う必要があります。しかし、私はあなたの主張を見逃しているかもしれません。
アーナウルド

@Titus-何か'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)がうまくいくかもしれません。それはあなたが念頭に置いていたものですか?
アーナルド

私はそれらを誤解していました。彼らは8進数の値だと思った。:)しかし、あなたの新しいアイデアも悪くありません。
タイタス

チャレンジ出力には、現在書き込まれているように、タブではなくスペースが必要です。
Mwr247

13

GNU sed、187163158(157 + 1)バイト

-r(ERE正規表現)で実行します。ファイルに末尾の改行が含まれていません。

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

良いアプローチですが、andまたはを追加するときに数字を削除することで約20バイト節約できますonly
ニール

@Neil there :)は、非常に重要な節約のためにあなたの提案を取り入れました。
FireFly

1
最初の行は次のとおりs/(.)(.)/User: \1\nGroup: \2\nOthers: /です。いくつかのより多くのバイトが持っているのPerlへの移植によって保存することができ\d、および\K
ninjalj

@ninjalj良い点。Perlを知らないのでsedに固執します。s///の置換の外でさらに短くするためにそこに引っ張る他のトリックがあると確信しています。
ホタル

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.インデックスはモジュール式であるため、48による序数の減少を削除します。
-3.より良い暗黙の連鎖を使用します。

-9バイトは、@ 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して、適切なカテゴリの3つの文字列を出力します:User:Group:およびOthers:

私は店への道を見つけることを試みたExecuteWriteRead別々の単語と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','*')セル配列リテラルの代わりに使用して数バイトを保存できます
ルイスメンドー

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選択する)UserGroupまたはOthers、CONCATENATE結腸およびタブ、およびCONCATENATEを有する別の配列インデックスでそのこと。

これが魔法です。に暗黙的にキャストしcharint減算し48(つまり、ASCII 48"0")をに変換0)、適切な表現をintsの配列として選択します。その後、その配列は'None','Read','Write','Execute','only','and'配列へのインデックスとして使用されます。デフォルト$ofs(出力フィールド区切り記号)はスペースであるため、文字列化された場合(左側に連結した場合に発生します)、配列要素間にスペースが正しく挿入されます。

これらの3つの文字列はパイプラインに残り、暗黙的な出力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番目のスタックに切り替え、会話テーブルを使用して各数値を変換し、印刷します。


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

プレリュードのみが使用されます。これは正しいことですか?

ゴルフをしていない:

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])]

ExecuteまたはWriteが行の最後にある場合、末尾のスペースを残しますが、これが許可されていないことはわかりませんでした。

編集 range(3)を0,1,2に変更し、Windowsの代わりにLinuxラップトップでバイトカウントをチェックすることで5バイトを節約しました(\ 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

あなたのコードを読んだ後、Python 2の回答のrange(3)を恥知らずに0,1,2に置き換えました。いい答えだ。+1
エルペドロ

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];}

str_pad追加の空白が必要になるため、これはの場合よりも1バイト短くなります。

壊す

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(['User'、 'Group'、 'Others'] as $ i => $ u){echo "\\ n $ u:\\ t"; いくつかのバイトを保存し、3,4,6の出力が間違っている
ヨルグヒュルサーマン

1
これは正しい順序です[5,33,34,66,35,67,131,531]良いアイデア
ヨルグヒュルザーマン

exmpleはJavaScriptを打つしたい次の6つのバイトはそれを行う節約するために私は、ユーザーに「ユーザー」を忘れている
イェルクHülsermann

@JörgHülsermann:とにかく「\ t」を採用しようとしていました。ありがとう。そのための+1 :)に良い目33
タイタス

1
346のために私たちの出力は、ユーザーは次のようになります。読み取りと書き込みグループ:のみその他を実行します。書き込み、実行、それはユーザーべき:書き込みをし、グループ実行:読み取り専用その他:読み取りと書き込み
イェルクHü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 .、標準入力からの入力を読み取るwhile read -n1 c方が適切です。配列インデックスは、bashに算術コンテキストを持っているため、${l[z++]}機能します。lとしてアクセスされる文字列としてより短くなります${l:z++*8:8}(オフセットと長さは算術コンテキストを持ちます)。でモード全体を読み取り、c「User:」、...をインラインで展開し、パラメーター展開を慎重に使用することで、別のバイトを削減できます。
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])}}

なし:

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](先行ゼロがある場合でも)入力の3桁を提供します。各数字は、「関数」の引数を示します

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

0は関数名自体を示します。""<>(リストの)リスト内のすべての文字列を連結します。"\n"&~Array~33つの改行を生成します。


Python 2の答えは、同じ変数名を使用していても、ほとんど同じであることに気付きました。投稿する前に私は正直にあなたのものを見ていませんでした!
エルペドロ

1
心配ない!私は、変数名マッチングはかなり:)このような状況で予想されることだと思い
グレッグ・マーティン

あなたが正しいと思います。変数名は少し予測可能
でした☺– ElPedro

ところで、1つのCOSは、我々は同じように:-)だと思う
ElPedro

1
ところで、私はMathematicaを知りませんが、「only」からスペースを削除することで1バイトを失うことができると思います。常に行末にあるため、末尾のスペースは必要ありません。
エルペドロ

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;}

ゴルフをしていない:

  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

文字列のハードコーディングは、文字列をつなぎ合わせるよりも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]]}

Dadaのおかげで20バイト節約できました!


3
私は間違っているかもしれませんが、あなたの配列は逆の順序であるべきではありませんか?b( "000")を呼び出した場合、 "None"を期待しながら "Read Write and Execute"を返します
ダダ

そして、これはもっとゴルフができると確信しています。たとえば、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]]}
ダダ

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 :)
ベータ崩壊

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

指定された8進数シーケンスの結果の文字列を文字列として返します。例えば: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
これはコードゴルフなので、コードをゴルフする必要があります。また、言語の名前とバイト数のヘッダーを追加します。
TuxCrafting

バイトカウントを追加しました。これがスコアです。勝つためにはスコアをできるだけ低くする必要があります
ベータディケイ

たとえば、あなたは、各機能で不要な空白の全てを取り除く
ベータ崩壊

1
@BetaDecayありがとう、このコミュニティは初めてなので、代わりにphpを使用した方がよいと思います。
アリレザTabatabaeian

1
@Alirezaそれは良いアイデアです。このサイトでは、我々は、JavaやC#:)で短い答えを見ることが好きですが、
ベータ崩壊

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

これは勝利基準の重大な候補ではありません。私たちはすべての答えに勝ち基準のためにスコアを最適化するための真剣な試みをすることを要求します(たとえば、このようなコードゴルフチャレンジでは、提出はプログラムのバイトカウントを最小化するために真剣に試みなければなりません)。
メゴ

を削除しimport sysて、プログラムを匿名関数(lambda o:...)にするだけで、かなりのバイトを節約できます。
-NoOneIsHere

0

F#、204 203バイト

私の最初のゴルフなので、間違いを許してください;)
ゴルフバージョン(pinkfloydx33の回答に基づいて1:1 ):

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
ヨルグヒュルサーマン

1
保存する13 + 34バイト。長いバージョンの場合:(-9)のecho str_pad("$u:",8)代わりに使用しecho"$u:".str_repeat(" ",3-$i)ます。これは$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] = "and $ a [$ z-1]" ;, else $ a [] = $ a?Only:None; 完了$ i =>時代遅れできません$ m = $ argv [1] [$ i]が必要です。残りについては、最初に別の方法を試してみます。入力していただきありがとうございます
ヨルクヒュルサーマン

1
その他のアイデア:(-3)のif(4&$m=$argv[1][$i])代わりに、またはループに置き換えます:($m=$argv[1][$i];if(4&$m)$m=;if();if();if();foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;
タイタス

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])

食べない

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ɪᴋᴇʀ

うーん、モデレーターが191だけしか得られないのに、モデレーターが151バイトを獲得したのは非常に不思議です:Dそれは間違いですか?編集内容の確認
アレクサンドルスミルノフ

すみませんでした。編集でタイプミスしました。修正されました。
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.