Chmod kodunu çözmek


26

Meydan okuma

Üç basamaklı sekizli izin sayısı verildiğinde, verdiği izinleri çıkar.

chmod

UNIX OS'de dosya izinleri chmodkomut kullanılarak değiştirilir . Chmod'u kullanmanın birkaç farklı yolu vardır, ancak bugün odaklanacağımız şey sekizli izinleri kullanmaktır.

İzin numarasındaki üç rakam farklı bir kişiyi temsil eder:

  • İlk hane, kullanıcının izinlerini temsil eder.
  • İkinci hane grup için izinleri temsil eder.
  • Son hane diğerleri için izinleri temsil eder.

Daha sonra, her hane aşağıda gösterilen şekilde bir izni temsil eder:

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

Giriş

Giriş, dize olarak üç basamaklı sayı olacaktır, örneğin:

133

veya

007

Bu, STDIN veya fonksiyon argümanları aracılığıyla iletilecektir.

Çıktı

Çıktınız, her bir kullanıcı, grup ve diğerleri için farklı izinler olmalıdır. Bu bilgileri şöyle göstermelisiniz:

User:   ddd
Group:  ddd
Others: ddd

Sonra üç boşluk, sonra Useriki boşluk Groupve sonra bir boşluk Others. dddİzin bilgileriyle değiştiriyorsunuz .

Çıktınız STDOUT'a veya döndürülmüş bir dize olarak olabilir.

Örnekler

Giriş: 666

Çıktı:

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

Giriş: 042

Çıktı:

User:   None
Group:  Read only
Others: Write only

Giriş: 644

Çıktı:

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

Kazanan

Bayt cinsinden en kısa kod kazanır.


Girişin özellikleri nelerdir?
Jonathan Allan,

@JonathanAllan Sadece üç haneli numara
Beta Decay

Sadece ondalık bir tamsayı olarak kastediyorsunuz, yani 042, 42 olarak mı alınacak?
Jonathan Allan,

2
@Jonathan Hayır, bu bir karakter girişidir, yani 042
Beta Decay

1
Çıktı sekme karakteriyle doğru görünüyor, öyleyse neden kullanmıyorsunuz? Sadece bir dize doldurmak için daha fazla bayt gerektiren ceza dilleri için?
Titus,

Yanıtlar:


3

05AB1E , 89 87 bayt

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

Cthulhu kodlamasını çağırır . CP-1252 kodlamasını kullanır . Çevrimiçi deneyin!


14

Javascript (ES6), 165 161 bayt

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`
`

Düzenleme: +1 bayt "sekme yok" kuralını yerine getirmek için

Örnekler

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"));


Diziyi yeniden düzenleyerek bir kaç bayt kazanabilirsiniz (ve sayıları dizgilerden ayırabiliriz). Fikir için +1.
Titus,

@Titus - Bazı baytları kaydeden bir düzenleme göremediğimi itiraf ediyorum. Ayrıca, sayıların dizge olarak ele alınması gerekir, böylece replace()zorlamadan üzerlerinde çalışırlar. Ama amacını özlüyorum.
Arnauld,

@Titus - 'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)İşe yarayabilir gibi bir şey . Aklında olan bu muydu?
Arnauld,

Onları yanlış anlıyordum; Sekizlik değerleri olduklarını düşündüm. :) Ama yeni fikrin de fena değil.
Titus,

Challenge çıktısı, halihazırda yazıldığı gibi sekmeler yerine boşluklar gerektirir.
Mwr247

13

GNU sed, 187 163 158 (157 + 1) bayt

-R (ERE regexp) ile çalıştırın . Dosyada izleyen satır yok.

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

Güzel bir yaklaşım ama sen eklerken basamak kaldırarak 20 bayt hakkında kaydedebilir andveya only.
Neil

@ Neil orada :) çok önemli bir tasarruf için önerinizi dahil.
FireFly

