サブ配列内の等しい数


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:私の英語をおApびします。


テストケースの数値はすべて正です。それは常にそうですか?
デニス

@Dennis No.には正の数と負の数を指定できます。
ルイスフェリペデジェススムニョス

回答:


5

オクターブ60 52 50バイト

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

オンラインでお試しください!

Luisのおかげで8バイト節約されました!

説明:

入力を3行、適切な量の列を持つ行列に再整形します。次に、各列を並べ替え、異なる行の要素間の差を計算します。これにより、2つの行を持つ行列が得られます。同一の数値にはゼロが、異なる数値には正の数値が含まれます。これは否定されるので、等しい要素は1すべてであり、等しくない要素はすべてです0。私たちは、その後、私たちの3つの選択肢のいずれかを与え、これらの列のそれぞれを合計:0 = All elements are unequal1 = Two elements are equal2 = 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]を再帰的に抽出し、次の式を使用して2つのカウンターt(3種類)と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回目のテストに失敗します(いくつかの等号と2つの等号のトリプルが必要です)
ジョナサンアラン


3

oK17 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
OKの

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ですが、少し短くなります。
ジュゼッペ

@ジュゼッペ:ありがとう、そして;のseq(0,a=v)代わりに他の5バイトを保存しました0:(length(v)-1)。残念ながら、オクターブがわからないので、その答えを簡単に読むことができません
...-digEmAll

@Giuseppe:アプローチを変更し、多くのバイトを節約しました:)
digEmAll

素晴らしいアプローチ!applyingで何か短いものuniqueがありましたが、3番目のテストケースでは失敗します。あなたのbyアプローチはより安全です
-JayCe

@JayCe:幸いなことに、R 3.2.0は多くのバイトを節約する長さ関数を導入しました...しかし、コードゴルフで競争力を高めるために、Rに
短い


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、次の3つの要素として剥離します。ifそれらがすべて等しいかどうかをテストし、等しい場合、インクリメントします$iElse$j少なくとも1つのペアが等しい場合に増加します。ループは、完全に出力されたら$i$j整数として。

だから...多くの...ドル...


2

Retina 0.8.2、68バイト

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

オンラインでお試しください!リンクには、行ごとに1つの値の目的の形式に変換するヘッダー付きのテストケースが含まれます。説明:

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

セパレータを使用して各行に3つの値を収集し、最初の値を最後に複製します。

%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)、3つの要素すべてが等しい(/= x y z)場合にtrueを返し、等しい数値のペアがない場合に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

網膜、23バイト

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

オンラインでお試しください!

説明

S2,3,` 

(0から始まる)2番目から始まる3番目のスペースごとに入力を分割します。つまり、入力を3つのグループに分割します。

%Cq`\S+

各行%C)で、一意の(q)値の数()を数えます(\S+)。

*\C`1

1s の数をカウントし、後続の改行(\)で印刷します*が、前の結果が失われないように、ドライラン()で印刷します。

2

2s の数を数えます(そして自動的に印刷します)。




1

スタックス、14 バイト

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

実行してデバッグする


[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

Elixir、92バイト

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

最初に、リストをサイズlength 3にチャンクします chunk(a,3)

第二に、変換されて、各要素の長さが一意になります。map chunk(a,3),&(length uniq&1)

最後に、結果のリストが1に等しい回数からなる配列を返しcount(c,&(&1==1))、そして得られたリストは2に等しい回数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))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.