2つのリストの平均化


11

2つのリストを平均化する

チャレンジ

正の整数の2つのリストが与えられた場合、新しいリストが同じ算術平均(平均)を持つように要素を2つの新しいリストに再配置できるかどうかを判断します。

入力

入力は、STDINを介して、または関数の引数として取得できます。入力はリストとして取得できます。または、言語がリスト(または配列/辞書などの類似物)をサポートしていない場合、入力はコンマまたはスペース区切りの文字列として取得できます。あれは、

"1 4 8 2 5,3 1 5 2 5"

次と同じです:

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

すべての入力リストは同じ長さになります。

出力

同じ平均で2つの新しいリストを作成できる場合、プログラム/関数は平均を出力するか返す必要があります。できない場合、プログラムは悲しい顔を出力するはず:(です。

等しい手段を使用して再配置されたリストは、存在する場合、同じ長さである必要はありません。新しいリストを作成するために、任意の数のスワップを作成できます。

1 4 8 2 5,3 1 5 2 5 -> 1 4 8 2 3,5 1 5 2 5 (swapped 3 and 5) -> 3.6
1 3 6 2,16 19 19 14 -> [[1,6,19,14],[3,2,16,19]] -> 10
2 6 2,6 3 5 -> 2 6,2 6 3 5 (moved 2) -> 4
90 80 20 1,40 60 28 18 -> :(

これはので、バイト単位の最短コードが優先されます。いつものように、標準の抜け穴は許可されていません。


2
各リストから任意の数の要素を交換できますか?1つのリストだけで他のリストに要素を与えることはできますか?「有効な順列が存在する」という意味がわかりません。また、これにはより多くのテストケースが必要です。
xnor

@xnorを使用すると、ある要素を別の要素に移動できます。さらにいくつかのテストケースを追加します
Downgoat

したがって、これは「単一のリスト(それらの結合)が与えられた場合、同じ平均を持つ2つの空でないリストに分割できますか?」と同等ですか?
xnor

1
@ vihan1086では、単一のリストを入力として受け取らないのはなぜですか?あなたのプレゼンテーションは不必要に複雑に思えます。
xnor

2
@ vihan1086 Sandboxの投稿を見ると、同じように多くの説明要求がそこに出されており、これらの点の多くを明確にしたと言いましたが、あなたの編集は実際にはそれを明確にしませんでした。さらにテキストを追加するよりも、混乱を招くテキストを置き換える方が良いでしょう。
xnor

回答:


12

Pyth、24バイト

?}KcsJsQlJmcsdldtPyJK":(

オンラインで試す:デモンストレーション

エラーに気付き、1バイトのゴルフをしてくれたDennisに感謝します。

説明:

?}KcsJsQlJmcsdldtPyJK":(   implicit: Q = evaluated input
      sQ                   all numbers of Q
     J                     save them in J
  KcsJ  lJ                 average of J (sum(J) / len(J))
                           store in K
          m     tPyJ       map each nonempty subset d of J to:
           csdld             average of d
?}                         if K in ^:
                    K        print K
                     ":(   else print sad-face

5
いいですね、+ 1。しかし、Pythには実際に平均を計算するための組み込み機能がありませんか?
アレックスA.

@AlexA。それは今持っている1(つまり.O
ミスターXcoder

6

SWI-Prolog、159バイト

a(A,B):-append([A,B],R),permutation(R,S),append([Y,Z],S),sum_list(Y,I),sum_list(Z,J),length(Y,L),length(Z,M),L\=0,M\=0,I/L=:=J/M,W is J/M,write(W);write(':(').

と呼ばれる a([1,4,8,2,5],[3,1,5,2,5]).


5

ジュリア、101バイト

f(a,b)=(m=mean;p=filter(i->m(i[1])==m(i[2]),partitions([a,b],2));isempty(p)?":(":m(collect(p)[1][1]))

これにより、2つの配列を受け入れ、それに応じて文字列または浮動小数点数を返す関数が作成されます。

Ungolfed +説明:

function f(a,b)
    # Get the set of all 2-way partitions of the array [a,b]
    l = partitions([a,b], 2)

    # Filter the set of partitions to those where the two
    # contained arrays have equal means
    p = filter(i -> mean(i[1]) == mean(i[2]), l)

    # Return a frown if p is empty, otherwise return a mean
    isempty(p) ? ":(" : mean(collect(p)[1][1])
end

2

R、94バイト

基本的にはジャクベスと同じだと思う。両方のリストの平均がリストの値の任意の組み合わせの平均と一致する場合、リストの合計長を含むが、それ以外の場合、平均は悲しい顔を出力します。

if(mean(l<-scan())%in%unlist(sapply(2:length(l)-1,function(x)combn(l,x,mean))))mean(l)else':('

テスト走行

> if(mean(l<-scan())%in%unlist(sapply(2:length(l)-1,function(x)combn(l,x,mean))))mean(l)else':('
1: 1 4 8 2 5
6: 3 1 5 2 5
11: 
Read 10 items
[1] 3.6
> if(mean(l<-scan())%in%unlist(sapply(2:length(l)-1,function(x)combn(l,x,mean))))mean(l)else':('
1: 90 80 20 1
5: 40 60 28 18
9: 
Read 8 items
[1] ":("

0

ゼリー、22バイト

FŒ!œs2ÆmE$$Ðf⁾:(ÆmX$Ṇ?

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

以下からの助けを借りて行わ氏Xcoderチャット

説明

FŒ!œs2ÆmE$$Ðf⁾:(ÆmX$Ṇ? - Main link, argument a (2D-array)

F                      - Flatten
 Œ!                    - All permutations
           Ðf          - Keep elements which are truthy when
   œs2    $            -   split into 2 parts and...
      Æm $             -   the means of each...
        E              -   are the same
                     ? - Ternary if
                    Ṇ  -   Condition: No lists remain
             ⁾:(       -   If so: Set the return value to ":("
                   $   -   Otherwise: 
                Æm     -     Get the mean of each list
                  X    -     Randomly choose one (all elements are the same)

失敗し2 6 2,6 3 5 -> 2 6,2 6 3 5 (moved 2) -> 4ます。今は、同じ長さの2つの部分に分割しているだけです。
ケビンCruijssen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.