将二进制分解为交替的子序列


30

这个灵感来自非重复二进制-问题13HP CodeWars'最近的比赛。

让我们取一个随机的十进制数

727429805944311

并查看其二进制表示形式:

10100101011001011111110011001011101010110111110111

现在,将该二进制表示形式拆分为数字01交替的子序列。

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

并将每个子序列转换回十进制。

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

任务

以单个正整数为输入,并输出通过上述过程获得的正整数序列。

细节

  • 输入和输出必须为十进制或一进制。
  • 输出中的数字必须以易于理解的方式分开,并且必须为十进制或一进制。对空格没有限制。有效的输出方式:[1,2,3]1 2 31\n2\n3这里\n是文字换行,等等。

测试用例

 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

附加说明:输出中的所有数字均应采用(2^k-1)/3或形式2*(2^k-1)/3。即0 1 2 5 10 21, 42, 85, 170, ...,即OEIS中的A000975


@DigitalTrauma:嗯……不,我认为这不属于挑战精神。
El'endia Starman

好。 |tac然后将保留在我的回答中:)
Digital Trauma'Mar

Answers:


11

Pyth,17 16字节

1字节感谢Jakube

iR2cJ.BQx1qVJ+dJ

示范

一个不错的,聪明的解决方案。使用Pyth的一些鲜为人知的功能,例如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
如果替换tJ+dJ,则可以删除hM
雅库布

@Jakube不错的一个!
isaacg '16

7

Mathematica,47个字节

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

取消高尔夫:

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

Split[list,f]将一个列表拆分为多个列表,在a和之间的位置中断,并且biff f[a,b]不返回True

