เอาท์พุท“ พอดี” ตัวเลข


21

"พอดีตัวเลข"

แซมมีแนวคิด "ยอดเยี่ยม" สำหรับการบีบอัด! คุณช่วยได้ไหม


นี่เป็นบทสรุปของแผนการบีบอัดของแซม ก่อนอื่นใช้เลขฐาน 10 แทนจำนวนธรรมชาติใด ๆ ที่มีขนาดเล็กกว่า 2 ^ 16 อย่างเคร่งครัดและเขียนเป็นสตริงไบนารีโดยไม่มีศูนย์นำหน้า

1 -> 1
9 -> 1001
15 -> 1111
13 -> 1101
16 -> 10,000
17 -> 1,0001
65535 -> 111111111111111

ตอนนี้แทนที่กลุ่มใด ๆ หนึ่งศูนย์หรือมากกว่าด้วยศูนย์เดียว นี่เป็นเพราะจำนวนนั้นผอมลง ตอนนี้สตริงไบนารีของคุณจะเป็นแบบนี้

1 -> 1 -> 1
9 -> 1001 -> 101
15 -> 1111 -> 1111
13 -> 1101 -> 1101
16 -> 10000 -> 10
17 -> 1,0001 -> 101
65535 -> 111111111111111 -> 111111111111111

ทีนี้คุณก็แปลงไบนารี่สตริงกลับไปเป็นเบสพื้นฐาน 10 แล้วส่งออกในรูปแบบที่ยอมรับได้ นี่คือกรณีทดสอบของคุณ จำนวนเต็มแรกแทนการป้อนข้อมูลและจำนวนเต็มสุดท้ายแทนการแสดงผล โปรดทราบว่าบางหมายเลขไม่เปลี่ยนแปลงและสามารถเรียกได้ว่า "พอดี"

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


คุณอาจใช้ภาษาใดก็ได้ แต่โปรดทราบว่าแซมเกลียดช่องโหว่มาตรฐาน นี่คือรหัสกอล์ฟเพื่อให้รหัสสามารถสั้นที่สุดเพื่อให้มีที่ว่างสำหรับหมายเลข "ที่บีบอัด"
หมายเหตุ: นี่ไม่ใช่รูปแบบการบีบอัดที่ยอมรับได้ การใช้สิ่งนี้จะทำให้คุณถูกไล่ออกทันที
จำเป็นต้องมีการอ้างอิง: ฉันไม่ได้รับเครดิตสำหรับแนวคิดนี้ นี่มาจากบล็อกของ @Conor O 'Brien ที่นี่ดู OEIS ของตัวเลขพอดี https://oeis.org/A090078


1
จากบล็อกการ์ตูนของ @ Conor: ลิงก์
2559

3
OEIS A090078อาจมีประโยชน์
Adnan

ฉันเป็นคนเขียนการ์ตูน <s> ฉันยังคาดหวังค่าภาคหลวงตัวแทน 35% </s>;)
Conor O'Brien

ผู้ลงคะแนนเสียงโปรดอธิบายปัญหานี้หรือไม่
Rohan Jhunjhunwala

1
ทำไม 16 เท่ากับ 8? ไม่ควร 16 เป็น10000?
eithed

คำตอบ:


10

05AB1E , 8 6 ไบต์

b00¬:C

คำอธิบาย

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

ลองออนไลน์

บันทึก 2 ไบต์ต้องขอบคุณAdnan


คุณสามารถแทนที่„00'0ด้วย00¬:)
Adnan

@Adnan Nice! ไม่ได้คิดอย่างนั้น
Emigna

ฉันไม่รู้ด้วยซ้ำว่าทำไมฉันจึงผลักพวกเขาให้เป็นสตริงอย่างชัดเจน ...
Emigna

ใช่มันค่อนข้างใช้งานง่าย แต่ใช้งานได้ดี :)
Adnan

ดูเหมือนว่ามันจะชนะ: D ฉันจะให้เวลาอีกเล็กน้อยก่อนที่จะยอมรับเพื่อให้ผู้คนสามารถเข้าร่วมได้มากขึ้น
Rohan Jhunjhunwala



7

แมงกระพรุนขนาด 20 ไบต์

p
d
# S
,1
*
\dbi
 2

ลองออนไลน์!

