Kolejne 1-bity są zwiększane

36

Biorąc pod uwagę wzorzec (format ciągu lub tablicy) bitów: [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]

Zadaniem jest zastąpienie dowolnej liczby kolejnych 1-bitów rosnącą sekwencją liczb zaczynającą się od 1.

Wkład

  • Wzór (może być odebrany jako ciąg lub tablica) Przykład:
    • Strunowy: 1001011010110101001
    • Szyk: [1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]

Wydajność

  • Rosnąca sekwencja numerów (może być zwrócona jako ciąg lub tablica) Przykład:
    • Strunowy: 1 0 0 1 0 1 2 0 1 0 1 2 0 1 0 1 0 0 1
    • Szyk: [1, 0, 0, 1, 0, 1, 2, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 0, 1]

Zasady

  • (dotyczy tylko łańcuchów) Dane wejściowe nie będą zawierać spacji między 1i0
  • Załóżmy wejście length > 0
  • (dotyczy tylko ciągów znaków) Dane wyjściowe są oddzielone spacją (użyj dowolnego innego separatora, jeśli potrzebujesz, o ile nie jest to cyfra ani litera z alfabetu)

Przykład:

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

Kryteria wygranej: Codegolf

Luis Felipe De Jesus Munoz
źródło

Odpowiedzi:

19

05AB1E , 4 bajty

γ€ƶ˜

Wypróbuj online! lub jako kombinezon testowy

Wyjaśnienie

γ      # split input into groups of consecutive equal elements
 €ƶ    # multiply each number in each sublist by its 1-based index in the sublist
   ˜   # flatten
Emigna
źródło
1
Nie, lepiej niż moje. Nigdy bym o tym nie pomyślał.
Magic Octopus Urn
3
Nie jestem w 100% zaznajomiony z regułami liczenia bajtów kodegolfa (a googling znalazł tylko ten post, który nie doszedł do wniosku). Chociaż twoja odpowiedź to 4 znaki, nie powinna to być co najmniej 8 bajtów (np. Utf-16-be bez BOM 03 B3 20 AC 01 B6 02 DC) lub 9 bajtów (utf-8:) CE B3 E2 82 AC C6 B6 CB 9Club 10 bajtów (np. UTF-16 w tym 2-bajtowy BOM) w jakimkolwiek kodowaniu innym niż zabawkowe? (Tak, jeden może skonstruować zabawka 8-bitowej kodowania podobny do ISO-8859 kodowania z tych 4 symbole reprezentowane przez bajty 1, lecz wydaje się, że oszustwem.)
dr jimbob
6
@drjimbob Tak, dobre pytanie. Kod można w rzeczywistości przekonwertować do pliku binarnego za pomocą strony kodowej 05AB1E . Na przykład γ€ƶ˜byłby reprezentowany jako 04 80 8F 98. Strona kodowa istnieje przede wszystkim w celu ułatwienia pisania kodu. Aby uruchomić ten 4-bajtowy plik, musisz uruchomić interpreter z --osabieflagą.
Adnan
18

Haskell , 15 bajtów

scanl1$(*).succ

Wypróbuj online!

Wyjaśnienie / Niegolfowany

scanl1 iteruje od lewej do listy za pomocą funkcji, która pobiera ostatni wynik, a bieżący element generuje nową listę z wynikami, pozostawiając puste listy i singletony „niezmodyfikowane”.

(*).succ jest odpowiednikiem \x y-> (x+1)*y

Używanie tej funkcji razem scanl1działa tylko dlatego, że rosnąca sekwencja ( 1,2,3, .. ) zaczyna się od 1 i albo nie ma żadnego elementu poprzedzającego (w takim przypadku jest to pierwszy element na liście, który nie będzie „modyfikowany”) lub mają wiodące 0 .

ბიმო
źródło
14

Łuska , 5 4 3 bajty

ṁ∫g

Wypróbuj online!

Wyjaśnienie

ṁ∫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]

Edytuj historię

-1 bajt przy użyciu scanl1overzipWith

-1 bajt przez przeniesienie Dennis „s rozwiązanie

ბიმო
źródło
12

APL (Dyalog Unicode) , 5 bajtów

⊥⍨¨,\

Wypróbuj online!

Jak to działa

⊥⍨¨,\
   ,\   Convert to lists of first n elements
⊥⍨¨     Map "Count trailing ones" to each list
Bubbler
źródło
Niezłe wykorzystanie ⊥⍨lewy.
Zacharý
11

JavaScript (ES6), 22 bajty

Pobiera dane wejściowe jako tablicę.

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

Wypróbuj online!

Krótsze a=>a.map(n=>a=n*-~a)(20 bajtów) niestety nie zadziałałyby z [1]powodu przymusu tablic singletonów do liczby całkowitej, którą przechowują.

Arnauld
źródło
10

J , 4 bajty

#.~\

Port rozwiązania APL Bubblera

Wypróbuj online!

J , 8 bajtów

i.&0@|.\

W jaki sposób?

To po prostu odległość do poprzedniej 0

       \  for each prefix
     |.   reverse it
    @     and
