Nombres égaux dans le sous-tableau

16

Étant donné un tableau de nombres avec length >=3etlength % 3 == 0

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

Vous le diviserez en sous-tableaux de longueur 3

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

Et retourner un tableau avec

  • [0] => Le nombre de cas dans le sous-tableau où tous les nombres sont égaux
  • [1] => Dans le cas où tous les nombres dans le sous-tableau ne sont pas égaux, le nombre de cas dans le sous-tableau où seulement 2 nombres sont égaux

Exemples et cas de test:

  • Entrée: [2, 4, 2, 5, 5, 5, 4, 2, 1, 3, 3, 1]sortie[1, 2]

Ceci est dû au fait

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

donc 2 equalet 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]

C'est le , donc la réponse la plus courte en octets gagne.


PD: Toutes mes excuses pour mon anglais.

Luis felipe De jesus Munoz
la source
Les nombres dans les cas de test sont tous positifs. Est-ce toujours le cas?
Dennis
@Dennis No. peut être des nombres positifs et négatifs.
Luis felipe De jesus Munoz

Réponses:

5

Octave , 60 52 50 octets

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

Essayez-le en ligne!

8 octets enregistrés grâce à Luis!

Explication:

Remodèle l'entrée en une matrice de 3 lignes et la quantité appropriée de colonnes. Il trie ensuite chacune des colonnes et calcule la différence entre les éléments sur différentes lignes. Cela donne une matrice à deux lignes, où les nombres identiques auront un zéro et les nombres différents auront un nombre positif. Ceci est nié, de sorte que tous les éléments égaux le soient 1et tous les éléments inégaux le soient 0. Nous résumons ensuite chacune de ces colonnes, nous donnant l' une des trois alternatives: 0 = All elements are unequal, 1 = Two elements are equalet 2 = All elements are equal. Nous vérifions ensuite leur nombre >1et leur nombre exact ==1.

Stewie Griffin
la source
4

JavaScript (ES6), 70 octets

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]

Essayez-le en ligne!

Comment?

Nous extrayons récursivement chaque triplet [a, b, c] du tableau d'entrée et mettons à jour deux compteurs t ( triplet ) et p (paire), en utilisant la formule suivante:

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

Il y a 5 cas possibles qui sont détaillés ci-dessous, de «tous égaux» à «tous distincts».

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
la source
Si la sortie peut avoir plus que seulement [0]et [1]index "Remarque: renvoie un tableau à 3 éléments avec [0]et [1]renvoyant les valeurs appropriées, et [2]renvoyant une valeur fictive (le nombre de 3 listes sans aucun élément en commun). Ceci est totalement valide selon les règles actuelles. " codegolf.stackexchange.com/a/166082/31257 62 octetsa=>a.map(_=>++r[--new Set(a.slice(i,i+=3)).size],r=[i=0,i])&&r
guest271314
3

Pyth, 13 14 12 11 octets

/Lml{kcQ3S2

Essayez-le ici

Explication

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

la source
Échoue pour le 3e test (a besoin de tous les égaux ET de trois triples égaux)
Jonathan Allan
3

05AB1E , 10 octets

3ôεÙg}12S¢

Essayez-le en ligne!

Explication

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
la source
3

oK , 17 16 octets

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

Essayez-le en ligne!

            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

