সাবসেট-সাম সমস্যা গল্ফ


15

কার্য

ইনপুট হিসাবে স্পেস-সীমাবদ্ধ পূর্ণসংখ্যার একটি তালিকা দেওয়া হয়েছে, এই সংখ্যার সমস্ত অনন্য-খালি সাবসেট আউটপুট দেয় যা প্রতিটি উপসেটের যোগফল 0 হয়।


পরীক্ষা ক্ষেত্রে

ইনপুট: 8 −7 5 −3 −2
আউটপুট:-3 -2 5


বিজয়ী মানদণ্ড

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী!


1
যদি ইনপুটটিতে অ-অনন্য সংখ্যা থাকে তবে আমাদের কী স্বতন্ত্রতা নিয়ে চিন্তা করতে হবে? অন্য কথায়, ইনপুটটির জন্য আমার কতগুলি ফলাফল মুদ্রণ করতে হবে 3 3 -3 -3?
কিথ র্যান্ডাল

@Keith। কনভেনশন অনুসারে, সেটগুলিতে স্বতন্ত্র উপাদানগুলি থাকে যা একবারে প্রদর্শিত হয়। বহুগুণে এমন উপাদান থাকতে পারে যা একাধিকবার প্রদর্শিত হতে পারে। en.wikipedia.org/wiki/Multiset
DavidC

4
@ ডেভিডকারারহর, ওপি তালিকার উপধারার বিষয়ে কথা বলে পরিভাষার সাথে মিশ্রিত হয়েছে।
পিটার টেলর

@ পিটারটেলর ধন্যবাদ ভাল যুক্তি.
ডেভিডসি

উত্তর:


4

গল্ফস্ক্রিপ্ট, ৪১ টি অক্ষর

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

আপনি যদি নির্দিষ্ট আউটপুট ফর্ম্যাটটির বিষয়ে চিন্তা না করেন তবে আপনি কোডটি 33 অক্ষরে সংক্ষিপ্ত করতে পারেন।

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

উদাহরণ ( অনলাইন দেখুন ):

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


4

পাইথন, ১১৯ টি চর

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 সাবসেটগুলি পুনরাবৃত্তভাবে গণনা করে এবং প্রতিটি পরীক্ষা করে।


বলিহারি! আমি একটি চরিত্রের মধ্যে এসেছি ...
বুথবি

3

পাইথন, 120

আমি কীথের সমাধানের চেয়ে আরও খারাপ একটি চরিত্র। তবে ... এটি পোস্ট না করার খুব কাছাকাছি। কোড-গল্ফের আমার পছন্দের বৈশিষ্ট্যগুলির মধ্যে হ'ল অনুরূপ দৈর্ঘ্যের সমাধানগুলি কতটা ভিন্ন।

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

পাইথন ( 128 137 136)

itertools.permutationsএত লম্বা নাম থাকার জন্য আপনাকে অভিশাপ !

নিষ্ঠুর বল সমাধান। আমি অবাক হয়েছি এটি সবচেয়ে কম নয়: তবে আমি অনুমান করি itertoolsসমাধানটি নষ্ট হয়ে গেছে।

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)

গল্ফযুক্ত (কুরুচিপূর্ণ আউটপুট):

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)

