Étant donné un modèle (format chaîne ou tableau) de bits:
[0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]
La tâche consiste à remplacer un nombre quelconque de 1-bits consécutifs par une séquence numérique ascendante commençant à 1.
Contribution
- Modèle (peut être reçu sous forme de chaîne ou de tableau) Exemple:
- Chaîne:
1001011010110101001
- Tableau:
[1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]
- Chaîne:
Sortie
- Séquence numérique ascendante (peut être renvoyée sous forme de chaîne ou de tableau) Exemple:
- Chaîne:
1 0 0 1 0 1 2 0 1 0 1 2 0 1 0 1 0 0 1
- Tableau:
[1, 0, 0, 1, 0, 1, 2, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 0, 1]
- Chaîne:
Règles
- (s'applique uniquement aux chaînes) L' entrée ne contiendra pas d'espaces entre
1
et0
- Supposer entrée
length > 0
- (s'applique uniquement aux chaînes de caractères) La sortie est séparée par un espace (utilisez tout autre séparateur si vous en avez besoin tant qu'il ne s'agit pas d'un chiffre ou d'une lettre de l'alphabet)
Exemple:
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ères gagnants: Codegolf
03 B3 20 AC 01 B6 02 DC
) ou 9 octets (utf-8:)CE B3 E2 82 AC C6 B6 CB 9C
ou 10 octets (par exemple, UTF-16, y compris la nomenclature à 2 octets) dans tout encodage non-jouet? (Oui, on pourrait construire un encodage jouet à 8 bits similaire à l'encodage ISO / 8859 avec ces 4 symboles représentés par 1 octet, mais cela semble être de la triche.)γ€ƶ˜
serait représenté par04 80 8F 98
. La page de code existe principalement pour faciliter l'écriture de code. Pour exécuter ce fichier de 4 octets, vous devez exécuter l'interpréteur avec l'--osabie
indicateur.Haskell , 15 octets
Essayez-le en ligne!
Explication / Ungolfed
scanl1
itère de gauche sur une liste en utilisant une fonction qui prend le dernier résultat et l'élément courant générant une nouvelle liste avec les résultats, laissant les listes vides et les singletons "non modifiés".(*).succ
est l'équivalent de\x y-> (x+1)*y
Utiliser cette fonction avec
scanl1
seulement ne fonctionne que parce que les séquences croissantes ( 1,2,3, .. ) commencent par 1 et n'ont pas d'élément précédent (auquel cas c'est le premier élément de la liste qui ne sera pas "modifié") ou ils ont un 0 en tête .la source
Python 2 , 36 octets
Essayez-le en ligne!
la source
Husk ,
5 43 octetsEssayez-le en ligne!
Explication
Modifier l'historique
-1 byte by using
scanl1
overzipWith
-1 byte by porting Dennis's solution
la source
APL (Dyalog Unicode), 5 bytes
Try it online!
How it works
la source
⊥⍨
trick.JavaScript (ES6), 22 bytes
Takes input as an array.
Try it online!
The shorter
a=>a.map(n=>a=n*-~a)
(20 bytes) would unfortunately fail on[1]
because of coercion of singleton arrays to the integer they're holding.la source
J, 4 bytes
A port of Bubbler's APL solution
Try it online!
J, 8 bytes
How?
It's simply the distance to the preceding
0
Try it online!
la source
Python 2,
3938 bytes-1 byte thanks to Erik the Outgolfer
Try it online!
la source
,
.,
you're not in the code anymore, but you will be forever in my heartJelly, 4 bytes
Try it online!
la source
K (oK),
118 bytesSolution:
Try it online!
Explanation:
Iterate over the list. Increment accumulator, multiply by current item (which resets accumulator if item is 0):
la source
Jelly, 4 bytes
Try it online!
How it works
la source
R,
4631 bytesTry it online!
sequence
, which "mainly exists in reverence to the very early history of R", is quite handy here.la source
RAD, 8 bytes
Try it online!
How?
(⊢×1+⊣)
, if the right argument is0
, return0
, otherwise increment the left argument⍂
, LTR Scan ((A f B) f C
instead ofA f (B f C)
) , apply this across the arrayla source
Japt,
765 bytesTry it
Explanation
la source
Java 8,
5548 bytesModifies the input-array instead of returning a new one to save bytes.
-7 bytes thanks to @TimSeguine.
Try it online.
Explanation:
la source
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
Code (68 bytes):
Layout (33 bytes):
Try it online!
Explanation:
la source
Gaia, 5 bytes
Try it online!
Explanation
Ugh, I thought SE code fonts were monospace....
la source
C (gcc),
454438 bytesTry it online!
Save one byte thanks to Toby Speight!
Save 6 bytes by using *= and a smarter while condition.
la source
*(a-1)
→a[-1]
Perl 6,
29 2418 bytes-6 bytes thanks to Sean!
Try it online!
The inner function could by
($+=1)*=*
, but then the anonymous variable would persist across function calls. We get by this by wrapping it in an explicit code block.Explanation:
la source
*.map(($+=1)*=*)
. This solution has the proviso that the state variable$
persists across calls to the function, so if the final element passed to one call and the first element passed to the next call are both nonzero, then the counting will start with the wrong number.*.map:{...}
.Jelly, 5 bytes
Try it online!
la source
Haskell, 19 bytes
Try it online!
Explanation: The code is equivalent to
scanl1(\b a->(b+a)*a)
, whereb
is the current bit anda
is the accumulator.scanl1
takes a list, instantiates the first list element as accumulator, and folds over the list and collects the intermediate values in a new list.Edit: BMO beat me by a few seconds and 4 bytes.
la source
Pyth, 6 bytes
Try it here!
How it works
la source
Wanted to get an answer in using regular expressions. There is probably an easier solution which I leave as an exercise for the reader.
PowerShell Core, 86 bytes
Try it online!
la source
Wolfram Language (Mathematica), 16 bytes
Try it online!
la source
QBasic, 60 bytes
Takes the input as a string; gives the output as numbers separated by newlines.
Explanation
We read the string
s$
and loopi
from1
up to its length.MID$(s$,i)
gets the substring from characteri
(1-indexed) to the end of the string. If this starts with a1
, it will be lexicographically>=
the string"1"
; if it starts with a0
, it will not be. Sob
gets0
if the character at indexi
is0
, or-1
if the character is1
.Next, we update the current value
v
. If we just read a0
, we wantv
to become0
; otherwise, we want to incrementv
by one. In other words,v = (-b) * (v+1)
; simplifying the math gives the shorter expression seen in the code. Finally, we printv
and loop.la source
Brain-Flak, 60 bytes
Try it online!
Explanation:
la source
Retina, 14 bytes
Try it online!
la source
C (gcc),
575251 bytesPort of Arnauld's JavaScript answer, modifies the array in-place. Try it online here.
la source
f(a,l,c)int*a;{for(c=0;l--;)c=*a++*=c+1;}
Shakespeare, 365 bytes
try it here
less golfed version
la source
C++, 47 bytes
A lambda that modifies an array in place, given start and end pointers.
Try it online! (requires Javascript)
Generic version at 55 bytes (this works for any container with elements of arithmetic type):
la source