バイナリを交互のサブシーケンスに分解します


30

これは、触発された問題13 -非繰り返しバイナリHP CodeWarsの最近の競争を。

ランダムな10進数を考えてみましょう。

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進数に変換します。

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

タスク

入力として単一の正の整数を取り、上記のプロセスで取得した正の整数のシーケンスを出力します。

詳細

  • 入力と出力は10進数または単項でなければなりません。
  • 出力の数字は、理にかなった、人間が読める形式で区切る必要があり、10進数または単項でなければなりません。空白に制限はありません。有効な出力スタイル:[1,2,3]1 2 3、リテラル改行等、あります1\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, ...ある、A000975 OEISインチ


@DigitalTrauma:うーん......いや、それは挑戦の精神の範囲内だとは思わない。
エレンディアスターマン

OK。 |tacそれから私の答えに残ります:)
デジタル外傷

回答:


11

Pyth、17 16バイト

ジャクベのおかげで1バイト

iR2cJ.BQx1qVJ+dJ

デモンストレーション

素晴らしい、賢い解決策。やなどx<int><list>、Pythのあまり知られていない機能を使用します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
ジャクベ

@ジャクベいいね!
isaacg

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]アレフアルファのきちんとしたチップです。


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:]それの世話をします。bin()formatで文字列を返すため、この文字列の最初の2文字を破棄する必要があります0b10101
次に、サブシーケンスの境界を識別する必要があります。これは(?<=(.))(?=\1)、左右に同じ番号を持つ文字列の長さゼロの位置に一致する正規表現を使用して実行できます。
すべてのサブシーケンスのリストを取得する明らかな方法re.split()は、特定の正規表現で文字列を分割することを使用することです。残念ながら、この関数は長さゼロのマッチには機能しません。しかし、幸いなre.sub()ことに、長さゼロの一致をスペースで置き換え、その後の文字列を分割します。
その後、これらの各サブシーケンスを解析して、10進数に戻すだけで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のシステムを使用していますか?
ジェームズヤングマン

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バイト保存された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>


正規表現/(01)*0?|(10)*1?/gで2バイト節約できますか、それは何かを台無しにしますか?
-ETHproductions

1
また、私はあなたがx=>'0b'+x-0+' 'バイトを保存することができると思います。
ETHproductions

@ETHproductions私は短い正規表現を試してみましたが、良くありません:(。他のヒントの
Thx

Leadboardは、1バイトの回答があると言います。これは、修正後の数値(62)が、前ではなく古い数値(63)の前にあるためだと思います。
カイルカノス

正規表現/((.)(?!\2))*./gを使用すると、4バイト節約できると思います。
ニール

3

Pyth、26バイト

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

ここで試してみてください!

説明

iR2c:.BQ "(?<=(。))(?= \\ 1)" d#Q =入力番号

     .BQ#入力をバイナリに変換
    : "(?<=(。))(?= \\ 1)" d#サブシーケンス間に空白を挿入
   c#空白で文字列を分割
iR2#各サブシーケンスを10進数に変換します

Pythonのsplit()関数は長さ0の一致で分割しないので、それらの一致をスペースで置き換え、その結果を分割する必要があります。


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では機能しません。

8バイトのDennisに感謝します!


それはfor構文です。...待って、ないfor
電卓

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)と、出力はスペースで区切られたsのechoed文字列になり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));}};

おそらく、文字列を分割するためのより良い正規表現があります。私は正規表現に精通していませんが、実験を続けます。

@FryAmTheEggmanのおかげで-8バイト


2

APL(APL)21 25バイト

0も処理するようになりました。

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

オンラインでお試しください!

2⊥⍣¯1⊢ 必要な数のビットを使用して、base-2に変換します(lit. base-2からの逆変換)

{} 次の匿名関数を適用します

0:: エラーが発生した場合:

  0 0を返す

 今試してください:

  2=/⍵ 引数のペアごとの等式(1つの0の長さ0のバイナリ表現は失敗します)

  1, 付加する1

  ⍵⊂⍨ それを使用して引数を分割します(各セクションの新しいセクションを開始します)

  2⊥¨ base-2からそれぞれ変換します


1
ここで本当に便利です。それをゼリーに追加する必要があります。
デニス

@Dennis次の2つのバージョンに注意してくださいR←X⊂Y:(⎕ML<3つまりDyalogスタイル)では、Xの各1に対応する結果で、Xの次の1(またはXの最後の要素)になる前の位置まで新しいパーティションが開始されますRの連続するアイテム⎕ML=3(つまりIBMスタイル)では、Xの対応する要素が前の要素よりも大きい場合、結果で新しいパーティションが開始されます。Xの0に対応するYのアイテムは結果に含まれません。そう⎕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)}

私は正規表現が恐ろしいので、edc65の答えと同じ式を使用しています

バイナリへの/からの変換を行う長い.NET呼び出し、および正規表現の一致を取得するための.NET呼び出しによって完全に破壊されます。それ以外の場合はかなり簡単です。入力を取得し、バイナリに入力し$args[0]、入力し、結果のsを取得し、ループを介してパイプ処理し、それらの値をに戻します。出力はパイプラインに残り、暗黙的に改行で印刷されます。convertMatches.Value|%{...}convertint


追加のクレジット-126バイトの(ほとんどの)非正規表現バージョン

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

再び入力を受け取り$args[0]convertバイナリにします。最初の文字を$lに、残りの文字をに格納して、char-arrayとして再キャストし$rます。次に$r、ループを送信します|%{...}。この場合、バイナリxorの結果に応じて、スペースを先頭に追加した文字または文字のみから繰り返しを選択し$l、を設定します。$l等しくします。これにより、同じ文字を2回連続して入力した場合に、それらの間にスペースが追加されるようになります。

ループの出力は-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不要な空白を削除することから開始できます。ご質問があればお知らせください!
アレックスA.

1

ジュリア、70 57バイト

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

これは、整数を受け入れて整数配列を返す匿名関数です。呼び出すには、変数に割り当てます。

ここでのアプローチは、DenkerAffeの素晴らしいPython answerに似ています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バイトのコスト(まだ純減)で、区切り文字をスペースから改行に変更できます。
フォックス

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

オンラインでお試しください!または、すべてのテストケースでわずかに変更したバージョンを試してください(10進数のI / Oを使用)。

あいにく、長さゼロの一致には2つの「サイド」があるように思われ、第3段階の正規表現で使用すると重複が発生します。ただし、1バイトしかかかりません。

入力を単項として、出力を単項として受け取ります。異なるin / out単項値の使用については確かではありませんが、4バイト節約できます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.