Keluarkan angka "Sesuai"


21

"Nomor yang Cocok"

Sam punya ide "brilian" untuk kompresi! Dapatkah kamu menolong?


Berikut ini adalah ikhtisar skema kompresi Sam. Pertama, ambil representasi basis 10 dari bilangan asli mana pun yang benar-benar lebih kecil dari 2 ^ 16, dan tulislah sebagai string biner tanpa nol di depan.

1 -> 1
9 -> 1001
15 -> 1111
13 -> 1101
16 -> 10.000
17 -> 10001
65535 -> 111111111111111

Sekarang ganti grup mana pun dari satu nol atau lebih dengan nol tunggal. Ini karena jumlahnya semakin ramping. String biner Anda sekarang akan terlihat seperti ini.

1 -> 1 -> 1
9 -> 1001 -> 101
15 -> 1111 -> 1111
13 -> 1101 -> 1101
16 -> 10.000 -> 10
17 -> 10001 -> 101
65535 -> 111111111111111 -> 111111111111111

Sekarang Anda mengonversi string biner kembali ke representasi basis 10, dan mengeluarkannya dalam format apa pun yang dapat diterima. Berikut ini adalah kasus pengujian Anda. Integer pertama mewakili input, dan integer terakhir mewakili output. Perhatikan bahwa beberapa angka tidak berubah, dan dengan demikian dapat disebut "cocok"

1 -> 1 -> 1 -> 1
9 -> 1001 -> 101 -> 5
15 -> 1111 -> 1111 -> 15
13 -> 1101 -> 1101 -> 13
16 -> 10.000 -> 10 -> 2
17 -> 10001 -> 101 -> 5
65535 -> 1111111111111111 -> 1111111111111111 -> 65535
65000 -> 1111110111101000 -> 11111101111010 -> 16250


Anda dapat menggunakan bahasa apa pun, tetapi harap dicatat bahwa Sam membenci celah standar. Ini adalah kode golf sehingga kode dapat sesingkat mungkin untuk memberikan ruang bagi angka "terkompresi".
Catatan: Ini BUKAN skema kompresi yang dapat diterima. Menggunakan ini akan segera membuat Anda dipecat.
Citation-Needed: Saya tidak menerima pujian untuk konsep ini. Ini berasal dari blog @Conor O 'Brien di sini lihat OEIS nomor yang pas ini. https://oeis.org/A090078


1
From @ Conor's comic blog: link
Rɪᴋᴇʀ

3
OEIS A090078 mungkin berguna.
Adnan

Akulah yang menulis komik. <s> Saya juga mengharapkan royalti rep 35% </s>;)
Conor O'Brien

Apakah downvoter tolong jelaskan masalah ini?
Rohan Jhunjhunwala

1
Mengapa 16 sama dengan 8? Bukankah seharusnya 16 10000?
eithed

Jawaban:


10

05AB1E , 8 6 byte

b00¬:C

Penjelasan

b        # convert input to binary
 00¬:    # replace 00 with 0 while possible
     C   # convert to int

Cobalah online

Disimpan 2 byte berkat Adnan


Anda dapat menggantinya „00'0dengan 00¬:).
Adnan

@ Adnan Bagus! Tidak memikirkan itu.
Emigna

Saya bahkan tidak tahu mengapa saya secara eksplisit mendorong mereka sebagai string ...
Emigna

Ya, ini sedikit berlawanan dengan intuisi, tetapi berhasil :).
Adnan

Ini sepertinya akan menang: D, saya akan memberikannya sedikit lebih banyak waktu sebelum menerima sehingga lebih banyak orang dapat berpartisipasi.
Rohan Jhunjhunwala


7

JavaScript (ES6), 41 byte

n=>+`0b${n.toString(2).replace(/0+/g,0)}`

7

Ubur-ubur , 20 byte

p
d
# S
,1
*
\dbi
 2

Cobalah online!

Penjelasan

  • i adalah input.
  • b mengubahnya menjadi biner (daftar angka)
  • \ddengan argumen 2dan daftar digit berlaku d(binary digit ke nomor) untuk setiap panjang-2 substring dari daftar digit.
  • * mengambil signum dari hasil: 00 pergi ke 0, yang lainnya ke 1.
  • ,1 paku 1 sampai akhir, sehingga digit terakhir tidak hilang.
  • # Smenyeleksi dari bimereka digit yang memiliki 1 pada daftar dihitung di atas: mereka yang tidak belahan kiri 00.
  • dmengkonversi kembali ke angka, dan pmencetak hasilnya.

