Chunk + перечислить список цифр

12

У меня есть список десятичных цифр:

4, 4, 4, 7, 7, 9, 9, 9, 9, 2, 2, 2, 4, 4

Список десятичных цифр известен как элементы. Из этих элементов мы можем сформировать «куски», сгруппировав одинаковые и смежные номера. Я хочу назначить каждому чанку уникальный номер, начиная с 1 и увеличивая на 1 в том порядке, в котором чанки появляются в исходном списке. Итак, вывод для данного примера будет выглядеть так:

1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5

Формат ввода

Список цифр. (0-9) Вы можете использовать встроенные языковые функции для чтения этого списка, как хотите. Кодировка: ASCII

Выходной формат

Серия десятичных чисел, разделенных разделителем. Ваша программа всегда должна использовать один и тот же разделитель. Разделитель должен быть длиннее 0 бит. Кодировка: ASCII

Применяются стандартные лазейки.

noɥʇʎԀʎzɐɹƆ
источник
8
Есть ли какая-то конкретная причина строгого формата ввода и вывода?
Несвязанная строка
2
@ UnrelatedString Хм, я ослаблю их.
noɥʇʎԀʎzɐɹƆ
8
IO все еще довольно строг. Разве вы не можете просто сказать «вход и выход в виде списка» и позволить по умолчанию сайт позаботится об этом за вас?
Джо Кинг
2
Можем ли мы предположить, что список не пуст?
Джо Кинг
1
Список по определению уже имеет разделители. Вот почему это список. Я также не понимаю, что вы имеете в виду You may use your language built-ins to read this list however you want.. Означает ли это, что мы должны включить конвертер строки в список в нашем представлении? И которые мы позволили вывести в виде списка?
Джо Кинг

Ответы:

7

Python 3.8 (предварительная версия) , 41 байт

lambda l,n=0:[n:=n+(l!=(l:=x))for x in l]

Попробуйте онлайн!

Хвала волшебному моржу :=выражений присваивания.


Python 2 , 42 байта

n=0
for x in input():n+=x!=id;id=x;print n

Попробуйте онлайн!

XNOR
источник
Хм, как долго это будет в Pyth?
noɥʇʎԀʎzɐɹƆ
Да, я избежал, idпотому что это 2 байта длиной ...
Эрик Outgolfer
Хорошая идеяid
U10-Forward
@ noɥʇʎԀʎzɐɹƆ 8 байтов для простого перевода: попробуйте онлайн!
Исаак
3

Желе , 6 5 байт

ŒɠµJx

Попробуйте онлайн!

Сохранено один байт благодаря UnrelatedString !

Входы и выходы в виде массива (с открывающими / закрывающими скобками)

Как это работает

ŒɠµJx - Main link, takes one argument:                       [7, 7, 5, 5, 5, 1]
Œɠ    - Get the lengths of consecutive elements:             [2, 3, 1]
  µ   - Call these lengths A
   J  - range(length(A))                                     [1, 2, 3]
    x - Repeat each element by the corresponding value in A: [1, 1, 2, 2, 2, 3]
Кэрд
источник
5 байтов
несвязанная строка
1
@UnrelatedString все эти новомодные атомы!
caird coinheringaahing
2

Perl 6 , 21 байт

{+<<[\+] $,|$_ Zne$_}

Попробуйте онлайн!

Блок анонимного кода, который принимает список и возвращает список. Это работает, сравнивая, не равны ли каждая пара смежных элементов, чем принимая совокупную сумму списка.

Джо Кинг
источник
2

05AB1E , 4 байта

γdƶ˜

Попробуйте онлайн!

γ       # group adjacent equal digits together
 d      # replace all digits with 1
  ƶ     # multiply each group by its 1-based index
   ˜    # flatten
Grimmy
источник
Я постоянно забываю, что у 05ab1e есть это ƶ... +1
Мистер Xcoder
1
Вот альтернатива 4-х байт:ηεγg
Кевин Круйссен
2

MATL , 8 байт

Y'wn:wY"

Попробуйте онлайн!

Объяснение:

    Y'      % run-length encoding
    w       % swap elements in stack
    n       % number of elements in array / size along each dimension
    :       % range; vector of equally spaced values
    w       % swap elements in stack
    Y"      % replicate elements of array
            % (implicit) convert to string and display
OrangeCherries
источник
2

Желе , 4 байта

ŒgƤẈ

Попробуйте онлайн!

Как?

ŒgƤẈ - Link: list of integers  e.g. [7,7,2,7,7]
  Ƥ  - for prefixes:     [7]   [7,7]   [7,7,2]      [7,7,2,7]        [7,7,2,7,7]
Œg   -   group runs      [[7]] [[7,7]] [[7,7],[2]]  [[7,7],[2],[7]]  [[7,7],[2],[7,7]]
   Ẉ - length of each    [1,   1,      2,           3,               3]
Джонатан Аллан
источник
1

Perl 5 , 27 байт

s/\d/$i+=$&!=$p;$p=$&;$i/ge

Попробуйте онлайн!

Опция командной строки -pзаставляет perl читать строку ввода из STDIN в «переменную по умолчанию» $_. Затем поиск заменяет все цифры $_счетчиком $i. И $iувеличивается для каждой цифры, которая отличается от предыдущей цифры, которая также находится на первой цифре, поэтому счетчик начинается с 1. Предыдущая цифра сохраняется в $p.

