Розшифруйте chmod


26

Виклик

Враховуючи трицифрове восьмеричне число дозволів, виведіть дозволи, які він надає.

chmod

На ОС UNIX дозволи файлів змінюються за допомогою chmodкоманди. Існує небагато різних способів використання chmod, але той, на який ми сьогодні зупинимось, - це використання дозволу восьмеричного типу.

Три цифри в номері дозволів представляють іншу особу:

  • Перша цифра представляє дозволи для користувача
  • Друга цифра представляє дозволи для групи
  • Остання цифра представляє дозволи для інших

Далі кожна цифра являє собою дозвіл, як показано нижче на:

Key: number | permission

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

Вхідні дані

Введенням буде тризначне число у вигляді рядка, наприклад:

133

або

007

Це буде передано або через STDIN, або через аргументи функції.

Вихідні дані

Вихід повинен мати різні дозволи для кожного користувача, групи та інших. Ви повинні відображати цю інформацію так:

User:   ddd
Group:  ddd
Others: ddd

Там, де є три пробіли після User, два пробіли після Groupі один пробіл після Others. Ви замінюєте dddінформацію про дозволи.

Ваш вихід може бути STDOUT або як повернутий рядок.

Приклади

Вхід: 666

Вихід:

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

Вхід: 042

Вихід:

User:   None
Group:  Read only
Others: Write only

Вхід: 644

Вихід:

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

Перемога

Виграє найкоротший код у байтах.


Які специфікації вводу?
Джонатан Аллан

@JonathanAllan Всього трицифрове число
бета-версія занепаду

Ви маєте на увазі лише десяткове ціле число, тож 042 буде отримано як 42?
Джонатан Аллан

2
@Jonathan Ні, це введення рядків, тому це буде 042
бета-версія занепаду

1
Вихід виглядає правильно з символом вкладки, так чому б не використовувати його? Просто для покарань, яким потрібно більше байтів для накладки рядка?
Тит

Відповіді:



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+)/)може спрацювати. Це те, що ти мав на увазі?
Арнольд

Я нерозумів їх; думав, що вони є вісімковими значеннями. :) Але і ваша нова ідея непогана.
Тіт

Виведення виклику вимагає пробілів замість вкладок, як це написано в даний час.
Mwr247

13

GNU sed, 187 163 158 (157 + 1) байт

Запустіть з -r (ERE regexp). Файл не містить зворотного нового рядка.

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

Хороший підхід, але ви можете зберегти близько 20 байт, видаливши цифри, додаючи andабо only.
Ніл

@Neil там :) включив вашу пропозицію про дуже значне заощадження.
FireFly

1
Перший рядок може бути просто: s/(.)(.)/User: \1\nGroup: \2\nOthers: /. Ще кілька байтів можна зберегти, перенісши на Perl, у якого є \dі \K.
ніндзя

@ninjalj хороший момент. Я буду дотримуватися sed, оскільки не знаю Perl, і я впевнений, що там будуть інші хитрощі, щоб зробити його ще коротшим, поза заміною s ///.
FireFly

6

C # 214 байт

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

6

Желе , 100 91 85 байт

Майже напевно гольфуючий - 91 байт, що ?! 8 місяців і 6 байт мудрості!
- 1. більше стискання струни;
- 2. зняти пост-порядковий декрет на 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на вихід три рядки, з відповідними категоріями: User:, Group:і Others:.

Я спробував знайти спосіб зберігання Execute , Write, Readяк окремі слова і СЦЕПИТЬ по мірі необхідності, але це виявилося більше , ніж наївний підхід.

Приклади:

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масив. Кожну ітерацію ми індексуємо в масив з $i++(за замовчуванням 0) для вибору User,Group або Othersоб'єднати його з двокрапкою та вкладкою, і з'єднати його з індексом масиву.