6

Python 2, 36 byte

f=lambda n:n and f(n/2)<<(n%4>0)|n%2

Implementasi rekursif langsung tanpa built-in konversi atau operasi string. Kurang bermain golf:

f=lambda n:n and[f(n/2),n%2+2*f(n/2)][n%4>0]

Ketika nkelipatan dari 4, itu berakhir dengan dua 0 dalam biner, jadi kami memotong satu dengan pembagi-lantai dengan 2. Jika tidak, kita membaginya nmenjadi (n%2) + 2*(n/2), meninggalkan digit biner terakhir n%2sendirian, dan berulang pada digit lainnya n/2.


Tidak n%2berlebihan?
xsot

@ xsot Tidak yakin apa yang Anda maksud. Melakukan |nmemberi hasil yang salah.
xnor

Maksud saya Anda dapat mengganti semuanya (n%4>0)|n%2dengan (n%4>0).
xsot

@ xsot Diutamakan berjalan seperti (f(n/2)<<(n%4>0)) | n%2.
xnor

Ah, itu salahku. Saya pikir shifting memiliki prioritas terendah.
xsot

5

Bash (sed + bc), 60 55 43 byte

echo $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]

edit:

  1. berubah sed -E 's/0+menjadi sed 's/00*dan mengubah gema dan pipa yang digunakan untuk meneruskan nilai ke bc dengan <<<.
  2. Saran cemerlang oleh @Digital Trauma!

contoh:

$ bash script.sh 65000
16250
$ bash script.sh 15
15
$ bash script.sh 9
5

1
sed + bc adalah pikiran pertamaku juga. echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bclebih pendek 2 byte
Riley

1
Gunakan pipa dan lolos untuk keuntungan Anda: echo $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]. Tapi dcdan tr membuatnya jauh lebih pendek .
Digital Trauma

1
@DigitalTrauma: Terima kasih, itu hebat! @Riley: ide bagus, akan sedikit lebih pendek seperti itu:bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
Master_ex

jika Anda menggunakan tr -s 0alih-alih sed Anda bisa turun ke 36 byte
Riley

@Riley: Benar, tetapi Digital Trauma sudah menggunakannya dalam jawaban bash lainnya jadi saya lebih suka tidak menggunakannya :)
Master_ex

4

Perl 6 ,  31  27 byte

{:2(.base(2).subst(:g,/0+/,0))}
{:2(.base(2)~~{S:g/0+/0/})}

Penjelasan:

-> $_ {
  # convert from base 2
  :2(

    # convert to base 2
    $_.base(2)

    # substitute
    .subst(
      :global,
      / 0+ /,  # all substrings made of 0s
      '0'      # with one 0
    )
  )
}

Contoh:

my &fit-compress = {:2(.base(2)~~{S:g/0+/0/})}
say fit-compress 1;     # 1
say fit-compress 9;     # 5
say fit-compress 15;    # 15
say fit-compress 13;    # 13
say fit-compress 16;    # 2
say fit-compress 17;    # 5
say fit-compress 65535; # 65535
say fit-compress 65000; # 16250

# number created with 「:2( [~] <0 1>.roll: 256 )」
say fit-compress 80794946326210692074631955353531749442835289622757526957697718534769445507500
# 4240335298301026395935723255481812004519990428936918

4

MATL, 11 9 8 byte

BFFOZtXB

Versi ini hanya berfungsi di MATLAB karena strrepdi MATLAB dapat menangani input logis. Berikut adalah versi yang akan bekerja dalam Oktaf (9 byte) (dan dengan demikian penerjemah online) yang secara eksplisit melemparkan input logis untuk diketik double.

Cobalah online

Penjelasan

    % Implicitly grab input
B   % Convert decimal to binary
FF  % Create the array [0 0]
O   % Number literal
Zt  % Replaces all [0 0] with [0] (will replace any number of 0's with 0)
XB  % Convert binary to decimal
    % Implicitly display

4

Python 3, 55 , 50 byte.

Disimpan 4 byte berkat Sp3000.

Solusi yang sangat mudah.

import re
f=lambda x:eval(re.sub('0+','0',bin(x)))

4
Bisakah Anda menyimpannya 0bdan evalsebaliknya?
Sp3000

@ Sp3000 Pasti bisa! Terima kasih untuk sarannya!
Morgan Thrapp

Lambda anonim diizinkan; Anda dapat mengecilkan ini hingga 48 byte dengan menggunakanlambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import re
MilkyWay90

3

Javascript (ES6), 40 byte

n=>'0b'+n.toString(2).replace(/0+/g,0)-0

1
Saya khawatir ini adalah cuplikan. Kecuali jika deskripsi tantangan menyatakan sebaliknya, solusi diharapkan berupa program atau fungsi lengkap.
manatwork

Apa yang harus menjadi "program lengkap" dalam Javascript jika saya tidak ingin menggunakan fungsi? Mohon saran.
cychoi

Misalnya dengan Node.js: console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0))).
manatwork

