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]
- Strunowy:
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]
- Strunowy:
Zasady
- (dotyczy tylko łańcuchów) Dane wejściowe nie będą zawierać spacji między
1
i0
- 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
03 B3 20 AC 01 B6 02 DC
) lub 9 bajtów (utf-8:)CE B3 E2 82 AC C6 B6 CB 9C
lub 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.)γ€ƶ˜
byłby reprezentowany jako04 80 8F 98
. Strona kodowa istnieje przede wszystkim w celu ułatwienia pisania kodu. Aby uruchomić ten 4-bajtowy plik, musisz uruchomić interpreter z--osabie
flagą.Haskell , 15 bajtów
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
scanl1
dział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
Python 2 , 36 bajtów
Wypróbuj online!
źródło
Łuska ,
5 43 bajtyWypróbuj online!
Wyjaśnienie
Edytuj historię
-1 bajt przy użyciu
scanl1
overzipWith
-1 bajt przez przeniesienie Dennis „s rozwiązanie
źródło
APL (Dyalog Unicode) , 5 bajtów
Wypróbuj online!
Jak to działa
źródło
⊥⍨
lewy.JavaScript (ES6), 22 bajty
Pobiera dane wejściowe jako tablicę.
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ą.źródło
J , 4 bajty
Port rozwiązania APL Bubblera
Wypróbuj online!
J , 8 bajtów
W jaki sposób?
To po prostu odległość do poprzedniej
0
Wypróbuj online!
źródło
Python 2 ,
3938 bajtów-1 bajt dzięki Erik the Outgolfer
Wypróbuj online!
źródło
,
.,
, nie ma cię już w kodzie, ale na zawsze pozostaniesz w moim sercuGalaretka , 4 bajty
Wypróbuj online!
źródło
K (oK) ,
118 bajtówRozwiązanie:
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):
źródło
Galaretka , 4 bajty
Wypróbuj online!
Jak to działa
źródło
R ,
4631 bajtówWypróbuj online!
sequence
, która „istnieje przede wszystkim w hołdzie bardzo wczesnej historii R” , jest tu bardzo przydatna.źródło
RAD, 8 bajtów
Wypróbuj online!
W jaki sposób?
(⊢×1+⊣)
, jeśli prawym argumentem jest0
, zwróć0
, w przeciwnym razie zwiększ lewy argument⍂
, Skanuj LTR ((A f B) f C
zamiastA f (B f C)
), zastosuj to w całej tablicyźródło
Japt,
765 bajtówSpróbuj
Wyjaśnienie
źródło
Java 8,
5548 bajtówZmienia tablicę wejściową zamiast zwracać nową, aby zapisać bajty.
-7 bajtów dzięki @TimSeguine .
Wypróbuj online.
Wyjaśnienie:
źródło
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 bajtów
Kod (68 bajtów):
Układ (33 bajty):
Wypróbuj online!
Wyjaśnienie:
źródło
Gaia , 5 bajtów
Wypróbuj online!
Wyjaśnienie
Ugh, myślałem, że czcionki SE są monospace ....
źródło
C (gcc) ,
454438 bajtówWypróbuj online!
Zaoszczędź jeden bajt dzięki Toby Speight!
Zaoszczędź 6 bajtów, używając * = i mądrzejszego warunku.
źródło
*(a-1)
→a[-1]
Perl 6 ,
29 2418 bajtów-6 bajtów dzięki Seanowi!
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:
źródło
*.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.*.map:{...}
.Galaretka , 5 bajtów
Wypróbuj online!
źródło
Haskell , 19 bajtów
Wypróbuj online!
Objaśnienie: Kod jest równoważny
scanl1(\b a->(b+a)*a)
, gdzieb
jest bieżącym bitem ia
jest akumulatorem.scanl1
pobiera 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 .
źródło
Pyth , 6 bajtów
Wypróbuj tutaj!
Jak to działa
źródło
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
Wypróbuj online!
źródło
Wolfram Language (Mathematica) , 16 bajtów
Wypróbuj online!
źródło
QBasic, 60 bajtów
Pobiera dane wejściowe jako ciąg; daje wynik jako liczby oddzielone znakami nowej linii.
Wyjaśnienie
Czytamy ciąg
s$
i pętlęi
od1
jego długości.MID$(s$,i)
pobiera podciąg od znakui
(indeksowany 1) do końca łańcucha. Jeśli zaczyna się od a1
, będzie to leksykograficznie>=
ciąg"1"
; jeśli zaczyna się na0
, nie będzie. Tak sięb
dzieje,0
jeśli znak w indeksiei
to0
, lub-1
jeśli znak jest1
.Następnie aktualizujemy bieżącą wartość
v
. Jeśli tylko przeczytamy a0
, chcemyv
się stać0
; w przeciwnym razie chcemy zwiększyćv
o jeden. Innymi słowyv = (-b) * (v+1)
; uproszczenie matematyki daje krótsze wyrażenie widoczne w kodzie. Na koniec drukujemyv
i zapętlamy.źródło
Brain-Flak , 60 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Siatkówka , 14 bajtów
Wypróbuj online!
źródło
C (gcc),
575251 bajtówOdpowiedź JavaScript Portu Arnaulda modyfikuje tablicę w miejscu. Wypróbuj online tutaj .
źródło
f(a,l,c)int*a;{for(c=0;l--;)c=*a++*=c+1;}
Szekspir, 365 bajtów
spróbuj tutaj
wersja mniej golfowa
źródło
C ++, 47 bajtów
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):
źródło