1
İlk satır sadece olabilir: s/(.)(.)/User: \1\nGroup: \2\nOthers: /. Biraz daha bayt vardır Perl, için taşıma tarafından kaydedilmiş olabilir \dve \K.
ninjalj

@ ninjalj iyi nokta. Perl'i tanımadığım için baştan başa çıkacağım ve eminim, onu daha da kısaltmak için başka hileler olacağından eminim, s /// değiştirmelerin dışında.
FireFly

6

C # 214 Bayt

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']}";}

6

Jöle , 100 91 85 bayt

Neredeyse kesinlikle golf - 91 byte, ne ?! 8 ay 6 bilgelik bayt!
- 1. daha fazla string sıkıştırma;
- 2. endeksleme modüler olduğu için ordinal azalmayı 48 oranında kaldırın;
- 3. daha iyi yapışma zincirleme kullanın).

-9 bayt benim için @Lynn çalışan dize sıkıştırma tür yardımı ile

,“£ɱ~»
Ñ
ṖK,“ and”,Ṫ
LĿK
7RBUT€Uị“ØJƓ“¥Ị£“¤/¡»Ç€“¡*g»ṭ
“ṖŒhJ"ỵd¡»ḲðJ4_⁶ẋ⁸,"j€”:ż⁹Oị¢¤Y

TryItOnline'da test edin

Nasıl?

,“£ɱ~» - 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

Octave, 185 bayt

@(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})

Girdiyi dizge olarak alan anonim bir işlev oluşturun: '042'. Bir diziye dönüştürmek: (56-'042)' = [0 4 2]. Bunu, hücre dizisini dizine eklemek için çoklu hücre endeksleri olarak kullanın Read Write and Execute','Read and Write', .... Kullanımları fprintfçıkışına uygun kategoriler ile üç dizeleri,: User:, Group:ve Others:.

Dükkana bir yol bulmak çalıştı Execute, Write, Readgerekli, ancak bu naif bir yaklaşım daha uzun olduğu ortaya çıktı ayrı kelimeler ve BİRLEŞTİR olarak.

Örnekler:

1> f('000')
User:   None
Group:  None
Others: None
2> f('042')
User:   None
Group:  Read only
Others: Write only

Çevrimiçi deneyin.


2
strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')Değişmez hücre dizisi yerine birkaç byte tasarruf edebilirsiniz
Luis Mendo

4

PowerShell v2 +, 189 168 bayt

[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]]}

Giriş boyunca Döngüler $args[0]bir şekilde char-array. İle bir diziye her yineleme, dizine $i++(varsayılan 0seçmek için) User, Groupya da Others, CONCATENATE bir kolon ve bir sekme, birleştirilecek olan başka bir dizi indeksi o.

İşte sihir. Bir dizi dizisi olarak uygun ifadeyi seçerek, dolaylı charolarak bir a intve çıkartır 48(yani, ASCII 48( "0") 'yi çevirerek ) . Bu dizi daha sonra dizinin içindeki dizin olarak kullanılır . Varsayılan (Çıktı Alan Ayırıcı) bir boşluk olduğundan, bu, dizilendirildiğinde (sola bittiğinde gerçekleşen) dizi öğeleri arasına doğru şekilde boşluk ekler.0int'None','Read','Write','Execute','only','and'$ofs

Bu üç dizge boru hattında bırakılır ve örtülü yoluyla çıktı Write-Outputprogram tamamlandığında gerçekleşir.

Örnek

PS C:\Tools\Scripts\golfing> .\decode-the-chmod.ps1 '123'
User:   Execute only
Group:  Write only
Others: Write and Execute

3

Straw , 193 bayt

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

Çevrimiçi deneyin

İlk yığındaki bir dönüşüm tablosuna 3 kez basın, ikinci yığına geçin, konuşma tablosunu kullanarak her numarayı dönüştürün ve yazdırın.


2

Haskell, 186 Bayt

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

Örnek:

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

Sadece Prelude kullanılır. Bunu doğru yapıyorum mu?

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

2

Python 2, 190 185 bayt

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])]