Menyimpang dari topik. Blok kode Anda memiliki masalah yang sama dengan @Master_ex. Apakah karena beberapa skrip konfigurasi shell yang populer mencemari terminal? Atau kesalahan SE?
cychoi

1
Perbaikan terpendek adalah dengan menambahkan N=>yang akan membuatnya menjadi penyerahan fungsi yang valid.
Martin Ender

3

Sebenarnya, 14 byte (tidak bersaing)

├`'0;;+(Æ`Y2@¿

Cobalah online!

Kiriman ini tidak bersaing karena perbaikan bug Ædilakukan setelah tantangan ini diposting.

Penjelasan:

├`'0;;+(Æ`Y2@¿
├               bin(input) (automatically discards leading zeroes)
 `'0;;+(Æ`Y     call this function until the output stops changing:
  '0;;+           push "0", "00"
       (Æ         replace "00" with "0" in binary string
           2@¿  convert from binary to decimal

Lalu poskan versi yang bersaing!
Leaky Nun



2

PHP, 53 51 Bytes

<?=bindec(preg_replace("/0+/",0,decbin($argv[1])));

Mengambil argumen dari konsol.

Terimakasih untuk:

@manatwork ganti "0" dengan 0


1
Sebagian besar "0"dan 0ditangani dengan cara yang sama.
manatwork

@manatwork Terima kasih. Itu jelas sekali yang seharusnya saya lihat sendiri.
Jeroen

2

Perl, 38 + 1 ( -p) = 39 byte

$_=oct"0b".sprintf("%b",$_)=~s/0+/0/gr

Membutuhkan -pflag untuk dijalankan (saya menambahkan -lflag agar lebih mudah dibaca, tetapi tidak diperlukan sebaliknya):

perl -plE '$_=oct"0b".sprintf("%b",$_)=~s/0+/0/gr' <<< "1
9
15
13
16
17
65535
65000"

Perhatikan banyak hal tentang kode: ia mengubah angka menjadi biner ( sprintf"%b"), lalu mengganti blok nol dengan hanya satu nol, dan mengubah hasilnya menjadi desimal ( oct"0b".).


2

C #, 112 91 byte

int x(int x)=>Convert.ToInt32(Rege‌​x.Replace(Convert.ToS‌​tring(x,2),"0+","0"),2);

-8 byte berkat TuukkaX


int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}- 94 byte menggunakan regex. Saya telah melihat banyak solusi C # tidak termasuk System.Text.RegularExpressionsjadi mungkin itu diizinkan di sini juga ...?
Yytsi

int f(int x){return Convert.ToInt32(Regex.Replace(Convert.ToString(x,2),"0+","0"),2);}86 byte
Yytsi

saya tidak tahu bagaimana Anda menghitung byte, saya menggunakan mothereff.in/byte-counter
downrep_nation

Saya menggunakan halaman itu juga, tetapi itu tidak berhasil, jadi saya menggunakan halaman yang berbeda. Anda juga harus menyebutkan versi C # yang diperlukan.
Yytsi

mothereff.in/byte-counter menghitung 79 byte untuk solusi Anda saat ini. Saya harus mengetikkan solusinya dengan tangan, jika tidak maka akan memberi saya 91.
Yytsi

2

Jawa, 75

int f(Integer x){return x.valueOf(x.toString(x,2).replaceAll("0+","0"),2);}

Program uji:

public class Fit {
    int f(Integer x){return x.valueOf(x.toString(x,2).replaceAll("0+","0"),2);}

    public static void main(final String... args) {
        final Fit x = new Fit();
        System.out.println(x.f(65000));
    }
}

Java 8 dikonversi ke lamda x-> blah; untuk byte yang lebih sedikit
Rohan Jhunjhunwala

int f (Integer x) {return x.parseInt (x.toString (x, 2) .replaceAll ("0 +", "0"));} untuk beberapa byte lebih sedikit
Rohan Jhunjhunwala