Ось магія. Ми неявно відкидаємо charдо intта віднімаємо 48(тобто, перетворюючи ASCII 48( "0") у 0), вибираючи відповідне формулювання як масив ints. Цей масив згодом використовується як індекс у 'None','Read','Write','Execute','only','and'масиві. Із за замовчуванням$ofs (роздільник вивідного поля) є пробіл, він правильно вставляє проміжки між елементами масиву, коли вони є строкованими (що відбувається, коли він конкатенується зліва).

Ці три рядки залишаються на конвеєрі і виводяться неявно 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: ),+>

Спробуйте в Інтернеті

Натисніть на три рази таблицю перетворення на перший стек, перейдіть на другий стек, перетворіть кожне число за допомогою таблиці бесіди та роздрукуйте.


2

Хаскелл, 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

Пітон 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 в кінці рядка, але я не бачив, що це заборонено.

EDIT Збережено 5 байт, змінивши діапазон (3) на 0,1,2 і перевіривши кількість байтів на моєму ноутбуці Linux замість одного Windows (\ n = \ r \ n або навпаки. Я ніколи не пам'ятаю, який).


2

Python 2, 240 239 238 237 228 байт

Я подумав, що нарешті віддам цю холодну гольф. Сподіваємось, пробіл пробілів дозволений. (виправлено і в процесі збережено байт)

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

Ласкаво просимо до PPCG, і приємна перша відповідь!
ETHproductions

Я безсоромно замінив діапазон (3) у своїй відповіді Python 2 на 0,1,2 після прочитання вашого коду. Гарна відповідь. +1
ElPedro

2

PHP, 169 159 байт

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

приймає рядок в якості аргументу командного рядка: php -r '<code>' <argument>,
друкує провідний рядок замість однієї задньої

Дякую Йоргу за те, що він вказав на мої помилки - і за \t.

PHP, 169 байт

з новим обмеженням: (символ символу вкладки заборонено)

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

Це на 1 байт коротше, ніж з str_pad, через додаткову порожню, яка знадобиться.

зламатися

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

Щоб створити масив для $n, використовуйте це:

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

1
foreach (['Користувач', 'Група', 'Інші'] як $ i => $ u) {echo "\\ n $ u: \\ t"; економить кілька байтів, а вихід на 3,4,6 невірний
Jörg Hülsermann

1
Це правильне замовлення [5,33,34,66,35,67,131,531] приємна ідея
Jörg Hülsermann

Я забув "Користувач" Користувачеві для exmple економить наступні 6 байтів, які ви хочете перемогти JavaScript, зробіть це
Jörg Hülsermann

@ JörgHülsermann: Я все одно збирався прийняти "\ t"; Спасибі. +1 за це :) Добре око 33!
Тит

1
для 346 нашим результатом є Користувач: Група "Читання і запис": Виконайте лише інші: Напишіть і виконайте це Користувач: Написати та виконати Група: Лише для читання: Читання та запис
Jörg 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краще читати вхід із stdin . Індекси масивів мають арифметичний контекст у bash, тому ${l[z++]}працює. lбула б коротшою як рядок, до якого можна було б отримати доступ ${l:z++*8:8}(зсув і довжина мають арифметичний контекст). Ще один байт можна захистити, прочитавши весь режим в c, розширивши "User:", ... inline та розумно використовуючи розширення параметрів.
ніндзя

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 буквальними новими рядками).
ніндзя

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

Математика, 211 байт

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

Проста реалізація (напевно, легко піддається обробці): нічого не обчислює, просто жорстко кодує кожен можливий вихід. Вхід - ціле число; виводить кожен рядок із заднім пробілом та загальним заднім рядком.

IntegerDigits[#,10,3]дає три цифри вводу (навіть якщо є провідні нулі). Кожна цифра вказує аргумент "функції"

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

з 0, що вказує саме ім'я функції. ""<>об'єднує всі рядки у списку (зі списків). "\n"&~Array~3виробляє три нові рядки.


Я щойно помітив, що моя відповідь Python 2 майже ідентична вашій, навіть використовуючи однакові імена змінних. Я, чесно кажучи, не бачив твого, перш ніж я розмістив!
ElPedro

1
не хвилюйтесь! Я думаю, що відповідність імен змінних можна очікувати в цій ситуації :)
Грег Мартін,

