Расшифруйте 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
Beta Decay
1
Вывод выглядит правильно с символом табуляции, так почему бы не использовать его? Просто для штрафных языков, которым нужно больше байтов для заполнения строки?
Титус

Ответы:

3

05AB1E , 89 87 байт

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

Призывает кодировку Ктулху . Использует кодировку CP-1252 . Попробуйте онлайн!

Аднан
источник
14

Javascript (ES6), 165 161 байт

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

Изменить: +1 байт, чтобы выполнить правило "без вкладки"

Примеры

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

Arnauld
источник
Вы можете получить несколько байтов, переставив массив (и, возможно, отделив числа от строк). +1 за идею.
Тит
@ Titus - Я должен признать, что я не вижу перестановки, которая сохраняет некоторые байты. Кроме того, числа должны рассматриваться как строки, чтобы replace()они работали без принуждения. Но я могу упустить из виду вашу мысль.
Арно
@ Titus - Нечто подобное 'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)может сработать. Это то, что вы имели в виду?
Арно
Я неправильно понял их; думал, что они были восьмеричные значения. :) Но твоя новая идея тоже неплоха.
Тит
Для выполнения задания требуются пробелы вместо вкладок, как написано в данный момент.
Mwr247
13

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

Запустите с -r (ERE регулярное выражение). Файл не содержит завершающей строки.

s/(.)(.)/User:   \1\nGroup:  \2\nOthers: /g
s/[4-7]/Read &/g
s/[2367]/Write &/g
s/[1357]/Execute &/g
s/(\w) (\w+) [1-7]/\1 and \2/g
s/[1-7]/only/g
s/0/None/g
Светляк
источник
Хороший подход, но вы можете сэкономить около 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']}";}
pinkfloydx33
источник
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-array. На каждой итерации мы индексируем в массив с $i++(по умолчанию 0), чтобы выбрать User, Groupили Othersобъединяем это с двоеточием и табуляцией, и объединяем это с другим индексом массива.

Вот магия. Мы неявно приводим charк a 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
AdmBorkBork
источник
3

Солома , 193 байта

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

Попробуйте онлайн

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

TuxCrafting
источник
2

Haskell, 186 байт

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

Пример:

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

Используется только прелюдия. Я делаю это правильно?

Ungolfed:

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

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

m c =   let up = zip ["User:   ","Group:  ","Others: "] c -- pair user and permission
        in mapM_ pp up --print each
michi7x7
источник
2

Python 2, 190 185 байт

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

Оставляет завершающий пробел, если Execute или Write находятся в конце строки, но я не видел, чтобы это было запрещено.

РЕДАКТИРОВАТЬ Сохранение 5 байтов путем изменения диапазона (3) на 0,1,2 и проверки количества байтов на моем ноутбуке с Linux вместо моего Windows (\ n = \ r \ n или наоборот. Я никогда не могу вспомнить, какой именно).

ElPedro
источник
2

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

Я думал, что наконец-то попробую эту холодную игру в гольф. Надеюсь, пробелы в конце разрешены. (исправлено, и в процессе сохранен байт)

i=0
def a(b):
 for d in 4,2,1:
    if b&d:yield('Execute','Write','Read')[d/2]
for k in raw_input():
 b,q=list(a(int(k))),' and';e=len(b)
 if e:b[~e/2]+=(' only',q,q)[e-1]
 print'UGOsrteohrue:pr :s  :'[i::3],' '.join(b)or None;i+=1
Джек Гринхилл
источник
Добро пожаловать в PPCG и приятного первого ответа!
ETHproductions
Я бесстыдно заменил диапазон (3) в моем ответе на Python 2 на 0,1,2 после прочтения вашего кода. Хороший ответ. +1
ElPedro
2

PHP, 169 159 байт

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

принимает строку в качестве аргумента командной строки: php -r '<code>' <argument>,
печатает ведущую строку вместо одной задней

Спасибо Jörg за указание на мои ошибки - и за \t.

PHP, 169 байт

с новым ограничением: (символ табуляции запрещен)

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

Это на 1 байт короче, чем с str_pad, потому что потребуется дополнительный пробел.

сломать

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

Чтобы создать массив для $n, используйте это:

$b=[[5],[1,4],[2,4],[2,0,1],[3,4],[3,0,1],[3,0,2],[3,2,0,1]];
foreach($b as$i=>$a){for($v=$j=0;$a;$j+=3)$v+=array_shift($a)<<$j;echo"$v,";}
Titus
источник
1
Еогеасп ([ 'пользователя', 'группы', 'другие'] как $ я => $ и) {эхо "\\ п $ U: \\ т"; сохраняет некоторые байты и вывод для 3,4,6 неверен
Йорг Хюльсерманн
1
Это правильный порядок [5,33,34,66,35,67,131,531] хорошая идея
Йорг Хюльсерманн
Я забыл «Пользователь» для пользователя, например, сохраняет следующие 6 байтов, которые вы хотите превзойти JavaScript, сделайте это
Йорг Хюльсерманн
@ JörgHülsermann: Я все равно собирался принять «\ t»; Спасибо. +1 за это :) Хороший глаз 33!
Тит
1
для 346 наш вывод: Пользователь: чтение и запись Группа: только выполнение Другие: запись и выполнение, если это необходимо Пользователь: запись и выполнение Группа: только чтение Другие: чтение и запись
Йорг Хюльсерманн
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, развернув «Пользователь:», ... встроенный и сделав разумное использование расширений параметров.
ниндзя
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";}

