Phân tách nhị phân thành các chuỗi xen kẽ


30

Điều này được lấy cảm hứng từ Vấn đề 13 - Không lặp lại Nhị phân của cuộc thi gần đây của HP CodeWars.

Hãy lấy một số thập phân ngẫu nhiên, nói

727429805944311

và nhìn vào biểu diễn nhị phân của nó:

10100101011001011111110011001011101010110111110111

Bây giờ chia biểu diễn nhị phân đó thành các phần sau trong đó các chữ số 01xen kẽ.

1010 010101 10 0101 1 1 1 1 1 10 01 10 0101 1 1010101 101 1 1 1 101 1 1

Và chuyển đổi từng phần sau trở lại thành số thập phân.

10 21 2 5 1 1 1 1 1 2 1 2 5 1 85 5 1 1 1 5 1 1

Nhiệm vụ

Lấy một số nguyên duy nhất, dương làm đầu vào và đầu ra chuỗi các số nguyên dương thu được theo quy trình trên.

Chi tiết

  • Đầu vào và đầu ra phải ở dạng thập phân hoặc đơn nguyên.
  • Các số trong đầu ra phải được phân tách theo kiểu hợp lý, dễ đọc với con người và chúng phải ở dạng thập phân hoặc đơn nguyên. Không hạn chế về khoảng trắng. Áp dụng phong cách đầu ra: [1,2,3], 1 2 3, 1\n2\n3nơi \nlà dòng mới đen vv

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

 Input | Output
     0 | 0
     1 | 1
     2 | 2
     3 | 1 1
     4 | 2 0
     5 | 5
     6 | 1 2
     7 | 1 1 1
     8 | 2 0 0
     9 | 2 1
    10 | 10
    50 | 1 2 2
   100 | 1 2 2 0
  1000 | 1 1 1 1 10 0 0
 10000 | 2 1 1 2 0 2 0 0 0
 12914 | 1 2 2 1 1 2 2
371017 | 5 42 10 2 1

Lưu ý thêm: tất cả các số trong đầu ra phải có dạng (2^k-1)/3hoặc 2*(2^k-1)/3. Đó là, 0 1 2 5 10 21, 42, 85, 170, ...mà là A000975 trong OEIS.


@DigitalTrauma: Hmmm ...... không, tôi không nghĩ đó là tinh thần của thử thách.
El'endia Starman

Được. |tacsẽ vẫn còn trong câu trả lời của tôi sau đó :)
Digital Trauma

Câu trả lời:


11

Bình thường, 17 16 byte

1 byte nhờ Jakube

iR2cJ.BQx1qVJ+dJ

Trình diễn

Một giải pháp tốt đẹp, thông minh. Sử dụng một số tính năng ít được biết đến của Pyth, như x<int><list>c<str><list>.

iR2cJ.BQx1qVJ+dJ
                    Q = eval(input())
    J.BQ            Store in J the input in binary.
          qV        Vectorize equality function over
            J+dJ    J and J with a leading dummy char, to get the offset right.
                    This calculates whether each element matches its successor.
        x1          Find all of the indexes of 1 (True) in this list.
   cJ                Chop J at those locations.
iR2                  Convert from binary back to base ten and output.

1
Nếu bạn thay thế tJbằng +dJbạn có thể loại bỏ hM.
Jakube 11/03/2016

@Jakube Đẹp một!
isaacg 11/03/2016

7

Toán học, 47 byte

#+##&~Fold~#&/@#~IntegerDigits~2~Split~Unequal&

Ung dung:

