Angka yang sama dalam sub-array

16

Diberikan array angka dengan length >=3danlength % 3 == 0

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

Anda akan membaginya dalam sub-array dengan panjang 3

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

Dan mengembalikan array dengan

  • [0] => Jumlah case dalam sub-array di mana semua angka sama
  • [1] => Jika semua angka dalam sub-array tidak sama, jumlah kasus dalam sub-array di mana hanya 2 angka yang sama

Contoh dan uji kasus:

  • Input: [2, 4, 2, 5, 5, 5, 4, 2, 1, 3, 3, 1]output[1, 2]

Hal ini karena

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

jadi 2 equaldan 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]

Ini adalah , jadi jawaban tersingkat dalam byte menang.


PD: Permintaan maaf untuk bahasa Inggris saya.

Luis felipe De jesus Munoz
sumber
Angka-angka dalam kasus uji semuanya positif. Apakah itu selalu terjadi?
Dennis
@Dennis No. dapat berupa angka positif dan negatif.
Luis felipe De jesus Munoz

Jawaban:

5

Oktaf , 60 52 50 byte

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

Cobalah online!

Disimpan 8 byte berkat Luis!

Penjelasan:

Membentuk kembali input ke dalam matriks dengan 3 baris, dan jumlah kolom yang sesuai. Kemudian mengurutkan masing-masing kolom, dan menghitung perbedaan antara elemen pada baris yang berbeda. Ini memberikan matriks dengan dua baris, di mana angka identik akan memiliki nol, dan angka yang berbeda akan memiliki angka positif. Ini dinegasikan, sehingga semua elemen yang sama 1, dan semua yang tidak sama 0. Kami kemudian jumlah masing-masing kolom, memberikan kita salah satu dari tiga alternatif: 0 = All elements are unequal, 1 = Two elements are equaldan 2 = All elements are equal. Kami kemudian memeriksa berapa banyak >1, dan berapa banyak tepatnya ==1.

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

Cobalah online!

Bagaimana?

Kami mengekstrak setiap triplet [a, b, c] secara rekursif dari array input dan memperbarui dua counter t (tiga-of-a-kind) dan p (pair), menggunakan rumus berikut:

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

Ada 5 kemungkinan kasus yang dirinci di bawah ini, dari 'semua sama' ke 'semua berbeda'.

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
sumber
Jika output dapat memiliki lebih dari satu-satunya [0] dan [1]mengindeks "Catatan: mengembalikan array 3-elemen dengan [0]dan [1]mengembalikan nilai yang sesuai, dan [2]mengembalikan nilai dummy (jumlah 3-daftar tanpa elemen yang sama). Ini benar-benar valid sesuai dengan aturan saat ini. " 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 byte

/Lml{kcQ3S2

Coba di sini

Penjelasan

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

sumber
Gagal untuk tes ke-3 (membutuhkan beberapa all-sama dan beberapa tiga kali lipat sama)
Jonathan Allan
3

05AB1E , 10 byte

3ôεÙg}12S¢

Cobalah online!

Penjelasan

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

ya , 17 16 byte

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

Cobalah 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

Untuk k , versi 17 byte adalah: +/(1 2=#=:)'0N 3#.

zgrep
sumber
0N 3-> 0N3(terima kasih kepada keanehan parsing di oK)
ngn
3

R , 70 byte

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

Cobalah online!

Versi sebelumnya :

R , 82 byte

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

Cobalah online!


R , 93 byte

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

Cobalah online!

menggali semua
sumber
1
Kemungkinan porting jawaban Octave akan lebih efisien, tetapi a=!1:2sedikit lebih pendek.
Giuseppe
@ Giuseppe: terima kasih, dan menyimpan 5 byte lainnya menggunakan seq(0,a=v)bukan 0:(length(v)-1);) Sayangnya saya tidak tahu oktaf jadi saya tidak bisa membaca jawaban itu dengan mudah ...
digEmAll
@ Giuseppe: mengubah pendekatan dan menyelamatkan banyak byte :)
digEmAll
Pendekatan hebat! Aku punya sesuatu yang lebih pendek dengan applying uniquetetapi gagal untuk kasus tes ketiga. byPendekatan Anda lebih aman
JayCe
@JayCe: untungnya R 3.2.0 memperkenalkan fungsi panjang yang menghemat banyak byte ... tetapi mereka harus memperkenalkan definisi fungsi lambda yang
pendek
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;}

Cobalah online!

Catatan: mengembalikan array 3-elemen dengan [0]dan [1]mengembalikan nilai yang sesuai, dan [2]mengembalikan nilai dummy (jumlah 3-daftar tanpa elemen yang sama). Ini benar-benar valid sesuai dengan aturan saat ini.

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

Cobalah online!