Eğer Yürüt ya da Yaz satırın sonundaysa boşluk bırakıyor ancak buna izin verilmediğini görmedim.

EDIT Aralığı (3) 0,1,2 olarak değiştirerek ve Linux dizüstü bilgisayarımda Windows bir yerine (\ n = \ r \ n veya başka bir şekilde yuvarlak olan bayt sayısını kontrol ederek 5 bayt kaydetti).


2

Python 2, 240 239 238 237 228 bayt

Sonunda bu soğuk golf olayını başarabileceğimi düşündüm. Umarım takip eden boşluk bırakılabilir. (sabit ve işlem sırasında bir bayt kaydedildi)

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'ye hoş geldiniz ve güzel bir cevap!
ETHproductions

Python 2 cevabımdaki (3) aralığını, kodunuzu okuduktan sonra 0,1,2 olarak değiştirdim. Güzel cevap +1
ElPedro

2

PHP, 169 159 bayt

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]," ";}

: komut satırı argümanı olarak dize alır php -r '<code>' <argument>,
bir arka birinin yerine gelen yeni satır basar

Jörg'e böceklerimi gösterdiği için - ve \t.

PHP, 169 bayt

yeni kısıtlama ile: (sekme karakteri yasak)

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];}

Bu, gerekebileceği str_padek boşluk nedeniyle , 1 bayttan daha kısa .

Yıkmak

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
}

Diziyi oluşturmak için şunu $nkullanı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,";}

1
foreach ([ 'Kullanıcı', 'Grup', 'Diğer'] $ i => $ u) {echo "\\ n u $: \\ t"; bazı baytları kaydeder ve 3,4,6 olan çıktı yanlıştır
Jörg Hülsermann 13:16

1
Bu doğru sipariş [5,33,34,66,35,67,131,531] güzel fikir
Jörg Hülsermann 13:16

'Kullanıcı'yı exmple için' Kullanıcı 'olarak unutmuşum JavaScript'i yenmek istediğiniz sonraki 6 baytı kaydeder
Jörg Hülsermann 13:16

@ JörgHülsermann: Yine de "\ t" yi almak üzereydim; Teşekkürler. Bunun için +1 :) İyi göz 33!
Titus,

1
346 için çıktımız Kullanıcı: Okuma ve Yazma Grubu: Yalnızca Yürüt Diğerleri: Yazma ve Yürütme
İşlemi

2

bash - 221 213 bayt

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]}";}

Bunun daha da yoğunlaşıp yoğunlaşmayacağı belli değil, en azından buradaki yaklaşımı temelden değiştirmeden (girişi ayırma ${b}ve ilgili dizeleri tutan diziye bir indeks olarak kullanma ).


1
\ onlyGenişletilmiş satır içi ile daha kısa . grep -o .<<<$1daha kısa echo $1|grep -o ., ancak stdin'den girişi okumak while read -n1 cdaha iyidir. Dizi dizinleri bash'de aritmetik bağlamlara sahip, bu yüzden ${l[z++]}işe yarıyor. lerişilebilecek bir dize olarak daha kısa olacaktır ${l:z++*8:8}(ofset ve uzunluk aritmetik bağlamdadır). Tüm modun okunması, c"Kullanıcı:", ... satır içi genişletilmesi ve parametre genişletmelerinin makul şekilde kullanılmasıyla başka bir bayt değiştirilebilir .
ninjalj

1
Bunun bir sonucu için: 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 yerine literal newlines).
ninjalj

1

Java 7, 300 284 bayt

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";}

Şimdilik doğrudan yaklaşım. Kelimeleri tekrar kullanmak için daha genel bir yaklaşım bulmaya çalışacağız.

Ungolfed ve test durumları:

Burada dene.

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"));
  }
}

Çıktı:

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 bayt

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])
  }
}

1

Mathematica, 211 bayt

{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}&

Basit bir uygulama (muhtemelen kolayca dövülebilir): hiçbir şeyi hesaplamaz, sadece her bir çıktının kodlarını yazar. Giriş bir tamsayıdır; her satırı sonda bir boşluk ve sonda da yeni bir satır çıkarır.

