Ini tidak memiliki tanda pound (#) yang diperlukan per output sampel dalam pertanyaan.
Iszi
5
PowerShell: 71 52 51 41
Terima kasih kepada @manatwork karena menunjukkan ForEach-Objectdapat digunakan sebagai ganti forloop.
Terima kasih kepada @ Joey untuk menunjukkan bahwa saya dapat menggunakan -joinpada output loop, daripada harus memasukkannya ke dalam variabel.
Kode golf:
'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
catatan:
Tidak ada kesalahan saat memeriksa input yang tidak valid. Script akan dengan senang hati mengambil 256, 4096, dan 65536 sebagai input, kemudian menghasilkan # 100100010000 (yang jelas tidak akan berfungsi sebagai RGB).
Tidak disatukan, dengan komentar:
# Put a hashtag in front of the output.
'#'+
# Join the nested code into one string.
-join(
# Pipe 1..3 to ForEach-Object to run a loop three times.
1..3|%{
# Take user input and format it as hex, with minimum two digits in output.
"{0:X2}"-f+(read-host)
}
)
Buat loop foreach($i in 1,2,3)untuk menguranginya menjadi 68 karakter.
manatwork
@manatwork Saya tidak berpikir itu sintaks yang tepat untuk foreachdi PowerShell. (Setidaknya, saya belum bisa menjalankan beberapa tes berjalan.) Namun, menggunakan sintaks yang tepat, alias bawaan, dan pintasan PowerShell lain yang baru-baru ini saya temukan, saya pikir saya punya sesuatu yang lebih baik, bercukur. 12 karakter lagi dari saran Anda. (1..3)|%{...}(Sisipkan pernyataan tanda kurung dari skrip yang ada di tempat ellipsis.) Saya masih perlu menguji ini sepenuhnya dalam skrip, tapi terima kasih telah mengarahkan saya ke arah itu!
Iszi
Tidak tahu apakah itu sintaks yang tepat atau tidak, tetapi referensi SS64 untuk foreachmenyebutkannya dan bekerja untuk saya. (Tidak tahu tentang versi. Yang datang dengan Windows 7.)
manatwork
@manatwork Itu menarik. Saya ingin menggali dan mencari tahu apa yang salah dengan kesalahan itu lagi (saya mendapatkan kesalahan "tak terduga 'dalam' ...".) Di lain waktu. Mungkin artikel SS64 ditulis untuk versi PowerShell yang berbeda - Saya tidak yakin. Untuk saat ini, saya telah mengonfirmasi bahwa (1..3)|%berfungsi dan membawa skrip ke 56 karakter. Saya akan mengeditnya menjadi jawabannya, dan pasti akan menghargai Anda untuk ide itu. Terima kasih lagi!
Iszi
2
Oh, sial. Anda bisa mendapatkan ini untuk 41 dengan menggunakan -join: '#'+-join(1..3|%{"{0:X2}"-f+(read-host)}).
Joey
4
bash 22 21 karakter
(Terima kasih @manatwork untuk 1 karakter menggunakan \bukan tanda kutip ganda)
printf \#%02X%02X%02X 12 12 12
#0C0C0C
atau membaca STDIN dalam satu lingkaran: 48 karakter:
Ditambahkan 2015-10-06: bash ( metode yang lebih tidak lazim ) 84 83 karakter
c=({0..9} {a..f}) d=\#;for b;do for a in / %;do d+=${c[$b$a 020]};done;done;echo $d
Saya tahu, bisa jadi 82 karakter jika 020ditulis 16, tetapi saya lebih suka ini ... Atau mungkin d+=${c[$b$a 0x10]}yang merupakan posting pertama.
hexcolor() {
local a b c=({0..9} {a..f}) d=\#
for b ;do
for a in / % ;do
d+=${c[$b$a 0x10]}
done
done
echo $d
}
hexcolor 72 61 139
#483d8b
hexcolor 75 0 130
#4b0082
hexcolor 0 255 127
#00ff7f
Saya suka jawaban ini :) beberapa lagi dan saya pikir saya mungkin akan menyelesaikan ini jika tidak ada yang lebih baik berguling-guling.
Quillion
Keren! Hanya sebuah unpackpertanyaan: dapatkah Anda membuat huruf heksadesimal a..f, seperti dalam pertanyaan?
manatwork
@manatwork Saya mencoba mencari cara untuk melakukannya di dalam unpack, tetapi tidak berhasil. Salah satu caranya adalah menggunakan sprintfalih-alih unpack, tapi itu lebih lama dan sepenuhnya ortodoks. Cara lain adalah dengan hanya memodifikasi string menjadi huruf besar:, map{uc unpack H2,chr}dengan biaya tiga karakter.
kotak roti
Terima kasih, @breadbox. Itu sedikit rumit packdan unpacktidak pernah masuk ke gaya pengkodean saya. Jadi itu cukup tidak lazim bagi saya.
tidak berfungsi untuk 1 1 1 yang akan menghasilkan # 010101
ratchet freak
Hai @ scratchetfreak. Ini bekerja untuk saya. Baru diuji dengan gforth. Memberikannya 1 1 1output #010101. Nilai 0-255 lainnya juga berfungsi. Lingkungan apa atau sebagainya yang Anda gunakan?
Darren Stone
2
C (67 karakter tanpa boilerplate utama)
int r,g,b;
scanf("%d %d %d",&r,&b,&g);
printf("#%06x",r<<16|g<<8|b);
Kerja bagus! Saya masih harus belajar banyak tentang golf!
Iszi
Oh, ide Anda dengan variabel-variabel itu juga pintar; tidak akan pernah terlintas dalam pikiranku. Kebetulan itu lebih lama dari favorit saya yang biasa: -splitdan -join.
Anda dapat menyimpan beberapa byte dengan menghilangkan [byte]sejak kita diberi input sebagai bilangan bulat, dan mengedit output Anda menjadi "#$o"- yang memberikan 31 byte untuk$args|%{$o+="{0:X2}"-f$_};"#$o"
AdmBorkBork
@TimmyD tidak tahu apakah menghapus [byte] berfungsi dengan benar di semua versi dalam versi yang saya uji (iirc 2.0 di xp) tanpa [byte] itu tidak digabungkan sebagai hex tetapi sebagai ints yaitu 72 61 139 adalah # 7261139 bukan # 483d8b "# $ o" di dalam kutipan bukan string literal tetapi string yang dievaluasi senang mengetahui terima kasih komentar tentang konversi hex akan dihargai
blabb
Tampaknya perbedaan antara PowerShell v2 dan v3 - pasti ada sesuatu dalam bagaimana versi .NET yang sesuai menangani konversi heksadesimal, tetapi saya tidak dapat menemukan dokumentasi di dalamnya.
(Catatan: mencetak '#' sebelum membaca input --- tugas tidak melarang ini; diberi tiga angka pada stdin menghasilkan output yang tepat pada stdout. Juga tidak mengganggu baris baru, dan seperti yang Anda lihat tidak 't tambahkan' # 'dengan benar ketika menjalankan "secara interaktif".)
Meminta untuk 3 hingga 9 digit RGB. Mengembalikan heksadesimal dengan tanda heksadesimal GML,$
d=get_string('','')if(d=='')e=""else e="00"h="0123456789ABCDEF"while(d!=''){b=d&255i=string_char_at(h,byte div 16+1)l=string_char_at(h,byte mod 16+1)e+=i+l;d=d>>8}return '$'+e
Jadikan ini skrip. Juga, kompilasi dengan variabel tidak diinisialisasi diperlakukan sebagai 0.
Secara kebetulan, saya akhirnya menulis hal yang persis sama dengan Anda sebelum saya melihat milik Anda. Sangat bagus =) Mereka cukup dekat sehingga saya tidak akan memposting milik saya, tetapi Anda dapat menyimpan beberapa byte pada pemetaan Anda dengan ini:x=>(x<16?0:'')+x.toString(16)
Mwr247
1
Juga, tidak perlu menyertakan r=di awal. Itu masih dianggap sebagai fungsi bahkan sebagai fungsi anonim, karena Anda dapat menjalankannya tanpa harus menetapkan apa pun.
Mwr247
Aduh. Dimaksudkan sebagai peta: x=>(x<16?0:'')+(x*1).toString(16)Milik saya dan yang pertama di sana memberikan nilai yang salah x>9.
Mwr247
Ini saat ini kembali #7261139sebagai ganti #483D8Buntuk kasus uji pertama.
Dennis
0
Python 2, 40 byte
s='#';exec's+="%02X"%input();'*3;print s
Membaca input dari tiga baris terpisah. Pelanggaran execdan perkalian string.
Jawaban:
Ruby: 19 karakter
Contoh dijalankan:
sumber
Rubi
Saya akan lebih banyak untuk bagian "tidak ortodoks". ;)
Font (pada browser web saya) agak tinggi, sehingga terlihat terdistorsi, tetapi terlihat lebih baik di Courier New:
Contoh dijalankan:
sumber
q / k (3 karakter)
Tidak persis tidak lazim tetapi cukup singkat
Contoh
Untuk mencocokkan format output dalam pertanyaan dengan tepat, kita dapat melakukan (untuk 9 karakter):
sumber
PowerShell:
71525141Kode golf:
catatan:
Tidak ada kesalahan saat memeriksa input yang tidak valid. Script akan dengan senang hati mengambil 256, 4096, dan 65536 sebagai input, kemudian menghasilkan # 100100010000 (yang jelas tidak akan berfungsi sebagai RGB).
Tidak disatukan, dengan komentar:
sumber
foreach($i in 1,2,3)
untuk menguranginya menjadi 68 karakter.foreach
di PowerShell. (Setidaknya, saya belum bisa menjalankan beberapa tes berjalan.) Namun, menggunakan sintaks yang tepat, alias bawaan, dan pintasan PowerShell lain yang baru-baru ini saya temukan, saya pikir saya punya sesuatu yang lebih baik, bercukur. 12 karakter lagi dari saran Anda.(1..3)|%{...}
(Sisipkan pernyataan tanda kurung dari skrip yang ada di tempat ellipsis.) Saya masih perlu menguji ini sepenuhnya dalam skrip, tapi terima kasih telah mengarahkan saya ke arah itu!foreach
menyebutkannya dan bekerja untuk saya. (Tidak tahu tentang versi. Yang datang dengan Windows 7.)(1..3)|%
berfungsi dan membawa skrip ke 56 karakter. Saya akan mengeditnya menjadi jawabannya, dan pasti akan menghargai Anda untuk ide itu. Terima kasih lagi!-join
:'#'+-join(1..3|%{"{0:X2}"-f+(read-host)})
.bash
2221 karakter(Terima kasih @manatwork untuk 1 karakter menggunakan
\
bukan tanda kutip ganda)atau membaca STDIN dalam satu lingkaran: 48 karakter:
Ditambahkan 2015-10-06: bash ( metode yang lebih tidak lazim )
8483 karakterSaya tahu, bisa jadi 82 karakter jika
020
ditulis16
, tetapi saya lebih suka ini ... Atau mungkind+=${c[$b$a 0x10]}
yang merupakan posting pertama.Pendekatan lain bash
Ini akan menampilkan jendela browser, dengan:
Di mana Anda dapat menggulung roda mouse untuk mengubah nilai (dengan tombol shift ditahan untuk langkah 15) ...
sumber
printf \#%02X%02X%02X
sudah cukup.d+=${c[$b$a 0x10]}
sesuatu yang seksi !d+=${c[$b$a 020]}
akan melakukan pekerjaan itu dan terlihat baikPerl, 31 karakter
Sulit untuk membuat program pendek seperti itu tidak lazim, tapi saya pikir ini berhasil.
sumber
unpack
pertanyaan: dapatkah Anda membuat huruf heksadesimal a..f, seperti dalam pertanyaan?unpack
, tetapi tidak berhasil. Salah satu caranya adalah menggunakansprintf
alih-alihunpack
, tapi itu lebih lama dan sepenuhnya ortodoks. Cara lain adalah dengan hanya memodifikasi string menjadi huruf besar:,map{uc unpack H2,chr}
dengan biaya tiga karakter.pack
danunpack
tidak pernah masuk ke gaya pengkodean saya. Jadi itu cukup tidak lazim bagi saya.Skrip Tindakan 3 | 43 karakter
Keluaran:
#483D8B
sumber
Perl 24 karakter
Maaf, ini tidak seksi daripada menggunakan
unpack
, tetapi lebih pendek!Versi yang lebih tidak jelas:
Tetapi jika Anda benar-benar lebih suka menggunakan
unpack
, maka Anda dapat:Sebagai contoh, ini bukan versi yang lebih pendek, tetapi saya menyukainya! (Perhatikan penggunaan
rand
untuk randering ini :-)sumber
> <>
10360Memanfaatkan ruang putih yang terbuang, dan memindahkan beberapa kode ke dalamnya
Jalankan dengan input baris perintah:
output: "# FF2448"
sumber
Keempat, 62 karakter
sumber
1 1 1
output#010101
. Nilai 0-255 lainnya juga berfungsi. Lingkungan apa atau sebagainya yang Anda gunakan?C (67 karakter tanpa boilerplate utama)
penggunaan printf & bit twiddler standar rawa
sumber
readf
,? Bukankah seharusnya begituscanf
?Dc:
3532 karakterContoh dijalankan:
Dc:
2724 karakter(Tetapi perlu nomor input pada jalur yang terpisah.)
Contoh dijalankan:
sumber
dc
jawaban yang cukup di situs web ini.JavaScript, 89 karakter
Bertobat
72 61 139
untuk256*(256*(72)+61)+139
dan evals itu.sumber
eval('(('+DEC.replace(/ /g,'<<8)+'))
bukannyaeval('256*(256*('+DEC.replace(/ /g,')+'))
membiarkan Anda menghemat 5 karakter!PowerShell, 45
Atau, jika itu dapat digunakan dengan memipipkan data, Anda bisa menggunakannya
yang membawanya ke 42 .
sumber
-split
dan-join
.PowerShell 37
disimpan satu byte berkat TimmyD
sumber
[byte]
sejak kita diberi input sebagai bilangan bulat, dan mengedit output Anda menjadi"#$o"
- yang memberikan 31 byte untuk$args|%{$o+="{0:X2}"-f$_};"#$o"
R, 16 byte
Itu dia. Gunakan bawaan.
sumber
C,
6773 Karakter (65 Karakter tidak termasuk utama)Program C membosankan - sangat ortodoks.
sumber
Python 2.7 (80 Karakter)
Saya mencari cara yang lebih baik untuk menangani nilai hex satu digit. Ada ide?
sumber
Befunge-98, 45 karakter
Bleh, kode duplikat. Baiklah. Hanya implementasi langsung dari konversi radix.
Contoh dijalankan
(Catatan: mencetak '#' sebelum membaca input --- tugas tidak melarang ini; diberi tiga angka pada stdin menghasilkan output yang tepat pada stdout. Juga tidak mengganggu baris baru, dan seperti yang Anda lihat tidak 't tambahkan' # 'dengan benar ketika menjalankan "secara interaktif".)
sumber
Bahasa Game Maker, 175 (Kesalahan pada posisi 81)
Meminta untuk 3 hingga 9 digit RGB. Mengembalikan heksadesimal dengan tanda heksadesimal GML,
$
Jadikan ini skrip. Juga, kompilasi dengan variabel tidak diinisialisasi diperlakukan sebagai 0.
Sumber
sumber
Gema, 93 karakter
Contoh dijalankan:
sumber
Burlsque, 12 byte (10 byte untuk huruf kecil)
Jika huruf kecil diizinkan juga maka 10 byte:
Pemakaian:
Jika Anda sangat membutuhkan huruf besar, tambahkan
ZZ
:Jika Anda tidak menerima bilangan bulat seperti dalam string, lanjutkan dengan:
Penjelasan:
Coba online di sini .
Bonus:
Untuk mengubahnya kembali gunakan ini:
sumber
Powershell, 28 byte
Skrip uji:
Keluaran:
sumber
Python3.3 @ 60 karakter
Tidak bisa menolak:
sumber
Clojure 76 Karakter
Ini mungkin terlambat, demi kelengkapan:
Contoh panggilan:
sumber
Mathematica, 40 karakter
sumber
Gangguan Umum, 39 karakter
Baca tiga bilangan bulat, kembalikan string.
sumber
Javascript ES6, 63 byte
sumber
x=>(x<16?0:'')+x.toString(16)
r=
di awal. Itu masih dianggap sebagai fungsi bahkan sebagai fungsi anonim, karena Anda dapat menjalankannya tanpa harus menetapkan apa pun.x=>(x<16?0:'')+(x*1).toString(16)
Milik saya dan yang pertama di sana memberikan nilai yang salahx>9
.#7261139
sebagai ganti#483D8B
untuk kasus uji pertama.Python 2, 40 byte
Membaca input dari tiga baris terpisah. Pelanggaran
exec
dan perkalian string.Contoh penggunaan:
sumber
Python (55 karakter)
sumber