Números iguales en subarreglos

16

Dado un conjunto de números con length >=3ylength % 3 == 0

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

Lo dividirá en sub-matrices de longitud 3

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

Y devolver una matriz con

  • [0] => La cantidad de casos en la submatriz donde todos los números son iguales
  • [1] => En caso de que todos los números en la sub-matriz no sean iguales, la cantidad de casos en la sub-matriz donde solo 2 números son iguales

Ejemplo y casos de prueba:

  • Entrada: [2, 4, 2, 5, 5, 5, 4, 2, 1, 3, 3, 1] salida[1, 2]

Esto es porque

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

entonces 2 equaly 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]

Esto es , por lo que gana la respuesta más corta en bytes.


PD: Disculpas por mi inglés.

Luis felipe De jesus Munoz
fuente
Los números en los casos de prueba son todos positivos. ¿Es ese siempre el caso?
Dennis
@ Dennis No. puede ser números positivos y negativos.
Luis felipe De jesus Munoz

Respuestas:

5

Octava , 60 52 50 bytes

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

Pruébalo en línea!

¡Guardado 8 bytes gracias a Luis!

Explicación:

Cambia la forma de la entrada en una matriz con 3 filas y la cantidad adecuada de columnas. Luego clasifica cada una de las columnas y calcula la diferencia entre los elementos en diferentes filas. Esto proporciona una matriz con dos filas, donde números idénticos tendrán un cero y números diferentes tendrán un número positivo. Esto se niega, de modo que todos los elementos iguales son 1, y todos desiguales son 0. A continuación, resumimos cada una de esas columnas, que nos da una de las tres alternativas: 0 = All elements are unequal, 1 = Two elements are equaly 2 = All elements are equal. Luego verificamos cuántos son >1y cuántos son exactamente ==1.

Stewie Griffin
fuente
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]

Pruébalo en línea!

¿Cómo?

Extraemos recursivamente cada triplete [a, b, c] de la matriz de entrada y actualizamos dos contadores t (tres de un tipo) y p (par), utilizando la siguiente fórmula:

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

Hay 5 casos posibles que se detallan a continuación, desde 'todos iguales' hasta '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
Arnauld
fuente
Si la salida puede tener más que solo [0]e [1]índices "Nota: devuelve una matriz de 3 elementos con [0]y [1]devuelve los valores apropiados y [2]devuelve un valor ficticio (el número de 3 listas sin ningún elemento en común). Esto es totalmente válido de acuerdo con las reglas actuales ". codegolf.stackexchange.com/a/166082/31257 62 bytesa=>a.map(_=>++r[--new Set(a.slice(i,i+=3)).size],r=[i=0,i])&&r
invitado271314
3

Pyth, 13 14 12 11 bytes

/Lml{kcQ3S2

Pruébalo aquí

Explicación

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

fuente
Falla en la tercera prueba (necesita algunos triples iguales y algunos triples iguales)
Jonathan Allan
3

05AB1E , 10 bytes

3ôεÙg}12S¢

Pruébalo en línea!

Explicación

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
Emigna
fuente
3

ok , 17 16 bytes

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

Pruébalo en línea!

            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 , la versión de 17 bytes es: +/(1 2=#=:)'0N 3#.

zgrep
fuente
0N 3-> 0N3(gracias a una rareza de análisis en 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))

Pruébalo en línea!

Versión anterior :

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

Pruébalo en línea!


R , 93 bytes

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

Pruébalo en línea!

digEmAll
fuente
1
Posiblemente portar la respuesta de Octave será más eficiente, pero a=!1:2es un poco más corto.
Giuseppe
@Giuseppe: gracias, y se guardan otros 5 bytes utilizando seq(0,a=v)en lugar de 0:(length(v)-1);) Lamentablemente no sé octava así que no puedo leer esa respuesta fácil ...
digEmAll
@Giuseppe: cambio de enfoque y ahorró muchos bytes :)
digEmAll
Gran enfoque! Tenía algo más corto por applying uniquepero falla para el tercer caso de prueba. Su byenfoque es más seguro
JayCe
@ JayCe: afortunadamente, R 3.2.0 introdujo la función de longitudes que ahorra muchos bytes ... pero deberían introducir una definición de funciones lambda en corto en R, para ser más competitivos en el código de golf: 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;}

Pruébalo en línea!

Nota: devuelve una matriz de 3 elementos con [0]y [1]devuelve los valores apropiados y [2]devuelve un valor ficticio (el número de 3 listas sin ningún elemento en común). Esto es totalmente válido de acuerdo con las reglas actuales.