คำอธิบาย

  • i เป็นอินพุต
  • b แปลงเป็นไบนารี่ (รายการของตัวเลข)
  • \dด้วยข้อโต้แย้ง2และรายการหลักใช้d (เลขฐานสองเป็นตัวเลข) กับสตริงย่อยยาว 2 ของรายการหลัก
  • * ใช้ signum ของผลลัพธ์: 00 ไปที่ 0 ทุกอย่างเป็น 1
  • ,1 tacks 1 ถึงจุดสิ้นสุดดังนั้นตัวเลขสุดท้ายจะไม่สูญหาย
  • # S เลือกจาก biตัวเลขเหล่านั้นที่มี 1 ในรายการที่คำนวณข้างต้น: ตัวเลขที่ไม่ใช่ครึ่งซ้ายของ 00
  • dแปลงกลับเป็นตัวเลขและpพิมพ์ผลลัพธ์

6

Python 2, 36 ไบต์

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

การใช้งานแบบเรียกซ้ำโดยตรงโดยไม่มีการแปลงฐานหรือการดำเนินการของสตริง หักกอล์ฟ:

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

เมื่อnมีหลายที่ 4 มันจะจบในสอง 0 ในไบนารีดังนั้นเราจึงตัดหนึ่งโดยพื้นหารด้วย 2. มิฉะนั้นเราแยกnเข้า(n%2) + 2*(n/2)ออกหลักสุดท้ายไบนารีn%2คนเดียวและ recurse n/2ในตัวเลขอื่น


ไม่n%2ซ้ำซ้อนหรือไม่
xsot

@xsot ไม่แน่ใจว่าคุณหมายถึงอะไร การ|nทำให้ผลลัพธ์ที่ผิด
xnor

ฉันหมายความว่าคุณสามารถแทนที่ทั้งกับ(n%4>0)|n%2 (n%4>0)
xsot

@xsot (f(n/2)<<(n%4>0)) | n%2ความสำคัญเป็นไปตาม
xnor

อ่าฉันก็แย่แล้ว ฉันคิดว่าการเปลี่ยนเป็นสิ่งที่สำคัญที่สุด
xsot

5

Bash (sed + bc), 60 55 43 ไบต์

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

แก้ไข:

  1. เปลี่ยนsed -E 's/0+ไปและเปลี่ยนเสียงสะท้อนและท่อใช้ในการส่งค่าให้กับคริสตศักราชsed 's/00*<<<
  2. ข้อเสนอแนะที่ยอดเยี่ยมโดย @Digital Trauma!

ตัวอย่าง:

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

1
sed + bc เป็นความคิดแรกของฉันด้วย echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bcสั้นลง 2 ไบต์
Riley

1
echo $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]ใช้ท่อและหนีออกมาเพื่อประโยชน์ของคุณ: แต่dcและทำให้มันเป็นทางที่สั้นกว่าtr
บาดเจ็บทางดิจิตอล

1
@ DigitalTrauma: ขอบคุณดีมาก! @Riley: ความคิดที่ดีมันจะสั้นกว่านี้นิดหน่อย:bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
Master_ex

ถ้าคุณใช้tr -s 0แทน sed คุณสามารถลดลงถึง 36 bytes
Riley

@Riley: ทรูดิจิตอล แต่บาดเจ็บแล้วใช้มันในคำตอบที่ทุบตีอื่น ๆ ดังนั้นผมจึงไม่ต้องการที่จะใช้มัน :)
Master_ex

4

Perl 6 ,  31  27 ไบต์

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

คำอธิบาย:

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

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

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

ตัวอย่าง:

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 ไบต์

BFFOZtXB

รุ่นนี้ใช้งานได้ใน MATLAB เท่านั้นเนื่องจากstrrepใน MATLAB สามารถจัดการอินพุตแบบลอจิคัล นี่คือรุ่นที่จะใช้งานใน Octave (9 bytes) (และล่ามออนไลน์) ซึ่งจะทำการปลดลอจิคัลอินพุตเพื่อพิมพ์อย่างชัดเจนdoubleซึ่งชัดเจนดุจปัจจัยตรรกะประเภท

ลองออนไลน์

คำอธิบาย

    % 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 ไบต์

บันทึกแล้ว 4 ไบต์ด้วย Sp3000

ทางออกที่ตรงไปตรงมาสวย

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

4
คุณสามารถเก็บ0bและเพียงevalแทน?
Sp3000

@ Sp3000 แน่นอนสามารถ! ขอบคุณสำหรับคำแนะนำ!
Morgan Thrapp

