Đầu ra Số lượng Fit Fit


21

"Số phù hợp"

Sam có một ý tưởng "tuyệt vời" để nén! Bạn có thể giúp?


Đây là một bản tóm tắt của sơ đồ nén của Sam. Trước tiên, hãy lấy một đại diện cơ sở 10 của bất kỳ số tự nhiên nào nhỏ hơn 2 ^ 16 và viết nó dưới dạng một chuỗi nhị phân mà không có bất kỳ số 0 đứng đầu nào.

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

Bây giờ thay thế bất kỳ nhóm nào của một hoặc nhiều số không bằng một số không. Điều này là do số lượng đã nhận được gầy hơn. Chuỗi nhị phân của bạn bây giờ sẽ trông như thế này.

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

Bây giờ bạn chuyển đổi chuỗi nhị phân trở lại đại diện cơ sở 10 và xuất nó ở bất kỳ định dạng nào được chấp nhận. Dưới đây là trường hợp thử nghiệm của bạn. Số nguyên đầu tiên đại diện cho một đầu vào và số nguyên cuối cùng đại diện cho một đầu ra. Lưu ý rằng một số số không thay đổi và do đó có thể được gọi là "phù hợp"

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


Bạn có thể sử dụng bất kỳ ngôn ngữ nào, nhưng xin lưu ý rằng Sam ghét những sơ hở tiêu chuẩn. Đây là mã golf, do đó mã có thể càng ngắn càng tốt để nhường chỗ cho các số "nén".
Lưu ý: Đây KHÔNG phải là sơ đồ nén chấp nhận được. Sử dụng điều này sẽ nhanh chóng khiến bạn bị sa thải.
Cần trích dẫn: Tôi không lấy tín dụng cho khái niệm này. Điều này xuất phát từ blog của @Conor O 'Brien ở đây xem OEIS này về các số phù hợp. https://oeis.org/A090078


1
Từ blog truyện tranh của @ Conor: link
Rɪᴋᴇʀ

3
OEIS A090078 có thể có ích.
Ad Nam

Chính tôi là người viết truyện tranh. <s> Tôi cũng mong đợi tiền bản quyền đại diện 35% </ s>;)
Conor O'Brien

Downvoter sẽ giải thích vấn đề?
Rohan Jhunjhunwala

1
Tại sao 16 bằng 8? 16 không nên 10000?

Câu trả lời:


10

05AB1E , 8 6 byte

b00¬:C

Giải trình

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

Dùng thử trực tuyến

Đã lưu 2 byte nhờ Adnan


Bạn có thể thay thế „00'0bằng 00¬:).
Ad Nam

@Ad Nam Đẹp! Không nghĩ về điều đó.
Emigna

Tôi thậm chí không biết tại sao tôi lại đẩy chúng thành chuỗi một cách rõ ràng ...
Emigna

Vâng, nó hơi phản trực giác, nhưng nó hoạt động :).
Ad Nam

Điều này có vẻ như nó sẽ thắng: D, tôi sẽ cho nó thêm một chút thời gian trước khi chấp nhận để nhiều người có thể tham gia.
Rohan Jhunjhunwala


7

JavaScript (ES6), 41 byte

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

7

Sứa , 20 byte

p
d
# S
,1
*
\dbi
 2

Hãy thử trực tuyến!

Giải trình

  • i là đầu vào.
  • b chuyển đổi nó thành nhị phân (danh sách các chữ số)
  • \dvới các đối số 2và danh sách chữ số được áp dụng d(chữ số nhị phân cho số) cho mỗi chuỗi con dài 2 của danh sách chữ số.
  • * lấy dấu của kết quả: 00 chuyển về 0, mọi thứ khác là 1.
  • ,1 xử lý 1 đến cuối, vì vậy chữ số cuối cùng không bị mất.
  • # Schọn từ bicác chữ số có 1 trong danh sách được tính ở trên: những chữ số không phải là nửa bên trái của 00.
  • dchuyển đổi trở lại số và pin kết quả.

6

Python 2, 36 byte

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

Việc thực hiện đệ quy trực tiếp không có các hoạt động xây dựng chuỗi hoặc chuỗi chuyển đổi cơ sở. Ít chơi gôn hơn:

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

Khi nlà bội số của 4, nó kết thúc bằng hai 0 ở dạng nhị phân, vì vậy chúng tôi cắt một bằng cách chia sàn cho 2. Nếu không, chúng tôi chia nthành (n%2) + 2*(n/2), để lại chữ số nhị phân cuối cùng n%2và lặp lại trên các chữ số khác n/2.