Прямой подход на данный момент. Постараюсь придумать более общий подход к повторному использованию слов.

Ungolfed и тестовые случаи:

Попробуй это здесь.

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

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

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

Выход:

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

User:   None
Group:  Read only
Others: Write only

User:   Read and Write
Group:  Read only
Others: Read only
Кевин Круйссен
источник
1

Groovy, 217 207 205 байт

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

ungolfed:

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

Mathematica, 211 байт

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

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

IntegerDigits[#,10,3]дает три цифры ввода (даже если есть начальные нули). Каждая цифра указывает на аргумент «функции»

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

0 указывает на само название функции. ""<>объединяет все строки в списке (списков). "\n"&~Array~3производит три новых строки.

Грег Мартин
источник
Я только что заметил, что мой ответ на Python 2 почти идентичен вашему, даже используя те же имена переменных. Я, честно говоря, не видел твоего, прежде чем отправил!
ElPedro
1
не стоит беспокоиться! Я думаю, что совпадения имен переменных в этой ситуации вполне ожидаемы :)
Грег Мартин,
Думаю, ты прав. Имена переменных были немного предсказуемы
El
Кстати, +1, потому что мы думаем так же :-)
ElPedro
1
Кстати, я не знаю Mathematica, но я думаю, что вы можете потерять байт, удалив пробел из «только». Он всегда будет в конце строки, поэтому не нужно завершать пробелом.
ElPedro
1

Ява 7, 278

Golfed:

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

Ungolfed:

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

Выход:

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

User:   None
Group:  Read only
Others: Write only

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

источник
1

Python 3,5, 3,6 - 235 232 228 216 байт

(должен работать на всех Python 3.x)

Таким образом, ввод находится на STDIN здесь (сохраняет импорт ☺).

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

Использование кортежей, пропуски пробелов, где это возможно, и приоритет операторов, где вы обычно ставите скобки, чтобы прояснить свои намерения.

Пример использования:

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

Un-golfed:

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])));
}
Grax32
источник
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
}

Это мой первый раз код игры в гольф, поэтому, пожалуйста, скажите мне, если я что-то сделал не так :)

РЕДАКТИРОВАТЬ 1:

Сохраненные несколько байт, заменив s[i]-'0'на s[i]&7(в самом конце) и сохранение счета списка в переменный:

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

РЕДАКТИРОВАТЬ 2:

Изменено на лямбда-выражение:

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

Javascript, 213 209 208 188 186 байт

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

Благодаря Дада сэкономлено 20 байтов!

Пол Шмитц
источник
3
Я могу ошибаться, но разве ваш массив не должен быть в обратном порядке? Если я вызываю b («000»), он возвращает «Read Write 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
polyglotrealIknow
источник
1
Добро пожаловать в PPCG! Хороший первый ответ BTW :)
Beta Decay
1

Кристалл, 200 194 байта

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

возвращает результирующую строку для заданной восьмеричной последовательности в виде строки. например: m("670")результаты к: User: Read and Write\nGroup: Read Write and Execute\nOthers: None.

Попробуйте онлайн .

Domii
источник
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 # :)
Beta Decay
0

Python 3.5 - 370 294 243 байта

Golfed:

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

Un-golfed:

#!/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 байта

мой первый гольф, так что прошу прощения за любые ошибки;)
Гольф-версия (основанная 1: 1 на ответ pinkfloydx33 ):

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

Негольфированная версия:

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

Пример использования:

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

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


Это исключительно для проверки, могу ли я «улучшить» ответ pinkfloydx33 - я не беру на себя ответственность за алгоритм

unknown6656
источник
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? Only: Нет; Готово $ 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

Python 3, 191 байт

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

ungolfed

def d(n):
    a,b,c,d,e=' and ',' only',"Execute","Write","Read"
    l=["None",c+b,d+b,d+a+c,e+b,e+a+c,e+a+d,e+" "+d+a+c]
    y,u,i=map(int,n)
    return"User:   %s\nGroup:  %s\nOthers: %s\n"%(l[y],l[u],l[i])
Александр Смирнов
источник
1
Добро пожаловать в PPCG! хороший первый пост!
Rɪᴋᴇʀ
Хм, мне очень любопытно, как модератор получил 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")
Ян
источник