Wyjście liczb „Dopasuj”


21

„Dopasuj liczby”

Sam ma „genialny” pomysł na kompresję! Możesz pomóc?


Oto podsumowanie schematu kompresji Sama. Najpierw weź podstawową reprezentację 10 dowolnej liczby naturalnej ściśle mniejszej niż 2 ^ 16 i zapisz jako ciąg binarny bez zer wiodących.

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

Teraz zamień dowolną grupę jednego lub więcej zer na pojedyncze zero. Wynika to z faktu, że liczba się zmniejszyła. Twój ciąg binarny będzie teraz wyglądał tak.

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

Teraz konwertujesz ciąg binarny z powrotem do reprezentacji podstawowej 10 i wyprowadzasz go w dowolnym akceptowalnym formacie. Oto twoje przypadki testowe. Pierwsza liczba całkowita reprezentuje dane wejściowe, a ostatnia liczba całkowita reprezentuje dane wyjściowe. Pamiętaj, że niektóre liczby się nie zmieniają, dlatego można je nazwać „dopasowanym”

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


Możesz używać dowolnego języka, ale pamiętaj, że Sam nienawidzi standardowych luk. To jest kod golfowy, więc kod może być tak krótki, jak to możliwe, aby zrobić miejsce dla „skompresowanych” liczb.
Uwaga: To NIE jest akceptowalny schemat kompresji. Korzystanie z tego spowoduje natychmiastowe zwolnienie.
Potrzebne cytowanie: Nie przypisuję sobie tej koncepcji. Pochodzi z bloga @Conor O 'Brien tutaj zobacz ten OEIS pasujących numerów. https://oeis.org/A090078


1
Z komiksowego bloga @ Conor: link
Rɪᴋᴇʀ


To ja napisałem komiks. <s> Spodziewam się również 35% przedstawicielstwa królewskiego </s>;)
Conor O'Brien

Czy downvoter mógłby wyjaśnić problem?
Rohan Jhunjhunwala

1
Dlaczego 16 równa się 8? Nie powinno być 16 lat 10000?
wyjechał

Odpowiedzi:


10

05AB1E , 8 6 bajtów

b00¬:C

Wyjaśnienie

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

Wypróbuj online

Zaoszczędzono 2 bajty dzięki Adnan


Możesz zastąpić „00'0przez 00¬:).
Adnan

@Adnan Nice! Nie myślałem o tym.
Emigna

Nie wiem nawet, dlaczego jawnie popchnąłem je jak struny ...
Emigna

Tak, to trochę sprzeczne z intuicją, ale działa :).
Adnan

Wygląda na to, że wygra: D, dam mu trochę więcej czasu na zaakceptowanie, aby więcej osób mogło wziąć udział.
Rohan Jhunjhunwala,


7

JavaScript (ES6), 41 bajtów

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

7

Meduza , 20 bajtów

p
d
# S
,1
*
\dbi
 2

Wypróbuj online!

Wyjaśnienie

  • i jest wejściem.
  • b konwertuje go na binarny (lista cyfr)
  • \dz argumentami, 2a lista cyfr ma zastosowanie d(cyfry binarne do liczby) do każdego podłańcucha o długości 2 na liście cyfr.
  • * przyjmuje podpis wyników: 00 idzie do 0, wszystko inne do 1.
  • ,1 odmierza 1 do końca, więc ostatnia cyfra nie jest tracona.
  • # Swybiera z bicyfr, które mają 1 na powyższej liście: te, które nie są lewymi połówkami 00.
  • dkonwertuje z powrotem na liczbę i pdrukuje wynik.

6

Python 2, 36 bajtów

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

Bezpośrednia rekurencyjna implementacja bez wbudowanych konwersji bazowych ani operacji łańcuchowych. Mniej golfa:

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

Kiedy njest wielokrotnością 4, kończy się na dwóch zerach w postaci binarnej, więc przecinamy jeden przez dzielenie podłogi przez 2. W przeciwnym razie dzielimy się nna (n%2) + 2*(n/2), zostawiamy ostatnią cyfrę binarną w n%2spokoju i powtarzamy na pozostałych cyfrach n/2.


Nie jest n%2zbędny?
xsot

@xsot Nie jestem pewien, co masz na myśli. Robienie |ndaje złe wyniki.
xnor

