Alt dizideki eşit sayılar


16

Sayılar dizisi ile Verilen length >=3velength % 3 == 0

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

3 uzunluğundaki alt dizilere bölebilirsiniz

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

Ve bir dizi ile

  • [0] => Alt dizideki tüm sayıların eşit olduğu vaka sayısı
  • [1] => Alt dizideki tüm sayıların eşit olmaması durumunda, alt dizideki yalnızca 2 sayının eşit olduğu vaka sayısı

Örnek ve test örnekleri:

  • Giriş: [2, 4, 2, 5, 5, 5, 4, 2, 1, 3, 3, 1]çıkış[1, 2]

Bunun nedeni ise

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

yani 2 equalve 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]

Bu , bu yüzden bayt en kısa cevap kazanmak.


PD: İngilizcem için özür dilerim.


Test durumlarındaki rakamların hepsi pozitiftir. Her zaman böyle mi?
Dennis

@Dennis No. pozitif ve negatif sayılar olabilir.
Luis felipe De jesus Munoz

Yanıtlar:


5

Oktav , 60 52 50 bayt

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

Çevrimiçi deneyin!

Luis sayesinde 8 bayt tasarruf etti!

Açıklama:

Girdiyi 3 satır ve uygun miktarda sütun içeren bir matrise yeniden şekillendirir. Daha sonra sütunların her birini sıralar ve farklı satırlardaki öğeler arasındaki farkı hesaplar. Bu, aynı sayıların sıfır ve farklı sayıların pozitif sayıya sahip olduğu iki sıralı bir matris verir. Bu reddedilir, böylece tüm eşit unsurlar 1ve eşitsizdir 0. Daha sonra bize üç alternatiflerden birini vererek, bu sütunların her biri Özetle: 0 = All elements are unequal, 1 = Two elements are equalve 2 = All elements are equal. Daha sonra kaç tanesinin >1ve kaç tanesinin tam olarak olduğunu kontrol ederiz ==1.


4

JavaScript (ES6), 70 bayt

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]

Çevrimiçi deneyin!

Nasıl?

Her üçlüyü [a, b, c] giriş dizisinden özyineli olarak çıkarırız ve aşağıdaki formülü kullanarak iki sayacı t (türünün üçü) ve p (çifti) güncelleriz:

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

Aşağıda "hepsi eşit" ten "tamamen farklı" ya kadar ayrıntılı 5 olası durum vardır.

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

Çıktı sadece birden fazla [0]ve [1]dizin içeriyorsa "Not: 3 öğeli bir dizi döndürür [0]ve [1]uygun değerlerle [2]döndürür ve kukla bir değer döndürür (ortak öğe içermeyen 3 listenin sayısı). geçerli kurallar. " codegolf.stackexchange.com/a/166082/31257 62 bayta=>a.map(_=>++r[--new Set(a.slice(i,i+=3)).size],r=[i=0,i])&&r
guest271314

3

Pyth, 13 14 12 11 bayt

/Lml{kcQ3S2

Burada deneyin

açıklama

/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. testte başarısız olur (bazı eşdeğerlere ve bazı iki eşit üçlülere ihtiyaç duyar)
Jonathan Allan

3

05AB1E , 10 bayt

3ôεÙg}12S¢

Çevrimiçi deneyin!

açıklama

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

3

Tamam , 17 16 bayt

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

Çevrimiçi deneyin!

            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

İçin k , 17 bayt sürümü: +/(1 2=#=:)'0N 3#.


0N 3-> 0N3(
OK'deki

3

R, , 70 bayt

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

Çevrimiçi deneyin!

Önceki sürümler :

R , 82 bayt

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

Çevrimiçi deneyin!


R , 93 bayt

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

Çevrimiçi deneyin!


1
Oktav cevabını taşımak muhtemelen daha verimli olacak, ancak a=!1:2biraz daha kısa olacak.
Giuseppe

@Giuseppe: teşekkürler ve seq(0,a=v)yerine kullanarak diğer 5 bayt kurtardı 0:(length(v)-1);) Ne yazık ki oktav bilmiyorum bu yüzden bu cevabı kolayca okuyamıyorum ...
digEmAll

@Giuseppe: yaklaşımı değiştirdi ve bir çok bayt kurtardı :)
digEmAll

Harika bir yaklaşım! Ben tarafından kısa bir şey vardı applying uniqueama üçüncü test durumu için başarısız olur. Kişisel byyaklaşım daha güvenlidir
Jayce

@JayCe: Neyse ki R 3.2.0, çok fazla bayt kaydeden uzunluklar fonksiyonunu tanıttı ... ancak kod
golfünde

3

Java (JDK 10) , 116 bayt

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

Çevrimiçi deneyin!

