Dekoduj chmod

26

Wyzwanie

Biorąc pod uwagę trzycyfrową liczbę uprawnień ósemkowych, wypisz uprawnienia, które przyznaje.

chmod

W systemach UNIX uprawnienia do plików są zmieniane za pomocą chmodpolecenia. Istnieje kilka różnych sposobów korzystania z chmod, ale tym, na którym skupimy się dzisiaj, jest używanie uprawnień ósemkowych.

Trzy cyfry w numerze uprawnienia oznaczają inną osobę:

  • Pierwsza cyfra reprezentuje uprawnienia użytkownika
  • Druga cyfra reprezentuje uprawnienia dla grupy
  • Ostatnia cyfra oznacza uprawnienia dla innych

Następnie każda cyfra reprezentuje uprawnienie, jak pokazano poniżej w:

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

Wkład

Wpis będzie trzycyfrową liczbą jako ciągiem znaków, np .:

133

lub

007

Zostanie to przekazane albo przez STDIN, albo przez argumenty funkcji.

Wydajność

Wynikiem powinny być różne uprawnienia dla każdego użytkownika, grupy i pozostałych. Musisz wyświetlić te informacje w następujący sposób:

User:   ddd
Group:  ddd
Others: ddd

Gdzie są trzy spacje po User, dwie spacje po Groupi jedna spacja po Others. Wymieniając dddz informacjami uprawnień.

Dane wyjściowe mogą być w formacie STDOUT lub w postaci zwróconego ciągu.

Przykłady

Dane wejściowe: 666

Wydajność:

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

Wejście: 042

Wydajność:

User:   None
Group:  Read only
Others: Write only

Dane wejściowe: 644

Wydajność:

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

Zwycięski

Najkrótszy kod w bajtach wygrywa.

Rozpad beta
źródło
Jakie są specyfikacje wejścia?
Jonathan Allan,
@JonathanAllan Wystarczy numer trzycyfrowy
Beta Decay
Masz na myśli tylko liczbę dziesiętną, więc 042 otrzymalibyśmy jako 42?
Jonathan Allan,
2
@Jonathan Nie, jest to ciąg wejściowy, więc będzie to 042
Rozpad Beta
1
Wynik wygląda dobrze ze znakiem tabulacji, więc dlaczego go nie użyć? Tylko dla języków karnych, które potrzebują więcej bajtów, aby uzupełnić ciąg?
Tytus

Odpowiedzi:

3

05AB1E , 89 87 bajtów

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

Przywołuje kodowanie Cthulhu . Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Adnan
źródło
14

JavaScript (ES6), 165 161 bajtów

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

Edycja: bajt +1, aby spełnić zasadę „brak karty”

Przykłady

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

Arnauld
źródło
Możesz zyskać kilka bajtów, przestawiając tablicę (i być może oddzielając liczby od ciągów). +1 za pomysł.
Tytus
@Titus - Muszę przyznać, że nie widzę rearanżacji, która oszczędza niektóre bajty. Liczby należy również traktować jako ciągi znaków, aby replace()działały na nich bez wymuszania. Ale może mi brakować twojej racji.
Arnauld,
@Titus - Coś podobnego 'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)może działać. Czy o to ci chodziło?
Arnauld,
Nie zrozumiałem ich; myślałem, że to wartości ósemkowe. :) Ale twój nowy pomysł też nie jest zły.
Tytus
Dane wyjściowe wyzwania wymagają spacji zamiast tabulatorów, ponieważ są obecnie zapisywane.
Mwr247,
13

GNU sed, 187 163 158 (157 + 1) bajtów

Uruchom z -r (wyrażenie regularne ERE). Plik nie zawiera końcowego nowego wiersza.

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
Robaczek świętojański
źródło
Ładne podejście, ale możesz zaoszczędzić około 20 bajtów, usuwając cyfry po dodaniu andlub only.
Neil,
@Neil there :) uwzględnił twoją sugestię dotyczącą bardzo znaczącego oszczędzania.
FireFly,
1
Pierwsza linia może być tylko: s/(.)(.)/User: \1\nGroup: \2\nOthers: /. Więcej bajtów można zaoszczędzić przez przeniesienie do Perla, który ma \di \K.
ninjalj
@ninjalj dobry punkt. Pozostanę przy sed, ponieważ nie znam Perla, i jestem pewien, że byłyby inne sztuczki, aby pociągnąć go tam, aby był jeszcze krótszy, poza zamiennikami s ///.
FireFly,
6