อนุญาตให้ใช้ lambdas แบบไม่ระบุชื่อ คุณสามารถย่อขนาดให้เหลือ 48 ไบต์ได้โดยใช้lambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import re
MilkyWay90

3

Javascript (ES6), 40 ไบต์

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

1
ฉันกลัวว่านี่เป็นตัวอย่าง หากไม่ได้ระบุคำอธิบายความท้าทายไว้เป็นอย่างอื่นโซลูชันคาดว่าจะเป็นโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ
จัดการ

จำเป็นต้องเป็น "full program" ใน Javascript หากฉันไม่ต้องการใช้ฟังก์ชั่นอะไร? กรุณาแนะนำ
cychoi

เช่นกับ console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0)))Node.js:
จัดการ

ปิดหัวข้อ รหัสบล็อกของคุณมีปัญหาเช่นเดียวกับ @Master_ex เป็นเพราะสคริปต์การตั้งค่าเชลล์ยอดนิยมบางตัวสร้างมลพิษให้กับเครื่อง หรือความผิดของ SE
cychoi

1
การแก้ไขที่สั้นที่สุดคือการเติมN=>ซึ่งจะทำให้การส่งฟังก์ชั่นถูกต้อง
Martin Ender

3

จริงแล้ว 14 ไบต์ (ไม่ใช่การแข่งขัน)

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

ลองออนไลน์!

การส่งนี้ไม่ได้แข่งขันกันเพราะข้อผิดพลาดสำหรับ Æแก้ไขข้อผิดพลาดหลังจากการโพสต์ความท้าทายนี้

คำอธิบาย:

