1 bits consecutivos são incrementados


36

Dado um padrão (formato de cadeia ou matriz) de bits: [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]

A tarefa é substituir qualquer número de 1 bits consecutivos por uma sequência numérica ascendente iniciando em 1.

Entrada

  • Padrão (pode ser recebido como uma sequência ou matriz) Exemplo:
    • Corda: 1001011010110101001
    • Matriz: [1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]

Saída

  • Sequência numérica crescente (pode ser retornada como uma sequência ou matriz) Exemplo:
    • Corda: 1 0 0 1 0 1 2 0 1 0 1 2 0 1 0 1 0 0 1
    • Matriz: [1, 0, 0, 1, 0, 1, 2, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 0, 1]

Regras

  • (aplicar somente para strings) A entrada não conterá espaços entre 1e0
  • Assumir Entrada length > 0
  • (aplicar somente para seqüências de caracteres) A saída é separada por espaço (use qualquer outro separador se você precisar, contanto que não seja um número ou uma letra do alfabeto)

Exemplo:

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

Critérios para ganhar: Codegolf

Respostas:


19

05AB1E , 4 bytes

γ€ƶ˜

Experimente online! ou como um traje de teste

Explicação

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

1
Oof, melhor que o meu. Eu nunca teria pensado nisso.
Magic Octopus Urn

3
Não estou 100% familiarizado com as regras de contagem de bytes do codegolf (e o Google encontrou apenas este post que não chegou a uma conclusão). Embora sua resposta seja de 4 caracteres, não deve ter pelo menos 8 bytes (por exemplo, utf-16-estar sem BOM 03 B3 20 AC 01 B6 02 DC) ou 9 bytes (utf-8:) CE B3 E2 82 AC C6 B6 CB 9Cou 10 bytes (por exemplo, UTF-16 incluindo a BOM de 2 bytes) em alguma codificação que não seja de brinquedo? (Sim, um poderia construir um brinquedo de 8 bits que codifica semelhante ao iso-8859 codificações com estes 4 símbolos representados como um byte, mas que parece ser batota.)
dr jimbob

6
@drjimbob Sim, boa pergunta. O código pode realmente ser convertido em um arquivo binário usando a página de código 05AB1E . Por exemplo, γ€ƶ˜seria representado como 04 80 8F 98. A página de código existe principalmente para facilitar a escrita do código. Para executar este arquivo de 4 bytes, você precisaria executar o intérprete com o --osabiesinalizador.
Adnan

18

Haskell , 15 bytes

scanl1$(*).succ

Experimente online!

Explicação / Ungolfed

scanl1 itera da esquerda sobre uma lista usando uma função que obtém o último resultado e o elemento atual gera uma nova lista com os resultados, deixando listas e singletons vazios "não modificados".

(*).succ é o equivalente a \x y-> (x+1)*y

O uso dessa função em conjunto scanl1apenas funciona porque as sequências crescentes ( 1,2,3, .. ) começam com 1 e não têm elemento anterior (nesse caso, é o primeiro elemento da lista que não será "modificado") ou eles têm um 0 inicial .



14

Casca , 5 4 3 bytes

ṁ∫g

Experimente online!

Explicação

ṁ∫g  -- full function, example input: [1,1,1,0,1]
  g  -- group: [[1,1],[0],[1]]
ṁ    -- map the following and concatenate result (example with [1,1,1])
 ∫   -- | cumulative sum: [1,2,3]
     -- : [1,2,3,0,1]

Editar histórico

-1 byte usando scanl1mais dezipWith

-1 byte, portando a solução de Dennis



11

JavaScript (ES6), 22 bytes

Recebe entrada como uma matriz.

a=>a.map(s=n=>s=n*-~s)

Experimente online!

a=>a.map(n=>a=n*-~a)Infelizmente, o menor (20 bytes) falharia [1]devido à coerção das matrizes singleton para o número inteiro que elas estão mantendo.




6

Gelatina , 4 bytes

‘×¥\

Experimente online!

‘×¥\
   \   Accumulate the input with:
  ¥   The dyad
‘      Increment the left element
 ×    Multiply by the second element (1 or 0)
       The result always begins with the first element unchanged

6

K (oK) , 11 8 bytes

Solução:

{y*1+x}\

Experimente online!

Explicação:

Iterar sobre a lista. Acumulador de incremento, multiplique pelo item atual (que redefine o acumulador se o item for 0):

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

5

Gelatina , 4 bytes

ŒgÄF

Experimente online!

Como funciona

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

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

Com o grupo rodando rápido, Erik sugeriu que seriam três bytes! (Se eu entendi o que ele iria fazer corretamente)
dylnan

