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.


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.


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

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.

É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

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


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!


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.


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


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.




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.


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

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


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


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

#@~.->#@=
cole


1

Stax , 14 octets

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

Exécuter et déboguer


[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

É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!



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!



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


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))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.