ตัวเลขที่เท่ากันในอาร์เรย์ย่อย


16

รับอาร์เรย์ของตัวเลขด้วยlength >=3และlength % 3 == 0

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

คุณจะแบ่งออกเป็นอาเรย์ย่อยที่มีความยาว 3

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

และส่งคืนอาร์เรย์ด้วย

  • [0] => จำนวนกรณีในอาร์เรย์ย่อยที่ตัวเลขทั้งหมดเท่ากัน
  • [1] => ในกรณีที่ตัวเลขทั้งหมดใน sub-array ไม่เท่ากันจำนวนของ case ใน sub-array ที่มีเพียง 2 ตัวเลขเท่านั้น

ตัวอย่างและกรณีทดสอบ:

  • อินพุต: [2, 4, 2, 5, 5, 5, 4, 2, 1, 3, 3, 1]เอาต์พุต[1, 2]

นี้เป็นเพราะ

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

ดังนั้น 2 equalและ 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]

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


PD: ขอโทษสำหรับภาษาอังกฤษของฉัน


ตัวเลขในกรณีทดสอบทั้งหมดเป็นค่าบวก เป็นเช่นนั้นเสมอหรือไม่
Dennis

@Dennis No. สามารถเป็นตัวเลขบวกและลบได้
Luis felipe De jesus Munoz

คำตอบ:


5

คู่ , 60 52 50 ไบต์

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

ลองออนไลน์!

บันทึกแล้ว 8 ไบต์ขอบคุณ Luis!

คำอธิบาย:

ปรับรูปร่างอินพุตให้เป็นเมทริกซ์ที่มี 3 แถวและจำนวนคอลัมน์ที่เหมาะสม จากนั้นเรียงลำดับแต่ละคอลัมน์และคำนวณความแตกต่างระหว่างองค์ประกอบในแถวที่แตกต่างกัน นี่จะให้เมทริกซ์ที่มีสองแถวโดยที่ตัวเลขที่เหมือนกันจะมีศูนย์และตัวเลขที่ต่างกันจะมีจำนวนบวก นี้จะเมื่อตะกี้เพื่อให้องค์ประกอบเท่ากับทั้งหมดที่มีและสิ่งที่ไม่เท่ากันอยู่1 0จากนั้นเราจะสรุปแต่ละคอลัมน์เหล่านั้นให้เราเป็นหนึ่งในสามทางเลือก: 0 = All elements are unequal, และ1 = Two elements are equal 2 = All elements are equalจากนั้นเราจะตรวจสอบวิธีการจำนวนมากและหลายวิธีที่จะตรง>1==1


4

JavaScript (ES6), 70 ไบต์

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]

ลองออนไลน์!

อย่างไร?

เราแยกทริปเล็ตแต่ละครั้ง[a, b, c]ออกจากอาร์เรย์อินพุตและอัปเดตสองเคาน์เตอร์t (สามรายการ) และp (คู่) โดยใช้สูตรต่อไปนี้:

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

มี 5 กรณีที่เป็นไปได้ซึ่งมีรายละเอียดด้านล่างจาก 'ทั้งหมดเท่ากัน' ถึง 'แตกต่างกันทั้งหมด'

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

หากเอาต์พุตสามารถมีได้มากกว่าเท่านั้น[0]และ[1]ดัชนี"หมายเหตุ: ส่งคืนอาร์เรย์ 3 องค์ประกอบพร้อมกับ[0]และ[1]คืนค่าที่เหมาะสมและ[2]ส่งกลับค่าดัมมี่ (จำนวนรายการ 3 รายการโดยไม่มีองค์ประกอบใด ๆ ที่เหมือนกัน) ทั้งหมดนี้ถูกต้องตาม กฎปัจจุบัน " 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 ไบต์

/Lml{kcQ3S2

ลองที่นี่

คำอธิบาย

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

ล้มเหลวในการทดสอบครั้งที่ 3 (ต้องการบางค่าเท่ากันและมีค่าเท่ากันสองเท่า)
Jonathan Allan


3

oK , 17 16 ไบต์

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

ลองออนไลน์!

            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

สำหรับkรุ่น 17 +/(1 2=#=:)'0N 3#ไบต์คือ:


0N 3-> 0N3(ต้องขอบคุณการวิเคราะห์คำในหน่วยโอเค)
ngn

3

R , 70 ไบต์

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

ลองออนไลน์!

รุ่นก่อนหน้า:

R , 82 ไบต์

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

ลองออนไลน์!


R , 93 ไบต์

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

ลองออนไลน์!


1
อาจเป็นคำตอบของอ็อกเทฟอาจจะมีประสิทธิภาพมากกว่า แต่a=!1:2สั้นกว่าเล็กน้อย
Giuseppe

@Giuseppe: ขอบคุณและบันทึกอีก 5 ไบต์โดยใช้seq(0,a=v)แทน0:(length(v)-1);) แต่น่าเสียดายที่ฉันไม่รู้จักอ็อกเทฟดังนั้นฉันจึงไม่สามารถอ่านคำตอบนั้นได้อย่างง่ายดาย ...
digEmAll

@Giuseppe: เปลี่ยนแปลงวิธีการและบันทึกจำนวนมากของไบต์ :)
digEmAll

