連続する1ビットが増加します


36

ビットのパターン(文字列または配列形式)が与えられた場合: [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]

タスクは、任意の数の連続する1ビットを1から始まる昇順の数字シーケンスで置き換えることです。

入力

  • パターン(文字列または配列として受け取ることができます)例:
    • 文字列: 1001011010110101001
    • アレイ: [1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]

出力

  • 昇順の数値シーケンス(文字列または配列として返される可能性があります)例:
    • 文字列: 1 0 0 1 0 1 2 0 1 0 1 2 0 1 0 1 0 0 1
    • アレイ: [1, 0, 0, 1, 0, 1, 2, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 0, 1]

ルール

  • (文字列にのみ適用)入力文10
  • 入力を想定 length > 0
  • (文字列にのみ適用)出力はスペースで区切られます(必要な場合は、数字またはアルファベット文字以外の区切り文字を使用します)

例:

Given [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1] 
Output [0,1,2,3,0,1,2,0,0,0,1,2,3,4,5,6]

--------------------------------------------------------------------------

Given 0110101111101011011111101011111111     
Output 0 1 2 0 1 0 1 2 3 4 5 0 1 0 1 2 0 1 2 3 4 5 6 0 1 0 1 2 3 4 5 6 7 8

---------------------------------------------------------------------------

Given 11111111111101    
Output 1 2 3 4 5 6 7 8 9 10 11 12 0 1

受賞基準:Codegolf

回答:


19

05AB1E、4バイト

γ€ƶ˜

オンラインでお試しください! またはテストスーツとして

説明

γ      # split input into groups of consecutive equal elements
 €ƶ    # multiply each number in each sublist by its 1-based index in the sublist
   ˜   # flatten

1
うーん、私のよりもいい。これは考えもしなかったでしょう。
魔法のタコ

3
私はcodegolfのバイトカウント規則に100%精通していません(そしてグーグルは結論に至らなかったこの投稿を見つけました)。あなたの答えは4文字ですが、少なくとも8バイト(たとえば、BOMなしのutf-16-be 03 B3 20 AC 01 B6 02 DC)または9バイト(utf-8:)CE B3 E2 82 AC C6 B6 CB 9Cまたは10バイト(たとえば、2バイトBOMを含むUTF-16)であってはなりませんおもちゃ以外のエンコーディングで?(はい、これらの4つのシンボルが1バイトとして表されるiso-8859エンコードに類似したおもちゃの8ビットエンコードを構築できますが、それは不正行為のようです。)
dr jimbob

6
@drjimbobはい、いい質問です。実際には、コード05AB1Eコードページを使用してバイナリファイルに変換できます。たとえば、γ€ƶ˜はとして表され04 80 8F 98ます。コードページは、主にコードの記述を容易にするために存在します。この4バイトのファイルを実行するには、--osabieフラグを指定してインタープリターを実行する必要があります。
アドナン

18

Haskell、15バイト

scanl1$(*).succ

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

説明/ゴルフなし

scanl1 最後の結果と現在の要素が結果を含む新しいリストを生成する関数を使用して、リストを左から繰り返し、空のリストとシングルトンを「変更なし」のままにします。

(*).succ と同等です \x y-> (x+1)*y

一緒にその機能を使用してscanl1のみ増加配列ために動作(1,2,3、...で始まる)1とのいずれか全く先行要素を持たない(その場合、それは「改変」されないリストの最初の要素の)または、先頭に0が付いています







8

Pythonの239 38バイト

Erik the Outgolferのおかげで-1バイト

i=1
for x in input():i*=x;print i;i+=1

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


1
私はあなたが必要とは思わない,
エリックアウトゴルファー

@EriktheOutgolferこのようにきれいに見えるc:
ロッド

1
申し訳ありませんが、人生では時々犠牲を払わなければなりません。
エリックアウトゴルファー

9
RIP ,あなたはもうコードではないですが、あなたは私の心に永遠になります
ロッド


6

K(oK)11 8バイト

溶液:

{y*1+x}\

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

説明:

リストを反復処理します。アキュムレータをインクリメントし、現在のアイテムで乗算します(アイテムが0の場合、アキュムレータをリセットします):

{y*1+x}\ / the solution
{     }\ / iterate (\) over lambda function
     x   / accumulator
   1+    / add 1
 y*      / multiply by current item

5

ゼリー、4バイト

ŒgÄF

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

使い方

ŒgÄF  Main link. Argument: A (bit array)

Œg    Group adjacent, identical bits.
  Ä   Accumulate; take the cumulative sum of each chunk.
   F  Flatten.

グループのクイックランニングで、Erikはこれが3バイトになることを提案しました!(私はそれが正しく何をするかを理解した場合)
ディルナン

