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

Застосовуються стандартні лазівки.


8
Якась конкретна причина жорсткого формату введення та виведення?
Непов’язана струна

2
@UnrelatedString Хм, я їх ослаблю.
noɥʇʎԀʎzɐɹƆ

8
ІО все ще досить суворий. Ви не можете просто сказати, що "введення та вихід - як список", і дозволити за замовчуванням веб-сайту подбати про це за вас?
Джо Кінг

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

Спробуйте в Інтернеті!


Хм, як довго це буде в Pyth?
noɥʇʎԀʎzɐɹƆ

Так, я уникнув, idтому що це 2 байти довгими ...
Ерік Аутгольфер

Дуже приємна ідеяid
U10-Вперед

@ noɥʇʎԀʎzɐɹƆ 8 байт для прямого перекладу: Спробуйте в Інтернеті!
isaacg



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]


1
@UnrelatedString всі ці новомодні атоми!
caird coinheringaahing




2

Perl 6 , 21 байт

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

Спробуйте в Інтернеті!

Блок анонімного коду, який приймає список і повертає список. Це працює, порівнюючи, чи не одна пара сусідніх елементів не однакова, ніж взяття сукупної суми списку.




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





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


hMsM._+0nVtза -2 байт.
Містер Xcoder

Або , якщо ви хочете зберегти свій підхід, rQ8такий же , як r8і .nможе бути sдля -2, а
г -

Ну добре, документи не згадували, які функції беруть неявноQ
ar4093

1

Scala , 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 потрібно попередньо робити заздалегідь через нагляд ... Хоча в Jelly є ще 5-байтний, я насправді зберігайте це, оскільки він використовує інший метод.

Для кожної пари сусідніх елементів вхідного списку L, перевірити, якщо LiLi+1,1i<|L|і збережіть ці результати у списку. Потім візьміть сукупну суму цього списку і збільште їх на 1, щоб відповідати системі індексації шматка. TL; DR. Щоразу, коли ми стикаємося з різними сусідніми елементами, ми збільшуємо індекс шматка на 1 .



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()

1

PHP , 52 байти

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

Спробуйте в Інтернеті!

Введення через командний рядок, вихід у STDOUT.

Thx to @ Night2 для приборканого '0' == 0виправлення порівняння!


@ Night2 хороший улов! Оновлено та виправлено. Дякую!
640



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

C (gcc) , 62 61 байт

Це одна з небагатьох записів, які я зробив, коли повна програма коротша, ніж функція!

По першому пропуску, мені не байдуже попереднє значення, тому я можу покластися на те, що argvє вказівником кудись і навряд чи буде між [0..9]!

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

Спробуйте в Інтернеті!



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.