├`'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

จากนั้นโพสต์เวอร์ชันแข่งขัน!
Leun Nun



2

PHP, 53 51 ไบต์

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

รับอาร์กิวเมนต์จากคอนโซล

ขอบคุณที่:

@ manatwork แทนที่ "0" ด้วย 0


1
เป็นส่วนใหญ่"0"และ0ได้รับการจัดการในลักษณะเดียวกัน
จัดการ

@ การจัดการขอบคุณ นั่นเป็นสิ่งที่ชัดเจนมากที่ฉันควรเห็นตัวเอง
Jeroen

2

Perl, 38 + 1 ( -p) = 39 ไบต์

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

ต้องการ-pตั้งค่าสถานะให้ทำงาน (ฉันเพิ่มการ-lตั้งค่าสถานะเพื่อให้อ่านได้ง่ายขึ้น แต่ไม่จำเป็นต้องใช้อย่างอื่น):

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

โปรดสังเกตมากเกี่ยวกับรหัส: มันแปลงตัวเลขเป็นเลขฐานสอง ( sprintf"%b") แล้วแทนที่ blocs ของศูนย์เพียงหนึ่งศูนย์และแปลงผลลัพธ์เป็นทศนิยม ( oct"0b".)


2

C #, 112 91 ไบต์

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

-8 ไบต์ขอบคุณ TuukkaX


int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}- 94 ไบต์โดยใช้ regex ฉันเคยเห็นโซลูชัน C # จำนวนมากไม่ได้รวมอยู่ด้วยSystem.Text.RegularExpressionsดังนั้นอาจได้รับอนุญาตที่นี่ด้วย ...
Yytsi

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

i dont know how you are counting bytes, i use this mothereff.in/byte-counter
downrep_nation

I use that page too, but it wouldn't work, so I used a different page. You should also mention the required C# version.
Yytsi

mothereff.in/byte-counter calculates 79 bytes for your current solution. I had to type the solution by hand, otherwise it would give me 91.
Yytsi

2

Java, 75

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

Test program:

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 convert to lamda x->blah; for fewer bytes
Rohan Jhunjhunwala

int f(Integer x){return x.parseInt(x.toString(x,2).replaceAll("0+","0"));} for a couple fewer bytes
Rohan Jhunjhunwala

@RohanJhunjhunwala That's wrong, it needs to use base 2. As for the lambda, I feel that it's incomplete without the type specification.
aditsu

oh ok, the other java answer uses the same technique
Rohan Jhunjhunwala



1

PowerShell v2+, 69 bytes

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

(A shorter way to convert to/from binary in PowerShell)

Takes input $args[0], uses the .NET built-in [convert]::ToString(int,base) to convert the input integer into a binary base string. That's filtered through the -replace to strip out any runs of one-or-more-zeros to just 0. That resultant string is sent back through the other direction via [convert]::ToInt32(string,base) to turn the binary back into an integer. That integer is left on the pipeline and output is implicit.

Test Cases

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

Reference Implementation in S.I.L.O.S "only" 417 bytes

Golfed

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

Here is the reference implementation fully ungolfed. As a bonus feature it outputs the steps needed to come to an answer.

/**
*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

By request the transpilation has been deleted. Feel free to view the edit history to recover it, otherwise go to this repo for an interpreter.

Sample output for 65000

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

4
Reference implementations should be in the challenge body, not as answers, since they are ungolfed and thus not serious contenders.
Mego

Ok, I'll golf it.
Rohan Jhunjhunwala

I didn't want to bloat up the challenge body with this @Mego
Rohan Jhunjhunwala

@TimmyD one second I'm golfing it down now
Rohan Jhunjhunwala

@Mego I have golfed it now
Rohan Jhunjhunwala


1

Retina, 30 bytes

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

Try it online!

And here I thought Retina would be amongst the first answers...


@randomra I'm asking the question OP for clarification
Leaky Nun

Is Retina capable of binary to decimal conversion or binary to unary conversion? I'll except either one so as to not exclude Retina
Rohan Jhunjhunwala

@RohanJhunjhunwala: Yes, it is
Business Cat

Is it possible to make this convert to unary or decimal? Ideally I would like to see decimal, but I will accept either.
Rohan Jhunjhunwala

1

Java, 152 143 138 bytes

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 bytes less thanks to @RohanJhunjhunwala. I prefer to keep it as a fully functioning program with main and the like. However, of course it can be golfed more otherwise.
  • 5 bytes less thanks to @LeakyNun's suggestions.

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));}} for 8 bytes of saving
Rohan Jhunjhunwala

wrap it in a lambda expression for even more saving and remove class definitions, and your set.
Rohan Jhunjhunwala

@RohanJhunjhunwala:Ah! The Integer i; part is simple and fantastic!
Master_ex

1
It works, but may produce a warning (as opposed to an error) on most sane IDE's. The thing is, you can always call static methods from a non static context, but you can never call a non-static method from a static context. While using this technique is strongly strongly discouraged in production code, it is legal java.
Rohan Jhunjhunwala

1
codegolf.stackexchange.com/questions/6671/… Is a good read to get more familiar with the lesser known (dare I say shadier) "features" of the java language.
Rohan Jhunjhunwala

1

Dyalog APL, 19 bytes

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

TryAPL online!

This function is really an "atop" of two functions, the first function is:

2∘⊥⍣¯1 the inverse of binary-to-decimal conversion, i.e. binary-from-decimal conversion
two 2 is bound to -to-decimal
repeat the operation negative one time ¯1 (i.e. once, but inverted)

In the second function, the above's binary result is represented by :

{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵ Boolean for where {0, 0} begins in ⍵
~ Boolean negation, so now we have ᴛʀᴜᴇ everywhere but at non-first zeros in zero-runs
⍵/⍨ use that to filter ⍵, so this removes our unwanted zeros
2⊥ convert binary-to-decimal


1

TSQL, 143 bytes

Not using build ins to convert from and to binary.

Golfed:

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

Ungolfed:

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

Fiddle


+1 for not using built ins. My S.I.L.O.S answer (reference implementation) does the same, but it got downvoted as people didn't think it was a serious competitor. Is the new line significant?
Rohan Jhunjhunwala

@RohanJhunjhunwala the new line is not significant. I am counting the characters of the code after the input variable has been defined and assigned a value.
t-clausen.dk

ok amkes sense -
Rohan Jhunjhunwala

@RohanJhunjhunwala I think it is cool that you use an unconversial language to solve Codegolf questions. It does seem you have unnecessary code to add extra information - probably only in your ungolfed version though. You should always try to provide the shortest code possible, cutting corners and abusing language querks(within the scope of the question). If possible you should provide a fiddle, so muggles me can test it
t-clausen.dk

The ungolfed version contains unnecessary code, but the golfed version contains no additional code. I can transpiler it into java if you want me to test it.
Rohan Jhunjhunwala

1

CJam, 16

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

Try it online

It's quite long due to lack of regex.

Explanation:

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 bytes

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

Test Program

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 bytes

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

Try it online!

Explanation

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 bytes

Saved two bytes thanks to manatwork.

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

The naive approach. (:


Regarding "0", see the 2nd point in sepp2k's tip. Regarding .to_i(2), where there is no ambiguity on where a parameter belongs, the parentheses are optional.
manatwork

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.