Równe liczby w pod-macierzy

16

Podano tablicę liczb za pomocą length >=3ilength % 3 == 0

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

Podzielisz go na pod-tablice o długości 3

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

I zwróć tablicę za pomocą

  • [0] => Liczba obserwacji w pod-macierzy, w której wszystkie liczby są równe
  • [1] => W przypadku, gdy wszystkie liczby w pod-macierzy nie są równe, liczba przypadków w pod-macierzy, w której tylko 2 liczby są równe

Przykłady i przypadki testowe:

  • Wejście: [2, 4, 2, 5, 5, 5, 4, 2, 1, 3, 3, 1]wyjście[1, 2]

To dlatego, że

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

więc 2 equali 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]

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.


PD: Przepraszam za mój angielski.

Luis Felipe De Jesus Munoz
źródło
Wszystkie liczby w przypadkach testowych są dodatnie. Czy tak jest zawsze?
Dennis
@Dennis No. może być liczbą dodatnią i ujemną.
Luis felipe De jesus Munoz

Odpowiedzi:

5

Oktawa , 60 52 50 bajtów

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

Wypróbuj online!

Zaoszczędź 8 bajtów dzięki Luisowi!

Wyjaśnienie:

Przekształca dane wejściowe w macierz z 3 wierszami i odpowiednią ilością kolumn. Następnie sortuje każdą z kolumn i oblicza różnicę między elementami w różnych wierszach. Daje to macierz z dwoma rzędami, w których identyczne liczby będą miały zero, a różne liczby będą miały liczbę dodatnią. Jest to negowane, tak że wszystkie równe elementy są 1i wszystkie są nierówne 0. Następnie sumują każdej z tych kolumn, dając nam jedną z trzech możliwości: 0 = All elements are unequal, 1 = Two elements are equali 2 = All elements are equal. Następnie sprawdzamy, ile ich jest >1i ile dokładnie ==1.

Stewie Griffin
źródło
4

JavaScript (ES6), 70 bajtów

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]

Wypróbuj online!

W jaki sposób?

Rekurencyjnie wyodrębniamy każdą tryplet [a, b, c] z tablicy wejściowej i aktualizujemy dwa liczniki t (trójka) i p (para), stosując następujący wzór:

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

Istnieje 5 możliwych przypadków, które są wyszczególnione poniżej, od „wszystkich równych” do „wszystkich odrębnych”.

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
źródło
Jeśli dane wyjściowe mogą mieć więcej niż tylko [0]i [1]indeksuje "Uwaga: zwraca tablicę 3-elementową z [0]i [1]zwracając odpowiednie wartości oraz [2]zwracając wartość fikcyjną (liczbę 3 list bez wspólnych elementów). Jest to całkowicie poprawne zgodnie z obecne zasady ”. codegolf.stackexchange.com/a/166082/31257 62 bajtya=>a.map(_=>++r[--new Set(a.slice(i,i+=3)).size],r=[i=0,i])&&r
guest271314
3

Pyth, 13 14 12 11 bajtów

/Lml{kcQ3S2

Wypróbuj tutaj

Wyjaśnienie

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

źródło
Nie udaje się do trzeciego testu (wymaga trochę równych ORAZ trochę potrójnych dwóch)
Jonathan Allan
3

05AB1E , 10 bajtów

3ôεÙg}12S¢

Wypróbuj online!

Wyjaśnienie

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
źródło
3

ok , 17 16 bajtów

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

Wypróbuj 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

Dla k , wersja 17 bajtów wynosi: +/(1 2=#=:)'0N 3#.

zgrep
źródło
0N 3-> 0N3(dzięki parsowaniu osobliwości w OK)
ngn
3

R , 70 bajtów

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

Wypróbuj online!

Poprzednie wersje :

R , 82 bajty

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

Wypróbuj online!


R , 93 bajty

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

Wypróbuj online!

digEmAll
źródło
1
Być może przeniesienie odpowiedzi Octave będzie bardziej wydajne, ale a=!1:2jest nieco krótsze.
Giuseppe
@Giuseppe: dzięki, a seq(0,a=v)zamiast tego zaoszczędziłem 5 innych bajtów 0:(length(v)-1);) Niestety nie znam oktawy, więc nie mogę łatwo odczytać tej odpowiedzi ...
digEmAll
@Giuseppe: zmieniono podejście i zaoszczędzono wiele bajtów :)
digEmAll
Świetne podejście! Miałem coś krótszego przez applyING uniqueale nie dla trzeciego przypadku testowego. Twoje bypodejście jest bezpieczniejsze
JayCe
@JayCe: na szczęście R 3.2.0 wprowadził funkcję długości, która oszczędza wiele bajtów ... ale powinny wprowadzić definicję
zwartej
3

Java (JDK 10) , 116 bajtów

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

Wypróbuj online!

Uwaga: zwraca się układ 3-elementy z [0]i [1]powrocie th odpowiednie wartości i [2]zwracania wartości obojętne (numer 3 listach bez elementów wspólnych). Jest to całkowicie ważne zgodnie z obowiązującymi przepisami.