@RohanJhunjhunwala Itu salah, perlu menggunakan basis 2. Adapun lambda, saya merasa itu tidak lengkap tanpa spesifikasi tipe.
aditsu

oh ok, jawaban java lainnya menggunakan teknik yang sama
Rohan Jhunjhunwala



1

PowerShell v2 +, 69 byte

[convert]::ToInt32(([convert]::ToString($args[0],2)-replace'0+',0),2)

( Cara yang lebih singkat untuk mengonversi ke / dari biner di PowerShell )

Mengambil input $args[0], menggunakan .NET built-in [convert]::ToString(int,base)untuk mengubah integer input menjadi string basis biner. Itu disaring melalui -replaceuntuk menghapus setiap berjalan satu atau lebih-nol hanya 0. String yang dihasilkan dikirim kembali melalui arah lain via[convert]::ToInt32(string,base) untuk mengubah kembali biner menjadi bilangan bulat. Bilangan bulat itu ditinggalkan di jalur pipa dan hasilnya tersirat.

Uji Kasus

PS C:\Tools\Scripts\golfing> 1,9,15,13,16,17,65535,65000|%{"$_ -> " +(.\output-fit-number.ps1 $_)}
1 -> 1
9 -> 5
15 -> 15
13 -> 13
16 -> 2
17 -> 5
65535 -> 65535
65000 -> 16250

1

Implementasi Referensi dalam SILOS "hanya" 417 byte

Golf

readIO :
i + 1
I = i
z = 1 
n = 32
b = n
z = 1
n = b
lbla
n - 1
GOSUB p
j = i
j - p
if j b
if z c
z = 1
GOTO e
lblc
b - 1
if n a
GOTO f
lblb
z = 0
A = a
A + 1000
set A 1
i - p
lble
a + 1
if n a
lblf
q = 1000
e = q
e + b
i = 0
lbl>
d = q
d - e
if d ?
n = b
n - i
GOSUB p
g = get q
g * p
o + g
i + 1
q + 1
GOTO >
lbl?
o / 2
printInt o
GOTO z
funcp
p = 1
Z = n
lblQ
if Z C
GOTO D
lblC
Z - 1
p * 2
GOTO Q
lblD
return
lblz

Berikut ini adalah implementasi referensi sepenuhnya ungolfed. Sebagai fitur bonus menghasilkan langkah-langkah yang diperlukan untuk mendapatkan jawaban.

/**
*Reference Implementation in the high quality S.I.L.O.S language.
*/
readIO Enter a number to "compress"
//some declarations
i + 1
I = i
z = 1 
//the above is a flag which shows whether or not a zero was last outputted
n = 32
b = n
//maximum number of input bits
printLine Original Binary



lblbinLoop
n - 1
GOSUB pow
j = I
j - p
if j printOne
if z ENDLOOP
print 0
GOTO ENDLOOP
lblprintOne
z = 0
print 1
I - p
lblENDLOOP
if n binLoop




printLine  
printLine Binary "Compressed"


z = 1
n = b


lbltopA
n - 1
GOSUB pow
j = i
j - p
if j printAOne
if z DontPrint
z = 1
print 0
GOTO ENDLOOPA
lblDontPrint
b - 1
if n topA
GOTO endOfBin
lblprintAOne
z = 0
print 1
A = a
A + 1000
set A 1
i - p
lblENDLOOPA
a + 1
if n topA

lblendOfBin

printLine  
printLine -----------
printLine Base 10 Output
print Out Bits:
printInt b

q = 1000
e = q
e + b
i = 0
lblOutputDec
d = q
d - e
if d DONE
n = b
n - i
GOSUB pow
g = get q
g * p
o + g
i + 1
q + 1
GOTO OutputDec
lblDONE
printLine
printLine ---------
o / 2
printInt o

GOTO funcs
//function declarations must be wrapped in gotoes to avoid the interpreter from complaining (breaking)

/**
*This will store the nth power of two in the "p" variable
*/
funcpow
p = 1
Z = n
lbltop
if Z continue
GOTO end
lblcontinue
Z - 1
p * 2
GOTO top
lblend
return

lblfuncs

Dengan permintaan, transpilasi telah dihapus. Jangan ragu untuk melihat riwayat edit untuk memulihkannya, jika tidak pergi ke repo ini untuk penerjemah.

Output sampel untuk 65000

Enter a number to "compress"
65000
Original Binary
1111110111101000 
Binary "Compressed"
11111101111010 
-----------
Base 10 Output
Out Bits:14
---------
16250