FromDigits[n,2] => Fold[#+##&,n]是来自alephalpha 的简洁提示


7

Python,86个字节

由于我对Pyth的想法太过厌恶了,让我们再次在Python中做到这一点。

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

在这里尝试!

说明

我们首先将输入数字n转换为二进制字符串。bin(n)[2:]照顾那个。我们需要丢弃此字符串的前2个字符,因为bin()它以格式返回了字符串0b10101
接下来,我们需要确定子序列的边界。可以使用正则表达式来完成此操作,该正则表达式(?<=(.))(?=\1)与字符串中长度为零的位置相匹配,该位置的左右数字相同。
获取所有子序列列表的明显方法是使用re.split(),它在某个正则表达式上分割字符串。不幸的是,此功能不适用于零长度匹配。但是幸运的re.sub()是,所以我们只用空格替换那些零长度的匹配项,然后在那之后拆分字符串。
然后,我们只需要使用和来将每个子序列解析回十进制数即可int(s,2)


4

果冻,12个字节

BI¬-ẋż@BFṣ-Ḅ

在线尝试!验证所有测试用例

怎么运行的

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.

当然是12个字符,但20个字节。或者您正在使用CHAR_BIT >> 8的系统?
James Youngman

1
@JamesYoungman Jelly默认情况下不使用UTF-8。实际上,它具有自己的代码页该页将每个256个字符理解为一个字节进行编码。
丹尼斯

4

Bash + GNU实用程序,51

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

输入来自STDIN。

  • dc -e2o?p 从STDIN读取输入整数并输出以2为底的字符串
  • sed -r ':;s/(.)\1/\1 \1/;t' 在有连续两个相同数字的地方用空格分隔以2为基的字符串
  • dc -e2i?f一口气读取拆分后的二进制文件,将每个部分放入堆栈中,然后f转储整个dc堆栈(以相反的顺序输出数字)...
  • ...由纠正tac

4

JavaScript(ES6)58 62 63

编辑保存的1个字节thx @ETHproductions

编辑保存的4个字节@@ 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>


您可以使用正则表达式保存两个字节/(01)*0?|(10)*1?/g,还是会弄乱某些东西?
ETHproductions 2016年

1
另外,我认为您可以x=>'0b'+x-0+' '保存一个字节。
ETHproductions

@ETHproductions我尝试了较短的正则表达式,不好:(。Thx为其他提示
edc65

排行榜说您有一个1字节的答案。我认为这是因为您在旧数字(63)之前而不是之后有正确的数字(62)。
凯尔·坎诺斯

我认为正则表达式为/((.)(?!\2))*./g您节省了4个字节。
尼尔

3

Pyth,26个字节

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

在这里尝试!

说明

iR2c:.BQ“(?<=(。))(?= \\ 1)” d#Q =输入号码

     .BQ#将输入转换为二进制
    :“((?<=(。))(?= \\ 1)” d#在子序列之间插入空格
   c#在空格上分割字符串
iR2#将每个子序列转换为十进制

由于Python的split()函数不会在零长度的匹配项上进行拆分,因此我必须将这些匹配项替换为一个空格并在其上拆分结果。


3

Pyth,22 21字节

&Qu?q%G2H&
GH+yGHjQ2Z

在线尝试:演示

在Pyth中确实是一项繁琐的任务。

说明:

&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个字节

码:

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

说明:

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

在线尝试!

使用CP-1252编码。


3

MATL18 17字节

YBTyd~Thhfd1wY{ZB

在线尝试!

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字节

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

我不知道为什么,但这在Bash中不起作用。

感谢Dennis提供8个字节!


这是for语法。...等等,不是for吗?
CalculatorFeline

Bash的算术扩展不允许您指定输出基数。要摆脱xargs,可以使用for i in `grep -oP '1?(01)*0?'<<<$[[##2]$1]`;<<<$[2#$i]
丹尼斯

2

PHP,171 168 162 160 158 121 120 131 124 118个 116 113 112字节

function d($i){for(;$d<$l=strlen($b=decbin($i));){$c.=$u=$b[$d];echo$u==$b[++$d]||$d==$l?bindec($c).$c=" ":"";}}
分解图
function d($i) {
  for ( ; $d < $l = strlen($b = decbin($i)); ) {
    $c .= $u = $b[$d];
    echo $u == $b[++$d] || $d == $l ? bindec($c) . $c = " "
                                    : "";
  }
}

使用d(int)并且您离开了,输出是echoed的ed字符串,int用空格分隔。

编辑:
-3:$b定义移至strlen()调用中。
-6:删除了$c实例化。
-2: 最后解决了串联问题。
-2:单行没有括号for()
-37: 全面检修。 使用Array存储块,而不是重复Array-> String-> Array调用。
-1:偷偷摸摸地$c复位。
+11:错误 修正。缺少最后一块。不再。
-7:根本不需要实例化$d吗?真好
-6: return - > echo
-2:紧缩$c
-3:三元,我的初恋。
-1:偷偷摸摸地偷偷摸摸$u


我认为您可以节省2个字节:function d($i){for(;$d<$l=strlen($b=decbin($i));print$u==$b[++$d]||$d==$l?bindec($c).$c=" ":"")$c.=$u=$b[$d];}
黑洞

2

凸0.2 +,25个字节

Convex是我正在开发的一种新语言,主要基于CJam和Golfscript。可以在此处找到解释器和IDE 。输入是命令行参数中的整数。这使用CP-1252编码。

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

说明:

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字节

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

可能有更好的正则表达式可以拆分字符串。我不精通正则表达式,但我会继续尝试。

-8个字节,感谢@FryAmTheEggman


2

APL(APL)21 25字节

现在也处理0。

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

在线尝试!

2⊥⍣¯1⊢ 转换为以2为基数,使用所需的位数(从基数2逆转换)

{} 应用以下匿名函数

0:: 如果发生任何错误:

  0 返回0

 现在尝试:

  2=/⍵ 参数的成对相等(将失败一个0的length-0二进制表示形式)

  1, 前置1

  ⍵⊂⍨ 使用它来划分参数(在每个1处开始新的部分)

  2⊥¨ 从base-2转换每个


1
在这里真的很有用。我应该将其添加到果冻中。
丹尼斯

@Dennis请注意以下两个版本R←X⊂Y:使用⎕ML<3(即Dyalog样式),将在与X中的每个1对应的结果中开始一个新分区,直到X中的下一个1(或X的最后一个元素)成为之前的位置。使用⎕ML=3(即IBM样式),只要X中的对应元素大于上一个元素,就会在结果中启动一个新分区。Y中与X中的0对应的项目不包括在结果中。所以⎕ML←1 ⋄ 1 0 0 1 0 1 1 ⊂ ⍳7相当于⎕ML←3⋄4 3 2 4 4 5 7⊂⍳7`
亚当

2

Japt,7个字节

¤ò¥ mn2

测试一下


说明

¤ò¥ 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个字节

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]

说明

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 

结果

>>> [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]

先前的解决方案(118字节)

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字节

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 是用于计算列表的未命名函数。

少打高尔夫球:

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个字节

包括+1的 -p

在STDIN上使用数字运行

perl -p alterbits.pl <<< 371017

alterbits.pl

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

1

PowerShell,103字节

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

由于我对regex感到恐惧,因此使用的表达式与edc65的answer相同。

冗长的.NET调用绝对可以破坏二进制文件之间的转换,而.NET调用则可以获取正则表达式匹配项。否则非常简单。取输入$args[0]convert这跟二进制,馈送入Matches,取所得到的.ValueS,管它们通过环|%{...}convertš这些值回int。输出留在管道上,并用换行符隐式打印。


额外的信用-126个字节的(大多数)非正则表达式版本

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

我们再次采取输入$args[0]convert它的二进制文件。我们将其重新铸造为char数组,将中的第一个字符$l和其余的字符存储在中$r。然后,我们$r通过一个循环发送循环|%{...},在该循环中,我们根据带有的二进制xor的结果,从带空格的字符或仅是字符中选择一次迭代$l,然后将$l其设置为等于该字符。这有效地确保了,如果我们连续两次有相同的字符,我们将在它们之间加一个空格。

将循环的输出-join汇总在一起,并附加到第一个字符$l,然后附加-split在空格上(从技术上讲,这是一个正则表达式,但我不打算对其进行计数)。然后,我们执行与正则表达式答案相同的循环convert并输出整数。


1

Java 345字节

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

测试

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

输出量

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
欢迎来到编程难题和代码高尔夫球!由于这是一场代码高尔夫竞赛,因此您应该使代码尽可能短。这里是一些使用Java打高尔夫球的技巧。您可以先定义不含样板package和的函数class,然后删除不必要的空格。如果您有任何疑问,请告诉我!
Alex A.

1

朱莉娅70 57字节

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

这是一个接受整数并返回整数数组的匿名函数。要调用它,请将其分配给变量。

这里的方法类似于DenkerAffe的Python不错的答案。我们获得nusing 的二进制表示形式bin(n),并在所有正则表达式匹配项中拆分结果字符串(?<=(.))(?=\1)。实际上是零长度的匹配;(?<=(.))是查找任何单个字符(?=\1)的正向查找,并且是查找后向匹配的字符的正向查找。这将在二进制表示形式中找到数字后跟的位置。只是parse每一个整数的基地2使用map瞧!


1

C,137个 129字节

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

输入和输出在标准流上。


我认为您不需要puts,即使使用起来不愉快,规范也不需要尾随换行符。
FryAmTheEggman

@FryAmTheEggman我宁愿不要生成不完整的最后一行。但是只要花一个字节(仍然净减少),我就可以将分隔符从空格更改为换行符。
福克斯

1

J,16字节

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

在线尝试!

说明

#:#.;.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个字节

解:

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

例子:

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

说明:

q 从右到左解释。

将输入转换为二进制,修剪掉前导零,找到不同的索引,取反获得相同的索引,分割这些索引的列表,转换回以10为底的数字。与APL解决方案相比,看上去有点沉重……

{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).' ';

由于没有限制,因此需要在输出的最后放置额外的空间。显示通知以进行简短编码。

非高尔夫版本

$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

视网膜,60

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

;
1

在线尝试!或尝试对所有测试用例进行略微修改的版本(使用十进制I / O)。

不幸的是,零长度匹配似乎有两个“边”,当与第三阶段的正则表达式一起使用时,会导致重复。虽然只花费一个字节。

将输入作为一元,将输出作为一元。不确定使用不同的in /​​ out一元值,但这会节省4个字节。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.