Olivier Grégoire
źródło
2

PowerShell , 106 bajtów

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

Wypróbuj online!

Dokładnie to, co jest napisane na puszce. Pętle nad wejściem $a. Każda iteracja złuszcza się $x,$y,$zjako kolejne trzy elementy. Testy ifsą równe, a jeśli tak, przyrosty $i. Else, zwiększa, $jjeśli co najmniej jedna para jest równa. Po zakończeniu pętli, wyjście $ii $jjako liczby całkowite.

Więc ... wiele ... dolarów ...

AdmBorkBork
źródło
2

Retina 0.8.2 , 68 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe z nagłówkiem do konwersji na pożądany format jednej wartości na linię. Wyjaśnienie:

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

Zbierz trzy wartości w każdym wierszu z separatorami i zduplikuj pierwszą na końcu.

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

Policz liczbę par duplikatów.

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

Policzyć 3s i 1s.

Neil
źródło
2

Common Lisp, 113 bajtów

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

Wypróbuj online!

Wykorzystano fakt, że w Common Lisp (= x y z)daje wartość true, jeśli wszystkie trzy elementy są równe, i (/= x y z)daje wartość true, jeśli żadna para liczb nie jest równa.

Renzo
źródło
2

Japt, 14 13 bajtów

2õ@ò3 x_â ʶX

Spróbuj


Wyjaśnienie

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
Kudłaty
źródło
2

Python 2 , 77 72 65 bajtów

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

Wypróbuj online!

7 bajtów zapisanych dzięki sprytnej sztuczce xnor

Chas Brown
źródło
Możesz wygenerować listę trojaczków krótszych jako zip(*[iter(a)]*3).
xnor
@xnor: Very nice; Zastanawiałem się, czy istnieje krótsza droga ...
Chas Brown
2

Siatkówka , 23 bajty

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

Wypróbuj online!

Wyjaśnienie

S2,3,` 

Podziel dane wejściowe co 3 spacje, zaczynając od (opartej na 0) drugiej, tzn. Podziel dane wejściowe na trzyosobowe grupy.

%Cq`\S+

W każdym wierszu ( %) policz liczbę ( C) unikalnych ( q) wartości ( \S+).

*\C`1

Policz liczbę 1s i wydrukuj je za pomocą końcowego linefeed ( \), ale zrób to w suchym biegu ( *), aby nie stracić poprzedniego wyniku.

2

Policz liczbę 2s (i wydrukuj je automatycznie).

Martin Ender
źródło
2

J , 16 15 bajtów

-1 bajt dzięki Cole!

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

Wypróbuj online!

Prawie takie samo podejście jak większość rozwiązań.

Wyjaśnienie:

        _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 Iwanow
źródło
#@~.->#@=
cole
1

Stax , 14 bajtów

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

Uruchom i debuguj

pustkowie
źródło
[3,5,6,5,5,7,6,6,8,7,7,7,3,4,2,4,4,3]Wyjścia [2,3]zamiast[1,3]
Luis Felipe de Jesus Munoz
[3,3,3,4,4,4,5,5,5,6,6,6,5,4,3]Wyjścia [1,0]zamiast[4,0]
Luis Felipe de Jesus Munoz
[3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]Wyjścia [5,0]zamiast[0,0]
Luis Felipe de Jesus Munoz
@LuisfelipeDejesusMunoz naprawiono
odpadł
Obecnie nie wyświetla żadnych wyników dla [1,1,1]. Jeśli użyjesz 2(zamiast 1Ttego zawsze przycina / pad do dokładnie rozmiaru 2.
rekurencyjny
1

Haskell , 90 bajtów

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

Wypróbuj online!

Wygląda trochę niezręcznie ...

użytkownik 28667
źródło
1

Eliksir , 92 bajty

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

Najpierw dzieli listę na długość 3 chunk(a,3)

Po drugie, konwertuje znalezione długości każdego elementu, zunifikowane; map chunk(a,3),&(length uniq&1).

Na koniec zwraca tablicę składającą się z liczby przypadków, gdy wynikowa lista jest równa jeden, count(c,&(&1==1))oraz liczby razy, gdy wynikowa lista jest równa dwa count(c,&(&1==2)).

Wypróbuj online!

Okx
źródło
1

Prolog (SWI) , 80 bajtów

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

Wypróbuj online!

Tylko ASCII
źródło
0

Tcl , 111 bajtów

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}

Wypróbuj online!


Tcl , 112 bajtów

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}

Wypróbuj online!


Tcl , 114 bajtów

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}

Wypróbuj online!

sergiol
źródło
0

Tcl , 98 bajtów

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

Wypróbuj online!

za pomocą -uniqueopcji lsortpolecenia. Dla wygody wymieniłem nazwy 1i 2zmienne, choć kodowanie wydaje się dość niezwykłe set 1 0:)

David
źródło
0

C # (interaktywny kompilator Visual C #) , 108 bajtów

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

Wypróbuj online!

Mniej golfa ...

// 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
źródło