Persis seperti yang tertulis di kaleng. Loop atas input $a. Setiap iterasi, dikupas $x,$y,$zsebagai tiga elemen berikutnya. Tes ifmereka semua sama dan jika begitu, kenaikan $i. Else, bertambah $jjika setidaknya satu pasangan sama. Setelah loop selesai, output $idan$j sebagai bilangan bulat.

Jadi ... banyak ... dolar ...

AdmBorkBork
sumber
2

Retina 0.8.2 , 68 byte

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

Cobalah online! Tautan mencakup kotak uji dengan tajuk untuk dikonversi ke format yang diinginkan dari satu nilai per baris. Penjelasan:

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

Kumpulkan tiga nilai pada setiap baris dengan pemisah dan duplikat yang pertama di akhir.

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

Hitung jumlah pasangan duplikat.

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

Hitung jumlah 3s dan 1s.

Neil
sumber
2

Jelly ,  9  8 byte

-1 terima kasih kepada Dennis (gunakan alias baru untuk L€, )

Q3ÐƤẈċⱮ2

Cobalah online!

Jonathan Allan
sumber
2

Common Lisp, 113 byte

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

Cobalah online!

Menggunakan fakta bahwa pada Common Lisp (= x y z)memberikan true jika ketiga elemen sama, dan (/= x y z)memberikan true jika tidak ada pasangan angka yang sama.

Renzo
sumber
2

Japt, 14 13 byte

2õ@ò3 x_â ʶX

Cobalah


Penjelasan

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
Shaggy
sumber
2

Python 2 , 77 72 65 byte

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

Cobalah online!

7 byte disimpan melalui trik pintar dari xnor

Chas Brown
sumber
Anda dapat membuat daftar kembar tiga lebih pendek sebagai zip(*[iter(a)]*3).
xnor
@ xnor: Sangat bagus; Saya bertanya-tanya apakah ada jalan yang lebih pendek ...
Chas Brown
2

Retina , 23 byte

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

Cobalah online!

Penjelasan

S2,3,` 

Membagi input di setiap ruang ke-3 mulai dari (berbasis-0) ke-2, yaitu membagi input menjadi kelompok-kelompok tiga.

%Cq`\S+

Pada setiap baris ( %) hitung jumlah C( q) nilai unik ( ) ( \S+).

*\C`1

Hitung jumlah 1s dan cetaklah dengan trafeed linefeed ( \), tetapi lakukan dalam dry-run ( *) agar kita tidak kehilangan hasil sebelumnya.

2

Hitung jumlah 2s (dan cetak secara otomatis).

Martin Ender
sumber
2

J , 16 15 byte

-1 byte berkat cole!

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

Cobalah online!

Cukup banyak pendekatan yang sama dengan sebagian besar solusi.

Penjelasan:

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

Stax , 14 byte

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

Jalankan dan debug itu

wastl
sumber
[3,5,6,5,5,7,6,6,8,7,7,7,3,4,2,4,4,3]keluaran [2,3]sebagai gantinya[1,3]
Luis felipe De jesus Munoz
[3,3,3,4,4,4,5,5,5,6,6,6,5,4,3]keluaran [1,0]sebagai gantinya[4,0]
Luis felipe De jesus Munoz
[3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]keluaran [5,0]sebagai gantinya[0,0]
Luis felipe De jesus Munoz
@LuisfelipeDejesusMunoz diperbaiki
wastl
Saat ini tidak menampilkan output apa pun untuk [1,1,1]. Jika Anda menggunakan 2(bukan 1Titu akan selalu memangkas / pad dengan ukuran tepat 2.
rekursif
1

Haskell , 90 byte

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

Cobalah online!

Terlihat agak aneh ...

pengguna28667
sumber
1

Eliksir , 92 byte

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

Pertama, potong daftar menjadi ukuran panjang 3 chunk(a,3)

Kedua, itu mengkonversi menemukan panjang setiap elemen, uniqified; map chunk(a,3),&(length uniq&1).

Akhirnya, ia mengembalikan array yang terdiri dari berapa kali daftar yang dihasilkan sama dengan satu count(c,&(&1==1))dan berapa kali daftar yang dihasilkan sama dengan duacount(c,&(&1==2)) .

Cobalah online!

Okx
sumber
1

Prolog (SWI) , 80 byte

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

Cobalah online!

Khusus ASCII
sumber
0

Tcl , 111 byte

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}

Cobalah online!


Tcl , 112 byte

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}

Cobalah online!


Tcl , 114 byte

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}

Cobalah online!

sergiol
sumber
0

Tcl , 98 byte

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

Cobalah online!

menggunakan -uniqueopsi lsortperintah. Saya menamai 1dan 2variabel saya untuk kenyamanan, sulit sepertinya kode tidak biasa set 1 0:)

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

Cobalah online!

Kurang bermain 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
sumber