Dekodiere den chmod


26

Herausforderung

Geben Sie bei einer dreistelligen oktalen Berechtigungsnummer die erteilten Berechtigungen aus.

chmod

Unter UNIX-Betriebssystemen werden die Dateiberechtigungen mit dem chmodBefehl geändert . Es gibt nur wenige Möglichkeiten, chmod zu verwenden, aber die, auf die wir uns heute konzentrieren werden, ist die Verwendung von oktalen Berechtigungen.

Die drei Ziffern in der Berechtigungsnummer stehen für eine andere Person:

  • Die erste Ziffer steht für die Berechtigungen für die Benutzer an
  • Die zweite Ziffer gibt die Berechtigungen für das an Gruppe an
  • Die letzte Ziffer gibt die Berechtigungen für andere an

Als nächstes repräsentiert jede Ziffer eine Erlaubnis wie unten gezeigt in:

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

Eingang

Die Eingabe ist die dreistellige Zahl als Zeichenfolge, zB:

133

oder

007

Dies wird entweder über STDIN oder über Funktionsargumente übergeben.

Ausgabe

Ihre Ausgabe sollte die unterschiedlichen Berechtigungen für jeden Benutzer, die Gruppe und die anderen Benutzer sein. Sie müssen diese Informationen folgendermaßen anzeigen:

User:   ddd
Group:  ddd
Others: ddd

Wo es drei Leerzeichen danach gibt User, zwei Leerzeichen danach Groupund ein Leerzeichen danach Others. Sie ersetzen ddddurch die Berechtigungsinformationen.

Ihre Ausgabe kann in STDOUT oder als zurückgegebener String erfolgen.

Beispiele

Eingabe: 666

Ausgabe:

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

Eingabe: 042

Ausgabe:

User:   None
Group:  Read only
Others: Write only

Eingabe: 644

Ausgabe:

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

Gewinnen

Der kürzeste Code in Bytes gewinnt.


Was sind die Spezifikationen des Eingangs?
Jonathan Allan

@ JonathanAllan Nur die dreistellige Zahl
Beta Decay

Du meinst nur als Dezimalzahl, also würde 042 als 42 empfangen werden?
Jonathan Allan

2
@Jonathan Nein, es ist eine Zeichenfolge, also wäre es 042
Beta Decay,

1
Die Ausgabe sieht mit einem Tabulatorzeichen richtig aus. Warum also nicht? Nur für Strafsprachen, die mehr Bytes zum Auffüllen eines Strings benötigen?
Titus

Antworten:


3

05AB1E , 89 87 Bytes

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

Beschwört die Cthulhu- Kodierung. Verwendet die CP-1252- Codierung. Probieren Sie es online!


14

Javascript (ES6), 165 bis 161 Byte

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`
`

Bearbeiten: +1 Byte, um die Regel "kein Tabulator" zu erfüllen

Beispiele

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"));


Sie können einige Bytes gewinnen, indem Sie das Array neu anordnen (und möglicherweise die Zahlen von den Zeichenfolgen trennen). +1 für die Idee.
Titus

@Titus - Ich muss zugeben, dass ich keine Neuanordnung sehe, die einige Bytes spart. Außerdem müssen die Zahlen als Zeichenfolgen behandelt werden, damit replace()sie ohne Zwang verarbeitet werden können. Aber ich kann Ihren Punkt verfehlen.
Arnauld

@Titus - So etwas 'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)könnte funktionieren. Ist es das, was du im Sinn hattest?
Arnauld

Ich habe sie missverstanden; dachte, sie wären Oktalwerte. :) Aber deine neue Idee ist auch nicht schlecht.
Titus

Die Ausgabe der Herausforderung erfordert Leerzeichen anstelle von Tabulatoren, wie sie derzeit geschrieben werden.
Mwr247

13

GNU sed, 187 163 158 (157 + 1) Bytes

Führen Sie mit -r (ERE regexp) aus. Die Datei enthält keinen nachgestellten Zeilenumbruch.

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

Nizza Ansatz, aber Sie können etwa 20 Bytes sparen, indem Sie die Ziffern entfernen, wenn Sie das andoder hinzufügen only.
Neil