Không n%2dư thừa?
xsot

@xsot Không chắc ý bạn là gì. Làm |ncho kết quả sai.
xnor

Tôi có nghĩa là bạn có thể thay thế toàn bộ (n%4>0)|n%2với (n%4>0).
xsot

@xsot Ưu tiên đi như (f(n/2)<<(n%4>0)) | n%2.
xnor

Ah, xấu của tôi rồi. Tôi nghĩ rằng dịch chuyển có ưu tiên thấp nhất.
xsot

5

Bash (sed + bc), 60 55 43 byte

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

chỉnh sửa:

  1. thay đổi sed -E 's/0+để sed 's/00*và thay đổi echo và ống sử dụng để vượt qua các giá trị cho bc với <<<.
  2. Gợi ý rực rỡ của @Digital Trauma!

thí dụ:

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

1
sed + bc là suy nghĩ đầu tiên của tôi quá. echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bcngắn hơn 2 byte
Riley

1
Sử dụng đường ống và thoát ra để lợi thế của bạn : echo $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]. Nhưng dctr làm cho nó ngắn hơn .
Chấn thương kỹ thuật số

1
@DigitalTrauma: Cảm ơn, thật tuyệt! @Riley: ý tưởng tốt đẹp, nó sẽ ngắn hơn một chút như thế:bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
Master_ex

nếu bạn sử dụng tr -s 0thay vì sed, bạn có thể xuống tới 36 byte
Riley

@Riley: Đúng, nhưng Digital Trauma đã sử dụng nó trong câu trả lời bash khác vì vậy tôi không muốn sử dụng nó :)
Master_ex

4

Perl 6 ,  31  27 byte

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

Giải trình:

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

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

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

Thí dụ:

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

Phiên bản này chỉ hoạt động trong MATLAB vì strreptrong MATLAB có thể xử lý các đầu vào logic. Đây là một phiên bản sẽ hoạt động trong Octave (9 byte) (và do đó, trình thông dịch trực tuyến) sẽ đưa ra các đầu vào logic để gõ double.

Dùng thử trực tuyến

Giải trình

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

Đã lưu 4 byte nhờ Sp3000.

Giải pháp khá đơn giản.

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

4
Bạn có thể giữ 0bvà chỉ evalthay thế?
Sp3000

@ Sp3000 Chắc chắn có thể! Cám ơn vì sự gợi ý!
Morgan Thrapp 17/8/2016

Lambdas ẩn danh được cho phép; bạn có thể thu nhỏ thành 48 byte bằng cách sử dụnglambda 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
Tôi sợ đây là một đoạn. Trừ khi mô tả thách thức nói cách khác, các giải pháp dự kiến ​​sẽ là các chương trình hoặc chức năng đầy đủ.
manatwork

Điều gì đòi hỏi phải là "chương trình đầy đủ" trong Javascript nếu tôi không muốn sử dụng chức năng? Xin tư vấn.
cychoi

Ví dụ với Node.js : console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0))).
manatwork 17/8/2016

Đề ra. Khối mã của bạn có cùng vấn đề với @Master_ex. Có phải vì một số tập lệnh cấu hình shell phổ biến gây ô nhiễm thiết bị đầu cuối? Hay lỗi của SE?
cychoi

1
Cách khắc phục ngắn nhất sẽ là trả trước N=>để làm cho nó trở thành một chức năng hợp lệ.
Martin Ender

3

Trên thực tế, 14 byte (không cạnh tranh)

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

Hãy thử trực tuyến!

Nội dung gửi này không cạnh tranh vì một lỗi Æđã được thực hiện sau khi thử thách này được đăng.

Giải trình:

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

Sau đó đăng một phiên bản cạnh tranh!
Leaky Nun



2

PHP, 53 51 byte

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

Đưa ra một đối số từ bàn điều khiển.

Nhờ vào:

@manatwork thay "0" bằng 0


1
Hầu hết "0"0được xử lý theo cùng một cách.
manatwork

@manatwork Cảm ơn. Đó là một điều khá rõ ràng tôi nên nhìn thấy chính mình.
Jeroen

2

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

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

Cần -pcờ để chạy (Tôi đã thêm -lcờ để dễ đọc hơn, nhưng không cần thiết khác):

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

Lưu ý nhiều điều để nói về mã: nó chuyển đổi số thành nhị phân ( sprintf"%b"), sau đó thay thế các khối số không chỉ bằng một số 0 và chuyển đổi kết quả thành số thập phân ( 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 nhờ TuukkaX


int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}- 94 byte sử dụng regex. Tôi đã thấy rất nhiều giải pháp C # không bao gồm System.Text.RegularExpressionsvì vậy có lẽ nó cũng được phép ở đây ...?
Yytsi

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

