Tantangan
Diberi nomor izin oktal tiga digit, keluarkan izin yang diberikannya.
chmod
Pada UNIX OS, izin file diubah menggunakan chmod
perintah. Ada beberapa cara menggunakan chmod, tetapi cara yang akan kita fokuskan hari ini adalah menggunakan izin oktal.
Tiga digit dalam nomor izin mewakili orang yang berbeda:
- Digit pertama mewakili izin untuk pengguna
- Digit kedua mewakili izin untuk grup
- Digit terakhir mewakili izin untuk orang lain
Selanjutnya, setiap digit mewakili izin seperti yang ditunjukkan di bawah ini di:
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
Memasukkan
Input akan berupa angka tiga digit sebagai string, misalnya:
133
atau
007
Ini akan diteruskan baik melalui STDIN atau melalui argumen fungsi.
Keluaran
Output Anda haruslah izin yang berbeda untuk masing-masing pengguna, grup, dan yang lainnya. Anda harus menampilkan informasi ini seperti:
User: ddd
Group: ddd
Others: ddd
Di mana ada tiga spasi setelahnya User
, dua spasi setelah Group
dan satu spasi sesudahnya Others
. Anda ganti ddd
dengan informasi izin.
Output Anda mungkin ke STDOUT atau sebagai string yang dikembalikan.
Contohnya
Input: 666
Keluaran:
User: Read and Write
Group: Read and Write
Others: Read and Write
Input: 042
Keluaran:
User: None
Group: Read only
Others: Write only
Input: 644
Keluaran:
User: Read and Write
Group: Read only
Others: Read only
Kemenangan
Kode terpendek dalam byte menang.
Jawaban:
05AB1E ,
8987 byteMemanggil penyandian Cthulhu .Menggunakan pengkodean CP-1252 . Cobalah online!sumber
Javascript (ES6),
165161 byteSunting: +1 byte untuk memenuhi aturan "no tab"
Contohnya
sumber
replace()
bekerja pada mereka tanpa paksaan. Tapi saya mungkin kehilangan poin Anda.'User3Group68Others58None576Read48Write476Execute475and4576only'.split(/(\d+)/)
mungkin bekerja. Apakah itu yang ada dalam pikiran Anda?GNU sed,
187 163158 bytes (157 +1) byteJalankan dengan -r (ERE regexp). File tidak mengandung baris baru.
sumber
and
atauonly
.s/(.)(.)/User: \1\nGroup: \2\nOthers: /
. Beberapa byte lagi dapat disimpan dengan porting ke Perl, yang memiliki\d
dan\K
.C # 214 Bytes
sumber
Jelly ,
100 9185 byteHampir pasti golf - 91 byte, apa ?!8 bulan dan 6 byte kebijaksanaan!- 1. lebih banyak kompresi string;
- 2. menghapus penurunan post-ordinal sebanyak 48 karena pengindeksan bersifat modular;
- 3. gunakan chaining diam-diam lebih baik).
-9 byte dengan bantuan jenis @Lynn menjalankan kompresi string untuk saya
Uji di TryItOnline
Bagaimana?
sumber
Oktaf, 185 byte
Buat fungsi anonim yang mengambil input sebagai string: '042'. Dikonversi ke array:
(56-'042)' = [0 4 2]
. Gunakan ini sebagai beberapa indeks sel untuk mengindeks array selRead Write and Execute','Read and Write', ...
. Penggunaanfprintf
untuk output tiga senar, dengan kategori yang sesuai:User:
,Group:
danOthers:
.Saya mencoba menemukan cara untuk menyimpan
Execute
,Write
,Read
sebagai kata-kata dan concatenate terpisah sesuai kebutuhan, tapi ini ternyata lebih lama dari pendekatan naif.Contoh:
Cobalah online.
sumber
strsplit('Read Write and Execute*Read and Write*Read and Execute*Read only*Write and Execute*Write only*Execute only*None','*')
alih-alih literal array selPowerShell v2 +,
189168 byteLoop melalui input
$args[0]
sebagaichar
-array. Setiap iterasi, kami indeks ke array dengan$i++
(default0
) untuk memilihUser
,Group
atauOthers
, concatenate yang dengan usus besar dan tab, dan concatenate bahwa dengan indeks array yang lain.Ini keajaibannya. Kami secara implisit melemparkan
char
keint
dan kurangi48
(yaitu, mengubah ASCII48
("0"
) menjadi0
), memilih kata-kata yang tepat sebagai array dariint
s. Array itu kemudian digunakan sebagai indeks ke dalam'None','Read','Write','Execute','only','and'
array. Karena default$ofs
(Output Field Separator) adalah spasi, ini dengan benar menyisipkan spasi di antara elemen-elemen array ketika dirangkai (yang terjadi ketika digabungkan ke kiri).Tiga string ini ditinggalkan di jalur pipa, dan output melalui implisit
Write-Output
terjadi pada penyelesaian program.Contoh
sumber
Sedotan , 193 byte
Cobalah online
Tekan 3 kali tabel konversi pada tumpukan pertama, beralih ke tumpukan kedua, konversi setiap nomor menggunakan tabel percakapan dan cetak.
sumber
Haskell, 186 Bytes
Contoh:
Hanya Prelude yang digunakan. Apakah saya melakukan ini dengan benar?
Tidak Disatukan:
sumber
Python 2,
190185 byteMeninggalkan ruang tambahan jika Jalankan atau Tulis ada di akhir baris tetapi saya tidak melihat bahwa ini tidak diizinkan.
EDIT Menyimpan 5 byte dengan mengubah rentang (3) menjadi 0,1,2 dan memeriksa jumlah byte pada laptop Linux saya, bukan pada Windows saya (\ n = \ r \ n atau sebaliknya. Saya tidak pernah dapat mengingat yang mana).
sumber
Python 2,
240239238237228 byteSaya pikir saya akhirnya akan mencoba golf yang dingin ini.
Semoga trailing whitespace diizinkan.(diperbaiki, dan dalam proses menyimpan byte)sumber
PHP,
169159 bytemengambil string sebagai argumen baris perintah:
php -r '<code>' <argument>
,mencetak baris baru terkemuka bukan satu membuntuti
Terima kasih kepada Jörg karena menunjukkan bug saya - dan untuk
\t
.PHP, 169 byte
dengan batasan baru: (karakter tab dilarang)
Ini lebih pendek 1 byte daripada dengan
str_pad
, karena tambahan kosong yang diperlukan.kerusakan
Untuk membuat array
$n
, gunakan ini:sumber
33
!pesta -
221213 byteGNU bash, version 4.3.46
Tidak jelas apakah ini dapat dipadatkan lebih lanjut, setidaknya bukan tanpa secara mendasar mengubah pendekatan di sini (memisahkan input dan menggunakannya sebagai indeks ke array
${b}
yang menyimpan string yang sesuai).sumber
\ only
inline yang diperluas.grep -o .<<<$1
lebih pendek dariecho $1|grep -o .
, tetapi membaca input dari stdin denganwhile read -n1 c
lebih baik. Indeks array memiliki konteks aritmatika dalam bash, jadi${l[z++]}
berfungsi.l
akan lebih pendek sebagai string, yang akan diakses sebagai${l:z++*8:8}
(offset dan panjang memiliki konteks aritmethic). Byte lain dapat ditambahkan dengan membaca seluruh mode dalamc
, memperluas "Pengguna:", ... sebaris dan memanfaatkan secara bijaksana ekspansi parameter.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}]}"
(ganti \ n dengan baris baru literal).Java 7,
300284 bytePendekatan langsung untuk saat ini. Akan mencoba memunculkan pendekatan yang lebih umum untuk menggunakan kembali kata-kata.
Kasus yang tidak disatukan & uji:
Coba di sini.
Keluaran:
sumber
Groovy,
217207205 byteungolfed:
sumber
Mathematica, 211 byte
Implementasi langsung (mungkin mudah dikalahkan): tidak menghitung apa pun, hanya kode-keras setiap output yang mungkin. Input adalah bilangan bulat; output setiap baris dengan spasi tambahan, dan baris baru tambahan secara keseluruhan.
IntegerDigits[#,10,3]
memberikan tiga digit input (bahkan jika ada nol di depan). Setiap digit menunjukkan argumen dari "fungsi"dengan 0 menunjukkan nama fungsi itu sendiri.
""<>
merangkai semua string dalam daftar (daftar)."\n"&~Array~3
menghasilkan tiga baris baru.sumber
Java 7, 278
Golf:
Tidak Disatukan:
Keluaran:
sumber
Python 3.5, 3.6 -
235232228216 byte(harus bekerja pada semua Python 3.x)
Jadi inputnya ada di STDIN di sini (menyimpan impor ☺).
Memanfaatkan tuple, menghilangkan spasi di mana mungkin dan prioritas operator di mana Anda biasanya meletakkan tanda kurung untuk memperjelas niat Anda.
Penggunaan sampel:
Tidak golf:
sumber
Batch, 280 byte
Hardcoding string adalah 47 byte lebih pendek daripada mencoba untuk menyatukannya. Akan menjadi 267 byte jika tab legal.
sumber
C #
307241210 bytestring 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])));}
Diformat
sumber
C #, 322
337 348byteItu pasti bukan versi terpendek, tapi saya mencoba memecahkan masalah ini menggunakan operator bitwise karena
chmod
nilainya sebenarnya adalah flag bit. Juga C # mungkin bukan bahasa golf terbaik: Dungolfed: (dengan komentar)
Ini adalah golf kode waktu pertama saya, jadi tolong beritahu saya, jika saya melakukan kesalahan :)
EDIT 1:
Menyimpan beberapa byte dengan menggantinya
s[i]-'0'
dengans[i]&7
(di bagian paling akhir) dan menyimpan daftar menjadi variabel:EDIT 2:
Diubah ke ekspresi lambda:
sumber
Javascript,
213209208188186 bytesDisimpan 20 byte berkat Dada!
sumber
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
sumber
Crystal,
200194 Bytesmengembalikan string yang dihasilkan untuk urutan oktal tertentu sebagai string. misalnya:
m("670")
hasil untuk:User: Read and Write\nGroup: Read Write and Execute\nOthers: None
.Cobalah online .
sumber
C #, 371 byte
sumber
Python 3.5 -
370294243 byteGolf:
Periksa ukuran:
Tidak golf:
Output sampel:
sumber
import sys
, dan hanya membuat program fungsi anonim (lambda o:
...).F #,
204203 Bytesgolf pertama saya, jadi tolong maafkan kesalahan apa pun;)
Versi golf (berdasarkan 1: 1 pada jawaban pinkfloydx33 ):
Versi ungolfed:
Contoh penggunaan:
Ini semata-mata untuk memeriksa, apakah saya bisa 'meningkatkan' jawaban pinkfloydx33 - Saya tidak menerima kredit apa pun untuk algoritme
sumber
PHP, 199 Bytes
PHP, 189 Bytes dengan \ t
sumber
echo str_pad("$u:",8)
alih-alihecho"$u:".str_repeat(" ",3-$i)
(-9); ini membuat$i=>
usang (-4). Di kedua versi: Gunakan$a[$z-1]="and $a[$z-1]";
bukannya{$a[]=$a[$z-1];$a[$z-1]="and";}
(-7) danelse$a[]=$a?Only:None;
bukannyaelseif($z<1)$a[]=None;else$a[]=Only;
(-14). Berubahif(1<$z=count($a))$a[$z-1]="and $a[$z-1]";else$a[]=$a?Only:None;
menjadiif($x=array_pop($a))$a[]=$a?"and $x":"$x Only";else$a[]=None;
(-3) dan kemudian menjadi$a[]=($x=array_pop($a))?$a?"and $x":"$x Only":None;
(-10)if(4&$m=$argv[1][$i])
alih-alih$m=$argv[1][$i];if(4&$m)
(-3) ATAU ganti$m=;if();if();if();
dengan lingkaran:foreach([Read,Write,Execute]as$k=>$s)if($argv[1][$i]&4>>$k)$a[]=$s;
(-7)Python 3, 191 byte
ungolfed
sumber
Javascript (ES6), 159 byte
Contoh:
sumber