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]
- Corda:
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]
- Corda:
Regras
- (aplicar somente para strings) A entrada não conterá espaços entre
1
e0
- 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
03 B3 20 AC 01 B6 02 DC
) ou 9 bytes (utf-8:)CE B3 E2 82 AC C6 B6 CB 9C
ou 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.)γ€ƶ˜
seria representado como04 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--osabie
sinalizador.Haskell , 15 bytes
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
scanl1
apenas 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 .fonte
Python 2 , 36 bytes
Experimente online!
fonte
Casca ,
5 43 bytesExperimente online!
Explicação
Editar histórico
-1 byte usando
scanl1
mais dezipWith
-1 byte, portando a solução de Dennis
fonte
APL (Dyalog Unicode) , 5 bytes
Experimente online!
Como funciona
fonte
⊥⍨
truque.JavaScript (ES6), 22 bytes
Recebe entrada como uma matriz.
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.fonte
J , 4 bytes
Uma porta da solução APL da Bubbler
Experimente online!
J , 8 bytes
Quão?
É simplesmente a distância do anterior
0
Experimente online!
fonte
Python 2 ,
3938 bytes-1 byte graças a Erik the Outgolfer
Experimente online!
fonte
,
.,
você não está no código mais, mas você estará sempre em meu coraçãoGelatina , 4 bytes
Experimente online!
fonte
K (oK) ,
118 bytesSolução:
Experimente online!
Explicação:
Iterar sobre a lista. Acumulador de incremento, multiplique pelo item atual (que redefine o acumulador se o item for 0):
fonte
Gelatina , 4 bytes
Experimente online!
Como funciona
fonte
R ,
4631 bytesExperimente online!
sequence
, que "existe principalmente em reverência à história muito antiga de R" , é bastante útil aqui.fonte
RAD, 8 bytes
Experimente online!
Quão?
(⊢×1+⊣)
, se o argumento certo for0
, retorne0
, caso contrário, aumente o argumento esquerdo⍂
, Digitalização LTR (em(A f B) f C
vez deA f (B f C)
), aplique isso na matrizfonte
Japonês,
765 bytesTente
Explicação
fonte
Java 8,
5548 bytesModifica a matriz de entrada em vez de retornar uma nova para salvar bytes.
-7 bytes graças a @TimSeguine .
Experimente online.
Explicação:
fonte
a->{int p=0,i=0;for(int b:a)a[i++]=b<1?p=0:++p;}
a->{int i=0;for(int v:a)a[i]+=v*i++<1?0:a[i-2];}
TIS , 68 + 33 = 101 bytes
Código (68 bytes):
Layout (33 bytes):
Experimente online!
Explicação:
fonte
Gaia , 5 bytes
Experimente online!
Explicação
Ugh, eu pensei que as fontes de código SE eram monoespaçadas ...
fonte
C (gcc) ,
454438 bytesExperimente online!
Economize um byte graças a Toby Speight!
Salve 6 bytes usando * = e uma condição mais inteligente.
fonte
*(a-1)
→a[-1]
Perl 6 ,
29 2418 bytes-6 bytes graças a Sean!
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:
fonte
*.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.*.map:{...}
.Gelatina , 5 bytes
Experimente online!
fonte
Haskell , 19 bytes
Experimente online!
Explicação: O código é equivalente a
scanl1(\b a->(b+a)*a)
, ondeb
está o bit atual ea
é o acumulador.scanl1
pega uma lista, instancia o primeiro elemento da lista como acumulador, dobra a lista e coleta os valores intermediários em uma nova lista.Edit: BMO me venceu por alguns segundos e 4 bytes .
fonte
Pitão , 6 bytes
Experimente aqui!
Como funciona
fonte
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
Experimente online!
fonte
Wolfram Language (Mathematica) , 16 bytes
Experimente online!
fonte
QBasic, 60 bytes
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çoi
de1
até seu comprimento.MID$(s$,i)
obtém a substring do caracterei
(indexado 1) até o final da string. Se isso começar com a1
, será lexicograficamente>=
a string"1"
; se começar com a0
, não será. Entãob
obtém0
se o caractere no índicei
é0
ou-1
se o caractere é1
.Em seguida, atualizamos o valor atual
v
. Se apenas lermos a0
, queremosv
nos tornar0
; caso contrário, queremos incrementarv
em um. Em outras palavrasv = (-b) * (v+1)
,; simplificar a matemática fornece a expressão mais curta vista no código. Finalmente, imprimimosv
e fazemos o loop.fonte
Flacidez cerebral , 60 bytes
Experimente online!
Explicação:
fonte
Retina , 14 bytes
Experimente online!
fonte
C (gcc),
575251 bytesA resposta JavaScript do Port of Arnauld modifica a matriz no local. Experimente online aqui .
fonte
f(a,l,c)int*a;{for(c=0;l--;)c=*a++*=c+1;}
Shakespeare, 365 bytes
tente aqui
versão menos golfe
fonte
C ++, 47 bytes
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):
fonte