Perbedaan BCD
Dengan bilangan bulat n, konversikan ke BCD ( binary-coded decimal ) dengan mengganti setiap digit desimal dengan representasi biner 4 digitnya
234 -> 0 0 1 0 0 0 1 1 0 1 0 0
Kemudian putar daftar angka biner untuk menemukan angka terbesar dan terkecil, diwakili oleh daftar ini tanpa penataan ulang lainnya.
max: 1 1 0 1 0 0 0 0 1 0 0 0 (the entire list rotated left 6 times)
min: 0 0 0 0 1 0 0 0 1 1 0 1 (the entire list rotated right 2 times)
Ubah angka-angka ini kembali menjadi desimal, memperlakukan daftar bit sebagai biner biasa dan kurangi yang terkecil dari yang terbesar:
1 1 0 1 0 0 0 0 1 0 0 0 -> 3336
0 0 0 0 1 0 0 0 1 1 0 1 -> 141
3336 - 141 -> 3195
Outputnya adalah selisih angka terbesar dan terkecil yang ditemukan.
Kasus uji:
234 -> 3195
1234 -> 52155
12 -> 135
975831 -> 14996295
4390742 -> 235954919
9752348061 -> 1002931578825
sumber
Max@#-Min@#&
menghemat satu byte. kanan?Max@#-Min@#&[#~FromDigits~2&/@Partition[s=Join@@(i=IntegerDigits)[i@#,2,4],Tr[1^s],1,1]]&
89 byte DAN efisien. sialan itu byte!1-9,10-99,100-999...
berikut adalah beberapa pembesaranJelly , 13 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Python 3 ,
115108 byteterima kasih kepada Jonathan Frech untuk -7 byte
Cobalah online!
sumber
PowerShell , 153 byte
Cobalah online!
Panggilan NET. Panjang bodoh untuk mengkonversi ke / dari biner benar-benar besar di sini. ;-)
Kami mengambil input sebagai
$args
, membungkusnya dalam string, lalu melemparkannya sebagaichar
-array. Kami mengulangi setiap digit,convert
memasukkan digittoString
di basis2
(yaitu, mengubah digit menjadi angka biner), lalu.padLeft
menjadikannya angka biner empat digit. Array string yang dihasilkan kemudian-join
diedarkan ke dalam string tunggal danchar
dicetak ulang sebagai -array sebelum disimpan ke dalam$b
.Selanjutnya, kita mengulang
$b
, yang hanya memastikan kita mengulang kali cukup untuk memperhitungkan setiap rotasi. Setiap iterasi, kami melepas karakter pertama menjadi$x
dan karakter yang tersisa$y
menggunakan beberapa penugasan. Kemudian, kita gabungkan mereka kembali menjadi satu$b=$y+$x
untuk memindahkan elemen pertama ke ujung, yaitu, secara efektif memutar array dengan satu. Itu-join
ed menjadi string, yang digunakan sebagai input keconvert
panggilan untuk mengubah string dari basis biner2
menjadiInt64
. Kami kemudiansort
semua angka-angka yang dihasilkan dan menyimpannya ke dalam$c
. Akhirnya, kami mengambil yang terbesar[-1]
dan mengurangi yang terkecil[0]
. Yang tersisa pada pipa dan output tersirat.sumber
Ohm v2 , 15 byte
Cobalah online!
Penjelasan:
sumber
JavaScript (ES6),
11810099 byteSunting: Disimpan 11 byte berkat @RickHitchcock. Disimpan 1 byte berkat @ETHproductions. Penjelasan:
0x1
Awalan menyebabkan input untuk diulang sebagai bilangan heksadesimal, yang binernya sama dengan BCD dari angka asli dengan awalan 1 (saya pikir ini lebih golf daripada cara lain untuk melipat ke kelipatan 4 digit) . Tidak termasuk awalan, yang diubah dari 1 ke 0, string yang dihasilkan kemudian diputar pada setiap posisi yang mungkin dan dikonversi dari kembali biner ke desimal. Akhirnya maksimum dan minimum dikurangi.sumber
.join``
dalam hal ini Anda perlu triple backticks dll.n=>(g=m=>Math[m](...[...s=(+`0x1${n}`).toString(2).slice(1)].map(_=>`0b${s=s.slice(1)+s[0]}`)))`max`-g`min`
slice
juga!m=>Math[m]
trick besar. Mungkin berubah(+`0x1${n}`)
ke('0x1'+n-0)
atau serupa?Python 2 ,
115113 byteCobalah online!
sumber
Pyth , 29 byte
Coba di sini! atau Lihat test suite.
sumber
Sekam , 18 byte
Cobalah online!
Seharusnya ada cara yang lebih pendek untuk mengubah digit menjadi representasi biner 4-bit ...
Penjelasan
sumber
APL (Dyalog) , 31 byte
Badan program penuh. Meminta nomor dari STDIN. Mencetak hasil ke STDOUT.
Cobalah online!
⍞
meminta baris teks dari STDIN⍎¨
mengeksekusi (mengevaluasi) masing-masing (karakter)(
...)⊤
mengkodekan (anti-basis) dalam sistem angka berikut:4/2
empat bit biner⍉
mengubah urutan,
ravel (meratakan)b←
simpan dib
(untuk b inary)⊂
terlampir (sehingga kami akan menggunakan seluruh daftar ini untuk setiap rotasi)(
...)⌽¨
putar (kiri) dengan masing-masing jumlah berikut:≢b
panjang darib
⍳
Saya menemukan itu2⊥¨
decode masing-masing dari base-2.(
...)
terapkan fungsi diam-diam berikut untuk itu⌈/
maks (-pengurangan)-
minus⌊/
min (reduksi)sumber
APL (Dyalog) ,
3734 byteCobalah online!
sumber
Jelly , 21 byte
Cobalah online!
sumber
Ruby ,
9691 byteCobalah online!
sumber
Mathematica,
11099 byteCobalah online!
sumber
Python 3, 141 byte
Cobalah online
sumber
Retina ,
9689 byteCobalah online! Agak lambat, jadi tautan hanya mencakup test case kecil. Sunting: Disimpan 7 byte berkat @MartinEnder. Penjelasan:
Awalan tiga
@
s untuk setiap digit. (Ini mewakili0
huruf BCD, tetapi lebih golf.)Ubah
@
s ke_
s (mewakili1
s dari BCD) jika sesuai.Perbaiki digit terakhir BCD.
Hasilkan semua rotasi.
Urutkan ke dalam urutan menaik.
Ubah mereka menjadi unary.
Kurangi yang pertama dari angka terakhir, abaikan angka menengah, dan ubah menjadi desimal.
sumber
%
untuk konversi biner ke unary dan Anda dapat menyimpan beberapa byte lagi dengan menggunakan karakter lain selain0
dan1
untuk biner: tio.run/##K0otycxL/…Haskell , 130 byte
Cobalah online!
Penjelasan / Tidak Diundang
Karena kita akan menggunakan
foldl1((+).(2*))
untuk mengkonversi dari biner ke desimal, kita mungkin juga tidak menggunakanmaximum
danminimum
melainkanfoldl1 max
(atau sama denganmin
masing - masing) dan menggunakan shortr = foldr1
.Sekarang, mari kita definisikan operator
f#x
yang mengonversix
ke BCD, menghasilkan semua rotasi, mengurangi penggunaan inif
dan mengubahnya menjadi desimal:Sekarang tinggal menggunakan operator ini satu kali dengan
max
dan satu kali denganmin
dan mengurangi hasil mereka:sumber
PHP,
156153 byteCobalah online!
sumber
Japt
-x
, 20 byteCobalah online!
Input sebagai array angka.
Penjelasan:
sumber
-x
bendera untuk menyimpan 2 byte.Pyth, 24/26 byte
Mengambil input sebagai string yang dikutip. 26 byte jika perlu mengambil input sebagai integer; tambahkan
dz
dalam kasus itu.Kasus Uji (input sebagai string, 24 byte)
Kasus Uji (masukan sebagai angka, 26 byte)
sumber
J, 43 byte
Cobalah online!
Terkadang gaya diam-diam membuat segalanya menjadi sulit. Tapi mungkin ada cara untuk melakukannya dengan gaya diam-diam yang jauh lebih ringkas dari ini. Saya pikir saya ingat cara yang lebih baik untuk membagi angka ke angka selain
"."0@":
tetapi saya tidak dapat mengingatnya ...Penjelasan
Prepending dan menghapus 8 adalah untuk memastikan bahwa jumlah nol yang tepat ada (J akan membentuk kembali arraynya menjadi ukuran elemen panjang maksimumnya, dan 8 adalah 4 digit dalam biner sehingga digunakan).
sumber
APL (NARS), 34 karakter, 68 byte
beberapa tes kecil:
sumber
Perl 5 ,
979189 + 2 (-F
) =999391 byteCobalah online!
sumber