Números iguais na sub-matriz


16

Dada uma matriz de números com length >=3elength % 3 == 0

[1, 2, 3, 4, ...]

Você o dividirá em sub-matrizes de comprimento 3

[[1, 2, 3], [4, 5, ...], [...

E retorne uma matriz com

  • [0] => A quantidade de casos no sub-array em que todos os números são iguais
  • [1] => No caso de todos os números na sub-matriz não serem iguais, a quantidade de casos na sub-matriz em que apenas 2 números são iguais

Exemplos e casos de teste:

  • Entrada: [2, 4, 2, 5, 5, 5, 4, 2, 1, 3, 3, 1]saída[1, 2]

Isto é porque

[[2, 4, 2], [5, 5, 5], [4, 2, 1], [3, 3, 1]]
  ^     ^    ^  ^  ^               ^  ^ 
   equal    all equal              equal   

então 2 equale 1all equal

  • [3,5,6,5,5,7,6,6,8,7,7,7,3,4,2,4,4,3] => [1, 3]
  • [3,3,3,4,4,4,5,5,5,6,6,6,5,4,3] => [4, 0]
  • [3,4,5,6,7,8,9,8,7,6,5,4,3,2,1] => [0, 0]

Isso é , então a resposta mais curta em bytes vence.


PD: Desculpas pelo meu inglês.


Os números nos casos de teste são todos positivos. Esse é sempre o caso?
Dennis

@Dennis No. podem ser números positivos e negativos.
Luis felipe De jesus Munoz

Respostas:


5

Oitava , 60 52 50 bytes

@(x)sum(sum(~diff(sort(reshape(x,3,[]))))'==[2 1])

Experimente online!

Economizou 8 bytes graças a Luis!

Explicação:

Remodela a entrada em uma matriz com 3 linhas e a quantidade apropriada de colunas. Em seguida, classifica cada uma das colunas e calcula a diferença entre os elementos em diferentes linhas. Isso fornece uma matriz com duas linhas, onde números idênticos terão zero e números diferentes terão um número positivo. Isso é negado, de modo que todos os elementos iguais são 1e todos os desiguais 0. Em seguida, resumir cada uma dessas colunas, dando-nos uma das três alternativas: 0 = All elements are unequal, 1 = Two elements are equale 2 = All elements are equal. Em seguida, verificamos quantas são >1e quantas são exatamente ==1.


4

JavaScript (ES6), 70 bytes

f=([a,b,c,...d],t=p=0)=>1/a?f(d,t+!(a-b&&a-c?b-c||++p:b-c&&++p)):[t,p]

Experimente online!

Quão?

Extraímos recursivamente cada trigêmeo [a, b, c] da matriz de entrada e atualizamos dois contadores t (três do tipo) ep (par), usando a seguinte fórmula:

t =
t + !(a - b && a - c ? b - c || ++p : b - c && ++p)

Existem 5 casos possíveis detalhados abaixo, de 'todos iguais' a 'todos distintos'.

a b c | a-b && a-c | b-c | b-c || ++p | b-c && ++p | t +=
------+------------+-----+------------+------------+------------
4 4 4 | false      | 0   | n/a        | 0          | !0    --> 1
4 4 5 | false      | ≠0  | n/a        | ++p        | !++p  --> 0
4 5 4 | false      | ≠0  | n/a        | ++p        | !++p  --> 0
5 4 4 | true       | 0   | ++p        | n/a        | !++p  --> 0
4 5 6 | true       | ≠0  | ≠0         | n/a        | !(≠0) --> 0

Se a saída puder ter mais do que apenas índices [0]e "Nota: retorna uma matriz de 3 elementos com e retornando os valores apropriados e retornando um valor simulado (o número de 3 listas sem nenhum elemento em comum). Isso é totalmente válido de acordo com as regras atuais ". codegolf.stackexchange.com/a/166082/31257 62 bytes[1][0][1][2] a=>a.map(_=>++r[--new Set(a.slice(i,i+=3)).size],r=[i=0,i])&&r
guest271314

3

Pitão, 13 14 12 11 bytes

/Lml{kcQ3S2

Experimente aqui

Explicação

/Lml{kcQ3S2
      cQ3        Split the input into groups of 3.
  ml{k           Deduplicate and get the length of each.
/L               Count the number...
         S2      ... of 1s and 2s.

Falha para o 3º teste (precisa de algumas todos-iguais e alguns triplos e dois iguais)
Jonathan Allan

3

05AB1E , 10 bytes

3ôεÙg}12S¢

Experimente online!

Explicação

3ô          # split input into groups of 3
  ε  }      # for each triple
   Ù        # remove duplicates
    g       # and get the length
      12S¢  # count the number of 1s and 2s in the result

3

OK , 17 16 bytes

+/(1 2=#=:)'0N3#

Experimente online!

            0N3# /reshape into groups of 3 (see ngn's comment)
  (       )'     /for each group:
        =:       /    make a map from number -> indices
       #         /    count number of keys/values
   1 2=          /    check if the count is equal to 1 or 2 
+/               /sum together the columns

Para k , a versão 17 byte é: +/(1 2=#=:)'0N 3#.


0N 3-> 0N3(graças a um oddity análise em OK)
NGN

3

R , 70 bytes

function(v,x=lengths(by(v,seq(0,a=v)%/%3,table)))c(sum(x<2),sum(x==2))

Experimente online!

Versões prévias :

R , 82 bytes

function(v,a=!1:2){for(i in lengths(by(v,seq(0,a=v)%/%3,table)))a[i]=a[i]+1;a[-3]}

Experimente online!


R , 93 bytes

function(v,a=table(lengths(by(v,0:(length(v)-1)%/%3,unique)))[c('1','2')])`[<-`(a,is.na(a),0)

Experimente online!


1
Possivelmente portar a resposta do Oitava será mais eficiente, mas a=!1:2é um pouco menor.
Giuseppe

@Giuseppe: Obrigado, e salvou outros 5 bytes utilizando seq(0,a=v), em vez de 0:(length(v)-1);) Infelizmente eu não sei oitava então eu não posso ler essa resposta fácil ...
digEmAll

@Giuseppe: abordagem mudou e salvou um monte de bytes :)
digEmAll

Ótima abordagem! Eu tinha algo mais curto ao applying, uniquemas ele falhou no terceiro caso de teste. Sua byabordagem é mais segura
JayCe 2/18

@JayCe: felizmente o R 3.2.0 introduziu a função comprimentos que economiza muitos bytes ... mas eles devem introduzir uma definição de funções lambda em curto no R, para ser mais competitivo no código de golfe: D
digEmAll

3

Java (JDK 10) , 116 bytes

l->{int r[]={0,0,0},i=0,a,b,c;for(;i<l.length;b=l[i++],c=l[i++],r[a==b?b==c?0:1:b==c|a==c?1:2]++)a=l[i++];return r;}

Experimente online!

Nota: retorna uma matriz de 3 elementos com [0]e [1]retornando os valores apropriados e [2]retornando um valor simulado (o número de 3 listas sem nenhum elemento em comum). Isso é totalmente válido de acordo com as regras atuais.


2

PowerShell , 106 bytes

param($a)for(;$a){$x,$y,$z,$a=$a;if($x-eq$y-and$y-eq$z){$i++}else{$j+=$x-eq$y-or$y-eq$z-or$z-eq$x}}+$i,+$j

Experimente online!

Exatamente o que diz na lata. Loops sobre entrada $a. Cada iteração se destaca $x,$y,$zcomo os próximos três elementos. Os testes ifsão todos iguais e, em caso afirmativo, aumentam $i. Elseincrementos$j se pelo menos um par for igual. Quando o loop estiver completo, faça a saída $ie $jcomo números inteiros.

Então ... muitos ... dólares ...


2

Retina 0.8.2 , 68 bytes

(.+)¶(.+)¶(.+)
;$1;$2;$3;$1;
%M`(;\d+)(?=\1;)
s`((1)|(3)|.)+
$#3 $#2

Experimente online! O link inclui casos de teste com cabeçalho para converter no formato desejado de um valor por linha. Explicação:

(.+)¶(.+)¶(.+)
;$1;$2;$3;$1;

Colete três valores em cada linha com separadores e duplique o primeiro no final.

%M`(;\d+)(?=\1;)

Conte o número de pares de duplicatas.

s`((1)|(3)|.)+
$#3 $#2

Contar o número de 3s e 1s.




2

Lisp comum, 113 bytes

(lambda(l &aux(a 0)(b 0))(loop for(x y z)on l by #'cdddr do(if(= x y z)(incf a)(if(/= x y z)()(incf b))))`(,a,b))

Experimente online!

Usou o fato de que, no Common Lisp, (= x y z)true se todos os três elementos forem iguais e (/= x y z)true se nenhum par de números for igual.


2

Japonês, 14 13 bytes

2õ@ò3 x_â ʶX

Tente


Explicação

2õ                :Range [1,2]
  @               :Pass each X through a function
   ò3             :  Split input to arrays of length 3
       _          :  Pass each through a function
        â         :    Remove duplicates
          Ê       :    Get length
           ¶X     :    Test for equality with X
      x           :  Reduce by addition

2

Python 2 , 77 72 65 bytes

lambda a:map([len(set(t))for t in zip(*[iter(a)]*3)].count,(1,2))

Experimente online!

7 bytes salvos através de um truque inteligente do xnor


Você pode gerar a lista de trigêmeos menor que zip(*[iter(a)]*3).
Xnor

@ xnor: Muito bom; Eu me perguntei se havia um caminho mais curto ...
Chas Brown

2

Retina , 23 bytes

S2,3,` 
%Cq`\S+
*\C`1
2

Experimente online!

Explicação

S2,3,` 

Divida a entrada em cada 3º espaço, começando no 2º (baseado em 0), ou seja, divida a entrada em grupos de três.

%Cq`\S+

Em cada linha ( %) conte o número ( C) de qvalores únicos ( ) ( \S+).

*\C`1

Conte o número de se 1imprima-os com um avanço de linha à direita ( \), mas faça-o em uma corrida a seco ( *) para não perder o resultado anterior.

2

Conte o número de 2s (e imprima-os automaticamente).


2

J , 16 15 bytes

-1 byte graças a cole!

1#.1 2=/_3#@=\]

Experimente online!

Praticamente a mesma abordagem que a maioria das soluções.

Explicação:

        _3    \]  - split the input into sublists of lenght 3
          #@~.    - for each triplet remove duplicates and take the length 
   1 2=/          - compare with 1 and 2
1#.               - add up

#@~.->#@=
cole


1

Stax , 14 bytes

ü┬─*HTÜ╫\Ä╢qm♥

Execute e depure


[3,5,6,5,5,7,6,6,8,7,7,7,3,4,2,4,4,3]saídas em [2,3]vez disso[1,3]
Luis felipe De jesus Munoz

[3,3,3,4,4,4,5,5,5,6,6,6,5,4,3]saídas em [1,0]vez disso[4,0]
Luis felipe De jesus Munoz

[3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]saídas em [5,0]vez disso[0,0]
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz fixado
wastl

No momento, não mostra nenhuma saída para [1,1,1]. Se você usar 2(, em vez de 1Tele sempre aparar / pad para exatamente o tamanho 2.
recursiva



1

Elixir , 92 bytes

fn a->import Enum;c=map chunk(a,3),&(length uniq&1);{count(c,&(&1==1)),count(c,&(&1==2))}end

Primeiro, divide a lista em tamanho 3 chunk(a,3)

Em segundo lugar, converte encontra o comprimento de cada elemento, não qualificado; map chunk(a,3),&(length uniq&1).

Finalmente, ele retorna uma matriz que consiste no número de vezes que a lista resultante é igual a uma count(c,&(&1==1))e o número de vezes que a lista resultante é igual a duas count(c,&(&1==2)).

Experimente online!



0

Tcl , 111 bytes

proc S {L a\ 0 e\ 0} {lmap {x y z} $L {expr {$x-$y|$y-$z?$x==$y|$y==$z|$x==$z?[incr e]:0:[incr a]}}
list $a $e}

Experimente online!


Tcl , 112 bytes

proc S {L a\ 0 e\ 0} {lmap {x y z} $L {expr {$x-$y||$y-$z?$x==$y|$y==$z|$x==$z?[incr e]:0:[incr a]}}
list $a $e}

Experimente online!


Tcl , 114 bytes

proc S {L a\ 0 e\ 0} {lmap {x y z} $L {expr {$x==$y&&$y==$z?[incr a]:$x==$y|$y==$z|$x==$z?[incr e]:0}}
list $a $e}

Experimente online!



0

Tcl , 98 bytes

proc A l {set 1 0;set 2 0
foreach a\ b\ c $l {incr [llength [lsort -u "$a $b $c"]]}
return $1\ $2}

Experimente online!

usando a -uniqueopção de lsortcomando. Eu nomeei 1e 2minhas variáveis ​​por conveniência, por mais difícil que pareça incomum codificar set 1 0:)


0

C # (compilador interativo do Visual C #) , 108 bytes

x=>new[]{1,2}.Select(n=>x.Select((v,i)=>(v,g:i/3)).GroupBy(y=>y.g,y=>y.v).Count(y=>y.Distinct().Count()==n))

Experimente online!

Menos golfe ...

// x is the input list of ints
x=>x
  // 1 distinct number means 3/3 are the same
  // 2 distinct number means 2/3 are the same
  new[]{1,2}
  // iterate over the outer array to get an index
  .Select(n=>x
    // iterate over the whole list with an index
    // and break into groups of size 3
    .Select((v,i)=>v,g:i/3))
    .GroupBy(y=>y.g,y=>y.v)
     // count the distinct values in each group
     // and get the result based on outer array value
    .Count(y=>y.Distinct().Count()==n))
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.