C # 214 bajtów

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']}";}
pinkfloydx33
źródło
6

Galaretka , 100 91 85 bajtów

Prawie na pewno do gry w golfa - 91 bajtów, co ?! 8 miesięcy i 6 bajtów mądrości!
- 1. większa kompresja strun;
- 2. usunąć dekrecję poporodową o 48, ponieważ indeksowanie jest modułowe;
- 3. użyj lepszego cichego łączenia).

-9 bajtów z miłą pomocą @Lynn dla mnie kompresujących ciągi znaków

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

Przetestuj w TryItOnline

W jaki sposób?

,“£ɱ~» - 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
Jonathan Allan
źródło
4

Oktawa, 185 bajtów

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

Utwórz anonimową funkcję, która pobiera dane wejściowe jako ciąg znaków: „042”. Przekonwertować go na tablicy: (56-'042)' = [0 4 2]. Użyj tego jako wielu indeksów komórek do indeksowania tablicy komórek Read Write and Execute','Read and Write', .... Zastosowania fprintfdo produkcji trzy struny, przy odpowiednich kategoriach: User:, Group:i Others:.

Próbowałem znaleźć drogę do sklepu Execute, Write, Readjako oddzielne słów i Złącz, w miarę potrzeb, ale okazało się dłużej niż naiwnego podejścia.

Przykłady:

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

Wypróbuj online.

Stewie Griffin
źródło
2
Możesz zaoszczędzić kilka bajtów, używając strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')zamiast literału tablicy komórek
Luis Mendo
4

PowerShell v2 +, 189 168 bajtów

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

Pętle przechodzą przez dane wejściowe $args[0]jako chartablice. Każdej iteracji wskaźnik, do tablicy z $i++(domyślnie 0), aby zaznaczyć User, Grouplub Others, połączyć go z okrężnicy, oraz zakładkę, i połączyć go z innym indeksem macierzy.

Oto magia. Mamy niejawnie rzucać chardo inti odejmować 48(czyli obracając ASCII 48( "0") do 0), wybierając odpowiednią treść w postaci tablicy ints. Ta tablica jest następnie używana jako indeks do 'None','Read','Write','Execute','only','and'tablicy. Ponieważ domyślnym $ofs(Output Field Separator) jest spacja, to poprawnie wstawia spacje między elementami tablicy po zszeregowaniu (co dzieje się, gdy łączy się w lewo).

Te trzy ciągi są pozostawione w potoku, a dane wyjściowe za pośrednictwem niejawnego mają Write-Outputmiejsce po zakończeniu programu.

Przykład

PS C:\Tools\Scripts\golfing> .\decode-the-chmod.ps1 '123'
User:   Execute only
Group:  Write only
Others: Write and Execute
AdmBorkBork
źródło
3

Słoma , 193 bajtów

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

Wypróbuj online

Naciśnij 3 razy tabelę konwersji na pierwszym stosie, przełącz na drugi stos, przekonwertuj każdy numer za pomocą tabeli konwersacji i wydrukuj.

TuxCrafting
źródło
2

Haskell, 186 bajtów

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

Przykład:

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

Wykorzystano tylko Preludium. Czy robię to dobrze?

Nie golfowany:

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
michi7x7
źródło
2

Python 2, 190 185 bajtów

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

Pozostawia końcową spację, jeśli polecenie Wykonaj lub Zapis znajdują się na końcu wiersza, ale nie widziałem, że nie jest to dozwolone.

EDYCJA Zaoszczędziłem 5 bajtów, zmieniając zakres (3) na 0,1,2 i sprawdzając liczbę bajtów na moim laptopie z Linuksem zamiast na moim Windowsie (\ n = \ r \ n lub na odwrót. Nigdy nie pamiętam, który).

ElPedro
źródło
2

Python 2, 240 239 238 237 228 bajtów

Myślałem, że w końcu spróbuję tego zimnego golfa. Mamy nadzieję, że końcowe białe znaki są dozwolone. (naprawiono, a proces zapisał bajt)

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
Jack Greenhill
źródło
Witamy w PPCG i niezła pierwsza odpowiedź!
ETHproductions
Bezwstydnie zastąpiłem zakres (3) w mojej odpowiedzi w Pythonie 2 na 0,1,2 po przeczytaniu twojego kodu. Niezła odpowiedź. +1
ElPedro
2

PHP, 169 159 bajtów

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

przyjmuje ciąg jako argument wiersza poleceń: php -r '<code>' <argument>,
drukuje wiodącą nowej linii zamiast jednego spływu

Dzięki Jörgowi za wskazanie moich błędów - i za \t.

PHP, 169 bajtów

z nowym ograniczeniem: (znak tabulacji zabroniony)

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

Jest to 1 bajt krótszy niż w przypadku str_pad, ponieważ wymagałby dodatkowego pustego miejsca.

awaria

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
}

