Найменші групи в масиві


14

Вступ

Давайте спостерігатимемо наступний масив:

[1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1]

Група складається з тих самих цифр поруч один з одним. У наведеному вище масиві є 5 різних груп:

[1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1]

 1, 1, 1 
          2, 2
                1, 1, 1, 1
                            2, 2, 2
                                     1, 1, 1

Найменша група з них є [2, 2], тому ми виводимо [2, 2].

Візьмемо ще один приклад:

[3, 3, 3, 4, 4, 4, 4, 5, 5, 4, 4, 3, 3, 4, 4]

 3, 3, 3
          4, 4, 4, 4
                      5, 5
                            4, 4
                                  3, 3
                                        4, 4

Ви можете бачити, що існує кілька груп однакової довжини. Найменшими групами є:

[3, 3], [4, 4], [4, 4] and [5, 5].

Тому ми просто виводимо [3, 3], [4, 4], [4, 4], [5, 5]в будь-якому розумному форматі. Ви можете виводити їх у будь-якому порядку.

Завдання

Даний масив, що складається лише з натуральних чисел, виводить найменшу групу (и) з масиву. Можна припустити, що масив буде містити щонайменше 1 ціле число.

Тестові справи

Input: [1, 1, 2, 2, 3, 3, 4]
Output: [4]

Input: [1]
Output: [1]

Input: [1, 1, 10, 10, 10, 100, 100]
Output: [1, 1], [100, 100]

Це , тому подання з найменшою кількістю байтів виграє!



Чи може вхід бути рядком?
downrep_nation

@downrep_nation Хм, як би ви цього робили? Якщо ви можете зробити це з багатозначними цілими числами, то це добре.
Аднан

ints дуже обмежені розміром, а рядки - ні. ось чому я прошу
downrep_nation

@downrep_nation Добре, тож як ви хочете надати вхід для останнього тестового випадку? 11101010100100не здається правильним для введення даних: p.
Аднан

Відповіді:


5

Pyth, 14 12 11

mM_MmhbrQ8

Тестовий сюїт

2 байти завдяки Jakube! І 1 байт завдяки isaacg!

На жаль, розшифровка довжини запуску не зовсім робить те, що ми хочемо, але це буде працювати з незначним рішенням, але це робить трохи довше, ніж ручне виконання:

mr]d9.mhbrQ8

Подяку Якубе за те, що це з'ясували.


Btw, rld працює, але вам потрібно надати список пар:mr]d9.mhbrQ8
Jakube

Детальніше про розшифровку довжини запуску: Розшифровка довжини запуску очікує список пар, наприклад, те, що повертається кодування довжини виконання, а не окрема пара.
isaacg

.bmYN==mM_M
isaacg

@isaacg Ах, правда, це має сенс, я думаю, я не задумувався над цим достатньо. Також цей трюковий карт акуратний, дякую!
FryAmTheEggman

8

Математика, 24 байти

MinimalBy[Length]@*Split

Це композиція з двох функцій, яку можна застосувати до списку. Splitприймає всі групи послідовних чисел і MinimalBy[Length]вибирає ті з мінімальною довжиною.


Чорт, щойно запустив Mathematica, щоб перевірити це ... +1 :)
Мартін Ендер

Тепер мені цікаво, чи я не зробив цього занадто банальним: /.
Аднан

4

Хаскелл, 38 байт

import Data.Lists
argmins length.group

Приклад використання: argmins length.group $ [3,3,3,4,4,4,4,5,5,4,4,3,3,4,4]-> [[4,4],[3,3],[4,4],[5,5]].

Створіть групи з рівних елементів і знайдіть ті, що мають мінімальну довжину.


Де документація Data.Lists?
Лінн

@Lynn: Дані.Списки . Дивіться також посилання на реекспортовані модулі на цій сторінці. argminsнаприклад, з Data.List.Extras.Agrmax .
німі

3

Python 2, 120 байт

import re
r=[x.group().split()for x in re.finditer(r'(\d+ )\1*',input())]
print[x for x in r if len(x)==min(map(len,r))]

Приймає введення як рядок цілих чисел, розділених пробілом, з пробілом і виводить список списків рядків. Стратегія полягає в тому, щоб знайти групи, використовуючи регулярний вираз (\d+ )\1*(який відповідає одному чи декільком цілим числу, розділеним пробілом, з пробілом), а потім розділити їх на пробіли на списки цілих чисел та роздрукувати ті групи, довжина яких дорівнює мінімальній довжині групи.

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


