Учитывая шаблон (формат строки или массива) битов:
[0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]
Задача состоит в том, чтобы заменить любое количество последовательных 1-битовых последовательностей по возрастанию, начиная с 1.
вход
- Шаблон (может быть получен в виде строки или массива) Пример:
- Строка:
1001011010110101001
- Массив:
[1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]
- Строка:
Выход
- Последовательность по возрастанию (может быть возвращена в виде строки или массива). Пример:
- Строка:
1 0 0 1 0 1 2 0 1 0 1 2 0 1 0 1 0 0 1
- Массив:
[1, 0, 0, 1, 0, 1, 2, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 0, 1]
- Строка:
правила
- (применяется только для строк) Ввод не будет содержать пробелы между
1
и0
- Предположим ввод
length > 0
- (применяется только для строк) Вывод разделяется пробелом (используйте любой другой разделитель, если вам нужно, если это не число или буква из алфавита)
Пример:
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
Критерии победы: Codegolf
03 B3 20 AC 01 B6 02 DC
) или 9 байтов (utf-8:)CE B3 E2 82 AC C6 B6 CB 9C
или 10 байтов (например, UTF-16, включая 2-байтовые спецификации) в любой не игрушечной кодировке? (Да, можно создать игрушечную 8-битную кодировку, аналогичную кодировке iso-8859, с этими 4 символами, представленными в виде 1-байта, но это похоже на обман.)γ€ƶ˜
будет представлен как04 80 8F 98
. Кодовая страница в первую очередь существует для облегчения написания кода. Чтобы запустить этот 4-байтовый файл, вам нужно запустить интерпретатор с--osabie
флагом.Haskell , 15 байт
Попробуйте онлайн!
Объяснение / Ungolfed
scanl1
выполняет итерацию слева над списком, используя функцию, которая получает последний результат, а текущий элемент генерирует новый список с результатами, оставляя пустые списки и одиночные элементы "неизмененными".(*).succ
является эквивалентом\x y-> (x+1)*y
Использование этой функции вместе с
scanl1
работает только потому, что увеличивающиеся последовательности ( 1,2,3, .. ) начинаются с 1 и не имеют предшествующего элемента (в этом случае это первый элемент в списке, который не будет «изменен») или у них ведущий 0 .источник
Python 2 , 36 байт
Попробуйте онлайн!
источник
Шелуха ,
5 43 байтаПопробуйте онлайн!
объяснение
Редактировать историю
-1 байт, используя
scanl1
болееzipWith
-1 байт путем переноса Dennis «S решение
источник
APL (Dyalog Unicode) , 5 байтов
Попробуйте онлайн!
Как это работает
источник
⊥⍨
уловки.JavaScript (ES6), 22 байта
Принимает ввод в виде массива.
Попробуйте онлайн!
К
a=>a.map(n=>a=n*-~a)
сожалению, более короткое (20 байт) не сработает[1]
из-за приведения массивов синглтона к целому числу, которое они содержат.источник
J , 4 байта
Порт APL-решения Bubbler
Попробуйте онлайн!
J , 8 байт
Как?
Это просто расстояние до предыдущего
0
Попробуйте онлайн!
источник
Python 2 ,
3938 байт-1 байт благодаря Эрику Аутгольферу
Попробуйте онлайн!
источник
,
.,
ты больше не в коде, но ты навсегда останешься в моем сердцеЖеле , 4 байта
Попробуйте онлайн!
источник
K (ок) ,
118 байтРешение:
Попробуйте онлайн!
Объяснение:
Переберите список. Увеличить аккумулятор, умножить на текущий элемент (который сбрасывает аккумулятор, если элемент равен 0):
источник
Желе , 4 байта
Попробуйте онлайн!
Как это работает
источник
R ,
4631 байтПопробуйте онлайн!
sequence
, который «в основном существует в почтении к самой ранней истории R» , здесь очень удобен.источник
RAD, 8 байт
Попробуйте онлайн!
Как?
(⊢×1+⊣)
, если правый аргумент есть0
, вернуть0
, в противном случае увеличить левый аргумент⍂
, LTR Scan ((A f B) f C
вместоA f (B f C)
), примените это через массивисточник
Japt,
765 байтПопытайся
объяснение
источник
Java 8,
5548 байтИзменяет массив ввода вместо того, чтобы возвращать новый для сохранения байтов.
-7 байт благодаря @TimSeguine .
Попробуйте онлайн.
Объяснение:
источник
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 байт
Код (68 байт):
Макет (33 байта):
Попробуйте онлайн!
Объяснение:
источник
Gaia , 5 байт
Попробуйте онлайн!
объяснение
Тьфу, я думал, что шрифты SE кода были моноширинными ....
источник
C (gcc) ,
454438 байтПопробуйте онлайн!
Сохраните один байт благодаря Тоби Спейт!
Сохраните 6 байтов, используя * = и более умное условие while.
источник
*(a-1)
→a[-1]
Perl 6 ,
29 2418 байт-6 байт благодаря Шону!
Попробуйте онлайн!
Внутренняя функция может
($+=1)*=*
, но тогда анонимная переменная сохранялась бы при вызовах функций. Мы получаем это, оборачивая его в явный блок кода.Объяснение:
источник
*.map(($+=1)*=*)
. Это решение имеет условие, что переменная состояния$
сохраняется при вызовах функции, поэтому, если последний элемент, переданный одному вызову, и первый элемент, переданный следующему вызову, оба не равны нулю, то подсчет начнется с неправильного номера.*.map:{...}
.Желе , 5 байт
Попробуйте онлайн!
источник
Haskell , 19 байтов
Попробуйте онлайн!
Объяснение: Код эквивалентен
scanl1(\b a->(b+a)*a)
, гдеb
- текущий бит иa
аккумулятор.scanl1
берет список, создает первый элемент списка в качестве накопителя, сворачивает список и собирает промежуточные значения в новый список.Изменить: BMO избили меня на несколько секунд и 4 байта .
источник
Pyth , 6 байт
Попробуй это здесь!
Как это работает
источник
Хотел получить ответ с помощью регулярных выражений. Вероятно, есть более простое решение, которое я оставляю читателю в качестве упражнения.
PowerShell Core , 86 байт
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 16 байт
Попробуйте онлайн!
источник
QBasic, 60 байт
Принимает ввод в виде строки; дает вывод в виде чисел, разделенных символами новой строки.
объяснение
Мы читаем строку
s$
и циклi
с1
точностью до ее длины.MID$(s$,i)
получает подстроку от символаi
(1-индексированный) до конца строки. Если это начинается с1
, это будет лексикографически>=
строка"1"
; если это начинается с0
, это не будет. Такb
получается,0
если символ в индексеi
есть0
, или-1
если символ есть1
.Далее мы обновляем текущее значение
v
. Если мы просто читаем0
, мы хотимv
стать0
; в противном случае мы хотим увеличитьv
на единицу. Другими словами,v = (-b) * (v+1)
; упрощение математики дает более короткое выражение, видимое в коде. Наконец, мы печатаемv
и зацикливаем.источник
Brain-Flak , 60 байт
Попробуйте онлайн!
Объяснение:
источник
Сетчатка , 14 байт
Попробуйте онлайн!
источник
C (gcc),
575251 байтJavaScript-код Port of Arnauld изменяет массив на месте. Попробуйте это онлайн здесь .
источник
f(a,l,c)int*a;{for(c=0;l--;)c=*a++*=c+1;}
Шекспир, 365 байт
попробуйте здесь
менее гольф-версия
источник
C ++, 47 байт
Лямбда, которая изменяет массив на месте, учитывая указатели начала и конца.
Попробуйте онлайн! (требуется Javascript)
Общая версия в 55 байтов (это работает для любого контейнера с элементами арифметического типа):
источник