Вызов
Если задано трехзначное число восьмеричных разрешений, выведите разрешения, которые оно предоставляет.
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
выигрыш
Самый короткий код в байтах побеждает.
Ответы:
05AB1E ,
8987 байтПризывает кодировку Ктулху .Использует кодировку CP-1252 . Попробуйте онлайн!источник
Javascript (ES6),
165161 байтИзменить: +1 байт, чтобы выполнить правило "без вкладки"
Примеры
источник
replace()
они работали без принуждения. Но я могу упустить из виду вашу мысль.'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)
может сработать. Это то, что вы имели в виду?GNU sed,
187 163158 (157 + 1) байтовЗапустите с -r (ERE регулярное выражение). Файл не содержит завершающей строки.
источник
and
илиonly
.s/(.)(.)/User: \1\nGroup: \2\nOthers: /
. Еще несколько байтов можно сохранить, портировав на Perl, который имеет\d
и\K
.C # 214 байта
источник
Желе ,
100 9185 байтПочти наверняка пригодный для игры в гольф - 91 байт, что ?!8 месяцев и 6 байтов мудрости!- 1. больше сжатия строк;
- 2. убрать пост-порядковый декремент на 48, поскольку индексирование является модульным;
- 3. лучше использовать молчаливую цепочку).
-9 байт с любезной помощью @Lynn, выполняющей сжатие строк для меня
Проверьте это в TryItOnline
Как?
источник
Октава, 185 байт
Создайте анонимную функцию, которая принимает входные данные в виде строки: «042». Преобразовать его в массив:
(56-'042)' = [0 4 2]
. Используйте это как несколько индексов ячеек, чтобы индексировать массив ячеекRead Write and Execute','Read and Write', ...
. Использованиеfprintf
на выход три строки, с соответствующими категориями:User:
,Group:
иOthers:
.Я пытался найти способ хранить
Execute
,Write
,Read
как отдельные слова и СЦЕПИТЬ по мере необходимости, но это оказалось больше , чем наивный подход.Примеры:
Попробуйте онлайн.
источник
strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')
вместо литерала массива ячеекPowerShell v2 +,
189168 байтПеребирает входные данные
$args[0]
какchar
-array. На каждой итерации мы индексируем в массив с$i++
(по умолчанию0
), чтобы выбратьUser
,Group
илиOthers
объединяем это с двоеточием и табуляцией, и объединяем это с другим индексом массива.Вот магия. Мы неявно приводим
char
к aint
и вычитаем48
(то есть превращаем ASCII48
("0"
) в0
), выбирая подходящую формулировку в качестве массиваint
s. Этот массив впоследствии используется в качестве индекса в'None','Read','Write','Execute','only','and'
массиве. Поскольку по умолчанию$ofs
(Разделитель выходных полей) используется пробел, он корректно вставляет пробелы между элементами массива при строковом преобразовании (что происходит, когда он соединяется слева).Эти три строки остаются в конвейере, и вывод через неявный
Write-Output
происходит при завершении программы.пример
источник
Солома , 193 байта
Попробуйте онлайн
Нажмите 3 раза таблицу преобразования в первом стеке, переключитесь на второй стек, преобразуйте каждое число с помощью таблицы разговоров и напечатайте.
источник
Haskell, 186 байт
Пример:
Используется только прелюдия. Я делаю это правильно?
Ungolfed:
источник
Python 2,
190185 байтОставляет завершающий пробел, если Execute или Write находятся в конце строки, но я не видел, чтобы это было запрещено.
РЕДАКТИРОВАТЬ Сохранение 5 байтов путем изменения диапазона (3) на 0,1,2 и проверки количества байтов на моем ноутбуке с Linux вместо моего Windows (\ n = \ r \ n или наоборот. Я никогда не могу вспомнить, какой именно).
источник
Python 2,
240239238237228 байтЯ думал, что наконец-то попробую эту холодную игру в гольф.
Надеюсь, пробелы в конце разрешены.(исправлено, и в процессе сохранен байт)источник
PHP,
169159 байтпринимает строку в качестве аргумента командной строки:
php -r '<code>' <argument>
,печатает ведущую строку вместо одной задней
Спасибо Jörg за указание на мои ошибки - и за
\t
.PHP, 169 байт
с новым ограничением: (символ табуляции запрещен)
Это на 1 байт короче, чем с
str_pad
, потому что потребуется дополнительный пробел.сломать
Чтобы создать массив для
$n
, используйте это:источник
33
!Баш -
221213 байтовGNU bash, version 4.3.46
Неясно, может ли это быть еще более сжатым, по крайней мере, без фундаментального изменения подхода (разделение входных данных и использование его в качестве индекса для массива,
${b}
который содержит соответствующие строки).источник
\ only
расширенным встроенным.grep -o .<<<$1
корочеecho $1|grep -o .
, ноwhile read -n1 c
лучше читать входные данные из stdin с . Индексы массива имеют арифметический контекст в bash, так что${l[z++]}
работает.l
будет короче как строка, к которой будет обращаться как${l:z++*8:8}
(смещение и длина имеют арифметический контекст). Другой байт можно уменьшить, прочитав весь режимc
, развернув «Пользователь:», ... встроенный и сделав разумное использование расширений параметров.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 буквальными символами новой строки).Java 7,
300284 байтаПрямой подход на данный момент. Постараюсь придумать более общий подход к повторному использованию слов.
Ungolfed и тестовые случаи:
Попробуй это здесь.
Выход:
источник
Groovy,
217207205 байтungolfed:
источник
Mathematica, 211 байт
Простая реализация (вероятно, легко победимая): ничего не вычисляется, просто жестко кодирует каждый возможный вывод. Ввод является целым числом; выводит каждую строку с завершающим пробелом и завершающим переводом строки в целом.
IntegerDigits[#,10,3]
дает три цифры ввода (даже если есть начальные нули). Каждая цифра указывает на аргумент «функции»0 указывает на само название функции.
""<>
объединяет все строки в списке (списков)."\n"&~Array~3
производит три новых строки.источник
Ява 7, 278
Golfed:
Ungolfed:
Выход:
источник
Python 3,5, 3,6 -
235232228216 байт(должен работать на всех Python 3.x)
Таким образом, ввод находится на STDIN здесь (сохраняет импорт ☺).
Использование кортежей, пропуски пробелов, где это возможно, и приоритет операторов, где вы обычно ставите скобки, чтобы прояснить свои намерения.
Пример использования:
Un-golfed:
источник
Пакетный, 280 байт
Жесткое кодирование строк было на 47 байт короче, чем попытка собрать их вместе. Было бы 267 байт, если бы вкладки были легальными.
источник
C #
307241210 байт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])));}
отформатирован
источник
C #, 322
337 348байтЭто, конечно, не самая короткая версия, но я попытался решить эту проблему с помощью побитовых операторов, поскольку
chmod
значения на самом деле являются битовыми флагами. Также C #, вероятно, не лучший язык для игры в гольф: Dбез золота: (с комментариями)
Это мой первый раз код игры в гольф, поэтому, пожалуйста, скажите мне, если я что-то сделал не так :)
РЕДАКТИРОВАТЬ 1:
Сохраненные несколько байт, заменив
s[i]-'0'
наs[i]&7
(в самом конце) и сохранение счета списка в переменный:РЕДАКТИРОВАТЬ 2:
Изменено на лямбда-выражение:
источник
Javascript,
213209208188186 байтБлагодаря Дада сэкономлено 20 байтов!
источник
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]]}
.Visual Basic, 606 байт
источник
Кристалл,
200194 байтавозвращает результирующую строку для заданной восьмеричной последовательности в виде строки. например:
m("670")
результаты к:User: Read and Write\nGroup: Read Write and Execute\nOthers: None
.Попробуйте онлайн .
источник
C #, 371 байт
источник
Python 3.5 -
370294243 байтаGolfed:
Проверка размера:
Un-golfed:
Образец вывода:
источник
import sys
и просто сделав программу анонимной функцией (lambda o:
...).F #,
204203 байтамой первый гольф, так что прошу прощения за любые ошибки;)
Гольф-версия (основанная 1: 1 на ответ pinkfloydx33 ):
Негольфированная версия:
Пример использования:
Это исключительно для проверки, могу ли я «улучшить» ответ pinkfloydx33 - я не беру на себя ответственность за алгоритм
источник
PHP, 199 байт
PHP, 189 байт с \ t
источник
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)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)Python 3, 191 байт
ungolfed
источник
Javascript (ES6), 159 байт
Пример:
источник