2

C #, 204 байти

void f(string o){var r=Regex.Matches(o,@"([0-9])\1{0,}").Cast<Match>().OrderBy(x=>x.Groups[0].Value.Length);foreach(var s in r){foreach(var z in r)if(s.Length>z.Length)return;Console.WriteLine(s.Value);}}

Я не знаю, чи правильно використовувати рядок, враховуючи, що всі гольф-езоланги отримують свій вклад так само, але він попросив ввести масив.

thats how it looks

неозорений:

    public static void f(string inp)
    {

        var r = Regex.Matches(inp, @"([0-9])\1{0,}").Cast<Match>().OrderBy(x => x.Groups[0].Value.Length);

        foreach (Match s in r)
        {
            foreach (Match z in r)
                if (s.Length > z.Length)
                    return;

        Console.WriteLine(s.Value);
        }


    }

Мені потрібен спосіб отримати найменші відповідники для масиву матчів, більшість моїх байтів витрачаються туди, допоможіть оцінити. Я намагаюся потрапити на речі LINQ та лямбда.


Технічно рядок - це масив.
Лина монашка

1

Python 2.x, 303 байти

x=input()
r=[q[2]for q in filter(lambda l:(len(l[2])>0)&((l[0]<1)or(x[l[0]-1]!=x[l[0]]))&((l[1]>len(x)-1)or(x[l[1]]!=x[l[1]-1]))&(len(filter(lambda k:k==l[2][0],l[2]))==len(l[2])),[(a,b,x[a:b])for a in range(0,len(x))for b in range(0,len(x)+1)])]
print filter(lambda k:len(k)==min([len(s)for s in r]),r)

Потворний. Код. Колись.

Введення: Масив у форматі r'\[(\d,)*(\d,?)?\]'
Іншими словами, масив пітонних чисел

Вихід: масив масивів (найменших груп) у тому порядку, в якому вони відображаються у вхідному масиві

Додаткові спільні функції (функції, які я не збирався робити):

  • Вхід може бути порожнім масивом; вихід буде порожнім масивом.
  • Змінившись minна max, він поверне масив найбільших груп.
  • Якщо ви просто зробите print rце, воно надрукує всі групи в порядку.

1

MATL, 15 байт

Y'tX<tb=bw)wTX"

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

Введення - це вектор, наприклад [1 2 3 4], а вихід - матриця, де кожен стовпець є однією з найменших груп, наприклад:

1 100
1 100

для третього тестового випадку.

Пояснення:

Y'    %// Run length encoding, gives 2 vectors of group-lengths and values
t     %// Duplicate group lengths
X<    %// Minimum group length
tb    %// Duplicate and get vector of group lengths to the top
=     %// Find which group lengths are equal to the minimum
bw)   %// And get the values of those groups
wTX"  %// Repeats the matrix of minimum-length-group values by the minimum group length

1

Желе, 22 17 16 байт

I0;œṗ¹L=¥ÐfL€Ṃ$$

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

I0;œṗ¹L=¥ÐfL€Ṃ$$     Main link. List: z = [a,b,c,...]

I                    Compute [b-a, c-b, d-c, ...]
 0;                  Concatenate 0 in front: [0, b-a, c-b, d-c, ...]
   œṗ                Split z where the corresponding item in the above array is not zero.
      L=¥Ðf          Filter sublists whose length equal:
           L€Ṃ$      the minimum length throughout the list.

     ¹         $     (grammar stuffs)

1

JavaScript (ES6), 106

a=>(a.map((v,i)=>v==a[i-1]?g.push(v):h.push(g=[v]),h=[]),h.filter(x=>!x[Math.min(...h.map(x=>x.length))]))

Тест

f=a=>(a.map((v,i)=>v==a[i-1]?g.push(v):h.push(g=[v]),h=[]),h.filter(x=>!x[Math.min(...h.map(x=>x.length))]))

console.log=x=>O.textContent+=x+'\n'

;[[1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1]
, [3, 3, 3, 4, 4, 4, 4, 5, 5, 4, 4, 3, 3, 4, 4]
, [1, 1, 2, 2, 3, 3, 4]
, [1]
, [1, 1, 10, 10, 10, 100, 100]]
.forEach(t=>console.log(t+' -> '+f(t).join` `))
<pre id=O></pre>