Кжетил С.
источник
1

Pyth , 13 11 байт

s.e*]hkhbr8

Попробуйте онлайн!

         r8  # Run-length encode (implicit argument is the input) (-> [[frequency, char], ...]
 .e          # Enumerated map (current element is b, index is k) over rQ8
   *]hk      # [ k+1 ] *
       hb    #           b[0]
s            # Reduce list on + ([a]+[b] = [a,b])

-2 байта благодаря мистеру Xcoder

ar4093
источник
hMsM._+0nVtдля -2 байтов.
Мистер Xcoder
Или, если вы хотите сохранить свой подход, rQ8он такой же, как r8и .nможет быть и sдля -2
Mr. Xcoder
Ах, хорошо, документы не упоминали, какие функции принимают неявныеQ
ar4093
1

Скала , 75 байт

s=>s.scanLeft(("",0))((x,y)=>(y,x._2+(if(x._1!=y)1 else 0))).tail.map(_._2)

Попробуйте онлайн!

Если вход и выход должны быть разделены запятой String (а не List), тогда 102 байта.

s=>s.split(", ").scanLeft(("",0))((x,y)=>(y,x._2+(if(x._1!=y)1 else 0))).tail.map(_._2).mkString(", ")
Доктор У Вит
источник
1

Желе , 5 байт

nƝÄŻ‘

Попробуйте онлайн!

Первоначально я стремился к 4-байтам (та же программа, но без Ż), но затем быстро понял, что 1 должен быть добавлен каждый раз из-за недосмотра ... Несмотря на то, что в желе есть еще 5-байт, я буду на самом деле сохранить это, потому что он использует другой метод.

LLiLi+1,1i<|L|

Мистер Xcoder
источник
1

JavaScript (ES6), 30 байт

Принимает ввод как массив целых чисел.

a=>a.map(p=n=>i+=p!=(p=n),i=0)

Попробуйте онлайн!

комментарии

a =>                // a[] = input array
  a.map(p =         // initialize p to a non-numeric value
  n =>              // for each value n in a[]:
    i +=            //   increment i if:
      p != (p = n), //     p is not equal to n; and update p to n
    i = 0           //   start with i = 0 (chunk counter)
  )                 // end of map()
Arnauld
источник
1

PHP , 52 байта

while(''<$d=$argv[++$x])echo$i+=$argv[$x-1]!=$d,' ';

Попробуйте онлайн!

Ввод через командную строку, вывод в STDOUT.

Спасибо @ Night2 за досадное исправление ошибок '0' == 0сравнения!

640 КБ
источник
@ Night2 хороший улов! Обновлено и исправлено. Спасибо!
640KB
0

Добавить ++ , 23 байта

D,f,@*,BGd€bL$bLRz€¦XBF

Попробуйте онлайн!

Как это работает

D,f,@*,     - Define a function, f, that takes one argument:  [7 7 5 5 5 1]
       BG   - Group neighbouring elements together:           [[[7 7] [5 5 5] [1]]]          
       d    - Duplicate:                                      [[[7 7] [5 5 5] [1]] [[7 7] [5 5 5] [1]]]
       €bL  - Get the length of each:                         [[[7 7] [5 5 5] [1]] [2 3 1]]
       $bLR - Length, then range of length:                   [[2 3 1] [1 2 3]]
       z    - Zip together:                                   [[2 1] [3 2] [1 3]]
       €¦X  - Reduce each by repetition:                      [[1 1] [2 2 2] [3]]
       BF   - Flatten:                                        [1 1 2 2 2 3]
            - Due to the * in the function definition,
                 return the whole stack:                      [1 1 2 2 2 3]
Кэрд
источник
0

Сетчатка 0.8.2 , 34 байта

\b\d+\b(?<=(\b(\3|(\d+))\D*)*)
$#3

Попробуйте онлайн! Объяснение:

\b\d+\b

Совпадение каждого числа по очереди.

(?<=(...)*)

Начните смотреть назад как можно больше матчей. (Следующие записи будут в порядке справа налево, так как это выглядит за спиной.)

\D*

Пропустить разделители.

(\3|(\d+))

Попробуйте найти тот же номер, что и в прошлый раз, но если это не удастся, просто сопоставьте любой номер, но помните, что мы должны были сопоставить новый номер.

\b

Убедитесь, что все числа совпадают.

$#3

Подсчитайте количество новых номеров.

Нил
источник
0

Stax , 10 байт

▓ª2ªmD?Ä╧╖

Запустите и отладьте его

Выход использует пробел в качестве разделителя. Входные данные соответствуют точным спецификациям, используя запятые в качестве разделителей, и теперь заключают в них фигурные скобки

рекурсивный
источник
0

C (gcc) , 62 61 байт

Это одна из немногих записей, которые я сделал, когда полная программа короче представления функции!

При первом проходе мне наплевать на предыдущее значение, поэтому я полагаюсь на тот факт, что argvуказатель куда-то находится и вряд ли будет между [0..9]!

s;main(i,j){for(;~scanf("%d,",&i);j=i)printf("%d ",s+=j!=i);}

Попробуйте онлайн!

ErikF
источник