Рівні числа в підмасиві


16

Дано масив чисел з length >=3іlength % 3 == 0

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

Ви розділите його на підмасиви довжиною 3

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

І повернути масив з

  • [0] => Кількість випадків у підмасиві, де всі числа рівні
  • [1] => Якщо всі числа в підмасиві не рівні, кількість випадків у підмасиві, де рівні лише 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]

Це , тому найкоротша відповідь у байтах виграє.


ПД: Вибачення за мою англійську.


Всі цифри в тестових випадках є позитивними. Це завжди так?
Денніс

@Dennis No. може бути додатними і від'ємними числами.
Luis felipe De jesus Munoz

Відповіді:


5

Октава , 60 52 50 байт

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

Спробуйте в Інтернеті!

Збережено 8 байт завдяки Луїсу!

Пояснення:

Переформатує вхід в матрицю з 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 байтиa=>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-й тест (потрібні кілька рівних І деякі дві рівні трійки)
Джонатан Алан



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: спасибі та зберегли інші 5 байт, використовуючи seq(0,a=v)замість 0:(length(v)-1);) На жаль, я не знаю октави, тому не можу легко прочитати цю відповідь ...
digEmAll

@Giuseppe: змінив підхід і врятував багато байтів :)
digEmAll

Чудовий підхід! У мене було що - то коротше applyІнг , uniqueале вона не для третього випадку випробування. Ваш byпідхід безпечніший
JayCe

@JayCe: на щастя, R 3.2.0 ввів функцію довжини, яка економить багато байтів ... але вони повинні ввести коротке визначення лямбда-функцій у 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всі вони рівні, а якщо так, то з кроком $i. Else, з кроком, $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

Лист звичайний, 113 байт

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

Спробуйте в Інтернеті!

Використовується той факт, що в Common Lisp (= x y z)дає істину, якщо всі три елементи рівні, і (/= x y z)дає true, якщо жодна пара чисел не дорівнює.


2

Japt, 14 13 байт

2õ@ò3 x_â ʶX

Спробуй це


Пояснення

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 байт

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

Спробуйте в Інтернеті!

7 байт збережено за допомогою хитрого фокусу від xnor


Ви можете створити список трійок, коротший як zip(*[iter(a)]*3).
xnor

@xnor: Дуже приємно; Мені було цікаво, чи існує коротший шлях ...
Час Браун

2

Сітківка , 23 байти

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

Спробуйте в Інтернеті!

Пояснення

S2,3,` 

Розбийте вхід на кожному третьому просторі, починаючи з (на основі 0) другого, тобто розділіть вхід на три групи.

%Cq`\S+

У кожному рядку ( %) підраховуйте кількість ( C) унікальних ( q) значень ( \S+).

*\C`1

Порахуйте кількість 1s і роздрукуйте їх за допомогою зворотного підводного рядка ( \), але зробіть це в сухому режимі ( *), щоб ми не втратили попередній результат.

2

Порахуйте кількість 2s (і роздрукуйте їх автоматично).




1

[3,5,6,5,5,7,6,6,8,7,7,7,3,4,2,4,4,3]вихід [2,3]замість цього[1,3]
Луїс феліпе Де Джес Муноз

[3,3,3,4,4,4,5,5,5,6,6,6,5,4,3]вихід [1,0]замість цього[4,0]
Луїс феліпе Де Джес Муноз

[3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]вихід [5,0]замість цього[0,0]
Луїс феліпе Де Джес Муноз

@LuisfelipeDejesusMunoz зафіксовано
wastl

Наразі він не показує жодного результату для [1,1,1]. Якщо ви використовуєте 2(замість 1Tнього, завжди буде обрізати / килимок точно до розміру 2.
рекурсивний



1

Еліксир , 92 байти

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

По-перше, фрагменти списку на розмір 3 chunk(a,3)

По-друге, він перетворює знаходження довжини кожного елемента, уніфікованої; map chunk(a,3),&(length uniq&1).

Нарешті, він повертає масив, що складається з того, скільки разів отриманий список дорівнює одному, count(c,&(&1==1))і кількість разів, коли отриманий список дорівнює двом count(c,&(&1==2)).

Спробуйте в Інтернеті!



0

Tcl , 111 байт

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}

Спробуйте в Інтернеті!


Tcl , 112 байт

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}

Спробуйте в Інтернеті!


Tcl , 114 байт

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}

Спробуйте в Інтернеті!



0

Tcl , 98 байт

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

Спробуйте в Інтернеті!

використовуючи -uniqueпараметр lsortкоманди. Я назвав 1і 2мої змінні для зручності, але важко це здається досить незвичним set 1 0:)


0

C # (Visual C # Interactive Compiler) , 108 байт

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

Спробуйте в Інтернеті!

Менше гольфу ...

// 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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.