Buat rutin yang mengambil array blok dalam satu sistem basis numerik, dan mengonversinya menjadi array blok dalam sistem basis numerik lain. Baik dari dan ke sistem bersifat arbitrer dan harus diterima sebagai parameter. Array input dapat berupa panjang arbitrer (Jika menggunakan bahasa di mana panjang array tidak disimpan dengan array, seperti C, parameter panjang harus diteruskan ke fungsi).
Begini cara kerjanya:
fromArray = [1, 1]
fromBase = 256
toBase = 16
result = convertBase(fromArray, fromBase, toBase);
Yang harus kembali [0, 1, 0, 1]
atau mungkin [1, 0, 1]
( 0
s adalah opsional karena mereka tidak mengubah nilai jawabannya).
Berikut ini beberapa vektor uji:
Vektor Tes Identitas
fromArray = [1, 2, 3, 4] fromBase = 16 toBase = 16 result = [1, 2, 3, 4]
Vektor Uji Sepele
fromArray = [1, 0] fromBase = 10 toBase = 100 result = [10]
Vektor Uji Besar
fromArray = [41, 15, 156, 123, 254, 156, 141, 2, 24] fromBase = 256 toBase = 16 result = [2, 9, 0, 15, 9, 12, 7, 11, 15, 14, 9, 12, 8, 13, 0, 2, 1, 8]
Vektor Uji Sangat Besar
fromArray = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] fromBase = 2 toBase = 10 result = [1, 2, 3, 7, 9, 4, 0, 0, 3, 9, 2, 8, 5, 3, 8, 0, 2, 7, 4, 8, 9, 9, 1, 2, 4, 2, 2, 3]
Vektor Dasar Tanpa Titik
fromArray = [41, 42, 43] fromBase = 256 toBase = 36 result = [1, 21, 29, 22, 3]
Kriteria / aturan lain:
Semua variabel integer harus masuk dalam standar integer bertanda 32 bit untuk semua rentang input yang masuk akal.
Anda dapat mengonversi ke representasi perantara, selama perantara tersebut tidak lebih dari sebuah array bilangan bulat bertanda 32 bit.
Berharap untuk menangani basis dari 2 hingga 256. Tidak perlu mendukung basis yang lebih tinggi dari itu (tetapi jika Anda ingin, dengan segala cara).
Berharap untuk menangani ukuran input dan output setidaknya hingga 1000 elemen. Solusi yang menskala elemen 2 ^ 32-1 akan lebih baik, tetapi 1000 tidak masalah.
Ini tidak selalu tentang memiliki kode terpendek yang akan memenuhi aturan ini. Ini tentang memiliki kode terbersih dan paling elegan.
Sekarang, ini tidak sepele untuk dilakukan, jadi jawaban yang hampir berhasil mungkin diterima!
sumber
Jawaban:
Python
sumber
Inilah solusi Haskell
Dan menjalankan tes dari pertanyaan:
sumber
R
Menangani ribuan elemen * dalam waktu kurang dari satu menit.
* untuk> 500 elemen Anda harus menaikkan level rekursi default atau tidak me-reset
mm
matriksdothelocomotion()
Contoh:
sumber
Versi JavaScript yang kurang jelas dan lebih cepat:
Waktu komputasi bertambah sebagai o (jumlah digit 2 ).
Tidak terlalu efisien untuk jumlah besar.
Pengkodean baris base64 versi khusus memanfaatkan rasio dasar untuk mempercepat perhitungan.
sumber
Javascript
Terima kasih Keith Randall atas jawaban Python Anda. Saya berjuang dengan hal-hal kecil dari solusi saya dan akhirnya menyalin logika Anda. Jika ada yang memberikan suara untuk solusi ini karena berfungsi maka silakan juga memberikan suara untuk solusi Keith.
Tes
Ini mungkin bisa menyusut banyak, tetapi saya sebenarnya ingin menggunakannya untuk proyek sampingan kecil. Jadi saya membuatnya tetap dapat dibaca (agak) dan mencoba untuk menjaga variabel tetap di periksa.
sumber
for each
pernyataan yang sudah ketinggalan zaman, dan konstruk yang menarik sepertid.length||e?d.push(e):0
... Apakah ini tantangan kode yang dikaburkan atau semacamnya? Anda dapat menulis hal yang sama dengan sintaks yang dapat dimengerti dan kinerja yang lebih baik.Mathematica
Tidak ada variabel yang ditentukan, input apa pun yang diterima asalkan sesuai dengan memori.
Uji jalan:
Di luar
sumber
Scala:
Kode uji dengan tes:
Lulus semua tes.
sumber
J,
109105Menangani ribuan digit tanpa keringat. Tidak ada bilangan bulat yang dirusak!
Contohnya
Semakin pendek.
sumber
Smalltalk, 128
tes:
dan untuk hiburan khusus Anda ( tantangan: mencari tahu, apa yang istimewa dari nilai input ):
sumber