Aby utworzyć tablicę $n, użyj tego:

$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,";}
Tytus
źródło
1
foreach ([„User”, „Group”, „Others”] as $ i => $ u) {echo "\\ n $ u: \\ t"; zapisuje niektóre bajty, a dane wyjściowe dla 3,4,6 są niepoprawne
Jörg Hülsermann 13.09.16
1
To jest właściwa kolejność [5,33,34,66,35,67,131,531] fajny pomysł
Jörg Hülsermann
Zapomniałem opcji „Użytkownik” dla użytkownika, ponieważ zapisuje kolejne 6 bajtów, które chcesz pokonać JavaScript, zrób to
Jörg Hülsermann
@ JörgHülsermann: I tak miałem zamiar przyjąć „\ t”; dzięki. +1 za to :) Dobre oko 33!
Tytus
1
dla 346 naszym wyjściem jest Użytkownik: Odczyt i zapis Grupa: Wykonaj tylko inni: Zapis i wykonanie należy: Użytkownik: Zapis i wykonanie Grupa: Tylko odczyt Inne: Odczyt i
zapis
2

bash - 221 213 bajtów

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

Nie jest jasne, czy można to jeszcze bardziej skondensować, przynajmniej nie bez zasadniczej zmiany tutaj podejścia (podzielenia danych wejściowych i wykorzystania ich jako indeksu tablicy ${b}zawierającej odpowiednie łańcuchy).

ramki
źródło
1
Jest krótszy z \ onlyrozszerzonym wbudowanym. grep -o .<<<$1jest krótszy niż echo $1|grep -o ., ale while read -n1 clepszy jest odczyt danych wejściowych ze standardowego wejścia . Indeksy tablic mają kontekst arytmetyczny w bash, więc ${l[z++]}działa. lbyłby krótszy jako ciąg, do którego można by uzyskać dostęp jako ${l:z++*8:8}(przesunięcie i długość mają kontekst arytmetyczny). Kolejny bajt można łączyć, odczytując cały tryb c, rozwijając „Użytkownik:”,… w linii i rozsądnie wykorzystując rozszerzenia parametrów.
ninjalj
1
Aby uzyskać wynik końcowy: 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}]}"(zamień \ n na dosłowne znaki nowej linii).
ninjalj
1

Java 7, 300 284 bajtów

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

Bezpośrednie podejście na razie. Spróbuje wymyślić bardziej ogólne podejście do ponownego użycia słów.

Przypadki bez golfa i testy:

Wypróbuj tutaj.

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

Wydajność:

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
Kevin Cruijssen
źródło
1

Groovy, 217 207 205 bajtów

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

bez golfa:

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])
  }
}
norganos
źródło
1

Mathematica, 211 bajtów

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

Prosta implementacja (prawdopodobnie łatwa do pobicia): niczego nie oblicza, tylko twarde kody dla każdego możliwego wyniku. Dane wejściowe są liczbami całkowitymi; wypisuje każdą linię z końcową spacją i końcową nową linią ogólnie.

