Равные числа в подмассиве


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]

Это , поэтому выигрывает самый короткий ответ в байтах.


PD: Извинения за мой английский.


Числа в тестовых случаях все положительные. Это всегда так?
Деннис

@Dennis No. может быть как положительным, так и отрицательным числом.
Луис Фелипе Де Иисус Муньос

Ответы:


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

ОК , 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

Для к , версия 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
Возможно, перенос ответа Octave будет более эффективным, но он 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

Common Lisp, 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)дает значение true, если все три элемента равны, и (/= 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,` 

Разделите входные данные в каждом третьем месте, начиная с 2-го (на основе 0), т.е. разделите входные данные на группы по три.

%Cq`\S+

В каждой строке ( %) подсчитайте количество ( C) значений unique ( q) ( \S+).

*\C`1

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

2

Подсчитайте количество 2s (и напечатайте их автоматически).


2

J , 16 15 байт

-1 байт благодаря Коулу!

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

Попробуйте онлайн!

Практически такой же подход, как и большинство решений.

Объяснение:

        _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

#@~.->#@=
Коул


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 #) , 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.