গল্ফড (চমত্কার আউটপুট) (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: ইটারটুলস মডিউলটি আমদানি করে এটিকে কল করে i

x=map(int,input().split()): ফাঁকা স্থান দ্বারা ইনপুট পৃথক করে, তারপরে ফলাফলের তালিকাগুলি আইটেমগুলিকে পূর্ণসংখ্যায় পরিণত করে ( 2 3 -5-> [2, 3, -5])

সেট ( sorted(j)সীমার মধ্যে একটি জন্য (1, LEN (i.permutations মধ্যে x) এর +1 টি) ঞ জন্য (এক্স, ক) যদি যোগফল (ঞ) == 0):
রিটার্নস একটি সমস্ত সাব-সেট নির্বাচন তালিকা x, সাজানো, যেখানে সমষ্টি 0 হয় এবং তারপরে কেবল অনন্য আইটেমগুলি পাওয়া যায়
( set(...))

আশেপাশের কবরগুলি (`) sorted(j)পাইথন শর্টহ্যান্ডের জন্য repr(sorted(j))। এটি এখানে থাকার কারণটি কারণ পাইথনের সেটগুলি তালিকাগুলি পরিচালনা করতে পারে না, তাই পরবর্তী সেরা জিনিসটি পাঠ্য হিসাবে একটি তালিকা সহ স্ট্রিংগুলি ব্যবহার করা উচিত।


আপনি কীভাবে স্ট্রিংয়ের পরিবর্তে পূর্ণসংখ্যা পাচ্ছেন সে সম্পর্কে আমি বিভ্রান্ত। split()স্ট্রিংগুলির একটি তালিকা তৈরি করে তবে তারপরে আপনি sumসেই বিভক্তির সাবসেটগুলিতে কল করছেন ।
কিথ র্যান্ডাল

@ কিথরান্ডাল: ফেসপাম আমি ভিড় করেছিলাম, তাই আমি আমার কোড পরীক্ষা করিনি। এটি নির্দেশ করার জন্য আপনাকে ধন্যবাদ।
beary605

আপনি সম্ভবত একটি অক্ষর সংরক্ষণ করতে পারেনfrom itertools import*
ম্যাট

আসলে কবরগুলি শর্টহ্যান্ডrepr()
gnibbler

@gnibbler: `'হ্যালো' running চালানোর সময় এটি আরও অনেক অর্থবোধ করে` ধন্যবাদ!
beary605

2

সি # - 384 টি অক্ষর

ঠিক আছে, সি # তে ক্রিয়ামূলক শৈলীর প্রোগ্রামিং খুব কম নয় , তবে আমি এটি পছন্দ করি! (কেবলমাত্র একটি নিষ্ঠুর শক্তি গণনা ব্যবহার করা, এর চেয়ে ভাল আর কিছু নয়))

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);}}

আরও পঠনযোগ্যতার জন্য ফর্ম্যাট করা এবং মন্তব্য করা হয়েছে:

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

এসডাব্লুআই-প্রোলগ 84

এই সংস্করণটি একটি ছদ্মবেশী শর্তে একটি উপযুক্ত আবশ্যক সন্ধানের পরিবর্তে তালিকাটি মুদ্রণ করে।

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

ইনপুট পদ্ধতি

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

রেকর্ডের জন্য, এটি এমন একটি সংস্করণ যা ভবিষ্যদ্বাণীটিকে সন্তুষ্ট করার জন্য একটি বাধ্যতামূলক সন্ধান করে:

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

ইনপুট পদ্ধতি

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

পূর্ববর্তী পুনর্বিবেচনায় একটি অসম্পূর্ণ সমাধান রয়েছে যা খালি সেট অপসারণ করতে পরিচালনা করে না।


2

গণিত 62 57 38

কোড

ইনপুটটি একটি অ্যারেতে পূর্ণসংখ্যা হিসাবে প্রবেশ করেছে x,।

x

ইনপুট

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

আউটপুট

আউটপুট


ব্যাখ্যা

x[[1, 1]] পূর্ণসংখ্যার তালিকায় ইনপুটটিকে রূপান্তর করে।

Subsets পূর্ণসংখ্যা থেকে সমস্ত উপগ্রহ উত্পন্ন করে।

Select....Tr@# == 0 0 টির সমান মোট সমস্ত সাবসেট দেয়।

Grid নির্বাচিত সাবসেটগুলি স্থান-বিভাজিত পূর্ণসংখ্যার আকারে ফর্ম্যাট করে।


2

জেলি , 6 বাইট

ŒPḊSÐḟ

এটি অনলাইন চেষ্টা করুন!

শুধু সম্পূর্ণতার জন্য। ব্র্যাচ্লাগের অনুরূপ, জেলিও চ্যালেঞ্জ পোস্টডেট করে, তবে এখন অবধি নতুন ভাষা সাধারণত প্রতিযোগিতা করে compete

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


1

জে, 57 53 51 49 টি অক্ষর

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

ব্যবহার:

   >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

ট্রেনটি পুনরায় (<@":@(#~0=+/)@#"1 _~2#:@i.@^#)লেখায় 4 টি অক্ষর সংরক্ষণ করা হয়।
অ্যালগরিদমশর্ক

1

স্ট্যাক্স , 8 বাইট সিপি 437

â±3╒yΣ╓à

চালান এবং অনলাইন ডিবাগ!

ব্যাখ্যা

ব্যাখ্যা করার জন্য আনপ্যাক করা সংস্করণ (9 বাইট) ব্যবহার করে।

LS{|+!fmJ
L            Convert to list
 S           Powerset
  {   f      Filter with block
   |+!       Sum is zero
       mJ    Print each subset, joined by spaces

Given a list of space-delimited integers as input; আপনি - তবে - ইনপুট হিসাবে একটি তালিকা নিচ্ছেন।
জোনাথন ফ্রেচ

এক বাইটের দামে ঠিক করবে।
ওয়েইজুন ঝো

1

জে , 34 বাইট

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

এটি অনলাইন চেষ্টা করুন!

কিভাবে

".ইনপুটটিকে একটি তালিকায় রূপান্তর করে। তারপর:

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

পার্ল 6 , 51 বাইট

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

এটি অনলাইন চেষ্টা করুন!

0 টির মতো অনন্য ব্যাগের একটি তালিকা ফেরত দেয় একটি ব্যাগ একটি ভারী সেট।

ব্যাখ্যা:

*.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

রুবি, ১১০ বাইট

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

টিআইও লিঙ্কটি পরে যুক্ত করবে।

সংখ্যাগুলির একটি তালিকা হিসাবে স্টিডিন থেকে ইনপুট নেয় 8 −7 5 −3 −2

এটি কীভাবে কাজ করে: এটি ইনপুটটিকে সংখ্যার অ্যারে রূপান্তর করে। 1 থেকে অ্যারের দৈর্ঘ্য পর্যন্ত দৈর্ঘ্যের সমস্ত ক্রিয়াকলাপ পান। এটি 0 এর যোগফল হলে এটি আউটপুট অ্যারেতে যুক্ত করে It এটি নকল ছাড়াই অ্যারে আউটপুট করে।

নমুনা ইনপুট জন্য আউটপুট: [[-3, -2, 5]]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.