Mengamati nilai-nilai biner yang dicetak sebagai oval dan tongkat tidaklah mudah ... Untuk membantu hal itu, Anda harus menulis fungsi (atau program) yang mencetak angka dalam representasi biner khusus.
Jadi saya ingin mengambil angka, katakan 3 ( 00000011
) dan output bit dalam format yang ditentukan pengguna, misalnya dengan pasangan yang dipisahkan oleh ruang:
00 00 00 11
atau, katakanlah, dalam urutan terbalik dan dengan beberapa dekorator, misalnya:
11_00_00_00
Selain itu, harus ada kemungkinan untuk menunjukkan '0' dan '1' sebagai karakter khusus untuk membedakan mereka dengan lebih baik, misalnya:
XX oo oo oo
Jadi tantangannya adalah untuk menulis kode yang melakukan itu semua dalam spesifikasi berikut.
Spesifikasi
Fungsi mengambil input seperti ini: f (A, mask, nol, ones)
Parameter:
A - nomor input - bilangan bulat (tidak bertanda) apa pun dalam rentang 0-255.
mask - parameter string yang mendefinisikan konstruksi output.
nol - string dengan panjang yang sama, mendefinisikan mesin terbang 'nol' untuk setiap slot output.
yang - string dengan panjang yang sama, mendefinisikan mesin terbang 'satu' untuk setiap slot output.
Aturan untuk konstruksi output:
Lihatlah gambar ini dengan contoh cermat untuk memahami bagaimana output dihasilkan:
Jadi hanya satu digit dalam topeng yang diuraikan dan diganti dengan bit A yang sesuai, karakter lain dibiarkan apa adanya . Lebih lanjut, jika nilai bit yang diambil adalah 1 maka akan muncul di output akhir sebagai "X" dan jika itu 0 maka akan muncul sebagai "o". Dalam contoh di atas keempat bit yang diambil adalah "1" jadi kita melihat "X" di semua slot.
Jika nomor input adalah 128, maka, secara logis, outputnya adalah X foo bar ooo
. Karakter dalam parameter "nol" dan "yang": karakter ASCII apa pun yang dapat dicetak, menganggap mereka selalu sejajar dengan mask.
Catatan :
- Bit diindeks 0: bit 0 adalah MSB.
- Asumsikan bahwa angka 8,9 tidak diperbolehkan dalam string mask.
- Input Strings termasuk karakter ASCII yang dapat dicetak.
- 'Nol' dan 'yang' disejajarkan dengan topeng.
- Untuk karakter khusus / pengubah dalam bahasa Anda: kami dapat menganggap mereka tidak akan muncul di string input.
Untuk kejelasan, lihat lebih banyak contoh.
Input -> Contoh output
Keluarkan semua 8 bit dalam urutan umum dengan pembatas ruang, dalam notasi oval-and-stick yang umum:
mask = "0123 4567"
zeros = "0000 0000"
ones = "1111 1111"
A=1 -> 0000 0001
Output dalam urutan terbalik, dalam notasi dasbor dan mesin terbang:
mask = "| 7654 3210 |"
zeros= " ---- ---- "
ones = " ssss ssss "
A=1 -> | s--- ---- |
A=3 -> | ss-- ---- |
A=128-> | ---- ---s |
Beragam notasi dalam satu output, misalnya untuk data yang dikemas:
mask = "0 | 123 4567"
zeros= " --- ----"
ones = "X kkk ssss"
A= 15 -> | --- ssss
A= 16 -> | --k ----
A= 32 -> | -k- ----
A= 128 -> X | --- ----
A= 255 -> X | kkk ssss
Pola berulang:
mask = "| 7 66 555 4444 |"
zeros= " . .. ... .... "
ones = " 0 00 000 0000 "
A= 0 -> | . .. ... .... |
A= 1 -> | 0 .. ... .... |
A= 2 -> | . 00 ... .... |
A= 3 -> | 0 00 ... .... |
A= 4 -> | . .. 000 .... |
Memperbarui
Aturan telah sedikit disederhanakan - program harus mencetak satu angka saja (bukan array / daftar angka seperti yang diusulkan pada awalnya).
A
terjadi, karena itu sama dalam semua kasus ujiJawaban:
JavaScript (ES6), 57 byte
Tampilkan cuplikan kode
sumber
Ruby , 48 byte
Parameter nol dan yang diperlakukan sebagai array (
*b
) dan dengan parameter nol disimpanb[0]
dan parameter yang disimpan dalamb[1]
.Parameter mask
f
memiliki setiap digit (/\d/
) diganti dengan karakter dari array yang sesuai. Variabel khusus$`
, yang menahan teks mengarah ke kecocokan saat ini, adalah (ab) digunakan di sini untuk melacak posisi.Pengindeksan bit Ruby memanggil 0 bit yang paling tidak signifikan, tetapi tantangan menyebut 0 bit yang paling signifikan. Pengurangan ASCII dari 55 (karakter '7') menghasilkan indeks bit Ruby yang dapat digunakan.
Cobalah online!
sumber
Perl 6 , 60 byte
sumber
Python, 97 byte
sumber
Mathematica, 131 byte
sumber
Length[x]
bisaLength@x
dan{#2,#3,#4}
bisa{##2}
.StringJoin@@
bisa sajaStringJoin@
dan#1
baru saja#
q / kdb +,
8664 byteLarutan:
Contoh:
Penjelasan:
Tarik keluar indeks di mana topeng input
M
adalah angka, sebut saja dim
sinilah kita akan memodifikasi masker input. Keluarkan angka dari string, masukkan ke integer dan kemudian indeks ke dalam array 8-bit kami untuk mendapatkan urutan yang benar. Gunakan array 8-bit ini untuk mengindeks ke dalamO
(jika 1 diatur) atauZ
(jika 0 diatur), dan kemudian indeks ke dalam daftar ini pada indeks yang diberikan olehm
. Akhirnya terapkan (:
) daftar baru ini ke topeng asli di indeksm
.Catatan:
Dapat mengurangi 14 byte lebih lanjut jika kami diizinkan memberikan argumen dalam bentuk:
[A;M;(Z;O)]
karena q memungkinkan hingga 3 argumen untuk diberikan ke suatu fungsi tanpa diberi nama secara eksplisit (yaitu
x
,y
danz
masing - masing):sumber