4
Implementasi referensi harus berada di badan tantangan, bukan sebagai jawaban, karena mereka tidak ungolfed dan dengan demikian bukan pesaing yang serius.
Mego

Ok, saya akan golf itu.
Rohan Jhunjhunwala

Saya tidak ingin membengkak tubuh tantangan dengan @Mego ini
Rohan Jhunjhunwala

@TimmyD sedetik aku bermain golf sekarang
Rohan Jhunjhunwala

@Mego Saya telah bermain golf sekarang
Rohan Jhunjhunwala

1

Pyth, 12

i:.BQ"0+"\02

On line.

  .BQ            # Convert input from base 10 to base 2
 :   "0+"\0      # Replace multiple zeroes with single zero
i          2     # Convert back from base 2 to base 10

1

Retina , 30 byte

.+
$*1;
+`(1+)\1
$1;
1;
1
;+
0

Cobalah online!

Dan di sini saya pikir Retina akan menjadi jawaban pertama ...


@randomra Saya mengajukan pertanyaan OP untuk klarifikasi
Leaky Nun

Apakah Retina mampu konversi biner ke desimal atau konversi biner ke unary? Saya akan kecuali salah satu dari itu agar tidak mengecualikan Retina
Rohan Jhunjhunwala

@RohanJhunjhunwala: Ya, itu
Bisnis Cat

Apakah mungkin membuat konversi ini menjadi unary atau desimal? Idealnya saya ingin melihat desimal, tetapi saya akan menerimanya juga.
Rohan Jhunjhunwala

1

Java, 152 143 138 byte

interface C{static void main(String[]b){Integer i=0;System.out.print(i.parseInt(i.toString(i.parseInt(b[0]),2).replaceAll("0+","0"),2));}}
  • 9 byte lebih sedikit berkat @RohanJhunjhunwala. Saya lebih suka menyimpannya sebagai program yang berfungsi penuh dengan utama dan sejenisnya. Namun, tentu saja bisa bermain golf lebih sebaliknya.
  • 5 byte lebih sedikit berkat saran dari LeakyNun.

1
class A {public static void main (String [] a) {Integer i; System.out.print (i.parseInt (i.toBinaryString (i.parseInt (a [0])). replaceAll ("0+", " 0 "), 2));}} untuk penghematan 8 byte
Rohan Jhunjhunwala

bungkus dengan ekspresi lambda untuk lebih menghemat dan menghapus definisi kelas, dan set Anda.
Rohan Jhunjhunwala

@RohanJhunjhunwala: Ah! Bagian Integer i;itu sederhana dan fantastis!
Master_ex

1
Ini berfungsi, tetapi dapat menghasilkan peringatan (sebagai lawan dari kesalahan) pada sebagian besar IDE yang waras. Masalahnya, Anda selalu dapat memanggil metode statis dari konteks non statis, tetapi Anda tidak pernah dapat memanggil metode non-statis dari konteks statis. Meskipun menggunakan teknik ini sangat tidak disarankan dalam kode produksi, ini adalah java legal.
Rohan Jhunjhunwala

1
codegolf.stackexchange.com/questions/6671/… Adalah bacaan yang baik untuk menjadi lebih akrab dengan yang kurang dikenal (berani saya katakan shadier) "fitur" dari bahasa java.
Rohan Jhunjhunwala

1

Dyalog APL , 19 byte

{2⊥⍵/⍨~0 0⍷⍵}2∘⊥⍣¯1

TryAPL online!

Fungsi ini benar-benar merupakan "puncak" dari dua fungsi, fungsi pertama adalah:

2∘⊥⍣¯1yang terbalik dari binary- untuk konversi -decimal, yaitu binary- dari -decimal konversi
dua 2 terikat untuk -untuk-desimal
berulang operasi negatif satu waktu ¯1(yaitu sekali, tapi terbalik)

Dalam fungsi kedua, hasil biner di atas diwakili oleh :

{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵Boolean untuk tempat {0, 0} dimulai pada ⍵
~Boolean negasi, jadi sekarang kita memiliki ᴛʀᴜᴇ di mana-mana tetapi di nol pertama di nol-lari
⍵/⍨gunakan itu untuk menyaring ⍵, jadi ini menghapus nol yang tidak diinginkan kita
2⊥mengkonversi biner-ke-desimal


1

TSQL, 143 byte

Tidak menggunakan build in untuk mengkonversi dari dan ke biner.

Golf:

DECLARE @i INT=65000

,@ CHAR(99)=''WHILE @i>0SELECT @=REPLACE(LEFT(@i%2,1)+@,'00',0),@i/=2WHILE @>''SELECT @i+=LEFT(@,1)*POWER(2,LEN(@)-1),@=STUFF(@,1,1,'')PRINT @i

Tidak Disatukan:

DECLARE @i INT=65000

,@ CHAR(99)=''
WHILE @i>0
  SELECT @=REPLACE(LEFT(@i%2,1)+@,'00',0),@i/=2

WHILE @>''
  SELECT @i+=LEFT(@,1)*POWER(2,LEN(@)-1),@=STUFF(@,1,1,'')

PRINT @i

Biola


+1 untuk tidak menggunakan bawaan. Jawaban SILOS saya (implementasi referensi) melakukan hal yang sama, tetapi turun karena orang tidak menganggapnya sebagai pesaing yang serius. Apakah baris baru itu penting?
Rohan Jhunjhunwala

@RohanJhunjhunwala baris baru tidak signifikan. Saya menghitung karakter kode setelah variabel input telah ditentukan dan diberi nilai.
t-clausen.dk

ok amkes sense -
Rohan Jhunjhunwala

@RohanJhunjhunwala Saya pikir itu keren bahwa Anda menggunakan bahasa unconversial untuk menyelesaikan pertanyaan Codegolf. Tampaknya Anda memiliki kode yang tidak perlu untuk menambahkan informasi tambahan - mungkin hanya dalam versi yang tidak diklik. Anda harus selalu berusaha memberikan kode sesingkat mungkin, memotong sudut dan menyalahgunakan bahasa querks (dalam lingkup pertanyaan). Jika memungkinkan Anda harus menyediakan biola, jadi muggle saya dapat mengujinya
t-clausen.dk

Versi ungolfed berisi kode yang tidak perlu, tetapi versi golf tidak mengandung kode tambahan. Saya dapat mentransisikannya ke java jika Anda ingin saya mengujinya.
Rohan Jhunjhunwala

1

CJam, 16

q~2b1+0a%0a*);2b

Cobalah online

Cukup lama karena kurangnya regex.

Penjelasan:

q~     read and evaluate the input number
2b     convert to base 2 (array of 1s and 0s)
1+     append a 1 to deal with trailing zeros
0a%    split by [0], dropping empty pieces; only chunks of 1s are left
0a*    join by [0]
);     discard the 1 we appended before
2b     convert back from base 2

1

Java, 64 byte

i->{return i.parseInt(i.toString(i,2).replaceAll("0+","0"),2);};

Program Tes

public static void main(String[] args) {
    Function<Integer, Integer> function = i -> {
        return i.parseInt(i.toString(i, 2).replaceAll("0+", "0"), 2);
    };

    System.out.println(function.apply(1)); // 1
    System.out.println(function.apply(9)); // 5
    System.out.println(function.apply(15)); // 15
    System.out.println(function.apply(13)); // 13
    System.out.println(function.apply(16)); // 2
    System.out.println(function.apply(17)); // 5
    System.out.println(function.apply(65535)); // 65535
}

1

CJam , 23 byte

ri2be`{_:g:>{:g}&}%e~2b

Cobalah online!

Penjelasan

ri          e# Read input as an integer
2b          e# Convert to binary
e`          e# Run-length encoding. Gives a nested (2D) array with run-lengths 
            e# and binary digits
{           e# This block is mapped over the outer array, i.e. is applied to
            e# each inner array
   _        e#   Duplicate the inner array
  :g        e#   Signum of each element of inner array
  :>        e#   This gives true if second element (digit) is false and first
            e#   element (run-length) is not zero. If so, we need to set that
            e#   run-length to 1
  {:g}&     e#   If that's the case, apply signum to original copy of inner
            e#   array, to make run-length 1
}%          e# End block which is mapped over the outer array
e~          e# Run-length decoding
2b          e# Convert from binary. Implicitly display

1

Ruby, 37 35 byte

Disimpan dua byte berkat manatwork.

->a{a.to_s(2).gsub(/0+/,?0).to_i 2}

Pendekatan naif. (:


Mengenai "0", lihat poin 2 di tip sepp2k . Mengenai .to_i(2), di mana tidak ada ambiguitas di mana parameter berada, tanda kurung adalah opsional.
manatwork

1

C, 37 byte

f(x){return x?f(x/2)<<!!(x%4)|x&1:0;}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.