FromDigits[#,2]&/@Split[IntegerDigits[#,2],Unequal]&

Split[list,f]chia một danh sách thành nhiều danh sách, phá vỡ ở vị trí giữa abiff f[a,b]không trả về True.

FromDigits[n,2] => Fold[#+##&,n]là một mẹo gọn gàng từ alephalpha.


7

Python, 86 byte

Vì tôi đã vượt qua khủng khiếp ở Pyth, hãy làm điều đó một lần nữa bằng Python.

import re
lambda n:[int(s,2)for s in re.sub("(?<=(.))(?=\\1)"," ",bin(n)[2:]).split()]

Hãy thử nó ở đây!

Giải trình

Chúng tôi bắt đầu với việc chuyển đổi số đầu nvào thành một chuỗi nhị phân. bin(n)[2:]chăm sóc điều đó Chúng ta cần loại bỏ 2 ký tự đầu tiên của chuỗi này vì bin()trả về chuỗi theo định dạng 0b10101.
Tiếp theo chúng ta cần xác định đường viền của các chuỗi con. Điều này có thể được thực hiện với biểu thức (?<=(.))(?=\1)chính phù hợp với các vị trí có độ dài bằng 0 trong chuỗi có cùng số ở bên trái và bên phải.
Cách rõ ràng để có được một danh sách tất cả các chuỗi sẽ là sử dụng re.split()phân tách một chuỗi trên một biểu thức chính quy nhất định. Thật không may, chức năng này không hoạt động cho các trận đấu có độ dài bằng không. Nhưng may mắn là re.sub()có, vì vậy chúng tôi chỉ thay thế các kết quả có độ dài bằng 0 bằng khoảng trắng và chia chuỗi trên các khoảng đó sau đó.
Sau đó, chúng ta chỉ cần phân tích từng chuỗi sau đó thành một số thập phân int(s,2)và được thực hiện.


4

Thạch, 12 byte

BI¬-ẋż@BFṣ-Ḅ

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

BI¬-ẋż@BFṣ-Ḅ  Main link. Argument: n

B             Convert n to base 2.
 I            Compute the increments, i.e., the differences of consecutive digits.
  ¬           Apply logical NOT.
   -ẋ         Repeat -1 that many times, for the logical NOT of each difference.
              [0, 0] / [1, 1] ->   0    -> 1 -> [-1]
              [0, 1] / [1, 0] -> 1 / -1 -> 0 -> []
       B      Yield n in base 2.
     ż@       Zip the result to the right with the result to the left.
        F     Flatten the resulting list of pairs.
         ṣ-   Split at occurrences of -1.
           Ḅ  Convert each chunk from base 2 to integer.

Chắc chắn là 12 ký tự nhưng 20 byte. Hay bạn đang sử dụng một hệ thống có CHAR_BIT >> 8?
James Youngman

1
@JamesYoungman Jelly không sử dụng UTF-8 theo mặc định. Trong thực tế, nó có trang mã riêng mã hóa từng trong số 256 ký tự mà nó hiểu là một byte đơn lẻ.
Dennis

4

Tiện ích Bash + GNU, 51

dc -e2o?p|sed -r ':;s/(.)\1/\1 \1/;t'|dc -e2i?f|tac

Đầu vào lấy từ STDIN.

  • dc -e2o?p đọc số nguyên đầu vào từ STDIN và xuất ra chuỗi 2 cơ sở
  • sed -r ':;s/(.)\1/\1 \1/;t' chia chuỗi cơ sở 2 với một khoảng trắng ở mọi nơi có cùng các chữ số liên tiếp
  • dc -e2i?fđọc nhị phân tách trong một lần, đặt từng phần lên ngăn xếp, sau đó kết fxuất toàn bộ dcngăn xếp (số đầu ra theo thứ tự ngược lại) ...
  • ... được sửa chữa bởi tac.

4

JavaScript (ES6) 58 62 63

Chỉnh sửa 1 byte đã lưu thx @ETHproductions

Chỉnh sửa 4 byte đã lưu thx @Neil

x=>x.toString(2).replace(/((.)(?!\2))*./g,x=>'0b'+x-0+' ')

f=x=>x.toString(2).replace(/((.)(?!\2))*./g,x=>'0b'+x-0+' ')

 
console.log=x=>O.textContent+=x+'\n'

;[
[     0,'0'],
[     1,'1'],
[     2,'2'],
[     3,'1 1'],
[     4,'2 0'],
[     5,'5'],
[     6,'1 2'],
[     7,'1 1 1'],
[     8,'2 0 0'],
[     9,'2 1'],
[    10,'10'],
[    50,'1 2 2'],
[   100,'1 2 2 0'],
[  1000,'1 1 1 1 10 0 0'],
[ 10000,'2 1 1 2 0 2 0 0 0'],
[ 12914,'1 2 2 1 1 2 2'],
[371017,'5 42 10 2 1']
].forEach(t=>{
  var i=t[0],k=t[1],r=f(i)
  console.log(i+' -> '+r+(r.trim()==k.trim() ? ' ok':'ko (should be '+k+')'))
})
<pre id=O></pre>


Bạn có thể lưu hai byte với regex không /(01)*0?|(10)*1?/g, hoặc điều đó có làm xáo trộn điều gì không ??
Sản phẩm ETH

1
Ngoài ra, tôi nghĩ bạn có thể làm gì x=>'0b'+x-0+' 'để tiết kiệm một byte.
Sản phẩm ETH

@ETHproductions Tôi đã thử regrec ngắn hơn, không tốt :(. Thx cho gợi ý khác
edc65

Bảng dẫn cho biết bạn có câu trả lời 1 byte. Tôi cho rằng đó là vì bạn có số đã sửa (62) trước số cũ (63) thay vì sau.
Kyle Kanos

Tôi nghĩ rằng regex /((.)(?!\2))*./ggiúp bạn tiết kiệm 4 byte.
Neil

3

Bình thường, 26 byte

iR2c:.BQ"(?<=(.))(?=\\1)"d

Hãy thử nó ở đây!

Giải trình

iR2c: .BQ "(? <= (.)) (? = \\ 1)" d # Q = số đầu vào

     .BQ # Chuyển đổi đầu vào thành nhị phân
    : "(? <= (.)) (? = \\ 1)" d # chèn khoảng trắng giữa các chuỗi
   c # chuỗi phân tách trên khoảng trắng
iR2 # chuyển đổi từng chuỗi thành số thập phân

Vì hàm split () của Python không phân chia trên các kết quả khớp có độ dài bằng 0, nên tôi phải thay thế các kết quả khớp đó bằng một khoảng trắng và phân chia kết quả trên đó.


3

Pyth, 22 21 byte

&Qu?q%G2H&
GH+yGHjQ2Z

Dùng thử trực tuyến: Trình diễn

Thực sự là một nhiệm vụ tẻ nhạt trong Pyth.

Giải trình:

&Qu?q%G2H&\nGH+yGHjQ2Z   implicit: Q = input number
                  jQ2    convert Q to base 2
  u               jQ2Z   reduce ^: for each digit H update the variable G=0:
   ?q%G2H                   if G%2 == H:
          \nG                  print G
         &   H                 then update G with H
              +yGH           else: update G with 2*G+H
  u                      print the last G also
&Q                       handle Q=0 special: only print 0 once

3

05AB1E , 18 byte

Mã số:

b2FNð«N«Dð-s:}ð¡)C

Giải trình:

b                   # Convert input to binary
 2F          }      # Do the following twice ( with N as range variable)
   Nð«N«            #    N + space + N
        D           #    Duplicate this
         ð-         #    Delete spaces from the duplicate string
           s        #    Swap the top two elements
            :       #    Replace the first string with the second
              ð¡    # Split on spaces
                )   # Wrap into an array
                 C  # Convert all element back to decimal

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