IntegerDigits[#,10,3]podaje trzy cyfry wejścia (nawet jeśli występują początkowe zera). Każda cyfra wskazuje argument „funkcji”

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

0 oznacza samą nazwę funkcji. ""<>łączy wszystkie ciągi z listy (list). "\n"&~Array~3produkuje trzy nowe linie.

Greg Martin
źródło
Właśnie zauważyłem, że moja odpowiedź w Pythonie 2 jest prawie identyczna z twoją, nawet używając tych samych nazw zmiennych. Szczerze mówiąc, nie widziałem twojego przed opublikowaniem!
ElPedro,
1
bez obaw! Myślę, że w tej sytuacji można się spodziewać dopasowania nazw zmiennych :)
Greg Martin
Chyba masz rację. Nazwy zmiennych były nieco przewidywalne ☺
ElPedro
btw, +1 bo myślimy tak samo :-)
ElPedro
1
przy okazji, nie znam Matematyki, ale myślę, że możesz stracić bajt, usuwając spację z „tylko”. Zawsze będzie na końcu linii, więc nie potrzebuje spacji końcowej.
ElPedro,
1

Java 7, 278

Gra w golfa:

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

Nie golfowany:

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

Wydajność:

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

źródło
1

Python 3.5, 3.6 - 235 232 228 216 bajtów

(powinien działać na wszystkich Python 3.x)

Więc dane wejściowe znajdują się tutaj na STDIN (zapisuje 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")

Używanie krotek, pomijanie spacji tam, gdzie to możliwe, i pierwszeństwo operatora w miejscach, w których normalnie wstawiałbyś nawiasy, aby wyjaśnić swoje intencje.

Przykładowe użycie:

$ 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

Bez golfa:

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"
    ))
Jonas Schäfer
źródło
1

Partia, 280 bajtów

@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

Kodowanie ciągów było o 47 bajtów krótsze niż próba ich złożenia. Byłoby 267 bajtów, gdyby karty były zgodne z prawem.

Neil
źródło
1

C # 307 241 210 bajtów

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

Sformatowany

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])));
}
Grax32
źródło
1

C #, 322 337 348 bajtów

Z pewnością nie jest to najkrótsza wersja, ale próbowałem rozwiązać ten problem za pomocą operatorów bitowych, ponieważ chmodwartości są w rzeczywistości flagami bitowymi. Również C # nie jest prawdopodobnie najlepszym językiem golfowym: 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')));}

bez golfa: (z komentarzami)

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
}

To jest mój pierwszy raz golfowy kod, więc powiedz mi, jeśli coś zrobiłem źle :)

EDYCJA 1:

Zapisano niektóre bajty, zastępując s[i]-'0'je s[i]&7(na samym końcu) i zapisując listę liczników do zmiennej:

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

EDYCJA 2:

Zmieniono na wyrażenie lambda:

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)));}
Stefan
źródło
1

JavaScript, 213 209 208 188 186 bajtów

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

Zaoszczędzono 20 bajtów dzięki Dadzie!

Paul Schmitz
źródło
3
Mogę się mylić, ale czy twoja tablica nie powinna być w odwrotnej kolejności? Jeśli wywołam b („000”), zwróci „Czytaj Zapis i Wykonaj”, podczas gdy można się spodziewać „Brak” ...
Dada,
I jestem prawie pewien, że to może być bardziej golfa. Na przykład wersja 191 bajtów: 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 bajtów

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
polyglotrealIknow
źródło
1
Witamy w PPCG! Dobra pierwsza odpowiedź BTW :)
Beta Decay
1

Kryształ, 200 194 bajtów

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

zwraca wynikowy ciąg dla podanej sekwencji ósemkowej jako ciąg. np: m("670")Wyniki dla: User: Read and Write\nGroup: Read Write and Execute\nOthers: None.

Wypróbuj online .

Domii
źródło
0

C #, 371 bajtów

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));
}
Alireza Tabatabaeian
źródło
4
To jest golf-golf, więc musisz zagrać w golfa. Dodaj także nagłówek z nazwą języka i liczbą bajtów.
TuxCrafting,
Dodałem twoją liczbę bajtów, która jest twoim wynikiem. Musisz wygrać jak najniższy wynik, aby wygrać
rozpad bety
Na przykład pozbywasz się niepotrzebnych białych znaków w każdej funkcji
Beta Decay
1
@BetaDecay Dzięki, jestem nowy w tej społeczności i myślę, że lepiej użyć php, co może prowadzić do większej liczby kodów kompaktowych.
Alireza Tabatabaeian
1
@Alireza To dobry pomysł. Chociaż na tej stronie lubimy widzieć krótkie odpowiedzi w Javie i C # :)
Beta Decay
0