@dylnan O problema é que é difícil decidir sobre um comportamento tão rápido. :( É por isso que o rápido ainda está em hiato.
Erik the Outgolfer

Poderia haver várias quicks para as principais implementações possíveis
dylnan


5

RAD, 8 bytes

(⊢×1+⊣)⍂

Experimente online!

Quão?

  • (⊢×1+⊣), se o argumento certo for 0, retorne 0, caso contrário, aumente o argumento esquerdo
  • , Digitalização LTR (em (A f B) f Cvez de A f (B f C)), aplique isso na matriz

4

Japonês, 7 6 5 bytes

åÏ*°X

Tente


Explicação

åÏ        :Cumulatively reduce
   °X     :  Increment the current total (initially 0)
  *       :  Multiply by the current element

4

Java 8, 55 48 bytes

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

Modifica a matriz de entrada em vez de retornar uma nova para salvar bytes.

-7 bytes graças a @TimSeguine .

Experimente online.

Explicação:

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
Você pode reduzi-lo para 48:a->{int p=0,i=0;for(int b:a)a[i++]=b<1?p=0:++p;}
Tim Seguine

@TimSeguine Thanks! Agora que eu vejo, não acredito que eu não tinha pensado nisso.
18764 Kevin Crijssen

1
Eu era capaz de me livrar de p, mas é do mesmo tamanho :(a->{int i=0;for(int v:a)a[i]+=v*i++<1?0:a[i-2];}
Tim Seguine

4

TIS , 68 + 33 = 101 bytes

Código (68 bytes):

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

Layout (33 bytes):

2 1 CC I0 ASCII - O0 NUMERIC - 32

Experimente online!

Explicação:

|    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

Gaia , 5 bytes

ẋ+⊣¦_

Experimente online!

Explicação

ẋ+⊣¦_     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

Ugh, eu pensei que as fontes de código SE eram monoespaçadas ...


Eles são monoespaços ... Falta um espaço na primeira linha.
micsthepick

Veja a edição. Ainda está desalinhado.
Mr. Xcoder

Você deve estar à procura de um dispositivo móvel ou algo assim - Parece-me muito bem
micsthepick

@micsthepick Eu não sou ...
Mr. Xcoder


4

Perl 6 , 29 24 18 bytes

-6 bytes graças a Sean!

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

Experimente online!

A função interna poderia funcionar ($+=1)*=*, mas a variável anônima persistiria nas chamadas de função. Conseguimos isso envolvendo-o em um bloco de código explícito.

Explicação:

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

Eu tenho o mesmo para baixo abordagem de base para 16 bytes: *.map(($+=1)*=*). Essa solução tem a condição de que a variável de estado $persista nas chamadas para a função; portanto, se o elemento final passado para uma chamada e o primeiro elemento passado para a próxima chamada forem diferentes de zero, a contagem começará com o número errado.
31518 Sean

@ Sean, Sim, lembro-me de ter lutado com isso quando respondi originalmente. Felizmente eu aprendi uma maneira de contornar isso desde então
Jo rei

Você pode bater mais um byte off: *.map:{...}.
Sean



3

Pitão , 6 bytes

m=Z*hZ

Experimente aqui!

Como funciona

m = Z * hZ - Programa completo. Q = a entrada avaliada.
m - para cada número inteiro d em Q.
 = Z - Atribua a variável Z (pré-inicializado a 0) para ...
   * hZ - (Z + 1) * d; (d está implícito no final).

3

Queria obter uma resposta no uso de expressões regulares. Provavelmente existe uma solução mais fácil que deixo como exercício para o leitor.

Núcleo do PowerShell , 86 bytes

Filter F{($_-split"(0)(\B|\b)"|?{$_-ne''}|%{$_-replace'(1+)',(1..$_.Length)})-join' '}

Experimente online!



3

QBasic, 60 bytes

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

Pega a entrada como uma string; fornece a saída como números separados por novas linhas.

Explicação

Lemos a corda s$e laço ide 1até seu comprimento.

MID$(s$,i)obtém a substring do caractere i(indexado 1) até o final da string. Se isso começar com a 1, será lexicograficamente >=a string "1"; se começar com a 0, não será. Então bobtém 0se o caractere no índice ié 0ou -1se o caractere é 1.

Em seguida, atualizamos o valor atual v. Se apenas lermos a 0, queremos vnos tornar 0; caso contrário, queremos incrementar vem um. Em outras palavras v = (-b) * (v+1),; simplificar a matemática fornece a expressão mais curta vista no código. Finalmente, imprimimos ve fazemos o loop.


3

Flacidez cerebral , 60 bytes

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

Experimente online!

Explicação:

([]){  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 bytes

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

A resposta JavaScript do Port of Arnauld modifica a matriz no local. Experimente online aqui .


Não seria mais preciso dizer que isso é K&R C?
Tim Seguine

Possivelmente, mas isso seria verdade para muitas respostas. Não sou especialista, mas é perfeitamente possível que nem seja K&R C. válido. O fato é que realmente não nos importamos com os padrões de idioma deste site. Se o gcc permite que você misture o K&R C com coisas mais modernas, é válido o C para fins de golfe, porque o gcc o compila. Veja também: codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
OOBalance

Até agora, eu não percebi que o C11 ainda suporta a sintaxe da função da lista de identificadores antigos, então deixa pra lá. Mas seu ponto é válido independentemente.
Tim Seguine

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

3

Shakespeare, 365 bytes

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.

tente aqui

versão menos golfe

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 bytes . Confira a página de dicas do SPL para obter dicas de golfe.
Jo rei

3

C ++, 47 bytes

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

Um lambda que modifica uma matriz no local, dados os ponteiros de início e fim.


Experimente online! (requer Javascript)


Versão genérica em 55 bytes (isso funciona para qualquer contêiner com elementos do tipo aritmético):

[](auto a,auto b){for(auto c=*a-*a;a!=b;)c=*a++*=1+c;};
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.