Grupos menores em uma matriz


14

Introdução

Vamos observar a seguinte matriz:

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

Um grupo consiste nos mesmos dígitos próximos um do outro. Na matriz acima, existem 5 grupos diferentes:

[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

O menor grupo deles é [2, 2], então produzimos [2, 2].

Vamos dar outro exemplo:

[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

Você pode ver que existem vários grupos com o mesmo comprimento. Os menores grupos são:

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

Então, nós apenas produzimos [3, 3], [4, 4], [4, 4], [5, 5]em qualquer formato razoável. Você pode produzi-los em qualquer ordem.

A tarefa

Dada uma matriz que consiste apenas em números inteiros positivos, produz o menor grupo (s) da matriz. Você pode assumir que a matriz conterá pelo menos 1 número inteiro.

Casos de teste

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]

Isso é , então a submissão com a menor quantidade de bytes ganha!



a entrada pode ser uma string?
downrep_nation

@downrep_nation Hmm, como você gostaria de fazer isso? Se você pode fazê-lo com números inteiros de vários dígitos, então tudo bem.
Adnan

ints são muito limitados por tamanho e strings não. é por isso que im perguntando
downrep_nation

@downrep_nation Ok, então como você deseja fornecer a entrada para o último caso de teste? 11101010100100não parece correto para a entrada: p.
Adnan

Respostas:


5

Pyth, 14 12 11

mM_MmhbrQ8

Suíte de teste

2 bytes graças a Jakube! E 1 byte graças a isaacg!

Infelizmente, a decodificação do comprimento da execução não faz exatamente o que queremos, mas funcionará com uma solução alternativa menor, mas isso a tornará um pouco mais longa que a implementação manual:

mr]d9.mhbrQ8

Agradecemos a Jakube por descobrir isso.


Btw, rld obras, mas você tem que fornecer uma lista de pares:mr]d9.mhbrQ8
Jakube

Mais sobre decodificação de comprimento de execução: a decodificação de comprimento de execução espera uma lista de pares, como o que a codificação de comprimento de execução retorna, não um par individual.
Isaacg

.bmYN==mM_M
isaacg 2/16/16

@isaacg Ah, isso faz sentido, acho que não estava pensando nisso o suficiente. Também esse truque de mapa é legal, obrigado!
FryAmTheEggman

8

Mathematica, 24 bytes

MinimalBy[Length]@*Split

Esta é uma composição de duas funções que podem ser aplicadas a uma lista. Splitpega todos os grupos de números consecutivos e MinimalBy[Length]seleciona aqueles com tamanho mínimo.


Droga, apenas despediu-se Mathematica para testar esta ... +1 :)
Martin Ender

Agora estou me perguntando se não fiz isso muito trivial: /.
Adnan

4

Haskell, 38 bytes

import Data.Lists
argmins length.group

Exemplo de uso: 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]].

Crie grupos de elementos iguais e encontre aqueles com comprimento mínimo.


Onde está a documentação Data.Lists?
Lynn

@Lynn: Data.Lists . Consulte também os links para os módulos reexportados nesta página. argminspor exemplo, é de Data.List.Extras.Agrmax .
N

3

Python 2, 120 bytes

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

Recebe a entrada como uma sequência de números inteiros separados por espaço com um espaço à direita e gera uma lista de listas de sequências. A estratégia é encontrar grupos usando a regex (\d+ )\1*(que corresponde a um ou mais números inteiros separados por espaço, com um espaço à direita), depois dividi-los em espaços em listas de números inteiros e imprimir os grupos cujo comprimento é igual ao tamanho mínimo do grupo.

Experimente online


2

C #, 204 bytes

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);}}

Não sei se o uso de uma string é justo, considerando que todos os esolangs de golfe recebem sua entrada da mesma maneira, mas ele solicitou a entrada da matriz.

é assim que parece

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);
        }


    }

Eu preciso de uma maneira de obter as menores correspondências para a matriz de correspondência, a maioria dos meus bytes são desperdiçados lá, ajuda apreciada. Estou tentando entrar em coisas LINQ e lambda.


Tecnicamente, uma string é uma matriz.
Leaky Nun

1

Python 2.x, 303 bytes

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)

Mais feio. Código. Sempre.

Entrada: uma matriz no formato r'\[(\d,)*(\d,?)?\]'
Em outras palavras, uma matriz python de números

Saída: uma matriz de matrizes (os menores grupos), na ordem em que aparecem na matriz de entrada

Recursos coincidentes adicionais (recursos que eu não pretendia criar):

  • A entrada pode ser uma matriz vazia; a saída será uma matriz vazia.
  • Ao mudar minpara max, ele retornará uma matriz dos maiores grupos.
  • Se você fizer print risso, ele imprimirá todos os grupos em ordem.

1

MATL, 15 bytes

Y'tX<tb=bw)wTX"

Experimente online

Input é um vetor, like [1 2 3 4], e output é uma matriz em que cada coluna é um dos menores grupos, por exemplo:

1 100
1 100

para o terceiro caso de teste.

Explicação:

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

Geléia, 22 17 16 bytes

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

Experimente online!

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

Teste

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>


Não h.map(length)funciona?
Leaky Nun

@KennyLau não, para que o trabalho lengthdeve ser uma função com a string como argumento, não um método de corda
edc65

1
@ edc65 Na verdade, uma propriedade de String. Não é um método.
Não que Charles seja

1

JavaScript (ES6), 113 bytes

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 bytes

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

Experimente online!

Explicação

A entrada é 1,1,10,10,10,100,100 .

A primeira linha corresponde a grupos com os mesmos termos:

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

A entrada se torna:

1,1
10,10,10
100,100

As duas linhas a seguir precedem o número de vírgulas na linha:

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

A entrada se torna:

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

Em seguida, eles são classificados por esta linha, que procura o primeiro número como índice:

O#`.+

A entrada se torna:

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

Em seguida, essas duas linhas encontram o local em que o comprimento é diferente e removem tudo:

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

A entrada se torna:

1:1,1
1:100,100

Em seguida, os números são removidos por essas duas linhas:

.+:
<empty-line>

Onde a entrada se torna:

1,1
100,100

@ Adnan Obrigado, corrigido.
Freira vazando

1

APL, 25 caracteres

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

Em inglês:

  • coloque em z o argumento dividido em que um número é diferente do anterior;
  • calcular o comprimento de cada sub-matriz
  • compare o mínimo com cada um dos comprimentos que produzem um valor booleano ...
  • ... usado para reduzir z

Comutar. Comutar. Comutar! ⍵⊂⍨1,2≠/⍵
Zacharý 31/07

1

J , 31 bytes

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

Entrada é uma matriz de valores. Saída é uma matriz de matrizes in a box.

Uso

   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│
└───┴───┴───┴───┘

Explicação

[:(#~[:(=<./)#@>)]<;.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 bytes

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

Usa +como identityfunção como (+ 5)é 5 :) O resto deve ser óbvio, Gé um mapa de hash usado como função e, dada uma chave, ele retorna o valor correspondente.


1

Braquilog , 6 bytes

ḅlᵒlᵍh

Experimente online!

Entrada através da variável de entrada e saída através da variável de saída.

ḅ         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.

Embora, diferentemente , agrupe elementos iguais não consecutivos, lᵒainda é necessário encontrar o grupo com os menores comprimentos e funciona porque a ordem dos grupos na saída é determinada pela posição do primeiro elemento de cada grupo, portanto isso ᵍhᵐpoderia funcionar como uma espécie de desduplicado pelo pseudo-metapredicado.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.