Venn Diyagram Hücreleri


12

Örneğin göz önüne alındığında çok setleri s1={2,3,7}, s2={1,2,4,7,8}ve s3={4,7}bir Venn diyagramı görselleştirir bunlar grubu ya da bir elemanı olup olmadığına bağlı olarak, içinde ya da eğrinin çevresinin dışında ya olan kapalı bir eğri ve ayar elemanları tarafından her set. Tüm set elemanları Venn diyagramında sadece bir kez göründüğünden, birden fazla sette bir eleman varsa, her seti temsil eden eğrilerin çakışması gerekir. Her birine üst üste binen Venn diyagramının bir hücresi diyoruz .

Bu açıklama biraz kafa karıştırıcı olabilir, bu yüzden bir örneğe bakalım.

Misal

Kümeleri için A Venn diyagramı s1, s2ve s3bu gibi görünebilir:

Bu Venn diyagramının hücreleri (soldan sağa, üstten alta doğru okuyun) vardır {1,8}, {2}, {7}, {4}, {3}, {}ve {}.

Pratikte, biri genellikle iki veya üç setin Venn diyagramlarıyla karşılaşır, çünkü dört veya daha fazla setin Venn diyagramlarının temsili çok açık değildir. Bununla birlikte, örneğin altı set için vardır:

CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1472309

Görev

Herhangi bir makul gösterimde boş olmayan pozitif tamsayılar kümesi verildiğinde, girdi kümelerinin Venn diyagramındaki hücre kümesini döndürün. Özellikle, herhangi bir grafik gösterimidir gereklidir.

  • Tam bir program veya işlev yazabilirsiniz.
  • Yalnızca bir boş küme (yani hücre kümesi ) yerine boş hücreler (yani tüm hücrelerin listesi ) olduğu kadar boş küme döndürebilirsiniz .
  • Yukarıdaki örneğin girdi bazıları makul yolları bunlarla sınırlı değildir {{2,3,7},{1,2,4,7,8},{4,7}}, [[2,3,7],[1,2,4,7,8],[4,7]], "2,3,7;1,2,4,7,8;4,7"veya "2 3 7\n1 2 4 7 8\n4 7". Seçtiğiniz giriş biçiminin kabul edilebilir olup olmadığından şüpheniz varsa, yorumda sormaya çekinmeyin.
  • Çıktı biçiminiz mümkünse giriş biçiminizle eşleşmelidir. Bu kuralın, biçiminizin boş kümeleri net bir şekilde görüntüleyebilmesini gerektirdiğini unutmayın.
  • Bu , bu yüzden seçtiğiniz dilde mümkün olduğunca az bayt kullanmaya çalışın. Diller arasında değil dil başına rekabeti teşvik etmek için bir yanıtı kabul etmeyeceğim.

Test Durumları

Olası çıkışlarla birlikte bazı girişler:

input -> output
{{2,3,7},{1,2,4,7,8},{4,7}} -> {{1,8},{2},{7},{4},{3},{}} (or {{1,8},{2},{7},{4},{3},{},{}})
{{1,2,3},{4,5,6},{7,8,9}} -> {{1,2,3},{4,5,6},{7,8,9},{}}
{{}} -> {{}}
{{1,2,3},{1,2}} -> {{1,2},{3},{}}
{{4,3,8},{1,2,9,3},{14,7,8,5},{6,11,3,8},{10},{9,4,3,7,10}} -> {{6,11},{10},{4},{3},{8},{5,14},{1,2},{9},{7},{}}
{{2,3,4,7},{},{1,3,7,5,6},{2,3,7,5},{7,2,4,3,6},{1,4,5}} -> {{},{4},{2},{7,3},{1},{6},{5}}
{{1,2,3,4},{1,2,5,6},{1,3,5,7}} -> {{4},{3},{2},{1},{6},{5},{7}}

Bunun bir kümenin tanımı nedeniyle doğru olduğunu varsayıyorum, ancak alt kümelerden birinde hiçbir kopya olmayacağını varsayabilir miyiz?
HyperNeutrino

@Hyper Neutrino Evet, tüm setlerin yinelenmediğini varsayabilirsiniz.
Laikoni

Belki hiçbir hücrenin boş olmadığı bir test durumu ekleyebilirsiniz . Örneğin, {{1,2,3,4}, {1,2,5,6}, {1,3,5,7}}.
Ørjan Johansen

İkincisi nasıl vermiyor {{1,2,3},{4,5,6},{7,8,9},{},{},{},{}}?
Sızdıran Rahibe

1
@carusocomputing Daha yakından incelendiğinde bunun gerçek bir Venn diyagramı olmadığını göreceksiniz, çünkü bazı olası çakışmalar eksik.
Laikoni

Yanıtlar:


8

Haskell , 71 bayt

Tamsayıların listesini alıp benzer bir liste döndüren anonim bir işlev.

Olarak kullan (foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[])[[1,2,3],[1,2]].

import Data.List
foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[]

Çevrimiçi deneyin!

Nasıl çalışır

  • Küme benzeri işlemleri \\(fark) ve intersectden kullanır Data.List.
  • Boş listeden başlayarak "kümeler" listesini (listeler olarak temsil edilir) bir hücre listesine katlar [].
  • xşemaya eklenecek geçerli kümedir ve rönceden oluşturulmuş hücrelerin listesidir.
    • x\\(id=<<r)xzaten oluşturulmuş hücrelerin hiçbirinde olmayan öğelerin alt kümesidir .
    • [intersect x,(\\x)]<*>rher hücreyi r, öğelerinin içinde olup olmamasına göre ayırır x.
  • Kesinlikle yok değil boş hücreleri birleştirmek girişiminde, böylece çıktı olanların biraz vardır.