@Neil there :) hat Ihren Vorschlag für eine sehr bedeutende Ersparnis aufgenommen.
FireFly

1
Die erste Zeile könnte genau: s/(.)(.)/User: \1\nGroup: \2\nOthers: /. Weitere Bytes könnten durch Portierung nach Perl eingespart werden, wozu \dund gehören \K.
Ninjalj

@ Ninjalj guter Punkt. Ich bleibe bei sed, da ich Perl nicht kenne, und ich bin mir sicher, dass es andere Tricks geben würde, um es noch kürzer zu machen, außerhalb von s /// Ersatz.
FireFly

6

C # 214 Bytes

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

Jelly , 100 91 85 Bytes

Mit ziemlicher Sicherheit golfen - 91 Bytes, was ?! 8 Monate und 6 Weisheitsbytes!
- 1. mehr String-Komprimierung;
- 2. Entfernen Sie die post-ordinale Dekrementierung um 48, da die Indizierung modular ist.
- 3. Verwenden Sie eine bessere stillschweigende Verkettung.

-9 Bytes mit der freundlichen Hilfe von @Lynn, die String-Komprimierungen für mich ausführt

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

Testen Sie es bei TryItOnline

Wie?

,“£ɱ~» - 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

Oktave, 185 Bytes

@(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})

Erstellen Sie eine anonyme Funktion, die die Eingabe als Zeichenfolge verwendet: '042'. Wandelt es in ein Array: (56-'042)' = [0 4 2]. Verwenden Sie dies als mehrere Zellenindizes, um das Zellenarray mit zu indizieren Read Write and Execute','Read and Write', .... Anwendungen fprintfzur Ausgabe der drei Saiten, mit den entsprechenden Kategorien: User:, Group:und Others:.

Ich habe versucht , einen Weg zu finden speichern Execute, Write,Read um Wörter als separate Wörter und nach Bedarf zu verketten, aber dies stellte sich als länger als der naive Ansatz heraus.

Beispiele:

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

Probieren Sie es online aus.


2
Sie können ein paar Bytes speichern verwenden strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')anstelle der Zelle Arrayliteral
Luis Mendo

4

PowerShell v2 + 189 168 Byte

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

Durchläuft die Eingabe $args[0]als char-array. Jede Iteration wir Index in ein Array mit $i++(Standardeinstellung 0) auszuwählen User,Group oder Others, Verketten dass mit einem Doppelpunkt und einer Lasche und Verketten das mit einem anderen Array - Index.

Hier ist die Magie. Wir setzen das implizit charin ein intund subtrahieren 48(dh ASCII 48( "0") in 0), wobei wir den entsprechenden Wortlaut als Array von ints auswählen . Dieses Array wird anschließend als Index für das 'None','Read','Write','Execute','only','and'Array verwendet. Seit dem Standard$ofs (Ausgabefeldtrennzeichen) ein Leerzeichen ist, werden bei der String-Erstellung (dh bei der Verkettung nach links) korrekt Leerzeichen zwischen den Array-Elementen eingefügt.

Diese drei Zeichenfolgen verbleiben in der Pipeline und werden implizit ausgegeben Write-Output nach Abschluss des Programms .

Beispiel

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

3

Stroh , 193 Bytes

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

Probieren Sie es online aus

Drücken Sie dreimal eine Umrechnungstabelle auf den ersten Stapel, wechseln Sie zum zweiten Stapel, konvertieren Sie jede Zahl mithilfe der Konversationstabelle und drucken Sie sie aus.


2

Haskell, 186 Bytes

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

Beispiel:

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

Nur Prelude verwendet. Mache ich das richtig?

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 Bytes

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

Hinterlässt ein Leerzeichen, wenn Execute oder Write am Ende der Zeile stehen, aber ich habe nicht gesehen, dass dies nicht erlaubt ist.

BEARBEITEN 5 Bytes gespart, indem der Bereich (3) auf 0,1,2 geändert und die Anzahl der Bytes auf meinem Linux-Laptop anstelle von Windows überprüft wurde (\ n = \ r \ n oder umgekehrt. Ich kann mich nie erinnern, welche).


2

Python 2, 240 239 238 237 228 Bytes

Ich dachte, ich würde endlich dieses kalte Golf-Ding ausprobieren. Es ist hoffentlich erlaubt, Leerzeichen nachzustellen. (behoben und dabei ein Byte gespeichert)

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

Willkommen bei PPCG und schöne erste Antwort!
ETHproductions

Ich habe den Bereich (3) in meiner Python 2-Antwort unverschämt auf 0,1,2 zurückgesetzt, nachdem ich Ihren Code gelesen habe. Gute Antwort. +1
ElPedro

2

PHP, 169 159 Bytes

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

nimmt Zeichenfolge als Zeilenargument Befehl php -r '<code>' <argument>,
druckt eine führende Newline anstelle eines Hinter ein

Vielen Dank an Jörg für den Hinweis auf meine Fehler - und für die \t.

PHP, 169 Bytes

mit der neuen Einschränkung: (Tabulatorzeichen verboten)

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

Dies ist 1 Byte kürzer als bei str_pad, da ein zusätzliches Leerzeichen erforderlich wäre.

Nervenzusammenbruch

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
}