Python 3.5 - 370 294 243 bajtów

Gra w golfa:

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

Kontrola rozmiaru:

$ du -b OctalToHuman.py 
243     OctalToHuman.py

Bez golfa:

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

Przykładowe dane wyjściowe:

$ 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
Promień
źródło
To nie jest poważny pretendent do kryteriów zwycięstwa. Potrzebujemy wszystkich odpowiedzi, aby podjąć poważną próbę zoptymalizowania ich wyniku pod kątem wygranych kryteriów (na przykład w takich wyzwaniach golfowych, jak ten, zgłoszenia muszą podjąć poważną próbę zminimalizowania liczby bajtów programu).
Mego
Możesz zaoszczędzić sporo bajtów, usuwając import sysi czyniąc program anonimową funkcją ( lambda o:...).
NoOneIsHere 18.09.16
0

F #, 204 203 bajtów

mój pierwszy golf, więc proszę wybacz wszelkie błędy;)
Wersja w golfa (oparta 1: 1 na odpowiedzi 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

Wersja bez golfa:

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

Przykładowe użycie:

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

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


Służy to wyłącznie sprawdzeniu, czy mógłbym „poprawić” odpowiedź pinkfloydx33 - nie przypisuję sobie żadnego algorytmu

nieznany6656
źródło
0

PHP, 199 bajtów

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 bajtów z \ 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);}
Jörg Hülsermann
źródło
Hej, powinieneś używać spacji zamiast tabulatorów
Beta Decay
W tym przypadku \ t wygląda jak str_repeat ("", 3- $ i) lub str_pad ("", 3- $ i, ""), ale z moim pomysłem nie ma znaczenia, że ​​nie mam szans na wygraną. another space cs.tut.fi/~jkorpela/chars/spaces.html
Jörg Hülsermann
1
13 + 34 bajty do zapisania. W długiej wersji: Użyj echo str_pad("$u:",8)zamiast echo"$u:".str_repeat(" ",3-$i)(-9); czyni to $i=>przestarzałym (-4). W obu wersjach: Użyj $a[$z-1]="and $a[$z-1]";zamiast {$a[]=$a[$z-1];$a[$z-1]="and";}(-7) i else$a[]=$a?Only:None;zamiast elseif($z<1)$a[]=None;else$a[]=Only;(-14). Skręć if(1<$z=count($a))$a[$z-1]="and $a[$z-1]";else$a[]=$a?Only:None;w if($x=array_pop($a))$a[]=$a?"and $x":"$x Only";else$a[]=None;(-3), a następnie w $a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None;(-10)
Tytus
@Titus echo str_pad ("$ u:", 8), $ a [$ z-1] = "i $ a [$ z-1]" ;, else $ a [] = $ a? Tylko: Brak; Gotowe $ i => przestarzałe Nie mogę zrobić, więc $ m = $ argv [1] [$ i] jest konieczne. Co do reszty, spróbuję najpierw w inny sposób. Dziękujemy za wkład
Jörg Hülsermann
1
Więcej pomysłów: if(4&$m=$argv[1][$i])zamiast $m=$argv[1][$i];if(4&$m)(-3) LUB zamień $m=;if();if();if();na pętlę: foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;(-7)
Tytus
0

Python 3, 191 bajtów

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

bez golfa

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])
Aleksandr Smirnov
źródło
1
Witamy w PPCG! fajny pierwszy post!
Rɪᴋᴇʀ
Hmm, jestem bardzo ciekawy, jak moderator otrzymał 151 bajtów, kiedy dostałem tylko 191: D Czy to błąd? Sprawdź zmiany
Aleksandr Smirnov
Przepraszam, to byłam ja. Pisałem na maszynie w edycji. Naprawiono teraz.
Rɪᴋᴇʀ
0

JavaScript (ES6), 159 bajtów

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

Przykład:

(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")
Ian
źródło