Uygulamamla aynı fikir, ancak iki bayt daha kısa. Aferin!
Laikoni

4

Jöle , 14 17 bayt

FṀ‘³iþ¬Ḅµ;ṀḶ$ĠṖṖ€

Çevrimiçi deneyin!

İşlev gönderme (Jelly varsayılan olarak listeleri yazdırdığı için gidiş-dönüş yapmaz - kendi çıktı biçimini okuyamaz - ancak bir işlev aynı biçimde girer ve çıkar). TIO bağlantısı, işlevi çalıştıran ve çıktısını girdinin ayrıştırıldığı formatta basan bir altbilgi içerir.

açıklama

FṀ‘³iþ¬Ḅµ;ṀḶ$ĠṖṖ€
FṀ‘               Find the largest number that appears in any of the input sets, + 1
   ³ þ            For each number from 1 to that number, and each of the input sets
    i ¬             find whether the number is missing from the set
       Ḅ          Convert the list of missing sets into a single number using binary
         ;        Append
        µ ṀḶ$     all numbers from 0 to the maximum value minus 1
             Ġ    Group indexes by values
              ṖṖ€ Delete the last group and last element of other groups

Tüm Venn şeması bölümleri kullanılmıyorsa, en az bir boş set çıkarmamız şartı burada programın yarısından fazlasını almayı başarır (bu , eşleşmeyen öğeler için en az bir grubumuz olduğundan emin olmamızı sağlar. başlangıçta kaç setin olduğunu ve artı hariç, kaynak kodun son dokuz baytını izlemek için Ġ). Uygulamanın temel yolu , "kümesiz" bölümünü dolduracak bir kukla giriş ve (daha sonra) her birine bir kukla giriş ekleyerek , tüm 2 ^ n Venn diyagram alt kümelerinin en az bir girişe sahip olmasını sağlamaktır. diğer bölümlerde Ġher alt küme için bir grup çıktısı verilir ṖṖ€.


En fazla 7 set için bir kısıtlama yoktur ve test durumlarından birinde daha fazlası vardır.
Ørjan Johansen

Orijinal setin 3 uzunluğuna sahip olduğunu varsaydım, çünkü Venn diyagramları böyle çalışıyor, ama görünüşe göre değil mi? Bu durumda, belki de sadece Venn diyagramının tüm bölümleri dolu değilse boş seti eklemek için farklı bir yola ihtiyacım var. Bu, başka türlü oldukça zarif bir soru üzerinde kötü bir leke.

Sanırım 7'yi 2 ^ n-1 ile değiştirebilirim.
Ørjan Johansen

Spec ile eşleşen 2 ^ n-1 değerine ulaşmak için bir yol buldum, ama acı uzun. Umarım daha kısa bir yol vardır, ama öyle olsa bile, bu soru sinir bozucu.

4

Perl 5, 79 bayt

sub{for$.(0..@_){$x{$_}+=2**$.for@{$_[$.]}};push@{$h{$x{$_}}},$_ for keys%x;%h}

Girişi [[2,3,7], [1,2,4,7,8], [4,7]] gibi anonim dizilerin bir listesi olarak alır. Anahtarların etiket olduğu ve değerlerin çıktı kümelerine karşılık gelen anonim diziler olduğu bir karma verir.

Tam bir programın parçası olarak:

*x=
sub{for$.(0..@_){$x{$_}+=2**$.for@{$_[$.]}};push@{$h{$x{$_}}},$_ for keys%x;%h};
%x=x([2,3,7],[1,2,4,7,8],[4,7]);
print"Set $_:@{$x{$_}}\n"for keys%x;

Açıklama:

Her kümeye etiket olarak bir tamsayı verir $.. Her benzersiz öğe için bir tamsayı depolayan bir karma oluşturur $_. Görünen 2**$.her kümeye ekler $_, her öğenin hangi kümelerde göründüğünü gösteren ikili bir harita oluşturur. Son olarak, Venn diyagramının her hücresi için anonim bir dizi oluşturur ve karşılık gelen kümelerde görünen öğeleri diziye iter. Böylece, her dizinin her elemanı aynı kümelerde ve dolayısıyla Venn diyagramının aynı hücresinde bulunur.


3

Pyth , 11 bayt

m-@Fds-Qdty

Test odası.

Nasıl çalışır

Venn diyagramının her bölgesi [kümelerin belirli kombinasyonlarında] bulunan ancak [diğer kümelerde] olmayan elemanları temsil eder.

Böylece, girişin güç setini bularak tüm olası kombinasyonları üretiyoruz (ve boş kombinasyonları çıkarıyoruz).

Oluşturulan her kombinasyon için, kombinasyondaki setlerin kesişimini buluruz ve diğer setlerdeki elemanları filtreleriz.

m-@Fds-Qdty  input as Q
          y  power set
         t   remove the first one (empty combination)
m            for each combination d:
  @Fd            find the intersection of all the sets in d
 -               filter out those who are in
     s               the union of
      -Qd            the sets not in the combination
                     (input minus combination)

2

JavaScript (ES6), 123 bayt

a=>a.map((b,i)=>b.map(e=>m[e]|=1<<i),m=[])&&[...Array(1<<a.length)].map((_,i)=>m.map((e,j)=>e==i&&j).filter(j=>j)).slice(1)
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.