Наименьшие группы в массиве

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 Хм, как бы вы хотели это сделать тогда? Если вы можете сделать это с многозначными целыми числами, тогда это нормально.
Аднан
Интенты очень ограничены по размеру, а строки - нет. вот почему я спрашиваю
downrep_nation
@downrep_nation Хорошо, так как вы хотите предоставить вход для последнего контрольного примера? 11101010100100не кажется правильным для ввода: с.
Аднан

Ответы:

5

Pyth, 14 12 11

mM_MmhbrQ8

Тестирование

2 байта благодаря Якубе! И 1 байт благодаря isaacg!

К сожалению, декодирование по длине прогона не совсем делает то, что мы хотим, но оно будет работать с небольшим обходным путем, но это делает его немного длиннее, чем ручная реализация:

mr]d9.mhbrQ8

Благодарим Якуба за то, что он это выяснил.

FryAmTheEggman
источник
Кстати, RLD работает, но вы должны предоставить список пар:mr]d9.mhbrQ8
Jakube
Подробнее о декодировании длины серии: при декодировании длины серии требуется список пар, например, возвращаемое кодирование длины серии, а не отдельная пара.
Исаак
.bmYN==mM_M
Исаак
@isaacg Ах, да, это имеет смысл, я думаю, я не продумал это достаточно. Также этот трюк с картой аккуратен, спасибо!
FryAmTheEggman
8

Mathematica, 24 байта

MinimalBy[Length]@*Split

Это состав из двух функций, которые могут быть применены к списку. Splitберет все группы последовательных чисел и MinimalBy[Length]выбирает их с минимальной длиной.

LegionMammal978
источник
Черт, только что запустил Mathematica, чтобы проверить это ... +1 :)
Мартин Эндер
Теперь мне интересно, если бы я не сделал это слишком тривиальным: /.
Аднан
4

Haskell, 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: Data.Lists . Смотрите также ссылки на реэкспортированные модули на этой странице. 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*(которое соответствует одному или нескольким целым числам, разделенным пробелами, с завершающим пробелом), затем разбить их по пробелам на списки целых чисел и распечатать те группы, длина которых равна минимальной длине группы.

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

Mego
источник
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);}}

Я не знаю, справедливо ли использование строки, учитывая, что все эсоланги в гольфе получают свои данные одинаково, но он запросил массив.

вот как это выглядит

ungolfed:

    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 и лямбду.

downrep_nation
источник
Технически строка - это массив.
Дрянная Монахиня
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,?)?\]'
Другими словами, массив чисел python

Выходные данные: массив массивов (наименьших групп) в порядке их появления во входном массиве.

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

  • Ввод может быть пустым массивом; на выходе будет пустой массив.
  • При изменении minна maxэто будет возвращать массив самых больших групп.
  • Если вы просто сделаете это print r, он распечатает все группы по порядку.
HyperNeutrino
источник
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>

edc65
источник
Не h.map(length)работает?
Утренняя монахиня
@KennyLau нет, для его работы lengthдолжна быть функция со строкой в качестве аргумента, а не метод строки
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

Retina, 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 аргумент split, где число отличается от предыдущего;
  • вычислить длину каждого подмассива
  • сравните минимум с каждой из длин, производящих логическое значение ...
  • ... который используется для уменьшения Z
lstefano
источник
Ездить. Ездить. Ездить! ⍵⊂⍨1,2≠/⍵
Захари
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это хеш-карта, используемая в качестве функции, и при наличии ключа она возвращает соответствующее значение.

NikoNyrh
источник
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ᵐможет функционировать как своего рода дедупликация с помощью псевдометапредиката.

Несвязанная строка
источник