$nVerwenden Sie Folgendes , um das Array für zu erstellen :

$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 (['Benutzer', 'Gruppe', 'Andere'] als $ i => $ u) {echo "\\ n $ u: \\ t"; spart einige Bytes und die Ausgabe für 3,4,6 ist falsch
Jörg Hülsermann

1
Das ist die richtige Reihenfolge [5,33,34,66,35,67,131,531] nette Idee
Jörg Hülsermann

Ich habe vergessen, 'User' zu User speichert zum Beispiel die nächsten 6 Bytes, die Sie schlagen möchten JavaScript do it
Jörg Hülsermann

@ JörgHülsermann: Ich wollte sowieso das "\ t" übernehmen; Vielen Dank. +1 dafür :) Gutes Auge auf die 33!
Titus

1
Für 346 lautet unsere Ausgabe Benutzer: Lesen und Schreiben Gruppe: Nur ausführen Andere: Schreiben und ausführen sollte Benutzer: Schreiben und ausführen Gruppe: Nur lesen Andere: Lesen und schreiben
Jörg Hülsermann

2

bash - 221 213 Bytes

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

Es ist unklar, ob dies weiter kondensiert werden kann, zumindest nicht, ohne den Ansatz hier grundlegend zu ändern (Eingabe aufteilen und als Index für das Array verwenden ${b}, das die entsprechenden Zeichenfolgen enthält).


1
Es ist kürzer mit \ onlyerweiterter Inline. grep -o .<<<$1ist kürzer als echo $1|grep -o ., aber es while read -n1 cist besser , die Eingabe von stdin mit zu lesen . Array-Indizes haben einen arithmetischen Kontext in der Bash, ${l[z++]}funktioniert also. lwäre kürzer als ein String, auf den zugegriffen wird als ${l:z++*8:8}(Offset und Länge haben arithmetischen Kontext). Ein weiteres Byte kann durch Einlesen des gesamten Modus c, Erweitern von "User:", ... inline und sinnvolle Verwendung von Parametererweiterungen vermieden werden .
Ninjalj

1
Für ein Endergebnis von: 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}]}"(Ersetzen Sie \ n durch wörtliche Zeilenumbrüche).
Ninjalj

1

Java 7, 300 284 Bytes

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

Direkte Ansprache vorerst. Ich werde versuchen, einen allgemeineren Ansatz zu finden, um die Wörter wiederzuverwenden.

Ungolfed & Testfälle:

Probieren Sie es hier aus.

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

Ausgabe:

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 Bytes

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 Bytes

{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}&

Eine einfache Implementierung (wahrscheinlich leicht zu schlagen): Berechnet nichts, sondern codiert jede mögliche Ausgabe hart. Die Eingabe ist eine Ganzzahl. Gibt für jede Zeile ein Leerzeichen und für die gesamte Zeile einen Zeilenumbruch aus.

