pengantar
Tantangan ini mengharuskan Anda untuk mengatur nol trailing dari representasi biner bilangan bulat 010101…
, ini paling baik dijelaskan dengan contoh:
Dengan bilangan bulat 400
, langkah pertama adalah mengubahnya menjadi biner:
110010000
Seperti yang dapat kita lihat bit kelima adalah bit yang paling tidak signifikan 1
, jadi mulai dari sana kita ganti nol yang lebih rendah dengan 0101
:
110010101
Akhirnya kami mengonversi itu kembali ke desimal: 405
Tantangan
Diberikan pengembalian integer positif / output nilai hasil yang sesuai dari proses yang didefinisikan di atas.
Aturan
- Urutan ini hanya didefinisikan untuk bilangan bulat dengan setidaknya satu
1
bit, sehingga input akan selalu ≥ 1 - Anda dapat mengambil input sebagai string, daftar digit (desimal) sebagai gantinya
- Anda tidak harus menangani input yang tidak valid
Testcases
Berikut adalah beberapa testcases dengan langkah perantara (Anda tidak harus mencetak / mengembalikannya):
In -> … -> … -> Out
1 -> 1 -> 1 -> 1
2 -> 10 -> 10 -> 2
3 -> 11 -> 11 -> 3
4 -> 100 -> 101 -> 5
24 -> 11000 -> 11010 -> 26
29 -> 11101 -> 11101 -> 29
32 -> 100000 -> 101010 -> 42
192 -> 11000000 -> 11010101 -> 213
400 -> 110010000 -> 110010101 -> 405
298 -> 100101010 -> 100101010 -> 298
n
adalah kekuatan maksimal 2 yang membagi input, maka jawabannya sederhana(input) + ceil((2^n - 2)/3)
Jawaban:
Python 3 , 20 byte
Cobalah online!
Penjelasan
Ambil
192
sebagai contoh. Bentuk binernya adalah11000000
, dan kita perlu mengubahnya11010101
.Kami mencatat bahwa kami perlu menambahkan
10101
nomornya. Ini adalah deret geometri (4^0 + 4^1 + 4^2
), yang memiliki bentuk tertutup sebagai(4^3-1)/(4-1)
. Ini sama dengan di4^3//3
mana//
menunjukkan pembagian integer.Jika ya
101010
, maka masih akan menjadi deret geometri (2×4^0 + 2×4^1 + 2×4^2
), yang2×4^3//3
karena alasan di atas.Bagaimanapun,
4^3
dan2×4^3
hanya akan menjadi bagian yang paling tidak penting, yang kami peroleh dengann&-n
:Kami memperhatikan bahwa komplemen dari
n
is00111111
. Jika kita menambahkan satu, itu menjadi01000000
, dan itu hanya tumpang tindih dengann=11000000
digit paling tidak signifikan. Perhatikan bahwa "melengkapi dan menambahkan satu" hanyalah negasi.sumber
lambda n:(n&-n)//3+n
berhasil juga? Lewati semua contoh uji sampel , tetapi menurut intuisi saya, itu seharusnya tidak valid, bukan?Jelly , 5 byte
Cobalah online!
Kali ini port pendekatan Leaky Nun (setidaknya aku membantunya sedikit menurunkan golf: P)
Jelly , 7 byte
Cobalah online!
Menggunakan pendekatan Jung Jung Min yang fantastis , dengan bantuan tidak langsung dari Martin Ender .
sumber
&N:3|
. Selamat; Anda mengalahkan Dennis di Jelly! (Tapi tidak cukupBahasa Wolfram (Mathematica) ,
36282624 byte-8 byte terima kasih kepada @MartinEnder dan -2 byte terima kasih kepada @ Mr.Xcoder
Cobalah online!
Kita hanya perlu menemukan jumlah nol trailing di input, dan menemukan nomor dengan
0
s dan1
s dengan panjang satu kurang dari itu, dan menambahkannya ke input.Begitu,
400 -> 11001000 -> 110010000 + 0000 -> 110010101 + 101 -> 405
Rumus eksplisit untuk
n
nomor th dengan alternating1
s dan0
s diberikan pada A000975 pada OEIS. Kita dapat menggunakan angkan
th karena tidak ada dua angka berbeda yang dapat memiliki panjang yang sama dalam biner dan memiliki digit bergantian.sumber
2^#~IntegerExponent~2
adalah(BitXor[#,#-1]+1)/2
#+⌊(#~BitAnd~-#)/3⌋&
.J ,
1918 byteCobalah online!
Penjelasan Cepat
Ini adalah jawaban lama, tetapi sifatnya sangat mirip dengan yang saat ini, ia hanya menghitung nol trailing secara berbeda. Lihat komentar untuk tautan yang menjelaskan cara kerjanya.
Jawaban Lain:
Jawaban sebelumnya (19 byte).
Lebih lama dari seharusnya karena
\
belok kanan ke kiri.sumber
+(2|-.i.@#.-.)&.#:
#.~
menghitung jumlah trailing truth , jadi yang kita butuhkan adalah#.~ -. #:
menghitung jumlah trailing nolJulia 0,6 , 12 byte
Cobalah online!
sumber
((!n=(n|n))&-n)/3
, atau!n=(((n|n)&(-n))/3)
, dll.|
juga+
dan&
sama*
. Oleh karena itu,n|n&-n÷3
diuraikan sebagain | ((n&-n) ÷3)
.JavaScript (ES6),
4039 byteMengambil input sebagai integer 32-bit.
Uji kasus
Tampilkan cuplikan kode
sumber
05AB1E ,
1385 byteDisimpan 5 byte berkat Tn. Xcoder dan formula rapi JungHwan Min.
Menyimpan 3 byte lainnya berkat Tn. Xcoder
Cobalah online!
Penjelasan
sumber
(<bitwise and here>3÷+
seharusnya bekerja untuk ~ 5 byte.R ,
7158 byteterima kasih kepada NofP untuk -6 byte
Cobalah online!
Mengasumsikan input adalah integer 32-bit. R hanya telah menandatangani bilangan bulat 32-bit (tetap ke
double
saat bilangan bulat melimpah) dan tidak ada 64-bit atau int yang tidak ditandatangani.sumber
which.max(n):1-1
ke!cumsum(n)
untuk mendapatkan solusi 65 bytebrainfuck , 120 byte
Cobalah secara Online!
Mulai dengan nilai di sel saat ini dan berakhir di sel dengan nilai output. Jelas tidak akan berfungsi pada angka di atas 255 karena itulah batas sel untuk tipuan otak tipikal, tetapi akan berfungsi jika Anda menganggap ukuran sel tak terbatas.
sumber
PowerShell , 168 byte
Cobalah online!
Aduh. Konversi ke / dari pemotongan biner dan array tidak benar-benar sesuai dengan PowerShell.
Mengambil input
$n
sebagai angka. Kami segera melakukanconvert
itu ke basis biner2
dan menyimpannya ke dalam$a
. Selanjutnya kita memiliki konstruksi if / else. Klausa if menguji apakah aregex
Match
terhadap 1 atau lebih0
s pada akhir string ('0+$'
) memiliki lokasinyaindex
di lebih besar dari0
(yaitu, mulai dari string biner). Jika ya, kami memiliki sesuatu untuk dikerjakan,else
kami hanya menampilkan angkanya.Di dalam
if
, kami mengirisx
digit pertama, dan merangkai+
-angka dengan digit yang tersisa. Namun, untuk digit yang tersisa, kami mengulanginya dan memilih salah satu0
atau1
sebagai keluaran, gunakan$i++%2
untuk memilih. Ini memberi kita010101...
pola alih-alih0
di akhir. Kami kemudian-join
kembali bersama menjadi string, dan$c
mengubahnya kembali menjadiInt32
basis2
.Dalam situasi apa pun, nomornya dibiarkan dalam pipa dan hasilnya tersirat.
sumber
APL + WIN, 43 byte
Meminta input layar
sumber
PowerShell ,
4136 byteCobalah online! atau Verifikasi semua kasus uji
Port of Leaky Nun's Python menjawab .
Disimpan 5 byte berkat Leaky Nun
sumber
PHP , 47 byte
Cobalah online!
Benar-benar hanya port lain dari solusi @Leaky Nun
sumber
Perl 5 , 54 byte
Cobalah online!
sumber
Python 3 , 56 byte
Cobalah online!
Belum benar-benar senang dengan ini, tapi saya benar-benar tidak ingin menggunakan formula ... -2 terima kasih kepada Rod . -1 terima kasih kepada Jonathan Frech .
sumber
eval(...)
bukannyaint(...,2)
bisa menghemat satu byte.Ruby , 15 byte
Pelabuhan lain dari pendekatan Leaky Nun.
Cobalah online!
sumber
Karat , 18 byte
Pelabuhan pendekatan Leaky Nun
Cobalah online!
sumber
AWK , 24 byte
Port jawaban Mathmatica JungHwan Min
Cobalah online!
sumber
JavaScript ES6, 13 byte
sumber
C, 56 byte
Cobalah online!
C (gcc), 50 byte
Cobalah online!
5148 byte menggunakan solusi Arnauld :Berkat @ l4m2 untuk menghemat tiga byte!
Cobalah online!
43 dengan gcc:
Cobalah online!
sumber
0xAAAAAAAA
=>-1u/3*2
Pari / GP , 19 byte
Pelabuhan pendekatan Leaky Nun.
Cobalah online!
sumber
Jelly , 13 byte
Cobalah online!
Penjelasan
Ambil 24 sebagai input contoh.
sumber