i.&0      find the index of the first 0

Wypróbuj online!

Galen Iwanow
źródło
8

Python 2 , 39 38 bajtów

-1 bajt dzięki Erik the Outgolfer

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

Wypróbuj online!

Pręt
źródło
1
Nie sądzę, że potrzebujesz ,.
Erik the Outgolfer
@EriktheOutgolfer wygląda ładniej w ten sposób c:
Rod
1
Przepraszam, ale czasami w życiu trzeba się poświęcić.
Erik the Outgolfer
9
RIP ,, nie ma cię już w kodzie, ale na zawsze pozostaniesz w moim sercu
Rod
6

Galaretka , 4 bajty

‘×¥\

Wypróbuj 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
dylnan
źródło
6

K (oK) , 11 8 bajtów

Rozwiązanie:

{y*1+x}\

Wypróbuj online!

Wyjaśnienie:

Iteruj po liście. Akumulator przyrostowy, pomnóż przez bieżącą pozycję (która resetuje akumulator, jeśli pozycja wynosi 0):

{y*1+x}\ / the solution
{     }\ / iterate (\) over lambda function
     x   / accumulator
   1+    / add 1
 y*      / multiply by current item
streetster
źródło
5

Galaretka , 4 bajty

ŒgÄF

Wypróbuj online!

Jak to działa

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

Œg    Group adjacent, identical bits.
  Ä   Accumulate; take the cumulative sum of each chunk.
   F  Flatten.
