Herausforderung
Geben Sie bei einer dreistelligen oktalen Berechtigungsnummer die erteilten Berechtigungen aus.
chmod
Unter UNIX-Betriebssystemen werden die Dateiberechtigungen mit dem chmod
Befehl geändert . Es gibt nur wenige Möglichkeiten, chmod zu verwenden, aber die, auf die wir uns heute konzentrieren werden, ist die Verwendung von oktalen Berechtigungen.
Die drei Ziffern in der Berechtigungsnummer stehen für eine andere Person:
- Die erste Ziffer steht für die Berechtigungen für die Benutzer an
- Die zweite Ziffer gibt die Berechtigungen für das an Gruppe an
- Die letzte Ziffer gibt die Berechtigungen für andere an
Als nächstes repräsentiert jede Ziffer eine Erlaubnis wie unten gezeigt in:
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
Eingang
Die Eingabe ist die dreistellige Zahl als Zeichenfolge, zB:
133
oder
007
Dies wird entweder über STDIN oder über Funktionsargumente übergeben.
Ausgabe
Ihre Ausgabe sollte die unterschiedlichen Berechtigungen für jeden Benutzer, die Gruppe und die anderen Benutzer sein. Sie müssen diese Informationen folgendermaßen anzeigen:
User: ddd
Group: ddd
Others: ddd
Wo es drei Leerzeichen danach gibt User
, zwei Leerzeichen danach Group
und ein Leerzeichen danach Others
. Sie ersetzen ddd
durch die Berechtigungsinformationen.
Ihre Ausgabe kann in STDOUT oder als zurückgegebener String erfolgen.
Beispiele
Eingabe: 666
Ausgabe:
User: Read and Write
Group: Read and Write
Others: Read and Write
Eingabe: 042
Ausgabe:
User: None
Group: Read only
Others: Write only
Eingabe: 644
Ausgabe:
User: Read and Write
Group: Read only
Others: Read only
Gewinnen
Der kürzeste Code in Bytes gewinnt.
Antworten:
05AB1E ,
8987 BytesBeschwört die Cthulhu- Kodierung.Verwendet die CP-1252- Codierung. Probieren Sie es online!quelle
Javascript (ES6),
165 bis161 ByteBearbeiten: +1 Byte, um die Regel "kein Tabulator" zu erfüllen
Beispiele
quelle
replace()
sie ohne Zwang verarbeitet werden können. Aber ich kann Ihren Punkt verfehlen.'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)
könnte funktionieren. Ist es das, was du im Sinn hattest?GNU sed,
187 163158 (157 + 1) BytesFühren Sie mit -r (ERE regexp) aus. Die Datei enthält keinen nachgestellten Zeilenumbruch.
quelle
and
oder hinzufügenonly
.s/(.)(.)/User: \1\nGroup: \2\nOthers: /
. Weitere Bytes könnten durch Portierung nach Perl eingespart werden, wozu\d
und gehören\K
.C # 214 Bytes
quelle
Jelly ,
100 9185 BytesMit ziemlicher Sicherheit golfen - 91 Bytes, was ?!8 Monate und 6 Weisheitsbytes!- 1. mehr String-Komprimierung;
- 2. Entfernen Sie die post-ordinale Dekrementierung um 48, da die Indizierung modular ist.
- 3. Verwenden Sie eine bessere stillschweigende Verkettung.
-9 Bytes mit der freundlichen Hilfe von @Lynn, die String-Komprimierungen für mich ausführt
Testen Sie es bei TryItOnline
Wie?
quelle
Oktave, 185 Bytes
Erstellen Sie eine anonyme Funktion, die die Eingabe als Zeichenfolge verwendet: '042'. Wandelt es in ein Array:
(56-'042)' = [0 4 2]
. Verwenden Sie dies als mehrere Zellenindizes, um das Zellenarray mit zu indizierenRead Write and Execute','Read and Write', ...
. Anwendungenfprintf
zur Ausgabe der drei Saiten, mit den entsprechenden Kategorien:User:
,Group:
undOthers:
.Ich habe versucht , einen Weg zu finden speichern
Execute
,Write
,Read
um Wörter als separate Wörter und nach Bedarf zu verketten, aber dies stellte sich als länger als der naive Ansatz heraus.Beispiele:
Probieren Sie es online aus.
quelle
strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')
anstelle der Zelle ArrayliteralPowerShell v2 +
189168 ByteDurchläuft die Eingabe
$args[0]
alschar
-array. Jede Iteration wir Index in ein Array mit$i++
(Standardeinstellung0
) auszuwählenUser
,Group
oderOthers
, Verketten dass mit einem Doppelpunkt und einer Lasche und Verketten das mit einem anderen Array - Index.Hier ist die Magie. Wir setzen das implizit
char
in einint
und subtrahieren48
(dh ASCII48
("0"
) in0
), wobei wir den entsprechenden Wortlaut als Array vonint
s auswählen . Dieses Array wird anschließend als Index für das'None','Read','Write','Execute','only','and'
Array verwendet. Seit dem Standard$ofs
(Ausgabefeldtrennzeichen) ein Leerzeichen ist, werden bei der String-Erstellung (dh bei der Verkettung nach links) korrekt Leerzeichen zwischen den Array-Elementen eingefügt.Diese drei Zeichenfolgen verbleiben in der Pipeline und werden implizit ausgegeben
Write-Output
nach Abschluss des Programms .Beispiel
quelle
Stroh , 193 Bytes
Probieren Sie es online aus
Drücken Sie dreimal eine Umrechnungstabelle auf den ersten Stapel, wechseln Sie zum zweiten Stapel, konvertieren Sie jede Zahl mithilfe der Konversationstabelle und drucken Sie sie aus.
quelle
Haskell, 186 Bytes
Beispiel:
Nur Prelude verwendet. Mache ich das richtig?
Ungolfed:
quelle
Python 2,
190 -185 BytesHinterlässt ein Leerzeichen, wenn Execute oder Write am Ende der Zeile stehen, aber ich habe nicht gesehen, dass dies nicht erlaubt ist.
BEARBEITEN 5 Bytes gespart, indem der Bereich (3) auf 0,1,2 geändert und die Anzahl der Bytes auf meinem Linux-Laptop anstelle von Windows überprüft wurde (\ n = \ r \ n oder umgekehrt. Ich kann mich nie erinnern, welche).
quelle
Python 2,
240239238237228 BytesIch dachte, ich würde endlich dieses kalte Golf-Ding ausprobieren.
Es ist hoffentlich erlaubt, Leerzeichen nachzustellen.(behoben und dabei ein Byte gespeichert)quelle
PHP,
169159 Bytesnimmt Zeichenfolge als Zeilenargument Befehl
php -r '<code>' <argument>
,druckt eine führende Newline anstelle eines Hinter ein
Vielen Dank an Jörg für den Hinweis auf meine Fehler - und für die
\t
.PHP, 169 Bytes
mit der neuen Einschränkung: (Tabulatorzeichen verboten)
Dies ist 1 Byte kürzer als bei
str_pad
, da ein zusätzliches Leerzeichen erforderlich wäre.Nervenzusammenbruch
$n
Verwenden Sie Folgendes , um das Array für zu erstellen :quelle
33
!bash -
221213 BytesGNU bash, version 4.3.46
Es ist unklar, ob dies weiter kondensiert werden kann, zumindest nicht, ohne den Ansatz hier grundlegend zu ändern (Eingabe aufteilen und als Index für das Array verwenden
${b}
, das die entsprechenden Zeichenfolgen enthält).quelle
\ only
erweiterter Inline.grep -o .<<<$1
ist kürzer alsecho $1|grep -o .
, aber eswhile read -n1 c
ist besser , die Eingabe von stdin mit zu lesen . Array-Indizes haben einen arithmetischen Kontext in der Bash,${l[z++]}
funktioniert also.l
wäre kürzer als ein String, auf den zugegriffen wird als${l:z++*8:8}
(Offset und Länge haben arithmetischen Kontext). Ein weiteres Byte kann durch Einlesen des gesamten Modusc
, Erweitern von "User:", ... inline und sinnvolle Verwendung von Parametererweiterungen vermieden werden .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}]}"
(Ersetzen Sie \ n durch wörtliche Zeilenumbrüche).Java 7,
300284 BytesDirekte Ansprache vorerst. Ich werde versuchen, einen allgemeineren Ansatz zu finden, um die Wörter wiederzuverwenden.
Ungolfed & Testfälle:
Probieren Sie es hier aus.
Ausgabe:
quelle
Groovy,
217207205 Bytesungolfed:
quelle
Mathematica, 211 Bytes
Eine einfache Implementierung (wahrscheinlich leicht zu schlagen): Berechnet nichts, sondern codiert jede mögliche Ausgabe hart. Die Eingabe ist eine Ganzzahl. Gibt für jede Zeile ein Leerzeichen und für die gesamte Zeile einen Zeilenumbruch aus.
IntegerDigits[#,10,3]
gibt die drei Ziffern der Eingabe an (auch wenn führende Nullen vorhanden sind). Jede Ziffer gibt ein Argument der "Funktion" anwobei 0 den Funktionsnamen selbst angibt.
""<>
Verkettet alle Zeichenfolgen in einer Liste (von Listen)."\n"&~Array~3
produziert die drei Zeilenumbrüche.quelle
Java 7, 278
Golf gespielt:
Ungolfed:
Ausgabe:
quelle
Python 3.5, 3.6 -
235232228216 Bytes(sollte auf allen Python 3.x funktionieren)
Die Eingabe erfolgt hier also über STDIN (speichert einen Import ☺).
Verwenden Sie Tupel, lassen Sie nach Möglichkeit Leerzeichen weg, und setzen Sie die Operatoren in Klammern, um Ihre Absichten zu verdeutlichen.
Beispielnutzung:
Nicht golfen:
quelle
Batch, 280 Bytes
Das Hardcodieren der Zeichenfolgen war 47 Byte kürzer als der Versuch, sie zusammenzufügen. Wäre 267 Bytes gewesen, wenn Tabulatoren legal wären.
quelle
C #
307241210 Bytesstring 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])));}
Formatiert
quelle
C #, 322
337 348BytesDas ist sicher nicht die kürzeste Version, aber ich habe versucht, dieses Problem mit bitweisen Operatoren zu lösen
chmod
Werte tatsächlich Bit-Flags sind. Auch C # ist wahrscheinlich nicht die beste Golfsprache: Dungolfed: (mit Kommentaren)
Dies ist mein erstes Mal Code Golfing, also sag mir bitte, wenn ich etwas falsch gemacht habe :)
EDIT 1:
Einige Bytes wurden durch Ersetzen
s[i]-'0'
durchs[i]&7
(ganz am Ende) und Speichern der Listenzahl in Variable gespeichert :EDIT 2:
Geändert in Lambda-Ausdruck:
quelle
Javascript,
213209208188186 BytesDank Dada 20 Bytes gespart!
quelle
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 Bytes
quelle
Kristall,
200194 BytesGibt die resultierende Zeichenfolge für eine bestimmte Oktalfolge als Zeichenfolge zurück. zB:
m("670")
Ergebnisse an:User: Read and Write\nGroup: Read Write and Execute\nOthers: None
.Probieren Sie es online aus .
quelle
C #, 371 Bytes
quelle
Python 3.5 -
370294243 BytesGolf gespielt:
Größenprüfung:
Nicht golfen:
Beispielausgabe:
quelle
import sys
, indem Sie das Programm entfernen und es zu einer anonymen Funktion machen (lambda o:
...).F #,
204203 Bytesmein erstes Golfspiel, bitte vergib mir alle Fehler;)
Die Golfversion (1: 1 basierend auf der Antwort von pinkfloydx33 ):
Die ungolfed Version:
Anwendungsbeispiel:
Dies ist nur zu überprüfen, ob ich die Antwort von pinkfloydx33 "verbessern" kann - ich nehme keine Anerkennung für den Algorithmus
quelle
PHP, 199 Bytes
PHP, 189 Bytes mit \ t
quelle
echo str_pad("$u:",8)
anstelle vonecho"$u:".str_repeat(" ",3-$i)
(-9); dies macht$i=>
obsolet (-4). In beiden Versionen: Verwenden Sie$a[$z-1]="and $a[$z-1]";
anstelle von{$a[]=$a[$z-1];$a[$z-1]="and";}
(-7) undelse$a[]=$a?Only:None;
anstelle vonelseif($z<1)$a[]=None;else$a[]=Only;
(-14). Biegen Sieif(1<$z=count($a))$a[$z-1]="and $a[$z-1]";else$a[]=$a?Only:None;
inif($x=array_pop($a))$a[]=$a?"and $x":"$x Only";else$a[]=None;
(-3) und dann in$a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None;
(-10)if(4&$m=$argv[1][$i])
anstelle von$m=$argv[1][$i];if(4&$m)
(-3) ODER durch$m=;if();if();if();
eine Schleife ersetzen :foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;
(-7)Python 3, 191 Bytes
ungolfed
quelle
Javascript (ES6), 159 Byte
Beispiel:
quelle