Sử dụng mã hóa CP-1252 .


3

MATL , 18 17 byte

YBTyd~Thhfd1wY{ZB

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

YB      % input number. Convert to binary string
T       % push true value
y       % duplicate binary string and push it at the top of the stack
d~      % true for each value that equals the previous one
T       % push true value
hh      % concatenate: true, indices, true
f       % find indices of true values
d       % consecutive differences: lenghts of alternating sequences
1wY{    % split binary string according to those lengths
ZB      % convert each substring into decimal number

3

zsh, 67 63 55 byte

for i in `grep -oP '1?(01)*0?'<<<$[[##2]$1]`;<<<$[2#$i]

Tôi không biết tại sao, nhưng điều này không hoạt động ở Bash.

Cảm ơn Dennis vì 8 byte!


Đó là forcú pháp. ... Đợi đã, không fors?
Máy

Mở rộng số học của Bash không cho phép bạn chỉ định cơ sở đầu ra. Để thoát khỏi xargs, bạn có thể sử dụng for i in `grep -oP '1?(01)*0?'<<<$[[##2]$1]`;<<<$[2#$i].
Dennis

2

PHP, 171 168 162 160 158 121 120 131 124 118 116 113 112 byte

function d($i){for(;$d<$l=strlen($b=decbin($i));){$c.=$u=$b[$d];echo$u==$b[++$d]||$d==$l?bindec($c).$c=" ":"";}}
Khung nhìn bùng nổ
function d($i) {
  for ( ; $d < $l = strlen($b = decbin($i)); ) {
    $c .= $u = $b[$d];
    echo $u == $b[++$d] || $d == $l ? bindec($c) . $c = " "
                                    : "";
  }
}

Sử dụng d(int)và bạn tắt, đầu ra là một echochuỗi ed intđược phân tách bằng khoảng trắng.

Chỉnh sửa:
-3: Chuyển $bđịnh nghĩa vào strlen()cuộc gọi.
-6: Xóa bỏ $ckhởi tạo.
-2: Cuối cùng đã khắc phục vấn đề nối.
-2: Không có dấu ngoặc cho dòng đơn for().
-37: Tổng đại tu. Đi với Arraychunklets thay vì lặp đi lặp lại Array-> String-> Arraycuộc gọi.
-1: Thiết$c lập lại lén lút .
+11: Lỗi. Đã mất đoạn cuối cùng. Không còn nữa.
-7: Không cần phải khởi tạo $dchút nào? Tốt đẹp.
-6: return -> echo.
-2: Giòn $c.
-3:Ternary, tình yêu đầu tiên của tôi.
-1: Lén lén lén lút $u.


Tôi nghĩ bạn có thể tiết kiệm 2 byte : function d($i){for(;$d<$l=strlen($b=decbin($i));print$u==$b[++$d]||$d==$l?bindec($c).$c=" ":"")$c.=$u=$b[$d];}.
Hố đen

2

Lồi 0,2+, 25 byte

Convex là một ngôn ngữ mới mà tôi đang phát triển dựa nhiều vào CJam và Golfscript. Trình thông dịch và IDE có thể được tìm thấy ở đây . Đầu vào là một số nguyên vào các đối số dòng lệnh. Điều này sử dụng mã hóa CP-1252 .

2bs®(?<=(.))(?=\\1)"ö2fbp

Giải trình:

2bs                         Convert to binary string
   ®(?<=(.))(?=\\1)"        Regex literal
                    ö       Split string on regex
                     2fb    Convert each split string into decimal integer
                        p   Print resulting array

2

Java 8, 127 119 byte

l->new java.util.ArrayList<Long>(){{for(String s:l.toBinaryString(l).split("(?<=(.))(?=\\1)"))add(l.parseLong(s,2));}};

Có lẽ có một biểu thức chính quy tốt hơn ngoài kia để phân chia chuỗi trên. Tôi không thành thạo regex, nhưng tôi sẽ tiếp tục thử nghiệm.

-8 byte nhờ @FryAmTheEggman


2

APL (APL) , 21 25 byte

Bây giờ xử lý 0 là tốt.

{0::0⋄2⊥¨⍵⊂⍨1,2=/⍵}2⊥⍣¯1⊢

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

2⊥⍣¯1⊢ chuyển đổi sang cơ sở 2, sử dụng bao nhiêu bit nếu cần (chuyển đổi ngược lại từ chuyển đổi cơ sở-2)

{... } áp dụng các chức năng ẩn danh sau

0:: nếu có lỗi xảy ra:

  0 trả về 0

 bây giờ cố gắng:

  2=/⍵ cặp bằng của đối số (sẽ không thành công biểu diễn nhị phân 0-length-0)

  1, trả trước 1

  ⍵⊂⍨ sử dụng để phân vùng đối số (bắt đầu phần mới trên mỗi 1)

  2⊥¨ chuyển đổi từng từ cơ sở-2


1
thực sự hữu ích ở đây Tôi nên thêm nó vào Jelly.
Dennis

@Dennis Hãy nhận biết hai phiên bản của R←X⊂Y: Với ⎕ML<3(nghĩa là kiểu Dyalog), một phân vùng mới được bắt đầu trong kết quả tương ứng với mỗi 1 trong X cho đến vị trí trước 1 trong X tiếp theo (hoặc phần tử cuối cùng của X) trở thành các mục liên tiếp của R. Với ⎕ML=3(tức là kiểu IBM), một phân vùng mới được bắt đầu trong kết quả bất cứ khi nào phần tử tương ứng trong X lớn hơn phần trước. Các mục trong Y tương ứng với 0 trong X không được bao gồm trong kết quả. Vì vậy, ⎕ML←1 ⋄ 1 0 0 1 0 1 1 ⊂ ⍳7tương đương với ⎕ML←3⋄ 4 3 2 4 4 5 7 7`
Adám

2

Japt , 7 byte

¤ò¥ mn2

Kiểm tra nó


Giải trình

¤ò¥ mn2
           :Implicit input of integer U.
¤          :Convert to binary string.
 ò¥        :Split to an array by checking for equality.
    m      :Map over array.
     n2    :Convert to base-10 integer.

1

Python 3, 115 byte

def f(s):
 s=bin(s);r=[s[2]]
 for i in s[3:]:
  if i==r[-1][-1]:r+=[i]
  else:r[-1]+=i
 return[int(x,2)for x in r]

Giải trình

def f(s):
 s=bin(s)                   # convert input in binary
 r=[s[2]]                   # initialize the result with the first char after the 'b' in binary string
 for i in s[3:]:            # loop on other element
  if i==r[-1][-1]:          # if the last element of the last string equal the current element 
   r+=[i]                   # we add the current element in a new string
  else:
   r[-1]+=i                 # we add the current element to the last sting
 return[int(x,2)for x in r] # convert binary string in integer 

Các kết quả

>>> [print(i,f(i)) for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 50, 100, 1000, 10000, 12914, 371017]]
0 [0]
1 [1]
2 [2]
3 [1, 1]
4 [2, 0]
5 [5]
6 [1, 2]
7 [1, 1, 1]
8 [2, 0, 0]
9 [2, 1]
10 [10]
50 [1, 2, 2]
100 [1, 2, 2, 0]
1000 [1, 1, 1, 1, 10, 0, 0]
10000 [2, 1, 1, 2, 0, 2, 0, 0, 0]
12914 [1, 2, 2, 1, 1, 2, 2]
371017 [5, 42, 10, 2, 1]

giải pháp trước đó (118 byte)

def f(s):
 s=bin(s);r=s[2]
 for i in s[3:]:
  if i==r[-1]:r+='a'+i
  else:r+=i
 return[int(x,2)for x in r.split('a')]

1

Haskell, 147 , 145 byte

x%[]=[x]
x%(y:z)|or.(zipWith(==)<*>tail)$y:x=x:[]%(y:z)|1<2=(y:x)%z
b x|x<2=[x]|1<2=b(div x 2)++[mod x 2]
map(sum.zipWith((*).(2^))[0..]).([]%).b

map(sum.zipWith((*).(2^))[0..]).([]%).b là một hàm không tên mà tính toán danh sách.

Ít chơi gôn hơn:

alternating :: Eq a => [a] -> Bool
alternating = or . (zipWith (==) <*> tail)

-- (%) is the partitioning function
(%) :: Eq a => [a] -> [a] -> [[a]]
x % [] = [x]

x % (y:z) | alternating (y : x) = x : [] % (y:z)
          | otherwise = (y : x) % z

bits :: Integral t => t -> [t]
bits x | x < 2     = [x] 
       | otherwise = bits (div x 2) ++ [mod x 2]

unBits :: Num c => [c] -> c
unBits = sum . zipWith ((*) . (2^)) [0..]

f :: Integer -> [Integer]
f = map unBits . ([]%) . bits

1

Perl, 53 byte

Bao gồm +1 cho -p

Chạy với số trên STDIN

perl -p alterbits.pl <<< 371017

alterbits.pl:

$_=sprintf"0b%b",$_;s/(.)\K(?=\1)/ 0b/g;s/\S+/$&/eeg

1

PowerShell, 103 byte

[regex]::Matches([convert]::ToString($args[0],2),"(01)+0?|(10)+1?|.").Value|%{[convert]::toint32($_,2)}

Vì tôi kinh khủng ở regex, tôi đang sử dụng cùng một biểu thức như câu trả lời của edc65 .

Hoàn toàn bị phá hủy bởi các cuộc gọi .NET dài để thực hiện chuyển đổi sang / từ nhị phân và cuộc gọi .NET để có được kết quả khớp chính thức. Nếu không thì khá đơn giản. Đưa đầu vào $args[0], converts thành nhị phân, đưa nó vào Matches, lấy .Values kết quả , đưa chúng qua một vòng lặp |%{...}và đưa convertcác giá trị đó trở lại int. Đầu ra được để lại trên đường ống và được in ngầm với dòng mới.


Đối với tín dụng bổ sung - phiên bản (hầu hết) không phải regex ở mức 126 byte

$l,$r=[char[]][convert]::ToString($args[0],2);$l+-join($r|%{(" $_",$_)[$l-bxor$_];$l=$_})-split' '|%{[convert]::toint32($_,2)}

Chúng tôi một lần nữa lấy đầu vào $args[0]convertnó để nhị phân. Chúng tôi tái phân vai thành một mảng char, lưu trữ ký tự đầu tiên $lvà các ký tự còn lại trong $r. Sau đó, chúng tôi gửi $rqua một vòng lặp |%{...}trong đó mỗi lần lặp mà chúng tôi chọn từ một ký tự được thêm vào một khoảng trắng hoặc chỉ ký tự, tùy thuộc vào kết quả của một xor nhị phân với $l, sau đó đặt $lbằng với ký tự. Điều này đảm bảo hiệu quả rằng nếu chúng ta có cùng một nhân vật hai lần liên tiếp, chúng ta sẽ đặt trước một khoảng trắng giữa chúng.

Đầu ra của vòng lặp được -joinnối với nhau và được thêm vào ký tự đầu tiên $l, sau đó -splitvào khoảng trắng (về mặt kỹ thuật là biểu thức chính quy, nhưng tôi sẽ không tính nó). Sau đó chúng tôi thực hiện cùng một vòng lặp như câu trả lời regex cho convertvà số nguyên đầu ra.


1

Java 345 byte

package com.ji.golf;
import java.util.regex.*;
public class Decompose {
  public static String decompose(long l) {
    String o="";
    String s=Long.toBinaryString(l);
    Matcher m=Pattern.compile("(01)+(0)?|(10)+(1)?|(1)|(0)").matcher(s);
    while(m.find()){String c=s.substring(m.start(),m.end());o+=Integer.parseInt(c, 2)+" ";}
    return o;
  }
}

Kiểm tra

package com.ji.golf;
public class DecompseTest {
  public static void main(String[] args) {
    String[] inOut = new String[]{
        "0,0",
        "1,1",
        "2,2",
        "3,1 1",
        "4,2 0",
        "5,5",
        "6,1 2",
        "7,1 1 1",
        "8,2 0 0",
        "9,2 1",
        "10,10",
        "50,1 2 2",
        "100,1 2 2 0",
        "1000,1 1 1 1 10 0 0",
        "10000,2 1 1 2 0 2 0 0 0",
        "12914,1 2 2 1 1 2 2",
        "371017,5 42 10 2 1"
    };
    for (String s : inOut) {
      String[] io = s.split(",");
      String result = Decompose.decompose(Long.parseLong(io[0]));
      System.out.println("in: " + io[0] + ", reusult: [" +  result.trim() + "], validates? " + result.trim().equals(io[1].trim()));
    }
  }
}

Đầu ra

in: 0, reusult: [0], validates? true
in: 1, reusult: [1], validates? true
in: 2, reusult: [2], validates? true
in: 3, reusult: [1 1], validates? true
in: 4, reusult: [2 0], validates? true
in: 5, reusult: [5], validates? true
in: 6, reusult: [1 2], validates? true
in: 7, reusult: [1 1 1], validates? true
in: 8, reusult: [2 0 0], validates? true
in: 9, reusult: [2 1], validates? true
in: 10, reusult: [10], validates? true
in: 50, reusult: [1 2 2], validates? true
in: 100, reusult: [1 2 2 0], validates? true
in: 1000, reusult: [1 1 1 1 10 0 0], validates? true
in: 10000, reusult: [2 1 1 2 0 2 0 0 0], validates? true
in: 12914, reusult: [1 2 2 1 1 2 2], validates? true
in: 371017, reusult: [5 42 10 2 1], validates? true

4
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Vì đây là một cuộc thi golf-code , bạn nên làm cho mã của mình càng ngắn càng tốt. Dưới đây là một số mẹo để chơi gôn trong Java. Bạn có thể bắt đầu bằng việc xác định chức năng của bạn mà không soạn sẵn packageclass, và loại bỏ các khoảng trắng không cần thiết. Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi!
Alex A.

1

Julia, 70 57 byte

n->map(i->parse(Int,i,2),split(bin(n),r"(?<=(.))(?=\1)"))

Đây là một hàm ẩn danh chấp nhận một số nguyên và trả về một mảng số nguyên. Để gọi nó, gán nó cho một biến.

Cách tiếp cận ở đây tương tự như câu trả lời Python hay của DenkerAffe . Chúng tôi nhận được biểu diễn nhị phân của nviệc sử dụng bin(n)và phân tách chuỗi kết quả ở tất cả các kết quả khớp của biểu thức chính quy (?<=(.))(?=\1). Đây thực sự là một trận đấu có độ dài bằng không; (?<=(.))là một cái nhìn tích cực tìm thấy bất kỳ nhân vật nào, và (?=\1)là một cái nhìn tích cực tìm thấy nhân vật phù hợp trong cái nhìn. Điều này xác định vị trí mà một số được theo sau bởi chính nó trong biểu diễn nhị phân. Chỉ cần parsemỗi số là một số nguyên trong cơ sở 2 bằng cách sử dụng mapvà thì đấy!


1

C, 137 129 byte

main(){unsigned long a,b=scanf("%lu",&a),c=!!a;while(a>=b*2)b*=2;while(b)b/=2,c=c*(~(a^a/2)&b|!b?!printf("%lu\n",c):2)+!!(a&b);}

Đầu vào và đầu ra là trên các luồng tiêu chuẩn.


Tôi không nghĩ rằng bạn cần puts, mặc dù nó sẽ không dễ sử dụng, thông số kỹ thuật không yêu cầu một dòng mới.
FryAmTheEggman 15/03/2016

@FryAmTheEggman Tôi không muốn tạo ra một dòng cuối cùng không đầy đủ. Nhưng với chi phí cho một byte (vẫn là giảm ròng) tôi có thể thay đổi dấu phân cách từ không gian sang dòng mới.
Fox

1

J , 16 byte

#:#.;.1~1,2=/\#:

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

Giải trình

#:#.;.1~1,2=/\#:  Input: integer n
              #:  Convert from decimal to list of binary digits
          2  \    For each overlapping sublist of size 2
           =/       Reduce using equals
        1,        Prepend 1
#:                Binary digits
    ;.1~          Partition those binary digits at the 1s in the previous list
  #.                Convert each partition from a list of binary digits to decimal

1

q / kdb +, 52 byte

Dung dịch:

{2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}

Ví dụ:

q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}0
,0
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}1
,1
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}3
1 1
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}8
2 0 0
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}10000
2 1 1 2 0 2 0 0 0
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}12914
1 2 2 1 1 2 2
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}371017
5 42 10 2 1
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}727429805944311
10 21 2 5 1 1 1 1 1 2 1 2 5 1 85 5 1 1 1 5 1 1

Giải trình:

q được giải thích từ phải sang trái.

Truyền đầu vào thành nhị phân, cắt bớt các số 0 đứng đầu, tìm các chỉ số ở các vị trí khác nhau, đảo ngược để lấy các chỉ số ở cùng, danh sách phân tách trên các chỉ số này, chuyển đổi trở lại cơ sở 10. Trông hơi nặng so với giải pháp APL mặc dù ...

{2 sv'cut[0,where not differ a]a:(63^first where a)_a:0b vs x} / ungolfed solution
{                                                            } / lambda function
      cut[                    ]                                / cut a list at indices, cut[indices]list
                                                      0b vs x  / converts to 64bit binary representation
                                                    a:         / save as a
                                                   _           / drop 'n' elements from a
                                 (                )            / evaluate this
                                     first where a             / returns first occurance of true in list a
                                  63^                          / fill result with 63 if null (to handle input of 0)
                               a:                              / save as a, we've stripped off all the left-most 0s
                      differ a                                 / whether or not item in list a is different to previous
                  not                                          / the inversion of this result
            where                                              / these are the points where we have 00 or 11
          0,                                                   / add the first index too!
  2 sv'                                                        / 2 sv converts binary back to base-10, ' for each list

0

PHP, 147

$b=decbin($argv[1]);$a=[$t=$b[0]];$k=0;for($i=1;$i<strlen($b);$i++){$v=$b[$i];if($v==$t)$k++;$t=$v;$a[$k].=$v;}foreach($a as$c)echo bindec($c).' ';

Cần đặt thêm không gian ở cuối sản lượng vì chúng không bị hạn chế. Thông báo được hiển thị cho mã hóa ngắn.

Phiên bản ung dung

$n=$argv[1];
$b=decbin($n);
$l=strlen($b);
$t=$b[0];
$a=[0=>$t];$k=0;
for($i=1;$i<$l;$i++){
    $v=$b[$i];
    if($v==$t){
        $k++;
    }
    $t=$v;$a[$k].=$v;    
}
foreach($a as $c){
    echo bindec($c).' ';
}

0

Võng mạc, 60

+`(1+)\1
$1a
a1
1
(?<=(.))(?=\1)
¶
+`1(a*)\b
a$.1$*1;
a

;
1

Hãy thử trực tuyến! Hoặc thử một phiên bản sửa đổi một chút cho tất cả các trường hợp thử nghiệm (với I / O thập phân).

Thật không may, các trận đấu có độ dài bằng không dường như có hai "mặt", gây ra sự trùng lặp khi được sử dụng với biểu thức chính quy từ giai đoạn thứ ba. Chỉ tốn một byte mặc dù.

Đưa đầu vào là unary, đầu ra là unary. Không thực sự chắc chắn về việc sử dụng các giá trị unary in / out khác nhau, nhưng điều đó sẽ tiết kiệm 4 byte.


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.