Not: uygun değerlerle 3 öğeden oluşan bir dizi döndürür [0]ve [1]uygun değerlerle [2]döndürür ve kukla bir değer döndürür (ortak öğe içermeyen 3 liste sayısı). Bu, mevcut kurallara göre tamamen geçerlidir.


2

PowerShell , 106 bayt

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

Çevrimiçi deneyin!

Tam olarak kalayda ne yazıyor. Giriş üzerinde döngüler $a. Her yineleme, $x,$y,$zsonraki üç öğe olarak soyulur . Testlerin ifhepsi eşittir ve eğer varsa artışlar $i. Else, $jen az bir çift eşitse artar . Döngü tamamlandığında, çıktı $ive $jtamsayı olarak.

Yani ... çok ... dolar ...


2

Retina 0.8.2 , 68 bayt

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

Çevrimiçi deneyin! Bağlantı, satır başına bir değerin istenen biçimine dönüştürmek için başlıklı test senaryoları içerir. Açıklama:

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

Ayırıcılarla her bir satıra üç değer toplayın ve sonunda ilkini çoğaltın.

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

Yinelenen çiftlerin sayısını sayın.

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

3S ve 1s sayısını sayın .




2

Ortak Lisp, 113 bayt

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

Çevrimiçi deneyin!

Common Lisp'de (= x y z)her üç öğe de eşitse (/= x y z)doğruyu verir ve hiçbir çift sayı eşit değilse doğru verir.


2

Japt, 14 13 bayt

2õ@ò3 x_â ʶX

Dene


açıklama

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 bayt

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

Çevrimiçi deneyin!

Xnor'tan akıllı bir numara ile kaydedilen 7 bayt


Üçlülerin listesini daha kısa olarak oluşturabilirsiniz zip(*[iter(a)]*3).
xnor

@xnor: Çok hoş; Daha kısa bir yol olup olmadığını merak ettim ...
Chas Brown

2

Retina , 23 bayt

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

Çevrimiçi deneyin!

açıklama

S2,3,` 

Girişi (0 tabanlı) 2'den başlayarak her 3. boşlukta bölün, yani girişi üçlü gruplara bölün.

%Cq`\S+

Her satırda ( %) C, unique ( q) değerlerinin ( \S+) sayısını ( ) sayın .

*\C`1

1S sayısını sayın ve bir sondaki satır besleme ( \) ile yazdırın , ancak bunu bir kuru çalışma ( *) ile yapın, böylece önceki sonucu kaybetmeyelim.

2

2S sayısını sayın (ve otomatik olarak yazdırın).


2

J , 16 15 bayt

Cole sayesinde -1 bayt!

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

Çevrimiçi deneyin!

Çözümlerin çoğunluğu ile hemen hemen aynı yaklaşım.

Açıklama:

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

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

Çalıştır ve hata ayıkla


[3,5,6,5,5,7,6,6,8,7,7,7,3,4,2,4,4,3][2,3]bunun yerine çıktılar[1,3]
Luis felipe De jesus Munoz

[3,3,3,4,4,4,5,5,5,6,6,6,5,4,3][1,0]bunun yerine çıktılar[4,0]
Luis felipe De jesus Munoz

[3,4,5,6,7,8,9,8,7,6,5,4,3,2,1][5,0]bunun yerine çıktılar[0,0]
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz sabit
Wastl

Şu anda için herhangi bir çıktı göstermiyor [1,1,1]. 2(Bunun yerine kullanırsanız 1T, her zaman tam olarak 2 boyuta kadar düzeltme / yastıklama yaparsınız
özyinelemeli



1

İksir , 92 bayt

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

İlk olarak, listeyi 3 boyuna böler chunk(a,3)

İkincisi, dönüştürülmemiş her öğenin uzunluğunu bulur; map chunk(a,3),&(length uniq&1).

Son olarak, sonuçta elde edilen listenin bire eşit count(c,&(&1==1))ve sonuçta elde edilen listenin iki sayısına eşit olduğu bir dizi döndürür count(c,&(&1==2)).

Çevrimiçi deneyin!



0

Tcl , 111 bayt

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}

Çevrimiçi deneyin!


Tcl , 112 bayt

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}

Çevrimiçi deneyin!


Tcl , 114 bayt

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}

Çevrimiçi deneyin!



0

Tcl , 98 bayt

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

Çevrimiçi deneyin!

komut -uniqueseçeneğini kullanarak lsort. Kolaylık için adlandırdım 1ve 2değişkenlerim, zor kodlamak için alışılmadık görünüyor set 1 0:)


0

C # (Visual C # Etkileşimli Derleyici) , 108 bayt

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

Çevrimiçi deneyin!

Daha az 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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.