IntegerDigits[#,10,3]girişin üç basamağını verir (başında sıfır olsa bile). Her basamak "işlev" argümanını gösterir

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

0 fonksiyon ismini gösterir. ""<>Listedeki tüm dizeleri birleştirir "\n"&~Array~3üç yeni satır üretir.


Python 2 cevabımın aynı değişken isimlerini kullanıyor olsanız bile sizinkiyle neredeyse aynı olduğunu fark ettim. Dürüst olmak gerekirse, göndermeden önce seninkini görmemiştim!
ElPedro

1
telaşa gerek yok! Değişken isimlerinin eşleşmesinin bu durumda beklenebileceğini düşünüyorum :)
Greg Martin

Sanırım haklısın. Değişken isimleri biraz tahmin edilebilirdi ☺
ElPedro 14:16

btw, +1 çünkü aynı şekilde düşünüyoruz :-)
ElPedro

1
btw, Mathematica'yı tanımıyorum ama boşluğu "sadece" dan kaldırarak bir bayt kaybedebileceğinizi düşünüyorum. Her zaman bir satırın sonunda olacaktır, bu nedenle sonda bir yere ihtiyaç duymaz.
ElPedro

1

Java 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;
  }

Çıktı:

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 bayt

(tüm Python 3.x üzerinde çalışması gerekir)

Yani giriş burada STDIN açık (bir ithalat ☺ kaydeder).

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")

Dürbünleri kullanmak, mümkünse boşluk bırakmak ve normalde niyetlerinizi netleştirmek için parantez koyacağınız operatör önceliği.

Örnek kullanım:

$ 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

Toplu iş, 280 bayt

@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

Telleri kodlamak, bir araya getirmeye çalışmaktan 47 bayt daha kısaydı. Sekmeler yasal olsaydı 267 bayt olurdu.


1

C # 307 241 210 bayt

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])));}

biçimlendirilmiş

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])));
}

1

C #, 322 337 348 bayt

Bu kesinlikle en kısa sürüm değil, ancak chmoddeğerler aslında bit bayrakları olduğu için bu sorunu bitsel operatörler kullanarak çözmeye çalıştım . Ayrıca C # muhtemelen en iyi golf dili değil: 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')));}

ungolfed: (yorumlarla)

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
}

Bu benim ilk kez golf oynamak kodum, bu yüzden yanlış bir şey yaparsam lütfen söyle :)

EDIT 1:

Değiştirerek bazı bayt Kaydedilen s[i]-'0'tarafından s[i]&7(en sonunda) ve değişken içine liste sayımı tasarrufu:

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)));}

EDIT 2:

Lamda ifadesine değiştirildi:

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 bayt

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]]}

Dada sayesinde 20 byte kurtarıldı!


3
Yanılıyor olabilirim, ama diziniz tam tersi olmamalı mı? Eğer b ("000")
Dada

Ve eminim bu daha çok golf oynayabilir. Örneğin, bir 191 bayt sürümü: 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]]}.
Dada

1

Visual Basic, 606 Bayt

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

1
PPCG'ye Hoşgeldiniz! Güzel ilk cevap BTW :)
Beta Decay

1

Kristal, 200 194 Bayt

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

Verilen bir sekizlik dizinin sonuç dizgisini dizge olarak döndürür. örneğin: m("670"): için sonuçlar User: Read and Write\nGroup: Read Write and Execute\nOthers: None.

Çevrimiçi deneyin .


0

C #, 371 bayt

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
Bu kod golf, kodunuzu golf oynamanız gerekiyor. Ayrıca, dilin ve bayt adının adını içeren bir başlık ekleyin.
TuxCrafting 13:06

Bayt sayısını ekledim, ki bu senin skorun. Puanınızı kazanmak için mümkün olduğunca düşük puan almanız gerekiyor
Beta Decay