Хто h.map(length)не працює?
Лина монашка

@KennyLau ні, для цього lengthмає бути функція з рядком як аргументом, а не методом string
edc65

1
@ edc65 Насправді властивість String. Не метод.
Не те, що Чарльз

1

JavaScript (ES6), 113 байт

a=>a.map(n=>n==c[0]?c.push(n):b.push(c=[n]),c=b=[])&&b.sort((a,b)=>a[l]-b[l],l='length').filter(e=>e[l]==b[0][l])

1

Сітківка, 91 85 80 79 77 76 75 74 байт

M!`\b(\d+)(,\1\b)*
(,()|.)+
$#2:$&
O#`.+
s`^(.*\b(.+:).*)¶(?!\2).+
$1
.+:
<empty-line>

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

Пояснення

Вхід є 1,1,10,10,10,100,100.

Перший рядок відповідає групам з однаковими умовами:

M!`\b(\d+)(,\1\b)*

Вхід стає:

1,1
10,10,10
100,100

Наступні два рядки додають кількість коми до рядка:

(,()|.)+
$#2:$&

Вхід стає:

1:1,1
2:10,10,10
1:100,100

Потім вони сортуються за цим рядком, який шукає перше число як індекс:

O#`.+

Вхід стає:

1:1,1
1:100,100
2:10,10,10

Потім ці два рядки знаходять місце, де довжина різна, і видаляємо все далі:

s`^(.*\b(.+:).*)¶(?!\2).+
$1

Вхід стає:

1:1,1
1:100,100

Потім числа видаляються цими двома рядками:

.+:
<empty-line>

Де вхід стає:

1,1
100,100

@Adnan Спасибі, виправлено.
Лина монашка

1

APL, 25 символів

{z/⍨(⊢=⌊/)≢¨z←(1,2≠/⍵)⊂⍵}

Англійською:

  • помістити z z розділити аргумент, де число відрізняється від попереднього;
  • обчислити довжину кожного підмножина
  • порівняйте мінімум з кожною з довжин, що створюють булеву форму ...
  • ... що використовується для зменшення z

Комутувати. Комутувати. Комутувати! ⍵⊂⍨1,2≠/⍵
Zacharý

1

J , 31 байт

[:(#~[:(=<./)#@>)]<;.1~1,2~:/\]

Введення - це масив значень. Вихід - це масив коробкових масивів.

Використання

   f =: [:(#~[:(=<./)#@>)]<;.1~1,2~:/\]
   f 1 1 2 2 3 3 4
┌─┐
│4│
└─┘
   f 3 3 3 4 4 4 4 5 5 4 4 3 3 4 4
┌───┬───┬───┬───┐
│5 5│4 4│3 3│4 4│
└───┴───┴───┴───┘

Пояснення

[:(#~[:(=<./)#@>)]<;.1~1,2~:/\]  Input: s
                              ]  Identity function, get s
                         2       The constant 2
                             \   Operate on each overlapping sublist of size 2
                          ~:/      Check if each pair is unequal, 1 if true else 0
                       1,        Prepend a 1 to that list
                 ]               Identity function, get s
                  <;.1~          Using the list above, chop s at each true index
[:(             )                Operate on the sublists
             #@>                 Get the length of each sublist
     [:(    )                    Operate on the length of each sublist
         <./                     Get the minimum length
        =                        Mark each index as 1 if equal to the min length else 0
   #~                            Copy only the sublists with min length and return

1

Clojure, 65 байт

#(let[G(group-by count(partition-by + %))](G(apply min(keys G))))

Використання в +якості identityфункції , як (+ 5)це 5 :) Решта має бути очевидно, Gє хеш-карта використовується в якості опції і дали ключ він повертає відповідне значення.


1

Брахілог , 6 байт

ḅlᵒlᵍh

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

Вхід через вхідну змінну і вихід через вихідну змінну.

ḅ         The list of runs of consecutive equal elements of
          the input
 lᵒ       sorted by length
   lᵍ     and grouped by length
          has the output variable
     h    as its first element.

Хоча, в відміну , групи непослідовних рівних елементів, то lᵒпо - , як і раніше необхідно знайти групу з найкоротшою довжиною, і вона працює , тому що порядок груп у висновку визначаються положенням першого елемента кожної групи, так що ᵍhᵐможе функціонувати як дедублікат псевдометапредмет.


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