Ortalama İki Liste


11

İki listenin ortalamasını alma

Meydan okuma

İki pozitif tamsayı listesi verildiğinde, öğeleri yeni listelerin aynı aritmetik ortalamasına (ortalama) sahip olacak şekilde iki yeni listeye yeniden düzenlemenin mümkün olup olmadığını belirleyin.

Giriş

Giriş STDIN üzerinden veya fonksiyon argümanları olarak alınabilir. Giriş bir liste olarak alınabilir veya diliniz listeleri desteklemiyorsa (veya diziler / sözlükler gibi bir şey), giriş virgül veya boşlukla sınırlandırılmış bir dize olarak alınabilir. Yani,

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

aynıdır:

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

Tüm giriş listeleri aynı uzunlukta olacaktır.

Çıktı

Aynı ortalamaya sahip iki yeni liste oluşturabilirseniz, programınız / işleviniz ortalamayı yazdırmalı veya ortalamayı döndürmelidir. Yapamıyorsanız, programınız üzgün bir yüz çıkarmalıdır :(.

Eşit yollara sahip yeniden düzenlenmiş listelerin, varsa, aynı uzunlukta olması gerekmediğini unutmayın. Yeni listeleri oluşturmak için istediğiniz sayıda takas yapılabilir.

Örnekler

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

Bu yani bayt en kısa kod kazanır. Her zaman olduğu gibi, standart boşluklara izin verilmez.


2
Her listeden istediğiniz sayıda öğeyi değiştirebilir miyiz? Bir liste diğerine sadece element verebilir mi? "Geçerli permütasyon var" ile ne demek istediğini anlamıyorum. Ayrıca bunun daha fazla test vakasına ihtiyacı var.
xnor

@xnor bir öğeyi diğerine taşıyabilirsiniz. Birkaç test örneği daha ekleyeceğim
Downgoat

Yani, bu, "Tek bir liste (birlikleri göz önüne alındığında), aynı ortalamaya sahip iki boş olmayan listeye bölünebilir mi?"
xnor

1
@ vihan1086 Neden tek bir listeyi girdi olarak almayalım? Sununuz gereksiz yere karmaşık görünüyor.
xnor

2
Sandbox postanıza baktığınızda, aynı açıklama taleplerinin birçoğu orada yapıldı ve bu noktaların çoğunu netleştirdiğinizi söylediniz, ancak düzenlemeleriniz onları daha net hale getirmedi. Daha fazla metin eklemek yerine kafa karıştırıcı metni değiştirmek daha iyi olurdu.
xnor

Yanıtlar:


12

Pyth, 24 bayt

?}KcsJsQlJmcsdldtPyJK":(

Çevrimiçi deneyin: Gösteri

Dennis'e bir hatayı fark ettiği ve bir bayt golf yaptığı için teşekkür ederiz.

Açıklama:

?}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
İyi iş, +1. Ama Pyth'in anlamını hesaplamak için yerleşik bir özelliği yok mu?
Alex

@AlexA. Şimdi var bir (yani .O)
Sayın Xcoder

6

SWI-Prolog, 159 bayt

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(':(').

Olarak adlandırılan a([1,4,8,2,5],[3,1,5,2,5]).


5

Julia, 101 bayt

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

Bu, iki diziyi kabul eden ve buna göre bir dize veya kayan nokta döndüren bir işlev oluşturur.

Ungolfed + açıklaması:

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 Bayt

Temelde sanırım Jakubes ile aynı. Her iki listenin ortalaması, listenin birleşik uzunluğuna kadar olan ancak listenin toplam uzunluğu dahil edilmeyen değerlerin herhangi bir kombinasyonunun ortalamasıyla eşleşiyorsa, ortalamayı aksi halde üzgün yüzün çıktısını alın.

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

Test sürüşü

> 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

Jöle , 22 bayt

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

Çevrimiçi deneyin!

Yardımıyla Done Sn Xcoder içinde sohbet

açıklama

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)

İçin başarısız 2 6 2,6 3 5 -> 2 6,2 6 3 5 (moved 2) -> 4. Şimdi sadece eşit uzunlukta iki parçaya bölüyorsunuz.
Kevin Cruijssen
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.