Altküme-Toplam Sorunu Golf


15

Görev

Girdi olarak boşlukla sınırlanan tam sayıların bir listesi verildiğinde, her bir alt kümenin 0 olarak topladığı bu sayıların boş olmayan tüm alt kümelerini çıktılayın.


Test durumu

Giriş: 8 −7 5 −3 −2
Çıkış:-3 -2 5


Kazanan Ölçüt

Bu , yani bayt içindeki en kısa kod kazanır!


1
Giriş benzersiz olmayan sayılar içeriyorsa benzersizlik konusunda endişelenmeli miyiz? Başka bir deyişle, girdi için kaç sonuç yazdırmam gerekiyor 3 3 -3 -3?
Keith Randall

@Keith. Kural olarak, kümeler en fazla bir kez görünen farklı öğelerden oluşur. Birden çok kümede birden çok görünen öğe olabilir. en.wikipedia.org/wiki/Multiset
DavidC

4
@DavidCarraher, OP, terminolojiyi liste alt kümelerinden bahsederek karıştırır.
Peter Taylor

@PeterTaylor Teşekkürler. İyi bir nokta.
DavidC

Yanıtlar:


4

GolfScript, 41 karakter

~][[]]\{`{1$+$}+%}%;(;.&{{+}*!},{" "*}%n*

Belirli çıktı biçimini önemsemiyorsanız kodu 33 karaktere kısaltabilirsiniz.

~][[]]\{`{1$+$}+%}%;(;.&{{+}*!},`

Örnek ( çevrimiçi görün ):

> 8 -7 5 -3 -2 4
-3 -2 5
-7 -2 4 5
-7 -3 -2 4 8

6

Brachylog (2), 9 karakter

{⊇.+0∧}ᵘb

Çevrimiçi deneyin!

{⊇.+0∧}ᵘb
 ⊇           subset
   +0        that sums to 0
  .  ∧       output the subset
{     }ᵘ     take all unique solutions
        b    except the first (which is the empty solution)

4

Python, 119 karakter

def S(C,L):
 if L:S(C,L[1:]);S(C+[L[0]],L[1:])
 elif sum(map(int,C))==0and C:print' '.join(C)
S([],raw_input().split())

2 ^ n alt kümelerinin tümünü yinelemeli olarak numaralandırır ve her birini denetler.


Bravo! Bir karaktere geldim ...
boothby

3

Python, 120

Ben Keith'in çözümünden daha kötü bir karakterim. Ama ... bu mesaj atmayacak kadar yakın. Code-golf'ün en sevdiğim özelliklerinden biri, benzer uzunlukta çözümlerin ne kadar farklı olabileceğidir.

l=raw_input().split()
print[c for c in[[int(j)for t,j in enumerate(l)if 2**t&i]for i in range(1,2**len(l))]if sum(c)==0]

2

Python ( 128137) 136)

Lanet olsun, itertools.permutations böyle uzun bir isme sahip olduğunuz için!

Kaba kuvvet çözümü. Bunun en kısa değil olduğuna şaşırdım: ama sanırımitertools çözümü mahvediyor.

Ungolfed:

import itertools
initial_set=map(int, input().split())
ans=[]
for length in range(1, len(x)+1):
    for subset in itertools.permutations(initial_set, length):
        if sum(subset)==0:
            ans+=str(sorted(subset))
print set(ans)

Golf (çirkin çıktı):

from itertools import*
x=map(int,input().split())
print set(`sorted(j)`for a in range(1,len(x)+1)for j in permutations(x,a)if sum(j)==0)

Golf (güzel çıktı) (183):

from itertools import*
x=map(int,input().split())
print `set(`sorted(j)`[1:-1]for a in range(1,len(x)+1)for j in permutations(x,a)if sum(j)==0)`[5:-2].replace("'","\n").replace(",","")

import itertools as i: itertools modülünü içe aktarma ve çağırma i

x=map(int,input().split()): girdiyi boşluklara göre ayırır, ardından ortaya çıkan listelerin öğelerini tamsayılara dönüştürür ( 2 3 -5->[2, 3, -5] )

grubu ( sorted(j)i.permutations j aralığındaki bir (1, len (x) 1) (x, a) eğer toplamı (j) '== 0):
Tüm alt kümelerinin döndüren bir listesi x, burada toplamı, kriteri 0 olur ve yalnızca benzersiz öğeleri
( set(...)) alır

Etrafındaki mezarlar (`) sorted(j)Python'un kısaltmasıdır repr(sorted(j)). Burada olmasının nedeni Python'daki kümelerin listeleri işleyememesidir, bu nedenle bir sonraki en iyi şey, bir listeye sahip dizeleri metin olarak kullanmaktır.


