Geben Sie "Fit" -Nummern aus


21

"Fit Numbers"

Sam hat eine "geniale" Idee für die Komprimierung! Kannst du helfen?


Hier ist ein Überblick über Sams Komprimierungsschema. Nehmen Sie zunächst eine Basis 10-Darstellung einer natürlichen Zahl, die streng kleiner als 2 ^ 16 ist, und schreiben Sie sie als Binärzeichenfolge ohne führende Nullen.

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

Ersetzen Sie nun eine Gruppe von einer oder mehreren Nullen durch eine einzelne Null. Dies liegt daran, dass die Zahl magerer geworden ist. Ihre Binärzeichenfolge sieht jetzt so aus.

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

Jetzt konvertieren Sie die Binärzeichenfolge zurück in eine Basis 10-Darstellung und geben sie in einem beliebigen akzeptablen Format aus. Hier sind Ihre Testfälle. Die erste Ganzzahl repräsentiert eine Eingabe und die letzte Ganzzahl repräsentiert eine Ausgabe. Beachten Sie, dass sich einige Zahlen nicht ändern und daher als "fit" bezeichnet werden können.

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 -> 11111111111111 -> 65535
65000 -> 1111110111101000 -> 11111101111010 -> 16250


Sie können jede Sprache verwenden, aber bitte beachten Sie, dass Sam Standardlücken hasst. Dies ist Codegolf, damit der Code so kurz wie möglich ist, um Platz für die "komprimierten" Zahlen zu schaffen.
Hinweis: Dies ist KEIN akzeptables Komprimierungsschema. Wenn Sie dies verwenden, werden Sie sofort gefeuert.
Citation-Needed: Ich kann dieses Konzept nicht würdigen. Das kommt von @Conor O‘Brien Blog hier sehen diese OEIS Passnummern. https://oeis.org/A090078


1
Aus dem Comic-Blog von @ Conor: link
16.

3
OEIS A090078 könnte sich als nützlich erweisen.
Adnan

Ich habe den Comic geschrieben. <s> Ich erwarte auch eine Lizenzgebühr von 35% </ s>;)
Conor O'Brien

Würde der Downvoter bitte das Problem erläutern?
Rohan Jhunjhunwala

1
Warum ist 16 gleich 8? Sollte nicht 16 sein 10000?
Eithed

Antworten:


10

05AB1E , 8 6 Bytes

b00¬:C

Erläuterung

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

Probieren Sie es online aus

2 Bytes gespart dank Adnan


Sie können „00'0durch 00¬:) ersetzen .
Adnan

@Adnan Schön! Daran habe ich nicht gedacht.
Emigna

Ich weiß nicht einmal, warum ich sie explizit als Saiten drückte ...
Emigna

Ja, es ist ein bisschen eingängig, aber es funktioniert :).
Adnan

Das sieht so aus, als würde es gewinnen: D, ich werde ein bisschen mehr Zeit darauf verwenden, bevor ich akzeptiere, damit mehr Leute teilnehmen können.
Rohan Jhunjhunwala


7

JavaScript (ES6), 41 Byte

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

7

Qualle , 20 Bytes

p
d
# S
,1
*
\dbi
 2

Probieren Sie es online!

Erläuterung

  • i eingegeben wird.
  • b konvertiert es in binär (Liste der Ziffern)
  • \dmit Argumenten 2und die Ziffernliste gilt d(Binärziffern zu Zahl) für jede Teilzeichenfolge der Länge 2 der Ziffernliste.
  • * Nimmt ein Zeichen für die Ergebnisse: 00 geht auf 0, alles andere auf 1.
  • ,1 setzt eine 1 ans Ende, damit die letzte Ziffer nicht verloren geht.
  • # Swählt aus biden Ziffern, die eine 1 in der oben berechneten Liste haben: diejenigen, die nicht die linke Hälfte von 00 sind.
  • dkonvertiert zurück in Zahl und pdruckt das Ergebnis.

6

Python 2, 36 Bytes

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

Eine direkte rekursive Implementierung ohne integrierte Basiskonvertierungs- oder Zeichenfolgenoperationen. Weniger golfen:

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

Wenn nes sich um ein Vielfaches von 4 handelt, endet es in zwei binären Nullen , sodass wir eine durch Teilen durch 2 abschneiden. Andernfalls teilen wir uns nauf (n%2) + 2*(n/2), lassen die letzte binäre Ziffer in n%2Ruhe und greifen auf die anderen Ziffern zurück n/2.