Örneğin, her bir işlevdeki gereksiz tüm boşluklardan kurtulursunuz
Beta Decay

1
@BetaDecay Teşekkürler, bu toplulukta yeniyim ve bunun yerine daha fazla sıkıştırma koduna yol açabilecek php kullanmam daha iyi olur.
Alireza Tabatabae,

1
@Alireza Bu iyi bir fikir. Her ne kadar bu sitede Java ve C # :) kısa cevaplarını görmek istiyoruz
Beta Decay

0

Python 3,5 - 370 294 243 bayt

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])

Boyut kontrolü:

$ 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])

Örnek çıktı:

$ 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

Bu kazanan kriterler için ciddi bir rakip değil. Kazanan kriterler için puanlarını optimize etmek için ciddi bir girişimde bulunmak için tüm cevapları istiyoruz (örneğin, bunun gibi kod golf zorluklarında, başvuruların programın bayt sayısını minimize etmek için ciddi bir girişimde bulunması gerekir).
Mego

Kaldırarak import sysve sadece programı anonim bir işlev yaparak ( lambda o:...) epeyce bayt kaydedebilirsiniz .
NoOneIsHere

0

F #, 204 203 Bayt

Benim ilk golf, böylece herhangi bir hata affet gerekmez;)
1 tabanlı golfed sürümü (: 1 pinkfloydx33 cevabı ):

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

Ungolfed versiyonu:

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

Örnek kullanım:

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

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


Bu sadece pinkfloydx33'ün cevabını 'iyileştirip iyileştiremeyeceğimi' kontrol etmek içindir - algoritma için herhangi bir kredi almıyorum


0

PHP, 199 Bayt

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 Bayt

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);}

Hey, sekmeler yerine boşluk kullanmalısınız
Beta Decay

Bu durumda str_repeat ("", 3- $ i) veya str_pad ("", 3- $ i, "") gibi görünüyor ama benim fikrim önemli değil, kazanma şansım yok. başka bir alan cs.tut.fi/~jkorpela/chars/spaces.html
Jörg Hülsermann

1
Kaydetmek için 13 + 34 bayt. Uzun versiyonda: (-9) echo str_pad("$u:",8)yerine kullanın echo"$u:".str_repeat(" ",3-$i); bu $i=>kullanılmaz hale gelir (-4). Kullanım: Her iki versiyonun da $a[$z-1]="and $a[$z-1]";yerine {$a[]=$a[$z-1];$a[$z-1]="and";}(-7) ve else$a[]=$a?Only:None;yerine elseif($z<1)$a[]=None;else$a[]=Only;(-14). Dönüş if(1<$z=count($a))$a[$z-1]="and $a[$z-1]";else$a[]=$a?Only:None;halinde if($x=array_pop($a))$a[]=$a?"and $x":"$x Only";else$a[]=None;(-3) ve bu daha sonra $a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None;(-10)
Titus

@Titus echo str_pad ("$ u:", 8), $ a [$ z-1] = "ve $ a [$ z-1]" ;, else $ a [] = $ a? Only: None; $ İ => bitti Yapamam, sonra $ m = $ argv [1] [$ i] gereklidir. Gerisi için önce başka bir yol denerdim. Girişi için Teşekkür
Jörg Hülsermann

1
Daha fazla fikir: if(4&$m=$argv[1][$i])yerine $m=$argv[1][$i];if(4&$m)(-3) OR yerine $m=;if();if();if();bir halka ile: foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;(-7)
Titus

0

Python 3, 191 bayt

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'ye Hoşgeldiniz! güzel ilk mesaj!
Rɪᴋᴇʀ

Hmm, moderatörün sadece 191: D'yi aldığımda 151 byte aldığını merak ediyorum. Düzenlemeleri kontrol et
Aleksandr Smirnov

O bendim, üzgünüm. Düzenlemeye yazdım. Şimdi düzeltildi.
Rɪᴋᴇʀ

0

Javascript (ES6), 159 bayt

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]]

Örnek:

(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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.