Dennis
źródło
Po uruchomieniu grupy Erik zasugerował, że będzie to trzy bajty! (Gdybym zrozumiał, co zrobiłby poprawnie)
dylnan
@dylnan Problem polega na tym, że trudno jest zdecydować się na takie zachowanie tak szybko. :( Dlatego szybkie jest nadal w przerwie.
Erik the Outgolfer
Może być wiele postów dla głównych możliwych implementacji
dylnan
5

RAD, 8 bajtów

(⊢×1+⊣)⍂

Wypróbuj online!

W jaki sposób?

  • (⊢×1+⊣), jeśli prawym argumentem jest 0, zwróć 0, w przeciwnym razie zwiększ lewy argument
  • , Skanuj LTR ( (A f B) f Czamiast A f (B f C)), zastosuj to w całej tablicy
Zacharý
źródło
4

Japt, 7 6 5 bajtów

åÏ*°X

Spróbuj


Wyjaśnienie

åÏ        :Cumulatively reduce
   °X     :  Increment the current total (initially 0)
  *       :  Multiply by the current element
Kudłaty
źródło
4

Java 8, 55 48 bajtów

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

Zmienia tablicę wejściową zamiast zwracać nową, aby zapisać bajty.

-7 bajtów dzięki @TimSeguine .

Wypróbuj online.

Wyjaśnienie:

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`
Kevin Cruijssen
źródło
1
Możesz go ogolić do 48:a->{int p=0,i=0;for(int b:a)a[i++]=b<1?p=0:++p;}
Tim Seguine,
@TimSeguine Thanks! Teraz, kiedy to widzę, nie mogę uwierzyć, że sam o tym nie pomyślałem.
Kevin Cruijssen
1
Byłem w stanie pozbyć się p, ale ma ten sam rozmiar :(a->{int i=0;for(int v:a)a[i]+=v*i++<1?0:a[i-2];}
Tim Seguine,
4

TIS , 68 + 33 = 101 bajtów

Kod (68 bajtów):

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

Układ (33 bajty):

2 1 CC I0 ASCII - O0 NUMERIC - 32

Wypróbuj online!

Wyjaśnienie:

|    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
Phlarx
źródło
4

Gaia , 5 bajtów

ẋ+⊣¦_

Wypróbuj online!

Wyjaśnienie

ẋ+⊣¦_     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, myślałem, że czcionki SE są monospace ....

Pan Xcoder
źródło
Są one monospace ... W pierwszym wierszu brakuje miejsca.
micsthepick,
Spójrz na edycję. Nadal jest źle ustawiony.
Pan Xcoder,
Musisz patrzeć z urządzenia mobilnego czy coś w tym stylu - dla mnie wygląda dobrze
micsthepick
@micsthepick Nie jestem ...
Pan Xcoder
4

C (gcc) , 45 44 38 bajtów

f(a,i)int*a;{while(--i)*++a*=-~a[-1];}

Wypróbuj online!

Zaoszczędź jeden bajt dzięki Toby Speight!

Zaoszczędź 6 bajtów, używając * = i mądrzejszego warunku.

Matej Mulej
źródło
Możesz zapisać 1 bajt: *(a-1)a[-1]
Toby Speight
Witamy w PPCG! :)
Shaggy
4

Perl 6 , 29 24 18 bajtów

-6 bajtów dzięki Seanowi!

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

Wypróbuj online!

Funkcja wewnętrzna mogłaby ($+=1)*=* , ale wtedy zmienna anonimowa utrzymywałaby się w wywołaniach funkcji. Uzyskujemy to poprzez zawinięcie go w wyraźny blok kodu.

Wyjaśnienie:

*.map:               # Map the array to
      {($+=1)    }   # The anonymous variable incremented
             *=$_    # Multiplied by the element
Jo King
źródło
Mam ten sam podstawowe podejście w dół do 16 bajtów: *.map(($+=1)*=*). To rozwiązanie ma warunek, że zmienna stanu $utrzymuje się między wywołaniami funkcji, więc jeśli ostatni element przekazany do jednego wywołania i pierwszy element przekazany do następnego wywołania są niezerowe, wówczas liczenie rozpocznie się od niewłaściwego numeru.
Sean
@Sean, Tak, pamiętam, że miałem z tym problem, kiedy pierwotnie odpowiedziałem. Na szczęście nauczyłem się od tego czasu
Jo King
Można wbić jeszcze jeden bajt off: *.map:{...}.
Sean
3

Haskell , 19 bajtów

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

Wypróbuj online!

Objaśnienie: Kod jest równoważny scanl1(\b a->(b+a)*a), gdzie bjest bieżącym bitem i ajest akumulatorem. scanl1pobiera listę, tworzy instancję pierwszego elementu listy jako akumulatora, składa się na liście i gromadzi wartości pośrednie na nowej liście.

Edycja: BMO pokonało mnie o kilka sekund i 4 bajty .

Laikoni
źródło
3

Pyth , 6 bajtów

m=Z*hZ

Wypróbuj tutaj!

Jak to działa

m = Z * hZ - Pełny program. Q = obliczone dane wejściowe.
m - Dla każdej liczby całkowitej dw Q.
 = Z - Przypisz zmienną Z (wstępnie zainicjalizowaną do 0) do ...
   * hZ - (Z + 1) * d; (d jest niejawne na końcu).
Pan Xcoder
źródło
3

Chciał uzyskać odpowiedź na temat używania wyrażeń regularnych. Prawdopodobnie istnieje łatwiejsze rozwiązanie, które pozostawiam jako ćwiczenie dla czytelnika.

PowerShell Core , 86 bajtów

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

Wypróbuj online!

Jeff Freeman
źródło
3

QBasic, 60 bajtów

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

Pobiera dane wejściowe jako ciąg; daje wynik jako liczby oddzielone znakami nowej linii.

Wyjaśnienie

Czytamy ciąg s$i pętlę iod 1jego długości.

MID$(s$,i)pobiera podciąg od znaku i(indeksowany 1) do końca łańcucha. Jeśli zaczyna się od a 1, będzie to leksykograficznie >=ciąg "1"; jeśli zaczyna się na 0, nie będzie. Tak się bdzieje, 0jeśli znak w indeksie ito 0, lub -1jeśli znak jest 1.

Następnie aktualizujemy bieżącą wartość v. Jeśli tylko przeczytamy a 0, chcemy vsię stać 0; w przeciwnym razie chcemy zwiększyć vo jeden. Innymi słowy v = (-b) * (v+1); uproszczenie matematyki daje krótsze wyrażenie widoczne w kodzie. Na koniec drukujemy vi zapętlamy.

DLosc
źródło
3

Brain-Flak , 60 bajtów

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

Wypróbuj online!

Wyjaśnienie:

([]){  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
Jo King
źródło
3

C (gcc), 57 52 51 bajtów

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

Odpowiedź JavaScript Portu Arnaulda modyfikuje tablicę w miejscu. Wypróbuj online tutaj .

OOBalance
źródło
Czy nie byłoby dokładniej powiedzieć, że to K&R C?
Tim Seguine,
Być może, ale tak byłoby w przypadku wielu odpowiedzi. Nie jestem ekspertem, ale jest całkiem możliwe, że nawet nie jest ważny K&R C. Chodzi o to, że tak naprawdę nie dbamy o standardy językowe na tej stronie. Jeśli gcc pozwala mieszać K&R C z bardziej nowoczesnymi rzeczami, to jest to poprawne C do celów golfowych, ponieważ gcc go skompiluje. Zobacz także: codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
OOBalance
Dopiero teraz szukałem, że C11 nadal obsługuje starą składnię funkcji listy identyfikatorów, więc nieważne. Ale twój punkt ma rację niezależnie.
Tim Seguine,
1
Zaproponujf(a,l,c)int*a;{for(c=0;l--;)c=*a++*=c+1;}
3

Szekspir, 365 bajtów

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.

spróbuj tutaj

wersja mniej golfowa

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
Al R.
źródło
280 bajtów . Sprawdź wskazówki SPL, aby uzyskać wskazówki dotyczące gry w golfa.
Jo King
3

C ++, 47 bajtów

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

Lambda, która modyfikuje tablicę w miejscu, biorąc pod uwagę wskaźniki początkowe i końcowe.


Wypróbuj online! (wymaga Javascript)


Wersja ogólna o 55 bajtach (działa to na dowolny kontener z elementami typu arytmetycznego):

[](auto a,auto b){for(auto c=*a-*a;a!=b;)c=*a++*=1+c;};
Toby Speight
źródło