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ą chmod
polecenia. 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 Group
i jedna spacja po Others
. Wymieniając ddd
z 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.
Odpowiedzi:
05AB1E ,
8987 bajtówPrzywołuje kodowanie Cthulhu .Wykorzystuje kodowanie CP-1252 . Wypróbuj online!źródło
JavaScript (ES6),
165161 bajtówEdycja: bajt +1, aby spełnić zasadę „brak karty”
Przykłady
źródło
replace()
działały na nich bez wymuszania. Ale może mi brakować twojej racji.'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)
może działać. Czy o to ci chodziło?GNU sed,
187 163158 (157 + 1) bajtówUruchom z -r (wyrażenie regularne ERE). Plik nie zawiera końcowego nowego wiersza.
źródło
and
lubonly
.s/(.)(.)/User: \1\nGroup: \2\nOthers: /
. Więcej bajtów można zaoszczędzić przez przeniesienie do Perla, który ma\d
i\K
.C # 214 bajtów
źródło
Galaretka ,
100 9185 bajtówPrawie 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
Przetestuj w TryItOnline
W jaki sposób?
źródło
Oktawa, 185 bajtów
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órekRead Write and Execute','Read and Write', ...
. Zastosowaniafprintf
do produkcji trzy struny, przy odpowiednich kategoriach:User:
,Group:
iOthers:
.Próbowałem znaleźć drogę do sklepu
Execute
,Write
,Read
jako oddzielne słów i Złącz, w miarę potrzeb, ale okazało się dłużej niż naiwnego podejścia.Przykłady:
Wypróbuj online.
źródło
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órekPowerShell v2 +,
189168 bajtówPętle przechodzą przez dane wejściowe
$args[0]
jakochar
tablice. Każdej iteracji wskaźnik, do tablicy z$i++
(domyślnie0
), aby zaznaczyćUser
,Group
lubOthers
, połączyć go z okrężnicy, oraz zakładkę, i połączyć go z innym indeksem macierzy.Oto magia. Mamy niejawnie rzucać
char
doint
i odejmować48
(czyli obracając ASCII48
("0"
) do0
), wybierając odpowiednią treść w postaci tablicyint
s. 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-Output
miejsce po zakończeniu programu.Przykład
źródło
Słoma , 193 bajtów
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.
źródło
Haskell, 186 bajtów
Przykład:
Wykorzystano tylko Preludium. Czy robię to dobrze?
Nie golfowany:
źródło
Python 2,
190185 bajtówPozostawia 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).
źródło
Python 2,
240239238237228 bajtówMyś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)źródło
PHP,
169159 bajtówprzyjmuje 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)
Jest to 1 bajt krótszy niż w przypadku
str_pad
, ponieważ wymagałby dodatkowego pustego miejsca.awaria
Aby utworzyć tablicę
$n
, użyj tego:źródło
33
!bash -
221213 bajtówGNU bash, version 4.3.46
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).źródło
\ only
rozszerzonym wbudowanym.grep -o .<<<$1
jest krótszy niżecho $1|grep -o .
, alewhile read -n1 c
lepszy jest odczyt danych wejściowych ze standardowego wejścia . Indeksy tablic mają kontekst arytmetyczny w bash, więc${l[z++]}
działa.l
był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 trybc
, rozwijając „Użytkownik:”,… w linii i rozsądnie wykorzystując rozszerzenia parametrów.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).Java 7,
300284 bajtówBezpoś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.
Wydajność:
źródło
Groovy,
217207205 bajtówbez golfa:
źródło
Mathematica, 211 bajtów
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”0 oznacza samą nazwę funkcji.
""<>
łączy wszystkie ciągi z listy (list)."\n"&~Array~3
produkuje trzy nowe linie.źródło
Java 7, 278
Gra w golfa:
Nie golfowany:
Wydajność:
źródło
Python 3.5, 3.6 -
235232228216 bajtów(powinien działać na wszystkich Python 3.x)
Więc dane wejściowe znajdują się tutaj na STDIN (zapisuje import ☺).
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:
Bez golfa:
źródło
Partia, 280 bajtów
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.
źródło
C #
307241210 bajtówstring 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
źródło
C #, 322
337 348bajtówZ pewnością nie jest to najkrótsza wersja, ale próbowałem rozwiązać ten problem za pomocą operatorów bitowych, ponieważ
chmod
wartości są w rzeczywistości flagami bitowymi. Również C # nie jest prawdopodobnie najlepszym językiem golfowym: Dbez golfa: (z komentarzami)
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'
jes[i]&7
(na samym końcu) i zapisując listę liczników do zmiennej:EDYCJA 2:
Zmieniono na wyrażenie lambda:
źródło
JavaScript,
213209208188186 bajtówZaoszczędzono 20 bajtów dzięki Dadzie!
źródło
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 bajtów
źródło
Kryształ,
200194 bajtówzwraca 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 .
źródło
C #, 371 bajtów
źródło
Python 3.5 -
370294243 bajtówGra w golfa:
Kontrola rozmiaru:
Bez golfa:
Przykładowe dane wyjściowe:
źródło
import sys
i czyniąc program anonimową funkcją (lambda o:
...).F #,
204203 bajtówmój pierwszy golf, więc proszę wybacz wszelkie błędy;)
Wersja w golfa (oparta 1: 1 na odpowiedzi pinkfloydx33 ):
Wersja bez golfa:
Przykładowe użycie:
Służy to wyłącznie sprawdzeniu, czy mógłbym „poprawić” odpowiedź pinkfloydx33 - nie przypisuję sobie żadnego algorytmu
źródło
PHP, 199 bajtów
PHP, 189 bajtów z \ t
źródło
echo str_pad("$u:",8)
zamiastecho"$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) ielse$a[]=$a?Only:None;
zamiastelseif($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;
wif($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)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)Python 3, 191 bajtów
bez golfa
źródło
JavaScript (ES6), 159 bajtów
Przykład:
źródło