To znaczy można zastąpić całość (n%4>0)|n%2z (n%4>0).
xsot 18.08.16

@xsot Pierwszeństwo ma postać (f(n/2)<<(n%4>0)) | n%2.
xnor

Ach, więc mój zły. Myślałem, że zmiana ma najniższy priorytet.
xsot 18.08.16

5

Bash (sed + bc), 60 55 43 bajtów

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

edytować:

  1. zmieniono sed -E 's/0+na sed 's/00*i zmieniono echo i potok używane do przekazania wartości do bc za pomocą <<<.
  2. Genialna sugestia @Digital Trauma!

przykład:

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

1
sed + bc to także moja pierwsza myśl. echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bcjest o 2 bajty krótszy
Riley

1
Użyj rur i ucieka na swoją korzyść: echo $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]. Ale dci tr uczyń to znacznie krótszym .
Cyfrowa trauma

1
@DigitalTrauma: Dzięki, to świetnie! @ Riley: fajny pomysł, byłoby to trochę krótsze w ten sposób:bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
Master_ex,

jeśli użyjesz tr -s 0zamiast sed, możesz zejść do 36 bajtów
Riley

@ Riley: To prawda, ale Digital Trauma używa go już w innej odpowiedzi na bash, więc wolę go nie używać :)
Master_ex,

4

Perl 6 ,  31  27 bajtów

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

Wyjaśnienie:

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

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

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

Przykład:

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 bajtów

BFFOZtXB

Ta wersja działa tylko w MATLAB, ponieważ strrepw MATLAB może obsługiwać dane logiczne. Oto wersja, która będzie działać w Octave (9 bajtów) (a tym samym interpreter online), który jawnie przekazuje logiczne dane wejściowe do pisania double.

Wypróbuj online

Wyjaśnienie

    % 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 bajtów.

Zaoszczędzono 4 bajty dzięki Sp3000.

Całkiem proste rozwiązanie.

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

4
Czy możesz zachować 0bi evalzamiast tego?
Sp3000,

@ Sp3000 Z pewnością może! Dzieki za sugestie!
Morgan Thrapp,

Anonimowe lambdy są dozwolone; możesz zmniejszyć to do 48 bajtów, używająclambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import re
MilkyWay90

3

JavaScript (ES6), 40 bajtów

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

1
Obawiam się, że to urywek. O ile opis wyzwania nie stanowi inaczej, oczekuje się, że rozwiązania będą pełnymi programami lub funkcjami.
manatwork

Co wymaga bycia „pełnym programem” w Javascript, jeśli nie chcę korzystać z funkcji? Proszę doradź.
szczegółowooi

Na przykład z node.js: console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0))).
manatwork

Poza tematem. Twój blok kodu ma taki sam problem jak @Master_ex. Czy to dlatego, że niektóre popularne skrypty konfiguracyjne powłoki zanieczyszczają terminal? Czy wina SE?
szczegółowooi

1
Najkrótszą poprawką byłoby dodanie do poprzedniej wersji, N=>co uczyniłoby ją poprawnym przesłaniem funkcji.
Martin Ender,

3

Właściwie 14 bajtów (niekonkurujące)

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

Wypróbuj online!

To zgłoszenie nie jest konkurencyjne, ponieważ Æpo opublikowaniu tego wyzwania dokonano poprawki błędu .

Wyjaśnienie:

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

Następnie opublikuj konkurencyjną wersję!
Leaky Nun



2

PHP, 53 51 bajtów

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

Pobiera argument z konsoli.

Dzięki:

@manatwork zamień „0” na 0


1
Przeważnie "0"i 0są obsługiwane w ten sam sposób.
manatwork

@manatwork Thanks. To było dość oczywiste, które powinienem był zobaczyć.
Jeroen,

2

Perl, 38 + 1 ( -p) = 39 bajtów

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

Potrzebuje -pflagi do uruchomienia (dodałem -lflagę, aby była bardziej czytelna, ale inaczej nie jest potrzebna):

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

Zauważ wiele do powiedzenia na temat kodu: konwertuje liczbę na binarną ( sprintf"%b"), a następnie zastępuje bloki zer tylko jednym zerem i konwertuje wynik na dziesiętny ( oct"0b".).


2

C #, 112 91 bajtów

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