Tôi không biết bạn đang đếm byte như thế nào, tôi sử dụng mẹeff.in / byte
count

Tôi cũng sử dụng trang đó, nhưng nó không hoạt động, vì vậy tôi đã sử dụng một trang khác. Bạn cũng nên đề cập đến phiên bản C # bắt buộc.
Yytsi

Mothereff.in/byte-count tính toán 79 byte cho giải pháp hiện tại của bạn. Tôi đã phải gõ giải pháp bằng tay, nếu không nó sẽ cho tôi 91.
Yytsi

2

Java, 75

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

Chương trình kiểm tra:

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 chuyển đổi sang lamda x-> blah; cho ít byte hơn
Rohan Jhunjhunwala

int f (Integer x) {return x.parseInt (x.toString (x, 2) .replaceAll ("0 +", "0"));} cho một vài byte ít hơn
Rohan Jhunjhunwala

@RohanJhunjhunwala Điều đó sai, nó cần sử dụng cơ sở 2. Đối với lambda, tôi cảm thấy rằng nó không đầy đủ nếu không có đặc điểm kỹ thuật loại.
aditsu

oh ok, câu trả lời java khác sử dụng kỹ thuật tương tự
Rohan Jhunjhunwala



1

PowerShell v2 +, 69 byte

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

( Một cách ngắn hơn để chuyển đổi sang / từ nhị phân trong PowerShell )

Đưa đầu vào $args[0], sử dụng .NET tích hợp [convert]::ToString(int,base)để chuyển đổi số nguyên đầu vào thành chuỗi cơ sở nhị phân. Điều đó được lọc qua -replaceđể loại bỏ bất kỳ hoạt động nào của một hoặc nhiều số không thành 0. Chuỗi kết quả đó được gửi trở lại qua hướng khác thông qua [convert]::ToInt32(string,base)để biến nhị phân trở lại thành một số nguyên. Số nguyên đó được để lại trên đường ống và đầu ra là ẩn.

Các trường hợp thử nghiệm

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

Tham chiếu thực hiện trong SILOS "chỉ" 417 byte

Chơi gôn

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

Dưới đây là tham chiếu thực hiện đầy đủ vô căn cứ. Là một tính năng thưởng, nó đưa ra các bước cần thiết để đi đến câu trả lời.

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

Theo yêu cầu, sự dịch chuyển đã bị xóa. Vui lòng xem lịch sử chỉnh sửa để khôi phục nó, nếu không hãy đến repo này để có thông dịch viên.

Sản lượng mẫu cho 65000

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

4
Việc triển khai tham chiếu nên ở trong cơ thể thách thức, chứ không phải là câu trả lời, vì chúng là vô căn cứ và do đó không phải là đối thủ nghiêm trọng.
Mego

Ok, tôi sẽ đánh gôn nó.
Rohan Jhunjhunwala

Tôi không muốn làm hỏng cơ thể thách thức với @Mego này
Rohan Jhunjhunwala

@TimmyD một giây Tôi đang chơi golf ngay bây giờ
Rohan Jhunjhunwala

@Mego Tôi đã chơi gôn ngay bây giờ
Rohan Jhunjhunwala


1

Võng mạc , 30 byte

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

Hãy thử trực tuyến!

Và ở đây tôi nghĩ Retina sẽ là một trong những câu trả lời đầu tiên ...


@randomra Tôi đang đặt câu hỏi cho OP để làm rõ
Leaky Nun

Retina có khả năng chuyển đổi nhị phân sang thập phân hoặc nhị phân sang chuyển đổi đơn phương không? Tôi sẽ ngoại trừ một trong số đó để không loại trừ Retina
Rohan Jhunjhunwala

@RohanJhunjhunwala: Vâng, đó là
Mèo kinh doanh

Có thể thực hiện chuyển đổi này thành unary hoặc thập phân? Lý tưởng nhất là tôi muốn xem số thập phân, nhưng tôi cũng sẽ chấp nhận.
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 ít hơn nhờ @RohanJhunjhunwala. Tôi thích giữ nó như một chương trình hoạt động đầy đủ với chính và tương tự. Tuy nhiên, tất nhiên nó có thể được chơi golf nhiều hơn nếu không.
  • Giảm 5 byte nhờ các đề xuất của @ LeakyNun.

1
class A {public static void main (String [] a) {Integer i; System.out.print (i.parseInt (i.toBinaryString (i.parseInt (a [0])). thay All ("0+", " 0 "), 2));}} cho 8 byte tiết kiệm
Rohan Jhunjhunwala