@dylnan問題は、そのような迅速な動作を決定するのが難しいことです。迅速に活動休止中である理由:(それがあります。
Outgolferエリック

メイン可能な実装のために複数のquicksがある可能性があります
dylnan


5

RAD、8バイト

(⊢×1+⊣)⍂

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

どうやって?

  • (⊢×1+⊣)、右の引数がの場合0、return 0、そうでない場合は左の引数をインクリメントします
  • 、LTRスキャン(の(A f B) f C代わりにA f (B f C))、これをアレイ全体に適用します


4

Javaの8、55の、48バイト

a->{int p=0,i=0;for(int v:a)a[i++]=v<1?p=0:++p;}

バイトを節約するために新しい配列を返す代わりに、入力配列を変更します。

@TimSeguineのおかげで-7バイト。

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

説明:

a->{             // Method with integer-array parameter and no return-type
  int p=0,       //  Previous integer, starting at 0
      i=0;       //  Index-integer, starting at 0
  for(int v:a)   //  Loop over the values of the input-array:
    a[i++]=v<1?  //   If the current value is 0:
          p=0    //    Reset the previous integer to 0
         :       //   Else:
          ++p;}  //    Increase `p` by 1 first with `++p`
                 //    and set the current item to this new value of `p`

1
あなたは48にそれを剃ることができます:a->{int p=0,i=0;for(int b:a)a[i++]=b<1?p=0:++p;}
ティムSeguine

@TimSeguineありがとう!私はそれを見たので、自分でそれについて考えていなかったとは信じられません。
ケビンCruijssen

1
私はpを取り除くことができましたが、それは同じサイズです:(a->{int i=0;for(int v:a)a[i]+=v*i++<1?0:a[i-2];}
ティムセグイン

4

TIS、68 + 33 = 101バイト

コード(68バイト):

@0
MOV UP ACC
SUB 47
MOV ACC ANY
@1
ADD 1
JRO UP
SUB ACC
MOV ACC ANY

レイアウト(33バイト):

2 1 CC I0 ASCII - O0 NUMERIC - 32

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

説明:

|    Input 0    |    Input is given in ASCII (`0` is 48, `1` is 49)
+--------+------+
| Node 0 |      |    This node prepares the input data
+--------+      |
| MOV UP ACC    |    Read in a character
| SUB 47        |    Subtract 47 to map [48, 49] to [1, 2]
| MOV ACC ANY   |    Send the 1 or 2 to the next node
|               |    Implicitly wrap back to top of node
+--------+------+
| Node 1 |      |    This node does the incrementing/printing
+--------+      |
| ADD 1         |    Increment counter (starts at zero)
| JRO UP        |    Get value from above, and jump forward that many lines  (skip next line or not)
| SUB ACC       |    Reset counter to zero (if input was zero)
| MOV ACC ANY   |    Send the counter value downward to be printed
|               |    Implicitly wrap back to top of node
+---------------+
|   Output 0    |    Output is space-delimited numeric values

4

ガイア、5バイト

ẋ+⊣¦_

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

説明

ẋ+⊣¦_     Full program
ẋ         Split into chunks of equal adjacent values.
   ¦_     And for each chunk, flattening the result afterwards...
 +⊣       Reduce it cumulatively on + (addition); aka cumulative sums

うーん、私はSEコードのフォントはモノスペースだと思っていました。


それらは等幅です...最初の行にスペースがありません。
-micsthepick

編集を見てください。まだずれています。
ミスターXcoder

あなたは、モバイルデバイスまたは何かから見ているに違いない-それは私にはうまく見えます
-micsthepick



4

Perl 6の29の24 18バイト

ショーンのおかげで-6バイト!

*.map:{($+=1)*=$_}

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

内部関数はによって可能ですが($+=1)*=*、その後、匿名変数は関数呼び出し間で持続します。明示的なコードブロックにラップすることでこれを実現します。

説明:

*.map:               # Map the array to
      {($+=1)    }   # The anonymous variable incremented
             *=$_    # Multiplied by the element

同じ基本的なアプローチを16バイトまで下げました:*.map(($+=1)*=*)。このソリューションには、$関数の呼び出し間で状態変数が保持されるという条件があります。そのため、1つの呼び出しに渡される最終要素と次の呼び出しに渡される最初の要素が両方ともゼロでない場合、カウントは間違った数で開始されます。
ショーン

@ショーン、ええ、私が最初に答えたとき、それと苦労したことを覚えています。幸いなことに、それ以降の方法を学びました
ジョーキング

もう1バイトをノックできます:*.map:{...}
ショーン


3

Haskell、19バイト

scanl1$((*)=<<).(+)

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

説明: コードはに相当しますscanl1(\b a->(b+a)*a)。ここbで、は現在のビットでa、アキュムレーターです。scanl1リストを取得し、最初のリスト要素をアキュムレーターとしてインスタンス化し、リストを折り返し、中間値を新しいリストに収集します。

編集:BMOは数秒と4バイトで私を打ちました


3

Pyth、6バイト

m=Z*hZ

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

使い方

m = Z * hZ –完全なプログラム。Q =評価された入力。
m – Qの各整数dについて
 = Z –変数Z(0に事前初期化)を割り当てる...
   * hZ –(Z + 1)* d; (dは最後に暗黙的です)。



3

QBasic、60バイト

INPUT s$
FOR i=1TO LEN(s$)
b=MID$(s$,i)>="1
v=-b*v-b
?v
NEXT

入力を文字列として受け取ります。改行で区切られた数値として出力を提供します。

説明

文字列を読み取り、その長さまでs$ループi1ます。

MID$(s$,i)文字i(1インデックス)から文字列の末尾までの部分文字列を取得します。これがa 1で始まる場合、辞書式>=に文字列になります"1"。で始まる場合0、そうではありません。だから、b取得0されたインデックスの文字があればiある0、または-1文字がある場合1

次に、現在の値を更新しますv。私達はちょうど読めば0、私たちは望んvなるために0。それ以外の場合は、v1 ずつ増やします。つまり、v = (-b) * (v+1); 数学を単純化すると、コードに見られる短い式が得られます。最後に、印刷vしてループします。


3

Brain-Flak、60バイト

([]){{}<>(())<>{{}<>({}({}))(<>)}{}([])}{}<>{({}[()]<>)<>}<>

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

説明:

([]){  For each element in the input
    {}
    <>(())<>  Push a one to the other stack
    { If the element is one,
       {}<>({}({}))(<>)  Add the one to a copy of the previous number in the series
    }{}  Pop the element
([])}  End loop
{}<>   Pop extra zero
{({}[()]<>)<>}<>   And reverse the output stack, subtracting one from each element


3

C(gcc)、57 52 51バイト

f(a,l,c,i)int*a;{for(c=i=0;i<l;)a[i++]=c=a[i]*-~c;}

Port of ArnauldのJavaScript answerは、配列をその場で変更します。こちらからオンラインでお試しください。


これがK&R Cであると言う方が正確ではないでしょうか?
ティムセギーン

おそらく、しかしそれは多くの答えに当てはまります。私は専門家ではありませんが、有効なK&R Cでさえない可能性があります。実は、このサイトの言語標準はあまり気にしません。gccでK&R Cをより新しいものと混合できる場合、gccがコンパイルするため、ゴルフの目的には有効なCです。参照:codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
OOBalance

C11が古い識別子リスト関数の構文をまだサポートしていることを今すぐ検索するまでは知りませんでした。しかし、あなたのポイントは関係ありません。
ティムセギーン

1
提案f(a,l,c)int*a;{for(c=0;l--;)c=*a++*=c+1;}

3

シェークスピア、365バイト

I.Ajax,.Ford,.Act I:.Scene I:.[enter Ajax and Ford]Ajax:Open mind!Scene V:.Ford:Am I nicer than the sum of a big red old cute hard cat a big red old cute joy?Ford:If so,you is the sum of thyself a son!Ford:If not,you is zero!Ford:Open heart!Ajax:you is a big red old cute hard cat.Ajax:Speak mind!Ajax:Open mind!Ford:Am I nicer than zero?Ajax:If so, let us Scene V.

ここで試してください

少ないゴルフバージョン

I.Ajax,.Ford,.
Act I:.
Scene I:.
[enter Ajax and Ford]
Ajax:Open mind!
Scene V:.
Ford:Am I nicer than the sum of a big red old cute hard cat a big red old cute joy?     <- smallest way to 48 (ascii "0") I could think of
Ford:If so,you is the sum of thyself a son!
Ford:If not,you is zero!
Ford:Open heart!
Ajax:you is a big red old cute hard cat.    <- get value of 32 or space
Ajax:Speak mind!                            <- then output it
Ajax:Open mind!
Ford:Am I nicer than zero?
Ajax:If so, let us Scene V.                 <- loop through inputs

280バイト。ゴルフのヒントについては、SPLのヒントページご覧ください
ジョーキング

3

C ++、47バイト

[](int*a,int*b){for(int c=0;a!=b;)c=*a++*=1+c;}

開始ポインターと終了ポインターを指定して、所定の位置に配列を変更するラムダ。


オンラインでお試しください!(Javascriptが必要です)


55バイトの汎用バージョン(これは、算術型の要素を持つすべてのコンテナーで機能します):

[](auto a,auto b){for(auto c=*a-*a;a!=b;)c=*a++*=1+c;};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.