Dizeler yerine tamsayıları nasıl alacağınız konusunda kafam karıştı. split()dizelerin bir listesini yapar, ancak daha sonra sumo bölümün alt kümelerini çağırırsınız.
Keith Randall

@KeithRandall: facepalm Acelem vardı, bu yüzden kodumu test etmedim. Bunu işaret ettiğiniz için teşekkür ederim.
beary605

Muhtemelen yaparak bir karakteri kurtarabilirsinfrom itertools import*
Matt

aslında mezarlar için kestirmerepr()
gnibbler

@gnibbler: `` Merhaba '' çalıştırırken çok daha mantıklı olurdu. Teşekkürler!
beary605

2

384 karakter

Tamam, C # 'da fonksiyonel tarzda programlama o kadar kısa değil , ama seviyorum ! (Sadece kaba kuvvet sayımı kullanmak, daha iyi bir şey değil.)

using System;using System.Linq;class C{static void Main(){var d=Console.ReadLine().Split(' ').Select(s=>Int32.Parse(s)).ToArray();foreach(var s in Enumerable.Range(1,(1<<d.Length)-1).Select(p=>Enumerable.Range(0,d.Length).Where(i=>(p&1<<i)!=0)).Where(p=>d.Where((x,i)=>p.Contains(i)).Sum()==0).Select(p=>String.Join(" ",p.Select(i=>d[i].ToString()).ToArray())))Console.WriteLine(s);}}

Daha fazla okunabilirlik için biçimlendirilmiş ve yorumlanmıştır:

using System;
using System.Linq;

class C
{
    static void Main()
    {
        // read the data from stdin, split by spaces, and convert to integers, nothing fancy
        var d = Console.ReadLine().Split(' ').Select(s => Int32.Parse(s)).ToArray();
        // loop through all solutions generated by the following LINQ expression
        foreach (var s in
            // first, generate all possible subsets; well, first just their numbers
            Enumerable.Range(1, (1 << d.Length) - 1)
            // convert the numbers to the real subsets of the indices in the original data (using the number as a bit mask)
            .Select(p => Enumerable.Range(0, d.Length).Where(i => (p & 1 << i) != 0))
            // and now filter those subsets only to those which sum to zero
            .Where(p => d.Where((x, i) => p.Contains(i)).Sum() == 0)
            // we have the list of solutions here! just convert them to space-delimited strings
            .Select(p => String.Join(" ", p.Select(i => d[i].ToString()).ToArray()))
        )
            // and print them!
            Console.WriteLine(s);
    }
}

2

SWI-Prolog 84

Bu sürüm, yüklemdeki bir terim için uygun bir bağlayıcı bulmaya çalışmak yerine listeyi yazdırır.

s([],O):-O=[_|_],sum_list(O,0),print(O).
s([H|T],P):-s(T,[H|P]).
s([_|T],O):-s(T,O).

Giriş metodu

s([8,-7,5,-3,-2,4],[]).

Kayıt için, bu yüklemi karşılamak için bir bağ bulan sürümdür:

s(L,O):-s(L,0,O),O=[_|_].
s([],0,[]).
s([H|T],S,[H|P]):-R is H+S,s(T,R,P).
s([_|T],S,O):-s(T,S,O).

Giriş metodu

s([8,-7,5,-3,-2,4],O).