-8 bajtów dzięki TuukkaX


int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}- 94 bajty przy użyciu wyrażenia regularnego. Widziałem wiele rozwiązań C #, które nie obejmują, System.Text.RegularExpressionswięc może to tutaj jest dozwolone ...?
Yytsi

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


Korzystam też z tej strony, ale to nie działa, więc użyłem innej strony. Powinieneś także wspomnieć o wymaganej wersji C #.
Yytsi,

mothereff.in/byte-counter oblicza 79 bajtów dla bieżącego rozwiązania. Musiałem wpisać rozwiązanie ręcznie, inaczej dałoby mi 91.
Yytsi

2

Java, 75

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

Program testowy:

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 przekonwertować na lamda x-> bla; dla mniejszej ilości bajtów
Rohan Jhunjhunwala,

int f (liczba całkowita x) {return x.parseInt (x.toString (x, 2) .replaceAll („0 +”, „0”));} dla kilku mniej bajtów
Rohan Jhunjhunwala

@RohanJhunjhunwala To nieprawda, trzeba użyć bazy 2. Jeśli chodzi o lambda, uważam, że nie jest kompletna bez specyfikacji typu.
aditsu

o ok, druga odpowiedź Java używa tej samej techniki
Rohan Jhunjhunwala



1

PowerShell v2 +, 69 bajtów

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

( Krótszy sposób konwersji do / z pliku binarnego w PowerShell )

Pobiera dane wejściowe $args[0], wykorzystuje wbudowany .NET [convert]::ToString(int,base)do konwersji wejściowej liczby całkowitej na binarny ciąg podstawowy. To jest filtrowane przez, -replaceaby usunąć wszystkie ciągi jednego lub więcej zer do po prostu 0. Ten wynikowy ciąg jest wysyłany z powrotem w drugą stronę, [convert]::ToInt32(string,base)aby przekształcić plik binarny z powrotem na liczbę całkowitą. Ta liczba całkowita pozostawia się w potoku, a dane wyjściowe są niejawne.

Przypadki testowe

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

Odwołanie do implementacji w SILOS „tylko” 417 bajtów

Grał w golfa

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

Oto implementacja referencyjna całkowicie nie golfowa. Jako funkcja dodatkowa generuje kroki potrzebne do uzyskania odpowiedzi.

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

Na żądanie transpozycja została usunięta. Zapoznaj się z historią edycji, aby ją odzyskać, w przeciwnym razie przejdź do tego repozytorium dla tłumacza.

Próbka wyjściowa dla 65000

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

4
Wdrożenia referencyjne powinny znajdować się w organie wyzwającym, a nie jako odpowiedzi, ponieważ są nierozpoznane, a zatem nie są poważnymi konkurentami.
Mego

Ok, zagram w golfa.
Rohan Jhunjhunwala

Nie chciałem nadmuchać ciała wyzwania tym @Mego
Rohan Jhunjhunwala,

@TimmyD jedna sekunda Teraz gram w golfa
Rohan Jhunjhunwala

@Mego Grałem w golfa
Rohan Jhunjhunwala,

1

Pyth, 12

i:.BQ"0+"\02

Online.

  .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

Siatkówka , 30 bajtów

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

Wypróbuj online!

I tutaj myślałem, że Retina będzie jedną z pierwszych odpowiedzi ...


@randomra Zadaję pytanie OP w celu wyjaśnienia
Leaky Nun

Czy Retina może konwertować dane binarne na dziesiętne lub binarne na jednoargumentowe? Z wyjątkiem jednego z nich nie wykluczę Retiny
Rohan Jhunjhunwala,

@RohanJhunjhunwala: Tak, to jest
Business Cat

Czy jest możliwe, aby konwertować na liczbę pojedynczą lub dziesiętną? Idealnie chciałbym zobaczyć dziesiętne, ale zaakceptuję oba.
Rohan Jhunjhunwala,

1

Java, 152 143 138 bajtów

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 bajtów mniej dzięki @RohanJhunjhunwala. Wolę zachować go jako w pełni funkcjonalny program z głównym i tym podobnym. Można jednak oczywiście grać w golfa w inny sposób.
  • 5 bajtów mniej dzięki sugestiom @ LeakyNun.