IntegerDigits[#,10,3]gibt die drei Ziffern der Eingabe an (auch wenn führende Nullen vorhanden sind). Jede Ziffer gibt ein Argument der "Funktion" an

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

wobei 0 den Funktionsnamen selbst angibt. ""<>Verkettet alle Zeichenfolgen in einer Liste (von Listen). "\n"&~Array~3produziert die drei Zeilenumbrüche.


Mir ist gerade aufgefallen, dass meine Python 2-Antwort fast mit Ihrer identisch ist, selbst wenn dieselben Variablennamen verwendet werden. Ich hatte deine ehrlich gesagt nicht gesehen, bevor ich gepostet habe!
ElPedro

1
keine Sorgen! Ich denke, die Übereinstimmung der Variablennamen ist in dieser Situation ziemlich zu erwarten :)
Greg Martin

Vermutlich hast du recht. Die Variablennamen waren etwas vorhersehbar ☺
ElPedro

Übrigens, +1 weil wir genauso denken :-)
ElPedro

1
Übrigens, ich kenne Mathematica nicht, aber ich glaube, Sie können ein Byte verlieren, indem Sie das Leerzeichen von "nur" entfernen. Es steht immer am Ende einer Zeile und benötigt kein Leerzeichen.
ElPedro

1

Java 7, 278

Golf gespielt:

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

Ausgabe:

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 Bytes

(sollte auf allen Python 3.x funktionieren)

Die Eingabe erfolgt hier also über STDIN (speichert einen Import ☺).

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

Verwenden Sie Tupel, lassen Sie nach Möglichkeit Leerzeichen weg, und setzen Sie die Operatoren in Klammern, um Ihre Absichten zu verdeutlichen.

Beispielnutzung:

$ 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

Nicht golfen:

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

Batch, 280 Bytes

@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

Das Hardcodieren der Zeichenfolgen war 47 Byte kürzer als der Versuch, sie zusammenzufügen. Wäre 267 Bytes gewesen, wenn Tabulatoren legal wären.


1

C # 307 241 210 Bytes

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

Formatiert

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 Bytes

Das ist sicher nicht die kürzeste Version, aber ich habe versucht, dieses Problem mit bitweisen Operatoren zu lösen chmod Werte tatsächlich Bit-Flags sind. Auch C # ist wahrscheinlich nicht die beste Golfsprache: 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: (mit Kommentaren)

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
}

Dies ist mein erstes Mal Code Golfing, also sag mir bitte, wenn ich etwas falsch gemacht habe :)

EDIT 1:

Einige Bytes wurden durch Ersetzen s[i]-'0'durch s[i]&7(ganz am Ende) und Speichern der Listenzahl in Variable gespeichert :

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

EDIT 2:

Geändert in Lambda-Ausdruck:

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 Bytes

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

Dank Dada 20 Bytes gespart!


3
Ich könnte mich irren, aber sollte Ihr Array nicht in der umgekehrten Reihenfolge sein? Wenn ich b ("000") aufrufe, wird "Read Write and Execute" zurückgegeben, während "None" zu erwarten ist ...
Dada,

Und ich bin mir ziemlich sicher, dass dies mehr Golf könnte. Zum Beispiel kann eine 191 - Byte - Version: 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 Bytes

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
Willkommen bei PPCG! Nette erste Antwort BTW :)
Beta Decay

1

Kristall, 200 194 Bytes

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

Gibt die resultierende Zeichenfolge für eine bestimmte Oktalfolge als Zeichenfolge zurück. zB: m("670")Ergebnisse an:User: Read and Write\nGroup: Read Write and Execute\nOthers: None .

Probieren Sie es online aus .


0

C #, 371 Bytes

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
Dies ist Code-Golf, also müssen Sie Ihren Code Golf spielen. Fügen Sie außerdem eine Kopfzeile mit dem Namen der Sprache und dem bytecount hinzu.
TuxCrafting

Ich habe Ihre Byteanzahl hinzugefügt, was Ihre Punktzahl ist. Sie müssen Ihre Punktzahl so niedrig wie möglich halten, um zu gewinnen
Beta Decay

