Gleiche Zahlen im Sub-Array

16

Bei einer Reihe von Zahlen mit length >=3undlength % 3 == 0

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

Sie werden es in Sub-Arrays der Länge 3 aufteilen

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

Und ein Array mit zurückgeben

  • [0] => Die Anzahl der Fälle im Unterarray, in denen alle Zahlen gleich sind
  • [1] => Falls nicht alle Zahlen im Sub-Array gleich sind, die Anzahl der Fälle im Sub-Array, in denen nur 2 Zahlen gleich sind

Beispiel- und Testfälle:

  • Eingabe: [2, 4, 2, 5, 5, 5, 4, 2, 1, 3, 3, 1]Ausgabe[1, 2]

Das ist weil

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

also 2 equalund 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]

Das ist , also gewinnt die kürzeste Antwort in Bytes.


PD: Entschuldigung für mein Englisch.

Luis Felipe De Jesus Munoz
quelle
Die Zahlen in den Testfällen sind alle positiv. Ist das immer so?
Dennis
@ Tennis Nr. Kann positive und negative Zahlen sein.
Luis Felipe De Jesus Munoz

Antworten:

5

Oktave , 60 52 50 Bytes

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

Probieren Sie es online!

8 Bytes gespart dank Luis!

Erläuterung:

Formt die Eingabe in eine Matrix mit 3 Zeilen und der entsprechenden Anzahl von Spalten um. Anschließend werden die einzelnen Spalten sortiert und der Unterschied zwischen den Elementen in verschiedenen Zeilen berechnet. Dies ergibt eine Matrix mit zwei Zeilen, wobei identische Zahlen eine Null und verschiedene Zahlen eine positive Zahl haben. Dies wird negiert, so dass alle gleichen Elemente gleich 1und alle ungleich sind 0. Wir haben dann jede dieser Spalten summieren, uns eine der drei Alternativen geben: 0 = All elements are unequal, 1 = Two elements are equalund 2 = All elements are equal. Wir überprüfen dann, wie viele >1und wie viele genau sind ==1.

Stewie Griffin
quelle
4

JavaScript (ES6), 70 Byte

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]

Probieren Sie es online!

Wie?

Wir extrahieren rekursiv jedes Triplett [a, b, c] aus dem Eingabearray und aktualisieren zwei Zähler t (Drei-von-einer-Art) und p (Paar) unter Verwendung der folgenden Formel:

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

Es gibt 5 mögliche Fälle, die im Folgenden beschrieben werden, von "alle gleich" bis "alle verschieden".

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
quelle
Wenn die Ausgabe mehr als nur [0]und [1]Indizes haben kann "Hinweis:[0][1][2] Gibt ein 3-Elemente-Array mit und die entsprechenden Werte und einen Dummy-Wert (die Anzahl der 3-Listen ohne gemeinsame Elemente) zurück. Dies gilt gemäß die aktuellen Regeln. " codegolf.stackexchange.com/a/166082/31257 62 Bytesa=>a.map(_=>++r[--new Set(a.slice(i,i+=3)).size],r=[i=0,i])&&r
guest271314
3

Pyth, 13 14 12 11 Bytes

/Lml{kcQ3S2

Probieren Sie es hier aus

Erläuterung

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

quelle
Schlägt für den 3. Test fehl (benötigt einige Gleichgestellte UND einige Gleichgestellte Dreifache)
Jonathan Allan
3

05AB1E , 10 Bytes

3ôεÙg}12S¢

Probieren Sie es online!

Erläuterung

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
quelle
3

ok , 17 16 bytes

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

Probieren Sie es 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

Für k , ist die 17 - Byte - Version: +/(1 2=#=:)'0N 3#.

zgrep
quelle
0N 3-> 0N3(dank einer parsing seltsamkeit in 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))

Probieren Sie es online!

Vorherige Versionen :

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

Probieren Sie es 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)

Probieren Sie es online!

digEmAll
quelle
1
Möglicherweise ist die Portierung der Octave-Antwort effizienter, jedoch a=!1:2etwas kürzer.
Giuseppe
@Giuseppe: Dank und gespeichert andere 5 Bytes mit seq(0,a=v)statt 0:(length(v)-1);) Leider weiß ich nicht , Oktave , damit ich nicht so leicht , dass die Antwort lesen ...
digEmAll
@ Giuseppe: Ansatz geändert und viele Bytes gespeichert :)
digEmAll
Toller Ansatz! Ich hatte etwas kürzeres durch applying, uniqueaber es schlägt für den dritten Testfall fehl. Ihr byAnsatz ist sicherer
JayCe
@JayCe: zum Glück R 3.2.0 eingeführten Längen funktioniert , dass eine Menge von Bytes speichert ... aber sie sollten eine kurzgeschlossene Lambda - Funktionen Definition in R, um wettbewerbsfähiger zu werden in Code Golf vorstellen: D
digEmAll
3

Java (JDK 10) , 116 Byte

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

Probieren Sie es online!

Hinweis: gibt eine 3-Elemente - Array mit [0]und [1]tH geeignete Werte zurückkehrt, und [2]einen Dummy - Wert zurückkehrt (die Anzahl der 3-Listen ohne Elemente gemeinsam). Dies gilt in vollem Umfang nach den aktuellen Regeln.