1
klasa A {public static void main (String [] a) {Integer i; System.out.print (i.parseInt (i.toBinaryString (i.parseInt (a [0])). replaceAll („0+”, „ 0 "), 2));}} na 8 bajtów oszczędzania
Rohan Jhunjhunwala

zawiń go w wyrażeniu lambda, aby jeszcze bardziej zapisać i usunąć definicje klas oraz zestaw.
Rohan Jhunjhunwala

@RohanJhunjhunwala: Ach! Ta Integer i;część jest prosta i fantastyczna!
Master_ex,

1
Działa, ale może generować ostrzeżenie (w przeciwieństwie do błędu) na większości rozsądnych IDE. Chodzi o to, że zawsze można wywoływać metody statyczne z kontekstu niestatycznego, ale nigdy nie można wywoływać metody niestatycznej z kontekstu statycznego. Podczas gdy używanie tej techniki jest zdecydowanie odradzane w kodzie produkcyjnym, jest to legalna Java.
Rohan Jhunjhunwala

1
codegolf.stackexchange.com/questions/6671/… Jest dobrym materiałem do zapoznania się z mniej znanymi (ośmielę się powiedzieć, że „cieńszymi”) funkcjami języka Java.
Rohan Jhunjhunwala

1

Dyalog APL , 19 bajtów

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

Wypróbuj APL online!

Ta funkcja jest naprawdę „na szczycie” dwóch funkcji, pierwszą funkcją jest:

2∘⊥⍣¯1odwrotny od binary- do -decimal konwersji, tj binary- z -decimal konwersji
dwóch 2 wiąże się -to-dziesiętnej
powtórzyć operację jeden ujemny czasu ¯1(to znaczy jednocześnie, lecz odwrócone)

W drugiej funkcji powyższy wynik binarny jest reprezentowany przez :

{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵Wartość logiczna dla miejsca, w którym {0, 0} zaczyna się od ool
~Negacja logiczna, więc teraz mamy but wszędzie, ale przy zerowych zerach w zerowych biegach
⍵/⍨używamy tego do filtrowania ⍵, więc to usuwa nasze niechciane zera
2⊥konwertowane z binarnego na dziesiętny


1

TSQL, 143 bajty

Nieużywanie wbudowanych poleceń do konwersji zi na pliki binarne.

Gra w golfa:

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

Nie golfowany:

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

Skrzypce


+1 za nieużywanie wbudowanych elementów. Moja odpowiedź SILOS (implementacja referencyjna) robi to samo, ale została odrzucona, ponieważ ludzie nie myśleli, że to poważny konkurent. Czy nowa linia jest znacząca?
Rohan Jhunjhunwala,

@RohanJhunjhunwala nowa linia nie jest znacząca. Liczę znaki kodu po zdefiniowaniu zmiennej wejściowej i przypisaniu wartości.
t-clausen.dk

ok amkes sens -
Rohan Jhunjhunwala

@RohanJhunjhunwala Myślę, że to fajne, że używasz niekonwencjonalnego języka do rozwiązywania pytań Codegolfa. Wygląda na to, że masz niepotrzebny kod, aby dodać dodatkowe informacje - prawdopodobnie tylko w wersji bez golfisty. Zawsze powinieneś starać się podać możliwie najkrótszy kod, skracając rogi i nadużywając pytań językowych (w zakresie pytania). Jeśli to możliwe, powinieneś dostarczyć skrzypce, więc mugole mogą mnie przetestować
t-clausen.dk

Wersja bez golfa zawiera niepotrzebny kod, ale wersja z golfem nie zawiera dodatkowego kodu. Mogę transpilować go do Java, jeśli chcesz, żebym go przetestował.
Rohan Jhunjhunwala

1

CJam, 16 lat

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

Wypróbuj online

Jest dość długi z powodu braku wyrażenia regularnego.

Wyjaśnienie:

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 bajty

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

Program testowy

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 bajty

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

Wypróbuj online!

Wyjaśnienie

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

Rubinowy, 37 35 bajtów

Zaoszczędzono dwa bajty dzięki manatwork.

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

Naiwne podejście. (:


Jeśli chodzi "0", patrz punkt 2. sepp2k jest końcówki . Jeśli chodzi o to .to_i(2), że nie ma dwuznaczności co do tego, gdzie należy parametr, nawiasy są opcjonalne.
manatwork

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.