Các số bằng nhau trong mảng con


16

Cho một dãy số có length >=3length % 3 == 0

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

Bạn sẽ chia nó thành các mảng con có độ dài 3

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

Và trả về một mảng với

  • [0] => Số lượng các trường hợp trong mảng con trong đó tất cả các số bằng nhau
  • [1] => Trong trường hợp tất cả các số trong mảng con không bằng nhau, số lượng các trường hợp trong mảng con trong đó chỉ có 2 số bằng nhau

Ví dụ và trường hợp thử nghiệm:

  • Đầu vào: [2, 4, 2, 5, 5, 5, 4, 2, 1, 3, 3, 1]đầu ra[1, 2]

Đây là vì

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

vì vậy 2 equalvà 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]

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


PD: Xin lỗi vì tiếng Anh của tôi.


Các con số trong các trường hợp thử nghiệm đều dương tính. Có phải luôn luôn như vậy?
Dennis

@Dennis số có thể là số dương và số âm.
Luis felipe De jesus Munoz

Câu trả lời:


5

Octave , 60 52 50 byte

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

Hãy thử trực tuyến!

Đã lưu 8 byte nhờ Luis!

Giải trình:

Định hình lại đầu vào thành một ma trận có 3 hàng và số lượng cột thích hợp. Sau đó, nó sắp xếp từng cột và tính toán sự khác biệt giữa các yếu tố trên các hàng khác nhau. Điều này đưa ra một ma trận có hai hàng, trong đó các số giống hệt nhau sẽ có số 0 và các số khác nhau sẽ có số dương. Điều này bị phủ định, do đó tất cả các yếu tố bằng nhau là 1, và tất cả đều không bằng nhau 0. Sau đó chúng tôi tổng hợp mỗi người cột, cho chúng ta một trong ba lựa chọn: 0 = All elements are unequal, 1 = Two elements are equal2 = All elements are equal. Sau đó chúng tôi kiểm tra xem có bao nhiêu >1và chính xác là bao nhiêu ==1.


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]

Hãy thử trực tuyến!

Làm sao?

Chúng tôi trích xuất đệ quy từng bộ ba [a, b, c] từ mảng đầu vào và cập nhật hai bộ đếm t (ba loại) và p (cặp), sử dụng công thức sau:

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

Có 5 trường hợp có thể được nêu chi tiết bên dưới, từ 'tất cả bằng' đến 'tất cả khác biệt'.

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

Nếu đầu ra có thể có nhiều hơn chỉ [0][1]chỉ mục "Lưu ý: trả về mảng 3 phần tử với [0][1]trả về các giá trị phù hợp và [2]trả về giá trị giả (số lượng danh sách 3 không có bất kỳ phần tử nào chung). Điều này hoàn toàn hợp lệ theo các quy tắc hiện hành. " codegolf.stackexchange.com/a/166082/31257 62 bytea=>a.map(_=>++r[--new Set(a.slice(i,i+=3)).size],r=[i=0,i])&&r
khách271314

3

Pyth, 13 14 12 11 byte

/Lml{kcQ3S2

Hãy thử nó ở đây

Giải trình

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

Thất bại cho bài kiểm tra thứ 3 (cần một số tất cả bằng và một số bộ ba bằng nhau)
Jonathan Allan


3

oK , 17 16 byte

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

Hãy thử trực tuyến!

            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

Đối với k , phiên bản 17 byte là : +/(1 2=#=:)'0N 3#.


0N 3-> 0N3(nhờ vào sự kỳ lạ phân tích cú pháp trong
oK

3

R , 70 byte

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

Hãy thử trực tuyến!

Những phiên bản trước :

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

Hãy thử trực tuyến!


R , 93 byte

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

Hãy thử trực tuyến!


1
Có thể chuyển câu trả lời Octave sẽ hiệu quả hơn, nhưng a=!1:2ngắn hơn một chút.
Giuseppe

@Giuseppe: cảm ơn và đã lưu 5 byte khác bằng cách sử dụng seq(0,a=v)thay vì 0:(length(v)-1);) Thật không may tôi không biết quãng tám nên tôi không thể đọc câu trả lời đó một cách dễ dàng ...
digEmAll

@Giuseppe: thay đổi cách tiếp cận và lưu rất nhiều byte :)
digEmAll

Cách tiếp cận tuyệt vời! Tôi đã có một cái gì đó ngắn hơn bằng cách applying uniquenhưng nó thất bại cho trường hợp thử nghiệm thứ ba. byCách tiếp cận của bạn an toàn hơn
JayCe

@JayCe: may mắn thay R 3.2.0 đã giới thiệu hàm độ dài tiết kiệm rất nhiều byte ... nhưng họ nên giới thiệu một định nghĩa hàm lambda rút gọn trong R, để cạnh tranh hơn trong môn đánh gôn: 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;}