Zum Beispiel werden Sie alle unnötigen Leerzeichen in jeder Funktion
Beta Decay,

1
@BetaDecay Danke, ich bin neu in dieser Community und ich denke, ich sollte stattdessen lieber PHP verwenden, was zu mehr kompakten Codes führen könnte.
Alireza Tabatabaeian

1
@ Alireza Das ist eine gute Idee. Obwohl auf dieser Seite, möchten wir kurze Antworten in Java und C # sehen :)
Beta Decay

0

Python 3.5 - 370 294 243 Bytes

Golf gespielt:

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

Größenprüfung:

$ du -b OctalToHuman.py 
243     OctalToHuman.py

Nicht golfen:

#!/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])

Beispielausgabe:

$ 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

Dies ist kein ernstzunehmender Anwärter auf die Gewinnkriterien. Wir fordern von allen Antworten einen ernsthaften Versuch, ihre Punktzahl für die Gewinnkriterien zu optimieren (zum Beispiel müssen bei Code-Golf-Herausforderungen wie dieser Einsendungen ernsthafte Anstrengungen unternommen werden, um die Byteanzahl des Programms zu minimieren).
Mego

Sie können einige Bytes sparen import sys, indem Sie das Programm entfernen und es zu einer anonymen Funktion machen ( lambda o:...).
NoOneIsHere

0

F #, 204 203 Bytes

mein erstes Golfspiel, bitte vergib mir alle Fehler;)
Die Golfversion (1: 1 basierend auf der Antwort von 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

Die ungolfed Version:

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

Anwendungsbeispiel:

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

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


Dies ist nur zu überprüfen, ob ich die Antwort von pinkfloydx33 "verbessern" kann - ich nehme keine Anerkennung für den Algorithmus


0

PHP, 199 Bytes

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 Bytes mit \ 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);}

Hey, du solltest Leerzeichen anstelle von Tabulatoren verwenden
Beta Decay

In diesem Fall sieht \ t wie str_repeat ("", 3- $ i) oder str_pad ("", 3- $ i, "") aus, aber es spielt für meine Idee keine Rolle, dass ich keine Chance habe, zu gewinnen Noch
Jörg

1
13 + 34 Bytes zu speichern. In der langen Version: Verwenden Sie echo str_pad("$u:",8)anstelle von echo"$u:".str_repeat(" ",3-$i)(-9); dies macht $i=>obsolet (-4). In beiden Versionen: Verwenden Sie $a[$z-1]="and $a[$z-1]";anstelle von {$a[]=$a[$z-1];$a[$z-1]="and";}(-7) und else$a[]=$a?Only:None;anstelle von elseif($z<1)$a[]=None;else$a[]=Only;(-14). Biegen Sie if(1<$z=count($a))$a[$z-1]="and $a[$z-1]";else$a[]=$a?Only:None;in if($x=array_pop($a))$a[]=$a?"and $x":"$x Only";else$a[]=None;(-3) und dann in $a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None;(-10)
Titus

@Titus echo str_pad ("$ u:", 8), $ a [$ z-1] = "und $ a [$ z-1]", sonst $ a [] = $ a? Nur: Keine; Done $ i => obsolet Ich kann es nicht tun, dann ist $ m = $ argv [1] [$ i] notwendig. Im übrigen würde ich erstmal einen anderen Weg versuchen. Vielen Dank für die Eingabe
Jörg Hülsermann

1
Weitere Ideen: if(4&$m=$argv[1][$i])anstelle von $m=$argv[1][$i];if(4&$m)(-3) ODER durch $m=;if();if();if();eine Schleife ersetzen : foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;(-7)
Titus

0

Python 3, 191 Bytes

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
Willkommen bei PPCG! schöner erster Beitrag!
15.

Hmm, ich bin sehr gespannt, wie der Moderator 151 Bytes bekommen hat, wenn ich nur 191: D bekomme. Ist es ein Fehler? Überprüfen Sie die Änderungen
Aleksandr Smirnov

Das war ich, sorry. Ich habe in der Bearbeitung getippt. Jetzt behoben.
15.

0

Javascript (ES6), 159 Byte

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

Beispiel:

(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")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.