Önceki düzeltme boş kümeyi kaldırmayı başaramayan tamamlanmamış bir çözüm içeriyor.


2

Mathematica 62 57 38

kod

Bir dizide tamsayı olarak girilen girdi x,.

x

giriş

Grid@Select[Subsets@x[[1, 1]], Tr@# == 0 &]

Çıktı

çıktı


açıklama

x[[1, 1]] girdiyi tamsayılar listesine dönüştürür.

Subsets tamsayılardan tüm altkümeleri oluşturur.

Select....Tr@# == 0 toplamı 0'a eşit olan tüm bu altkümeleri verir.

Grid seçilen alt kümeleri boşlukla ayrılmış tamsayılar olarak biçimlendirir.


2

Jöle , 6 bayt

ŒPḊSÐḟ

Çevrimiçi deneyin!

Sadece bütünlük için. Brachylog'a benzer şekilde, Jelly de meydan okumayı sonlandırıyor, ancak şu ana kadar yeni diller normal olarak rekabet ediyor.

ŒP       Power set.
  Ḋ      Dequeue, remove the first element (empty set).
    Ðḟ   Filter out the subsets with truthy (nonzero)...
   S       sum.


1

J, 57 53 51 49 karakterler

>a:-.~(#:@i.@(2&^)@#<@":@(#~0=+/)@#"1 _])".1!:1[1

Kullanımı:

   >a:-.~(#:@i.@(2&^)@#<@":@(#~0=+/)@#"1 _])".1!:1[1
8 _7 5 _3 _2 4
5 _3 _2
_7 5 _2 4
8 _7 _3 _2 4

Trenin yeniden yazılması (<@":@(#~0=+/)@#"1 _~2#:@i.@^#)4 karakter kazandırır.
algoritmalarhark


1

J , 34 bayt

(a:-.~](<@#~0=+/)@#~[:#:@i.2^#)@".

Çevrimiçi deneyin!

Nasıl

".girişi bir listeye dönüştürür. sonra:

a: -.~ ] (<@#~ (0 = +/))@#~ [: #:@i. 2 ^ #
                                  i.       NB. ints from 0 to...
                                     2 ^ # NB. 2 to the input len
                            [: #:@         NB. converted to binary masks
       ] (             ) #~                NB. filter the input using
                                           NB. using those masks, giving
                                           NB. us all subsets
         (             )@                  NB. and to each one...
         (  #~ (0 = +/))                   NB. return it if its sum is
                                           NB. 0, otherwise make it 
                                           NB. the empty list.
         (<@           )                   NB. and box the result.
                                           NB. now we have our answers
                                           NB. and a bunch of empty 
                                           NB. boxes, or aces (a:).
a: -.~                                     NB. remove the aces.

1

Perl 6 , 51 bayt

*.words.combinations.skip.grep(!*.sum)>>.Bag.unique

Çevrimiçi deneyin!

0'a eşit olan benzersiz Çantaların listesini döndürür. Bir Çanta ağırlıklı bir Settir.

Açıklama:

*.words                 # Split by whitespace
 .combinations          # Get the powerset
 .skip                  # Skip the empty list
 .grep(!*.sum)          # Select the ones that sum to 0
 >>.Bag                 # Map each to a weighted Set
 .unique                # And get the unique sets

0

Yakut, 110 bayt

a=gets.split.map &:to_i;b=[];(1...a.length).each{|c|a.permutation(c){|d|d.sum==0?b<<d:0}};p b.map(&:sort).uniq

Daha sonra TIO bağlantısı ekleyecek.

Stdin'den bir sayı listesi olarak girdi alır, örn. 8 −7 5 −3 −2

Nasıl çalışır: Girdiyi bir sayı dizisine dönüştürür. 1'den dizinin uzunluğuna kadar olan uzunlukların tüm permütasyonlarını alır. 0'a eşitlerse bunları çıkış dizisine ekler. Diziyi yinelenmeden çıktılar.

Örnek giriş için çıkış: [[-3, -2, 5]]

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.