วิธีการที่ยอดเยี่ยม! ฉันมีบางสิ่งบางอย่างที่สั้นลงโดยapplyไอเอ็นจีuniqueแต่มันล้มเหลวสำหรับกรณีทดสอบที่สาม byวิธีการของคุณปลอดภัยขึ้น
JayCe

@JayCe: โชคดี R 3.2.0 แนะนำฟังก์ชั่นความยาวที่ช่วยประหยัดจำนวนไบต์ ... แต่พวกเขาควรจะแนะนำฟังก์ชั่นแลมบ์ดา shorted ใน R เพื่อให้สามารถแข่งขันในโค้ดกอล์ฟได้มากขึ้น: D
digEmAll

3

Java (JDK 10) , 116 ไบต์

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

ลองออนไลน์!

หมายเหตุ: ส่งคืนอาร์เรย์ 3 องค์ประกอบพร้อมกับ[0]และ[1]คืนค่าที่เหมาะสมและ[2]คืนค่าตัวอย่าง (จำนวน 3 รายการโดยไม่มีองค์ประกอบใด ๆ ที่เหมือนกัน) ทั้งหมดนี้ถูกต้องตามกฎปัจจุบัน


2

PowerShell , 106 ไบต์

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

ลองออนไลน์!

สิ่งที่พูดบนกระป๋อง $aลูปมากกว่าการป้อนข้อมูล การวนซ้ำแต่ละครั้งจะแยกออก$x,$y,$zเป็นองค์ประกอบสามส่วนถัดไป ทดสอบพวกเขากำลังทั้งหมดที่เท่าเทียมกันและถ้าเป็นเช่นนั้นการเพิ่มขึ้นif เพิ่มขึ้นถ้าอย่างน้อยหนึ่งคู่มีค่าเท่ากัน เมื่อลูปเสร็จสมบูรณ์เอาต์พุตและ$iElse$j$i$jเป็นจำนวนเต็ม

ดังนั้น ... หลาย ... ดอลลาร์ ...


2

เรติน่า 0.8.2 , 68 ไบต์

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

ลองออนไลน์! ลิงก์มีกรณีทดสอบพร้อมส่วนหัวเพื่อแปลงเป็นรูปแบบที่ต้องการหนึ่งค่าต่อบรรทัด คำอธิบาย:

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

รวบรวมสามค่าลงในแต่ละบรรทัดด้วยตัวคั่นและทำซ้ำค่าแรกในตอนท้าย

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

นับจำนวนคู่ซ้ำ

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

นับจำนวน3s และ1s




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

Try it online!

Used the fact that in Common Lisp (= x y z) gives true if all the three elements are equal, and (/= x y z) gives true if no pair of numbers is equal.


2

Japt, 14 13 bytes

2õ@ò3 x_â ʶX

Try it


Explanation

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

Retina, 23 bytes

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

Try it online!

Explanation

S2,3,` 

Split the input at every 3rd space starting at the (0-based) 2nd, i.e. split the input into groups of three.

%Cq`\S+

On each line (%) count the number (C) of unique (q) values (\S+).

*\C`1

Count the number of 1s and print them with a trailing linefeed (\), but do so in a dry-run (*) so that we don't lose the previous result.

2

Count the number of 2s (and print them automatically).


2

J, 16 15 bytes

-1 byte thanks to cole!

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

Try it online!

Pretty much the same approach as the majority of solutions.

Explanation:

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

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

Run and debug it


[3,5,6,5,5,7,6,6,8,7,7,7,3,4,2,4,4,3] outputs [2,3] instead [1,3]
Luis felipe De jesus Munoz

[3,3,3,4,4,4,5,5,5,6,6,6,5,4,3] outputs [1,0] instead [4,0]
Luis felipe De jesus Munoz

[3,4,5,6,7,8,9,8,7,6,5,4,3,2,1] outputs [5,0] instead [0,0]
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz fixed
wastl

It doesn't currently show any output for [1,1,1]. If you use 2( instead of 1T it will always trim/pad to exactly size 2.
recursive



1

Elixir, 92 bytes

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

First, chunks the list into size length 3 chunk(a,3)

Secondly, it converts finds the length of each element, uniqified; map chunk(a,3),&(length uniq&1).

Finally, it returns an array consisting of the number of times the resulting list is equal to one count(c,&(&1==1)) and the number of times the resulting list is equal to two count(c,&(&1==2)).

Try it online!



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}

Try it 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}

Try it 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}

Try it online!



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}

Try it online!

using -unique option of lsort command. I named 1 and 2 my variables for convenience, tough it seems pretty unusual to code set 1 0 :)


0

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

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

Try it online!

Less golfed...

// 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))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.