Olivier Grégoire
quelle
2

PowerShell , 106 Byte

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

Probieren Sie es online!

Genau das, was es verspricht. Schleifen über Eingang $a. Jede Iteration löst sich $x,$y,$zals die nächsten drei Elemente ab. Prüft if, ob sie alle gleich sind und wenn ja, inkrementiert $i. Else, erhöht sich, $jwenn mindestens ein Paar gleich ist. Sobald die Schleife abgeschlossen ist, wird ausgegeben $iund $jals Ganzzahl ausgegeben .

Also ... viele ... Dollar ...

AdmBorkBork
quelle
2

Retina 0.8.2 , 68 Bytes

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

Probieren Sie es online! Link enthält Testfälle mit Header zum Konvertieren in das gewünschte Format mit einem Wert pro Zeile. Erläuterung:

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

Sammeln Sie drei Werte in jeder Zeile mit Trennzeichen und duplizieren Sie den ersten am Ende.

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

Zählen Sie die Anzahl der Duplikatpaare.

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

Zähle die Anzahl von 3s und 1s.

Neil
quelle
2

Gelee ,  9  8 Bytes

-1 danke an Dennis (benutze einen neuen Alias ​​für L€, )

Q3ÐƤẈċⱮ2

Probieren Sie es online!

Jonathan Allan
quelle
2

Common Lisp, 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))

Probieren Sie es online!

Verwendet die Tatsache, dass in Common Lisp (= x y z)true ergibt, wenn alle drei Elemente gleich sind, und (/= x y z)true ergibt, wenn kein Zahlenpaar gleich ist.

Renzo
quelle
2

Japt, 14 13 Bytes

2õ@ò3 x_â ʶX

Versuch es


Erläuterung

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
Zottelig
quelle
2

Python 2 , 77 72 65 Bytes

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

Probieren Sie es online!

7 Bytes gespeichert durch einen cleveren Trick von xnor

Chas Brown
quelle
Sie können die Liste der Triplets kürzer als erstellen zip(*[iter(a)]*3).
xnor
@ xnor: Sehr nett; Ich fragte mich, ob es einen kürzeren Weg gab ...
Chas Brown
2

Netzhaut , 23 Bytes

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

Probieren Sie es online!

Erläuterung

S2,3,` 

Teilen Sie die Eingabe ab der (0-basierten) 2. Stelle an jeder 3. Stelle auf, dh teilen Sie die Eingabe in Dreiergruppen auf.

%Cq`\S+

%Zählen Sie in jeder Zeile ( ) die Anzahl ( C) der eindeutigen ( q) Werte ( \S+).

*\C`1

Zählen Sie die Anzahl der 1s und drucken Sie sie mit einem nachgestellten Zeilenvorschub ( \), aber im Probelauf ( ), *damit wir das vorherige Ergebnis nicht verlieren.

2

Zählen Sie die Anzahl der 2s (und drucken Sie sie automatisch aus).

Martin Ender
quelle
2

J , 16-15 Bytes

-1 Byte danke an Cole!

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

Probieren Sie es online!

Ziemlich der gleiche Ansatz wie bei den meisten Lösungen.

Erläuterung:

        _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
quelle
#@~.->#@=
Cole
1

Stax , 14 Bytes

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

Führen Sie es aus und debuggen Sie es

wastl
quelle
[3,5,6,5,5,7,6,6,8,7,7,7,3,4,2,4,4,3]Ausgänge [2,3]stattdessen[1,3]
Luis Felipe De Jesus Munoz
[3,3,3,4,4,4,5,5,5,6,6,6,5,4,3]Ausgänge [1,0]stattdessen[4,0]
Luis Felipe De Jesus Munoz
[3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]Ausgänge [5,0]stattdessen[0,0]
Luis Felipe De Jesus Munoz
@ LuisfelipeDejesusMunoz behoben
wastl
Derzeit werden keine Ausgaben für angezeigt [1,1,1]. Wenn Sie 2(stattdessen verwenden 1T, wird das Pad immer exakt auf Größe 2
zugeschnitten
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]]

Probieren Sie es online!

Sieht etwas umständlich aus ...

user28667
quelle
1

Elixier , 92 Bytes

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

Teilen Sie die Liste zunächst in die Länge 3 auf chunk(a,3)

Zweitens konvertiert es die Länge jedes Elements, und zwar einheitlich. map chunk(a,3),&(length uniq&1).

Schließlich wird ein Array zurückgegeben, das aus der Häufigkeit, mit der die resultierende Liste eins ist, count(c,&(&1==1))und der Häufigkeit, mit der die resultierende Liste zwei ist, besteht count(c,&(&1==2)).

Probieren Sie es online!

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

Probieren Sie es 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}

Probieren Sie es 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}

Probieren Sie es online!

Sergiol
quelle
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}

Probieren Sie es online!

mit -uniqueOption des lsortBefehls. Ich habe 1und 2meine Variablen aus Bequemlichkeitsgründen benannt, es scheint ziemlich ungewöhnlich zu sein, sie zu codieren set 1 0:)

David
quelle
0

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

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

Probieren Sie es online!

Weniger golfen ...

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