Pour k , la version 17 octets est: +/(1 2=#=:)'0N 3#.

zgrep
la source
0N 3-> 0N3(grâce à une bizarrerie d'analyse en oK)
ngn
3

R , 70 octets

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

Essayez-le en ligne!

Versions précédentes :

R , 82 octets

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

Essayez-le en ligne!


R , 93 octets

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

Essayez-le en ligne!

digEmAll
la source
1
Peut-être que le portage de la réponse Octave sera plus efficace, mais a=!1:2est un peu plus court.
Giuseppe
@Giuseppe: merci, et j'ai sauvé 5 autres octets en utilisant seq(0,a=v)au lieu de 0:(length(v)-1);) Malheureusement, je ne connais pas l'octave donc je ne peux pas lire cette réponse facilement ...
digEmAll
@Giuseppe: changé d'approche et économisé beaucoup d'octets :)
digEmAll
Super approche! J'ai eu quelque chose de plus court en applying uniquemais il échoue pour le troisième cas de test. Votre byapproche est plus sûre
JayCe
@JayCe: heureusement, R 3.2.0 a introduit une fonction de longueurs qui économise beaucoup d'octets ... mais ils devraient introduire une définition de fonctions lambda raccourcie dans R, afin d'être plus compétitif dans le golf de code: D
digEmAll
3

Java (JDK 10) , 116 octets

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

Essayez-le en ligne!

Remarque: renvoie un tableau à 3 éléments avec [0]et [1]renvoyant les valeurs appropriées, et [2]renvoyant une valeur fictive (le nombre de 3 listes sans aucun élément en commun). Ceci est totalement valable selon les règles actuelles.

Olivier Grégoire
la source
2

PowerShell , 106 octets

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

Essayez-le en ligne!

Exactement ce qu'il dit sur l'étain. Boucles sur entrée $a. Chaque itération, décolle $x,$y,$zcomme les trois éléments suivants. Les tests ifsont tous égaux et si oui, incrémente $i. Else, incrémente $jsi au moins une paire est égale. Une fois la boucle terminée, sortez $iet $jsous forme d'entiers.

Donc ... beaucoup ... de dollars ...

AdmBorkBork
la source
2

Retina 0.8.2 , 68 octets

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

Essayez-le en ligne! Le lien inclut des cas de test avec en-tête pour convertir au format souhaité d'une valeur par ligne. Explication:

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

Collectez trois valeurs sur chaque ligne avec des séparateurs et dupliquez la première à la fin.

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

Comptez le nombre de paires de doublons.

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

Comptez le nombre de 3s et 1s.

Neil
la source
2

Lisp commun, 113 octets

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

Essayez-le en ligne!

Utilisé le fait qu'en Common Lisp (= x y z)donne vrai si tous les trois éléments sont égaux, et (/= x y z)donne vrai si aucune paire de nombres n'est égale.

Renzo
la source
2

Japt, 14 13 octets

2õ@ò3 x_â ʶX

Essayez-le


Explication

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
Hirsute
la source
2

Python 2 , 77 72 65 octets

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

Essayez-le en ligne!

7 octets enregistrés via une astuce astucieuse de xnor

Chas Brown
la source
Vous pouvez générer la liste des triplets plus courte que zip(*[iter(a)]*3).
xnor
@xnor: Très bien; Je me demandais s'il y avait un chemin plus court ...
Chas Brown
2

Rétine , 23 octets

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

Essayez-le en ligne!

Explication

S2,3,` 

Divisez l'entrée à chaque 3e espace à partir du 2e (basé sur 0), c'est-à-dire divisez l'entrée en groupes de trois.

%Cq`\S+

Sur chaque ligne ( %), comptez le nombre ( C) de qvaleurs uniques ( ) ( \S+).

*\C`1

Comptez le nombre de 1s et imprimez-les avec un retour à la ligne ( \), mais faites-le dans un dry-run ( *) afin de ne pas perdre le résultat précédent.

2

Comptez le nombre de 2s (et imprimez-les automatiquement).

Martin Ender
la source
2

J , 16 15 octets

-1 octet grâce à Cole!

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

Essayez-le en ligne!

À peu près la même approche que la majorité des solutions.

Explication:

        _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
la source
#@~.->#@=
cole
1

Stax , 14 octets

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

Exécuter et déboguer

wastl
la source
[3,5,6,5,5,7,6,6,8,7,7,7,3,4,2,4,4,3]sorties à la [2,3]place[1,3]
Luis felipe De jesus Munoz
[3,3,3,4,4,4,5,5,5,6,6,6,5,4,3]sorties à la [1,0]place[4,0]
Luis felipe De jesus Munoz
[3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]sorties à la [5,0]place[0,0]
Luis felipe De jesus Munoz
@LuisfelipeDejesusMunoz fixed
wastl
Il n'affiche actuellement aucune sortie pour [1,1,1]. Si vous utilisez à la 2(place de 1Tcelui-ci, le trim / pad sera toujours exactement à la taille 2.
récursif
1

Haskell , 90 octets

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

Essayez-le en ligne!

Ça a l'air un peu maladroit ...

user28667
la source
1

Élixir , 92 octets

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

D'abord, coupe la liste en taille 3 chunk(a,3)

Deuxièmement, il convertit trouve la longueur de chaque élément, uniqified; map chunk(a,3),&(length uniq&1).

Enfin, il renvoie un tableau composé du nombre de fois où la liste résultante est égale à un count(c,&(&1==1))et du nombre de fois où la liste résultante est égale à deux.count(c,&(&1==2)) .

Essayez-le en ligne!

Okx
la source
1

Prolog (SWI) , 80 octets

[A,B,C|T]-X/Y:-T-M/N,(A=B,B=C,X is M+1,Y=N;X=M,(A\=B,B\=C,Y=N;Y is N+1)).
_-0/0.

Essayez-le en ligne!

ASCII uniquement
la source
0

Tcl , 111 octets

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}

Essayez-le en ligne!


Tcl , 112 octets

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}

Essayez-le en ligne!


Tcl , 114 octets

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}

Essayez-le en ligne!

sergiol
la source
0

Tcl , 98 octets

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

Essayez-le en ligne!

en utilisant l' -uniqueoption de lsortcommande. J'ai nommé 1et 2mes variables pour plus de commodité, difficile il semble assez inhabituel de coder set 1 0:)

David
la source
0

C # (Visual C # Interactive Compiler) , 108 octets

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

Essayez-le en ligne!

Moins 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
la source