gói nó trong một biểu thức lambda để tiết kiệm hơn nữa và loại bỏ các định nghĩa lớp và tập hợp của bạn.
Rohan Jhunjhunwala

@RohanJhunjhunwala: À! Phần Integer i;này là đơn giản và tuyệt vời!
Master_ex 16/8/2016

1
Nó hoạt động, nhưng có thể tạo ra một cảnh báo (trái ngược với lỗi) trên hầu hết các IDE lành mạnh. Vấn đề là, bạn luôn có thể gọi các phương thức tĩnh từ một bối cảnh không tĩnh, nhưng bạn không bao giờ có thể gọi một phương thức không tĩnh từ một bối cảnh tĩnh. Trong khi sử dụng kỹ thuật này được khuyến khích mạnh mẽ trong mã sản xuất, đó là java hợp pháp.
Rohan Jhunjhunwala

1
codegolf.stackexchange.com/questions/6671/ Nhật Bản là một cách đọc tốt để làm quen với các tính năng ít được biết đến (dám nói là shadier) của ngôn ngữ java.
Rohan Jhunjhunwala

1

APL Dyalog , 19 byte

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

Dùng thử trực tuyến!

Chức năng này thực sự là một "đỉnh" của hai chức năng, chức năng đầu tiên là:

2∘⊥⍣¯1các nghịch đảo của binary- để chuyển đổi -decimal, tức là binary- từ -decimal chuyển đổi
hai 2 là ràng buộc để -to-thập phân
lặp lại các hoạt động trong những tiêu cực thời gian ¯1(ví dụ một lần, nhưng đảo ngược)

Trong hàm thứ hai, kết quả nhị phân ở trên được biểu thị bằng :

{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵Boolean cho nơi {0, 0} bắt đầu trong neg Phủ
~định Boolean, vì vậy bây giờ chúng ta có ở mọi nơi nhưng ở các số không đầu tiên trong các lần chạy 0
⍵/⍨sử dụng để lọc ⍵, do đó, việc này sẽ loại bỏ các số không mong muốn của chúng ta
2⊥chuyển đổi nhị phân thành số thập phân


1

TSQL, 143 byte

Không sử dụng bản dựng để chuyển đổi từ và sang nhị phân.

Chơi gôn

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

Ung dung:

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

Vĩ cầm


+1 khi không sử dụng nội dung được xây dựng. Câu trả lời SILOS của tôi (triển khai tham chiếu) cũng làm như vậy, nhưng nó bị đánh giá thấp vì mọi người không nghĩ rằng đó là một đối thủ cạnh tranh nghiêm trọng. Là dòng mới có ý nghĩa?
Rohan Jhunjhunwala

@RohanJhunjhunwala dòng mới không đáng kể. Tôi đang đếm các ký tự của mã sau khi biến đầu vào được xác định và gán giá trị.
t-clausen.dk

ok amkes giác -
Rohan Jhunjhunwala

@RohanJhunjhunwala Tôi nghĩ thật tuyệt khi bạn sử dụng một ngôn ngữ không đối nghịch để giải quyết các câu hỏi của Codegolf. Dường như bạn có mã không cần thiết để thêm thông tin - có lẽ chỉ trong phiên bản không được cung cấp của bạn. Bạn phải luôn cố gắng cung cấp mã ngắn nhất có thể, cắt góc và lạm dụng các câu hỏi ngôn ngữ (trong phạm vi câu hỏi). Nếu có thể, bạn nên cung cấp một câu đố, vì vậy tôi có thể kiểm tra nó
t-clausen.dk

Phiên bản không mã hóa chứa mã không cần thiết, nhưng phiên bản đánh gôn không chứa mã bổ sung. Tôi có thể chuyển mã nó thành java nếu bạn muốn tôi kiểm tra nó.
Rohan Jhunjhunwala

1

CJam, 16

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

Dùng thử trực tuyến

Nó khá dài do thiếu regex.

Giải trình:

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

Chương trình kiểm tra

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

Hãy thử trực tuyến!

Giải trình

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

Lưu hai byte nhờ manatwork.

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

Cách tiếp cận ngây thơ. (


Về "0", nhìn thấy điểm thứ 2 trong sepp2k 's tip . Về việc .to_i(2), nơi không có sự mơ hồ về nơi thuộc về một tham số, các dấu ngoặc đơn là tùy chọn.
manatwork 17/8/2016

1

C, 37 byte

f(x){return x?f(x/2)<<!!(x%4)|x&1:0;}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.