Ist nicht n%2überflüssig?
Xsot

@ xsot Nicht sicher, was du meinst. Tun |nführt zu falschen Ergebnissen.
Xnor

Ich meine , Sie ganz ersetzen können , (n%4>0)|n%2mit (n%4>0).
xsot

@xsot Die Rangfolge lautet (f(n/2)<<(n%4>0)) | n%2.
xnor

Ah, mein schlechtes dann. Ich dachte, das Schalten hat die niedrigste Priorität.
xsot

5

Bash (sed + bc), 60 55 43 Bytes

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

bearbeiten:

  1. geändert sed -E 's/0+in sed 's/00*und geändert in Echo und Pipe, mit denen der Wert an bc übergeben wird <<<.
  2. Genialer Vorschlag von @Digital Trauma!

Beispiel:

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

1
sed + bc war auch mein erster Gedanke. echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bcist 2 Bytes kürzer
Riley

1
Verwenden Sie Rohre und Fluchten zu Ihrem Vorteil: echo $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]. Aber dcund tr mach es viel kürzer .
Digital Trauma

1
@DigitalTrauma: Danke, das ist toll! @ Riley: nette Idee, es wäre ein bisschen kürzer wie das:bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
Master_ex

Wenn Sie tr -s 0anstelle von sed verwenden, können Sie bis zu 36 Bytes erreichen
Riley

@ Riley: Stimmt, aber Digital Trauma verwendet es bereits in der anderen Bash-Antwort, daher bevorzuge ich, es nicht zu verwenden :)
Master_ex

4

Perl 6 ,  31  27 Bytes

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

Erläuterung:

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

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

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

Beispiel:

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 Bytes

BFFOZtXB

Diese Version funktioniert nur in MATLAB, da strrepin MATLAB logische Eingaben verarbeitet werden können. Hier ist eine Version, die in Octave (9 Bytes) (und damit im Online-Interpreter) funktioniert und die logischen Eingaben explizit in type umsetzt double.

Probieren Sie es online aus

Erläuterung

    % 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 Bytes.

4 Bytes gespart dank Sp3000.

Ziemlich einfache Lösung.

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

4
Kannst du das 0bund einfach evalstattdessen behalten ?
Sp3000

@ Sp3000 Sicher kann das! Danke für den Vorschlag!
Morgan Thrapp

Anonyme Lambdas sind erlaubt; Sie können dies mitlambda 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
Ich fürchte, das ist ein Ausschnitt. Sofern in der Beschreibung der Herausforderung nichts anderes angegeben ist, wird erwartet, dass es sich bei den Lösungen um vollständige Programme oder Funktionen handelt.
Manatwork

Was muss in Javascript "volles Programm" sein, wenn ich die Funktion nicht nutzen möchte? Bitte beraten.
Cychoi

Zum Beispiel mit Node.js: console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0))).
Manatwork

Off topic. Ihr Codeblock hat das gleiche Problem wie @Master_ex. Liegt es daran, dass einige beliebte Shell-Konfigurationsskripts das Terminal verschmutzen? Oder ist SE schuld?
Cychoi

1
Die kürzeste Lösung wäre das Voranstellen N=>einer gültigen Funktion.
Martin Ender

3

Eigentlich 14 Bytes (nicht konkurrierend)

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

Probieren Sie es online!

Diese Einsendung ist nicht konkurrierend, da ein Bugfix für gemacht Æwurde, nachdem diese Herausforderung veröffentlicht wurde.

Erläuterung:

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

Dann poste eine konkurrierende Version!
Undichte Nonne



2

PHP, 53 51 Bytes

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

Übernimmt ein Argument von der Konsole.

Dank an:

@manatwork "0" durch 0 ersetzen


1
Meistens "0"und 0werden genauso gehandhabt.
Manatwork

@manatwork Danke. Das war ziemlich offensichtlich, ich hätte mich sehen sollen.
Jeroen

2

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

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

Needs -pflag to run (Ich habe -lflag hinzugefügt , um es lesbarer zu machen, aber es wird sonst nicht benötigt):

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

Zu dem Code gibt es viel zu sagen: Er konvertiert die Zahl in binary ( sprintf"%b"), ersetzt dann Blöcke mit Nullen durch nur eine Null und konvertiert das Ergebnis in decimal ( oct"0b".).


2

C #, 112 91 Bytes

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

