Uprawnienia do plików
Zaadaptowano z bezpłatnej odpowiedzi na pytanie „Carla” z UIL - Computer Science Programming dla dystryktu 2018.
Wprowadzenie
W systemach operacyjnych typu UNIX każdy plik, katalog lub łącze jest „własnością” „użytkownika”, który jest członkiem „grupy” i ma pewne „uprawnienia” reprezentowane przez ciąg dziesięciu znaków, taki jak „ drwxrwxrwx ". Pierwszym znakiem jest „d”, „-” lub „l” (katalog, plik lub link), a następnie trzy zestawy wartości „rwx”, wskazujące uprawnienia „odczyt, zapis, wykonanie”. Pierwszy zestaw to prawa użytkownika, środkowy zestaw prawa grupy, a trzeci prawa wszystkich innych do tego obiektu.
Odmowa dostępu do któregokolwiek z tych praw jest reprezentowana przez „-” zamiast „r”, „w” lub „x”. Na przykład przykładowy ciąg uprawnień do katalogu to „drwxr - r--”, wskazujący pełne uprawnienia do katalogu dla użytkownika, ale uprawnienia „tylko do odczytu” dla członka grupy i wszystkich innych.
Każda kombinacja „rwx” może być również reprezentowana przez wartość ósemkową (0–7) z najbardziej znaczącym bitem reprezentującym uprawnienie do odczytu, kolejnym najbardziej znaczącym bitem reprezentującym uprawnienie do zapisu i najmniej znaczącym bitem reprezentującym uprawnienie do wykonania.
Wyzwanie
Biorąc pod uwagę czteroznakowy ciąg kodu składający się ze znaku: „D”, „F” lub „L”, po którym następuje trzycyfrowa liczba ósemkowa, np. 664, zwraca wynikowy ciąg 10 znaków reprezentujący wartość uprawnień wskazany.
Wkład
Twój program lub funkcja może albo odczytać dane wejściowe ze standardowego wejścia (zostaną wprowadzone cztery znaki, opcjonalnie po nich nowa linia), albo przekazać dane wejściowe jako argument.
Twój program może przyjmować duże lub małe litery, ale musi być spójny (wszystkie dane wejściowe są pisane wielkimi literami lub wszystkie dane wejściowe są pisane małymi literami).
Wydajność
Twój program musi wydrukować wynikowy ciąg dziesięciu znaków reprezentujący wartość uprawnień wskazaną w dokładnie określonym formacie określonym powyżej. Dozwolone jest ogonowanie białych znaków.
Przypadki testowe
W: F664
OUT: -rw-rw-r--
IN: D775
OUT: drwxrwxr-x
IN: L334
OUT: l-wx-wxr--
IN: F530
OUT: -r-x-wx---
w: D127
Out:d--x-w-rwx
Punktacja i zasady
- Standardowe otwory na pętle są zabronione.
- Obowiązują standardowe zasady .
- Podaj link, aby przetestować kod, a także wyjaśnienie.
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach!
Odpowiedzi:
Galaretka , 19 bajtów
Wypróbuj online!
Jak to działa
źródło
bash,
5953 bajtówOdpowiednie narzędzie do pracy?
Podziękowania dla Dennisa za zapisanie 5 bajtów i HTNW za zapisanie jednego.
Wypróbuj online!
źródło
chmod ${1:1} a>a;stat -c%A a|sed "s/-/\L${1:0:1}/;s/f/-/"
oszczędza dwa bajty.tr
zamiasty
:chmod ${1:1} a>a;stat -c%A a|sed s/./\\L${1:0:1}/|tr f -
a
a użytkownik ma pozwolenie na jego utworzenie, czy plika
istnieje i użytkownik może zapisywać? Bo jeśli istnieje plika
własnośćroot
z uprawnieniami700
, to nie powinno działać.Python 2 , 78 bajtów
Pobiera dane wejściowe jako znak i trzy liczby całkowite.
Wypróbuj online!
Wyjaśnienie
[a,'-'][a=='f']
przyjmuje znak wejściowy lub-
, jeśli znak jestf
.'-r'[x/4]+'-w-w'[x/2]+'-x'[x%2]
jest zasadniczo konwersją ósemkową, aby uzyskaćrwx
ciąg.źródło
Perl 5 z
-p
, 37 bajtówPobiera dane pisane małymi literami.
Wypróbuj online!
źródło
Retina 0.8.2 , 43 bajty
Wypróbuj online! Link zawiera przypadki testowe. Wprowadza dane pisane małymi literami. Wyjaśnienie:
Potrójnie każdą cyfrę, z przyrostkiem
r
,w
ix
.Zmień wszystkie niepoprawne litery na
-
s.Usuń pozostałe cyfry.
źródło
Siatkówka , 51 bajtów
Wypróbuj online!
Nie mam pojęcia, jak korzystać z Retina, więc daj mi znać, jak to zrobić lepiej. Pomyślałem, że spróbuję nauczyć się co najmniej jednego języka, który nie jest Pyth.
Wyjaśnienie:
Wymienić
f
z-
(pozostawiającd
il
niezmieniony), następnie zastąpić każdą cyfrę z odpowiedniorwx
.źródło
JavaScript (ES6), 63 bajty
Oczekuje, że ciąg wejściowy pisany małymi literami.
Wypróbuj online!
Skomentował
źródło
Węgiel drzewny , 27 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
źródło
Haskell ,
848381 bajtówWypróbuj online!
Skończyło się, że jest bardzo podobny w koncepcji do odpowiedzi Python 2 na Mnemonic. f tworzy typ pliku, reszta to uprawnienia z liczby ósemkowej. Ten naprawdę sprawił, że marzyłem i był trochę rozmyślny, a operator zawarty w preludium.
źródło
div
zamiastquot
.Java 8, 100 bajtów
Wypróbuj online.
Port odpowiedzi Retina @Neil .
Wyjaśnienie:
źródło
.replaceAll
to wciąż mniej bajtów niż pętla zi.replaceAll
dodanareturn
i tablica ciągów. Ale oczywiście należy się Neilowi , który odpowiada na pytanie Retina, z którego korzystałem jako bazę do portu.Galaretka , 21 bajtów
Pełny program drukujący do STDOUT. (Jako monadyczny link zwracana jest lista zawierająca znak i lista trzech list znaków).
Wypróbuj online! Lub zobacz zestaw testowy .
W jaki sposób?
źródło
Perl 6
-p
, 37 bajtówWypróbuj online!
Rozwiązanie Perla 5 dla Port Hastingsa.
źródło
Siatkówka , 38 bajtów
Zainspirowany komentarzem z ASCII-only .
Wypróbuj online!
Pomysł polega na zamianie każdej cyfry na jednoargumentową (domyślną cyfrą jednoargumentową w Retina
_
) z trzema wiodącymi-
, a następnie konwertowaniem cyfr binarnych z największej na najmniej znaczącą.źródło
Python 3 , 71 bajtów
Wypróbuj online!
Python 3.3+ ma do tego wbudowane, chociaż ze względu na konieczność importu i różnice w oczekiwanym formacie wejściowym nie jest zbyt przyjazny dla golfa.
źródło
Tcl , 139 bajtów
Wypróbuj online!
Tcl , 144 bajty
Wypróbuj online!
Tcl , 149 bajtów
Wypróbuj online!
Tcl , 150 bajtów
Wypróbuj online!
Tcl , 180 bajtów
Wypróbuj online!
Wciąż bardzo nie golfisty!źródło
Java (JDK 10) , 118 bajtów
Wypróbuj online!
Kredyty
źródło
fdl
, można zmienićvar r=s[0]<70?"d":s[0]<72?"-":"l";
, abyvar r=s[0]=='f'?"-":s[0]+"";
zaoszczędzić 6 bajtów. Ponadto,.toCharArray()
można.split("")
zapisać dodatkowe 4 bajty.""+
później usunąć „cast” achar
do aString
);) Dzięki!Excel, 224 bajty
Sporządzono w 4 etapach:
I 3 razy:
Starając się być mądrzejszym, dodaje
25 bytes
za zestaw uprawnień, łącznie 75:źródło
05AB1E ,
3427 bajtówWypróbuj online!
Grał w golfa o 7 bajtów przez @MagicOctopusUrn
źródło
ćls8βbvyi…rwx3*Nèë'-}J'f'-:
za 7 mniej ...f
prostu zastępuję wszystkief
w ostatnim ciągu na-
.i <CODE FOR TRUE> ë <CODE FOR FALSE> }
Python 2 , 238 bajtów
Wypróbuj online!
Zakładałem, że to będzie kropla w wiadrze, ale rzeczywiście się myliłem. Prawdopodobnie powinien był zdać sobie sprawę, że lambda w pewnym momencie nie była najlepszym pomysłem.
źródło
APL + WIN, 55 bajtów
Monity o ciąg wejściowy z małymi literami wiodącymi:
Wyjaśnienie:
źródło
Python 3 , 77 bajtów
Wypróbuj online!
źródło
J ,
5752 bajtów5 bajtów zapisanych dzięki FrownyFrog!
Wypróbuj online!
Jeszcze jedno długie rozwiązanie ... Nie wiem, jak zrobić
}
pracę z czasownikami milczącymi i dlatego użyłem dużo dłużej{"0 1&.|:
do selekcji.Wyjaśnienie:
@}.
Upuść pierwszy symbol i,.&.":
przekonwertować resztę na listę cyfr dziesiętnych]:#:
zamień każdą cyfrę na listę cyfr binarnych (i zamknij widelec)('-',:'rwx')
tworzy tabelę 2-rzędową i użyj 0, aby wybrać z pierwszego wiersza / 1 - z drugiego wiersza{"0 1&.|:~
używa cyfr binarnych, aby wybrać z powyższej tabeli[:,
spłaszcza wynik('d-l'{~'DFL'i.{.)
formatuje pierwszy symbol,
dołącza symbol fisrt do listy uprawnieńźródło
1#:@}."."0
('d-l'{~'DFL'i.{.)
→-&.('-DLld'i.{.)
i.
i&.
wielkie dzięki! Nawiasem mówiąc, czy możesz mi wyjaśnić, jak używać wyboru}
w milczących czasownikach?2 2 2&#:`('-',:'rwx'"_)}@"."0@}.
ma dokładnie taką samą długość333
:)PHP, 68 bajtów
przekłada
f
się małymi wejście do podkreślenia i każdej liczby ósemkowej na jejrwx
równowartość, za pomocą podkreślenia zamiast kreski (zapisać potrzebę cudzysłowów), a następnie zastępuje_
się-
.Uruchom jako potok z
-nF
lub spróbuj online .źródło
C (gcc) ,
109104 bajtówPrzynajmniej C może konwertować dane ósemkowe .... :-)
Edycja: Zdałem sobie sprawę, że modyfikator rozmiaru nie był bezwzględnie wymagany i
putchar()
jest krótszy niżprintf()
w tym przypadku!Wypróbuj online!
Oryginalny:
Wypróbuj online!
źródło