Olivier Grégoire
fuente
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

Pruébalo en línea!

Exactamente lo que dice en la lata. Recorre la entrada $a. Cada iteración, se despega $x,$y,$zcomo los siguientes tres elementos. Las pruebas ifson todas iguales y, en caso afirmativo, incrementos $i. Else, se incrementa $jsi al menos un par es igual. Una vez que se completa el ciclo, la salida $iy$j como enteros.

Entonces ... muchos ... dólares ...

AdmBorkBork
fuente
2

Retina 0.8.2 , 68 bytes

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

Pruébalo en línea! El enlace incluye casos de prueba con encabezado para convertir al formato deseado de un valor por línea. Explicación:

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

Recolecte tres valores en cada línea con separadores y duplique el primero al final.

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

Cuenta el número de pares de duplicados.

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

Cuenta el número de 3sy 1s.

Neil
fuente
2

Lisp común, 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))

Pruébalo en línea!

Usó el hecho de que en Common Lisp (= x y z)da verdadero si los tres elementos son iguales, y (/= x y z)da verdadero si ningún par de números es igual.

Renzo
fuente
2

Japt, 14 13 bytes

2õ@ò3 x_â ʶX

Intentalo


Explicación

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
Lanudo
fuente
2

Python 2 , 77 72 65 bytes

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

Pruébalo en línea!

7 bytes guardados a través de un ingenioso truco de xnor

Chas Brown
fuente
Puede generar la lista de trillizos más cortos como zip(*[iter(a)]*3).
xnor
@xnor: Muy lindo; Me preguntaba si había un camino más corto ...
Chas Brown
2

Retina , 23 bytes

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

Pruébalo en línea!

Explicación

S2,3,` 

Divida la entrada en cada 3er espacio comenzando en el 2do (basado en 0), es decir, divida la entrada en grupos de tres.

%Cq`\S+

En cada línea ( %) cuente el número ( C) de qvalores únicos ( ) ( \S+).

*\C`1

Cuente el número de 1sy imprímalos con un salto de línea final ( \), pero hágalo en una ejecución en seco ( *) para que no perdamos el resultado anterior.

2

Cuente el número de 2s (e imprímalos automáticamente).

Martin Ender
fuente
2

J , 16 15 bytes

-1 byte gracias a cole!

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

Pruébalo en línea!

Prácticamente el mismo enfoque que la mayoría de las soluciones.

Explicación:

        _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
Galen Ivanov
fuente
#@~.->#@=
cole
1

Stax , 14 bytes

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

Ejecutar y depurarlo

wastl
fuente
[3,5,6,5,5,7,6,6,8,7,7,7,3,4,2,4,4,3]salidas en su [2,3]lugar[1,3]
Luis felipe De jesus Munoz
[3,3,3,4,4,4,5,5,5,6,6,6,5,4,3]salidas en su [1,0]lugar[4,0]
Luis felipe De jesus Munoz
[3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]salidas en su [5,0]lugar[0,0]
Luis felipe De jesus Munoz
@LuisfelipeDejesusMunoz arreglado
wastl
Actualmente no muestra ningún resultado para [1,1,1]. Si lo usa 2(en su lugar 1T, siempre recortará / rellenará exactamente al tamaño 2.
recursivo el
1

Haskell , 90 bytes

g[]=[]
g(a:b:c:x)=(sum$map fromEnum[a==b,a==c,b==c]):g x
f x=[sum[1|y<-g x,y==n]|n<-[3,1]]

Pruébalo en línea!

Parece un poco incómodo ...

usuario28667
fuente
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

Primero, divide la lista en longitud de tamaño 3 chunk(a,3)

En segundo lugar, convierte encuentra la longitud de cada elemento, sin especificar; map chunk(a,3),&(length uniq&1).

Finalmente, devuelve una matriz que consta del número de veces que la lista resultante es igual a uno count(c,&(&1==1))y el número de veces que la lista resultante es igual a doscount(c,&(&1==2)) .

Pruébalo en línea!

Okx
fuente
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}

Pruébalo en línea!


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}

Pruébalo en línea!


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}

Pruébalo en línea!

sergiol
fuente
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}

Pruébalo en línea!

usando la -uniqueopción de lsortcomando. Nombré 1y 2mis variables por conveniencia, difícil parece bastante inusual codificar set 1 0:)

david
fuente
0

C # (compilador interactivo de 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))

Pruébalo en línea!

Menos golf ...

// 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))
dana
fuente