Здогадайтесь, ви праві. Імена змінних були трохи передбачуваними ☺
ElPedro

btw, +1 cos ми думаємо так само :-)
ElPedro

1
btw, я не знаю Mathematica, але я думаю, ви можете втратити байт, видаливши пробіл з "тільки". Він завжди буде в кінці рядка, тому не потрібен пробіл.
ElPedro

1

Ява 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')));}

неозорий: (з коментарями)

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
}

Це мій гольф з першим кодом, тому, будь ласка, скажіть мені, якщо я зробив щось не так :)

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

EDIT 2:

Змінено на лямбда-вираз:

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

1

Javascript, 213 209 208 188 186 байт

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

Збережено 20 байт завдяки Dada!


3
Я можу помилитися, але чи не повинен ваш масив бути в протилежному порядку? Якщо я зателефоную b ("000"), він поверне "Read Read and Execute", тоді як можна очікувати "None" ...
Dada

І я впевнений, що це може бути більше гольфу. Так , наприклад, 191 байт версії: function b(p){a=" and ";r="Read";w="Write";e="Execute";v=";";o=" only";c=["None",e+o,w+o,w+a+e,r+o,r+a+e,r+a+w,r+" "+w+a+e];return"User: "+c[p[0]]+"\nGroup: "+c[p[1]]+"\nOthers: "+c[p[2]]}.
Дада

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

повертає отриманий рядок для заданої восьмеричної послідовності у вигляді рядка. наприклад: 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

Я додав ваш кількість байтів, який є вашим балом. Щоб виграти, потрібно отримати максимально низький результат
Beta Decay

Наприклад, ви позбавитесь від усіх зайвих пробілів у кожній функції
Beta Decay

1
@BetaDecay Спасибі, я новачок у цій спільноті, і я вважаю, що краще використовувати php замість цього, що може призвести до отримання більше компактних кодів.
Аліреза Табатабайський

1
@Alireza Це гарна ідея. Хоча на цьому сайті ми любимо бачити короткі відповіді на Java та C # :)
бета-версія занепаду

0

Пітон 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);}

Гей, вам слід використовувати пробіли замість вкладок
Beta Decay

У цьому випадку \ t виглядає як str_repeat ("", 3- $ i) або str_pad ("", 3- $ i, ""), але це не має значення для моєї ідеї, я не маю шансів на перемогу. Якщо я повинен взяти інший пробіл cs.tut.fi/~jkorpela/chars/spaces.html
Йорг Гюльсерманн

1
13 + 34 байти для економії. У довгому варіанті: Використовуйте echo str_pad("$u:",8)замість echo"$u:".str_repeat(" ",3-$i)(-9); це робить $i=>застарілим (-4). В обох версіях: Використовуйте $a[$z-1]="and $a[$z-1]";замість {$a[]=$a[$z-1];$a[$z-1]="and";}(-7) і else$a[]=$a?Only:None;замість elseif($z<1)$a[]=None;else$a[]=Only;(-14). Поверніть if(1<$z=count($a))$a[$z-1]="and $a[$z-1]";else$a[]=$a?Only:None;на if($x=array_pop($a))$a[]=$a?"and $x":"$x Only";else$a[]=None;(-3), а потім у $a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None;(-10)
Тит

@Titus echo str_pad ("$ u:", 8), $ a [$ z-1] = "і $ a [$ z-1]" ;, ще $ a [] = $ a? Тільки: Ні; Виконано $ i => застаріле, я не можу зробити, тоді потрібно $ m = $ argv [1] [$ i]. В іншому я спробую спершу інший спосіб. Дякую за вклад
Йорг Гюльсерманн

1
Більше ідей: if(4&$m=$argv[1][$i])замість $m=$argv[1][$i];if(4&$m)(-3) АБО замініть $m=;if();if();if();петлю: foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;(-7)
Тіт

0

Пітон 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ɪᴋᴇʀ

Хм, мені дуже цікаво, як модератор отримав 151 байт, коли мені лише 191: 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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.