Hãy thử trực tuyến!

Lưu ý: trả về mảng 3 phần tử có [0][1]trả về các giá trị phù hợp và [2]trả về giá trị giả (số lượng danh sách 3 không có bất kỳ phần tử nào chung). Điều này là hoàn toàn hợp lệ theo các quy tắc hiện hành.


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

Hãy thử trực tuyến!

Chính xác những gì nó nói trên tin. Vòng lặp trên đầu vào $a. Mỗi lần lặp, lột ra $x,$y,$znhư ba yếu tố tiếp theo. Các xét nghiệm iftất cả đều bằng nhau và nếu vậy, tăng dần $i. Else, gia tăng $jnếu ít nhất một cặp bằng nhau. Khi vòng lặp hoàn thành, đầu ra $i$jdưới dạng số nguyên.

Vậy ... nhiều ... đô la ...


2

Võng mạc 0.8.2 , 68 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm với tiêu đề để chuyển đổi sang định dạng mong muốn của một giá trị trên mỗi dòng. Giải trình:

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

Thu thập ba giá trị trên mỗi dòng bằng dấu phân cách và nhân đôi giá trị đầu tiên ở cuối.

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

Đếm số lượng cặp trùng lặp.

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

Đếm số lượng 3s và 1s.




2

Lisp thông thường, 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))

Hãy thử trực tuyến!

Đã sử dụng thực tế là trong Common Lisp (= x y z)cho true nếu cả ba phần tử đều bằng nhau và (/= x y z)cho true nếu không có cặp số nào bằng nhau.


2

Japt, 14 13 byte

2õ@ò3 x_â ʶX

Thử nó


Giải trình

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 byte

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

Hãy thử trực tuyến!

7 byte được lưu thông qua một mẹo thông minh từ xnor


Bạn có thể tạo danh sách các bộ ba ngắn hơn như zip(*[iter(a)]*3).
xnor

@xnor: Rất đẹp; Tôi tự hỏi liệu có cách nào ngắn hơn không ...
Chas Brown

2

Võng mạc , 23 byte

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

Hãy thử trực tuyến!

Giải trình

S2,3,` 

Tách đầu vào ở mọi không gian thứ 3 bắt đầu từ thứ 2 (dựa trên 0), tức là chia đầu vào thành các nhóm ba.

%Cq`\S+

Trên mỗi dòng ( %) đếm số ( C) của các qgiá trị duy nhất ( ) ( \S+).

*\C`1

Đếm số lượng 1s và in chúng bằng linefeed ( \), nhưng làm như vậy trong một lần chạy khô ( *) để chúng ta không mất kết quả trước đó.

2

Đếm số lượng 2s (và in chúng tự động).


2

J , 16 15 byte

-1 byte nhờ cole!

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

Hãy thử trực tuyến!

Khá nhiều cách tiếp cận tương tự như phần lớn các giải pháp.

Giải trình:

        _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 byte

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

Chạy và gỡ lỗi nó


[3,5,6,5,5,7,6,6,8,7,7,7,3,4,2,4,4,3]đầu ra [2,3]thay thế[1,3]
Luis felipe De jesus Munoz

[3,3,3,4,4,4,5,5,5,6,6,6,5,4,3]đầu ra [1,0]thay thế[4,0]
Luis felipe De jesus Munoz

[3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]đầu ra [5,0]thay thế[0,0]
Luis felipe De jesus Munoz

Đã sửa lỗi @LuisfelipeDejesusMunoz
lãng phí

Nó hiện không hiển thị bất kỳ đầu ra cho [1,1,1]. Nếu bạn sử dụng 2(thay vì 1Tnó sẽ luôn cắt / pad thành kích thước chính xác 2.
đệ quy



1

Thuốc tiên , 92 byte

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

Đầu tiên, chia danh sách thành kích thước dài 3 chunk(a,3)

Thứ hai, nó chuyển đổi tìm độ dài của mỗi phần tử, không xác định; map chunk(a,3),&(length uniq&1).

Cuối cùng, nó trả về một mảng bao gồm số lần danh sách kết quả bằng một count(c,&(&1==1))và số lần danh sách kết quả bằng hai lầncount(c,&(&1==2)) .

Hãy thử trực tuyến!





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}

Hãy thử trực tuyến!

sử dụng -uniquetùy chọn của lsortlệnh. Tôi đặt tên 12các biến của tôi để thuận tiện, khó khăn khi viết mã có vẻ khá bất thường set 1 0:)


0

C # (Trình biên dịch tương tác Visual C #) , 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))

Hãy thử trực tuyến!

Ít chơi gôn hơn ...

// 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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.