-8 Bytes dank TuukkaX


int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}- 94 Bytes unter Verwendung von Regex. Ich habe gesehen, dass viele C # -Lösungen nicht enthalten System.Text.RegularExpressionssind. Vielleicht ist dies auch hier zulässig ...?
Yytsi

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

Ich weiß nicht, wie Sie Bytes zählen, ich benutze diese mothereff.in/byte-counter
Downrep_nation

Ich benutze diese Seite auch, aber es würde nicht funktionieren, also habe ich eine andere Seite verwendet. Sie sollten auch die erforderliche C # -Version angeben.
Yytsi

mothereff.in/byte-counter berechnet 79 Bytes für Ihre aktuelle Lösung. Ich musste die Lösung von Hand
eingeben

2

Java, 75

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

Testprogramm:

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 konvertieren nach lamda x-> blah; für weniger Bytes
Rohan Jhunjhunwala

int f (Integer x) {gebe x.parseInt (x.toString (x, 2) .replaceAll ("0 +", "0")) für ein paar Bytes weniger zurück
Rohan Jhunjhunwala

@RohanJhunjhunwala Das ist falsch, es muss Basis 2 verwendet werden. Was das Lambda betrifft, habe ich das Gefühl, dass es ohne die Typangabe unvollständig ist.
Aditsu

oh ok, die andere Java-Antwort verwendet die gleiche Technik
Rohan Jhunjhunwala



1

PowerShell v2 +, 69 Byte

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

( Eine kürzere Möglichkeit zum Konvertieren in / aus Binärdateien in PowerShell )

Übernimmt Eingaben $args[0], verwendet das eingebaute .NET[convert]::ToString(int,base) konvertiert die Eingabe-Ganzzahl in eine binäre Basiszeichenfolge. Das wird durch die gefiltert -replace, um alle Läufe von einer oder mehreren Nullen zu entfernen 0. Diese resultierende Zeichenfolge wird über zurück in die andere Richtung gesendet [convert]::ToInt32(string,base), um die Binärdatei wieder in eine Ganzzahl umzuwandeln. Diese Ganzzahl bleibt in der Pipeline und die Ausgabe ist implizit.

Testfälle

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

Referenzimplementierung in SILOS "nur" 417 Byte

Golf gespielt

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

Hier ist die Referenzimplementierung völlig ungolfed. Als Bonusfunktion werden die Schritte ausgegeben, die für eine Antwort erforderlich sind.

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

Auf Wunsch wurde die Transpilation gelöscht. Sie können auch den Bearbeitungsverlauf anzeigen, um ihn wiederherzustellen. Andernfalls wechseln Sie zu diesem Repo einen Dolmetscher.

Beispielausgabe für 65000

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

4
Referenzimplementierungen sollten sich im Herausforderungskörper befinden, nicht als Antworten, da sie nicht im Golf sind und daher keine ernsthaften Konkurrenten sind.
Mego

Ok, ich werde es Golf spielen.
Rohan Jhunjhunwala

Ich wollte den Herausforderungskörper mit diesem @Mego
Rohan Jhunjhunwala

@ TimyD eine Sekunde Ich spiele jetzt Golf
Rohan Jhunjhunwala

@ Mego Ich habe es jetzt Golf gespielt
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

Netzhaut , 30 Bytes

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

Probieren Sie es online!

Und hier dachte ich, Retina wäre eine der ersten Antworten ...


@ Randomra Ich stelle die Frage OP zur Klärung
Leaky Nun

Kann Retina Binär in Dezimal oder Binär in Unär konvertieren? Ich werde eine Ausnahme machen, um Retina
Rohan Jhunjhunwala

@ RohanJhunjhunwala: Ja, es ist
Business Cat

Ist es möglich, diese Konvertierung in unär oder dezimal durchzuführen? Im Idealfall würde ich gerne eine Dezimalzahl sehen, aber ich werde beides akzeptieren.
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 weniger dank @RohanJhunjhunwala. Ich bevorzuge es, es als ein voll funktionsfähiges Programm mit Haupt- und dergleichen zu behalten. Es kann aber natürlich auch anders gespielt werden.
  • 5 Bytes weniger dank @ LeakyNuns Vorschlägen.

1
Klasse A {public static void main (Zeichenfolge [] a) {Ganzzahl i; System.out.print (i.parseInt (i.toBinaryString (i.parseInt (a [0])). replaceAll ("0+", " 0 "), 2));}} für 8 Bytes Speichern
Rohan Jhunjhunwala

Wickeln Sie es in einen Lambda-Ausdruck, um Klassendefinitionen und Ihre Menge noch besser zu speichern und zu entfernen.
Rohan Jhunjhunwala

@ RohanJhunjhunwala: Ah! Der Integer i;Teil ist einfach und fantastisch!
Master_ex

1
Es funktioniert, kann aber bei den meisten vernünftigen IDEs eine Warnung (im Gegensatz zu einem Fehler) auslösen. Die Sache ist, Sie können immer statische Methoden aus einem nicht statischen Kontext aufrufen, aber Sie können niemals eine nicht statische Methode aus einem statischen Kontext aufrufen. Obwohl von der Verwendung dieser Technik im Produktionscode dringend abgeraten wird, handelt es sich um legales Java.
Rohan Jhunjhunwala

1
codegolf.stackexchange.com/questions/6671/… Ist eine gute Lektüre, um sich mit den weniger bekannten (wage ich zu sagen shadier) "Funktionen" der Java-Sprache vertraut zu machen.
Rohan Jhunjhunwala

1

Dyalog APL , 19 Bytes

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

TryAPL online!

Diese Funktion ist wirklich eine "Spitze" von zwei Funktionen, die erste Funktion ist:

2∘⊥⍣¯1das inverse von binary- zu -decimal Umwandlung, dh binary- aus -decimal Umwandlung
zwei 2 gebunden ist an -bis-dezimalen
Wiederholen der Operation negativ Zeit ¯1(dh einmal, aber invertiert)

In der zweiten Funktion wird das obige binäre Ergebnis dargestellt durch :

{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵Boolesch für den
~Punkt, an dem {0, 0} in in Boolescher Negation beginnt. Jetzt haben wir ᴛʀᴜᴇ überall, aber bei Nullen in
⍵/⍨Nullläufen wird dies zum Filtern von ⍵ verwendet. Dadurch werden unsere unerwünschten Nullen entfernt
2⊥, die die Binärzahl in die Dezimalzahl umwandeln


1

TSQL, 143 Bytes

Keine Verwendung von Build-Ins zum Konvertieren von und nach Binär.

Golf gespielt:

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

Geige


+1 für die Nichtverwendung von eingebauten Ins. Meine SILOS-Antwort (Referenzimplementierung) verhält sich genauso, wurde jedoch abgelehnt, da die Leute nicht dachten, dass es sich um einen ernsthaften Konkurrenten handelt. Ist die neue Zeile von Bedeutung?
Rohan Jhunjhunwala

@ RohanJhunjhunwala die neue Zeile ist nicht von Bedeutung. Ich zähle die Zeichen des Codes, nachdem die Eingabevariable definiert und mit einem Wert versehen wurde.
t-clausen.dk

ok amkes sense -
Rohan Jhunjhunwala

@RohanJhunjhunwala Ich finde es cool, dass Sie eine nicht gesprochene Sprache verwenden, um Codegolf-Fragen zu lösen. Es scheint, dass Sie unnötigen Code haben, um zusätzliche Informationen hinzuzufügen - wahrscheinlich jedoch nur in Ihrer ungolfed-Version. Sie sollten immer versuchen, den kürzestmöglichen Code bereitzustellen, um Fehler zu vermeiden und Sprachfehler zu missbrauchen (im Rahmen der Frage). Wenn möglich sollten Sie eine Geige zur Verfügung stellen, damit Muggel mich es testen können
t-clausen.dk

Die ungolfed-Version enthält unnötigen Code, die golfed-Version enthält jedoch keinen zusätzlichen Code. Ich kann es in Java transpilieren, wenn Sie wollen, dass ich es teste.
Rohan Jhunjhunwala

1

CJam, 16

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

Probieren Sie es online aus

Es ist ziemlich lang, weil es an Regex mangelt.

Erläuterung:

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);};

Testprogramm

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

Probieren Sie es online!

Erläuterung

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

Zwei Bytes dank Handarbeit gespart.

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

Der naive Ansatz. (:


In Bezug auf "0"sehen, den zweiten Punkt in sepp2k ‚s Spitze . Wenn .to_i(2)nicht eindeutig ist, wo ein Parameter hingehört, sind die Klammern optional.
Manatwork

1

C 37 Bytes

f(x){return x?f(x/2)<<!!(x%4)|x&1:0;}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.