แบ่งคำออกเป็นส่วน ๆ ด้วยคะแนนเท่ากัน


9

สมมติว่า A = 1, B = 2 ... Z = 26 และค่าของคำคือผลรวมของค่าตัวอักษรเหล่านี้มันเป็นไปได้ที่จะแบ่งคำบางคำออกเป็นสองชิ้นโดยที่พวกเขามีค่าเท่ากัน

ตัวอย่างเช่น "wordsplit" สามารถแบ่งออกเป็นสองส่วนดังนี้: ordsl wpit เนื่องจาก o + r + d + s + l = w + p + i + t

นี่เป็นความท้าทายที่ครูคอมพิวเตอร์ของเรามอบให้ - มันเป็นความท้าทายของ Lionhead Studios ที่เห็นได้ชัด ฉันได้แก้ไขมันใน Python และจะโพสต์คำตอบของฉันในไม่ช้า

ถาม:โปรแกรมที่สั้นที่สุดซึ่งสามารถแยกรายการที่เป็นไปได้ทั้งหมดซึ่งมีคะแนนเท่ากัน โปรดทราบว่าจะต้องมีรายการหนึ่งรายการสำหรับแต่ละกลุ่มของตัวอักษร - ordsl wpit นั้นเหมือนกับ rdosl wtip เป็นต้น มันง่ายกว่าที่จะแสดงรายการพวกเขาตามลำดับที่มาในคำศัพท์

โบนัส:

  • หากคุณเน้นคู่ที่ทั้งสองคำเป็นคำภาษาอังกฤษที่ถูกต้อง (หรือการเรียงลำดับตัวอักษรบางอย่าง) ให้ใช้รายการคำบางชนิด (สามารถทำได้โดยการใส่เครื่องหมายดอกจันติดกับวิธีอื่นหรือวิธีอื่น แต่ทำให้ชัดเจน)
  • การเพิ่มตัวเลือกสำหรับการลบรายการที่ซ้ำกัน (นี่ไม่ควรเป็นค่าเริ่มต้น)
  • สนับสนุนมากกว่าสองแยกตัวอย่างเช่นแยกสามสี่หรือ n ทาง

โปรแกรมจะต้องรองรับอินพุตตัวพิมพ์ผสมหรือไม่ และถ้าเป็นเช่นนั้นมันสามารถทิ้งเคสสำหรับเอาต์พุตได้หรือไม่?
Nemo157

@ Nemo157 มันอาจเพิกเฉยกรณีและไม่ต้องเก็บไว้ในผลลัพธ์
โทมัสโอ

เอาต์พุตของโปรแกรมสามารถเพิ่มสิ่งต่าง ๆ ได้ตราบใดที่ส่วนที่ร้องขอของเอาต์พุตนั้นชัดเจนต่อมนุษย์?
JB

@JB ใช่มันสามารถ
โทมัส O

ตกลงฉันจะปรับปรุง Perl นั้นแล้ว) ขอบคุณ
JB

คำตอบ:


4

Perl, 115 118 123

@_=~/./g;for$i(1..1<<@_){$l=$
r;$i&1<<$_?$l:$r+=64-ord$_[$_
]for 0..$#_;$l-$r||$i&1<<$_&&
print$_[$_]for 0..$#_;say""}

perl -nE '<code goes here>'ทำงานด้วย 'n' นั้นจะถูกนับในขนาดรหัส

Respaced:

@_ = /./g;
for $i (1 .. 1<<@_) {
  $l = $r;
  $i & 1<<$_ ? $l : $r -= 64 - ord $_[$_] for 0 .. $#_;

  $l - $r      ||
  $i & 1<<$_   &&
  print $_[$_]
    for 0 .. $#_;

  say ""
}

ด้วยความคิดเห็นและชื่อตัวแปร:

# split a line of input by character
@chars = /./g;

# generate all binary masks of same length
for $mask (1 .. 1<<@_) {

  # start at "zero"
  $left_sum = $right_sum;

  # depending on mask, choose left or right count
  # 1 -> char goes left; 0 -> char goes right
  $mask & 1<<$_ ? $left_sum : $right_sum
    -= 64 - ord $chars[$_]   # add letter value
      for 0 .. $#chars;      # for all bits in mask

  # if left = right
  $left_sum - $right_sum ||

  # if character was counted left (mask[i] = 1)
  $mask & 1<<$_          &&

  # print it
  print $chars[$_]

  # ...iterating on all bits in mask
    for 0 .. $#chars;

  # newline
  say ""
}

เทคนิคบางอย่างที่ใช้:

  • 1..1<<@_ครอบคลุมช่วงบิตเดียวกับ0..(1<<@_)-1แต่สั้นกว่า (โปรดทราบว่าการพิจารณาปัญหาจากที่ไกลออกไปรวมถึงขอบเขตของช่วงหลายครั้งจะไม่ส่งผลให้เกิดผลลัพธ์ที่ผิด)
  • $ left_range และ $ right_range จะไม่ถูกรีเซ็ตเป็นศูนย์ตัวเลข "0" จริง: เนื่องจากเราเพิ่งสะสมและเปรียบเทียบมันในตอนท้ายสิ่งที่เราต้องมีคือเริ่มต้นที่ค่าเดียวกัน
  • การลบ64-ord$_[$_]แทนการเพิ่มord$_[$_]-64จะชนะตัวละครที่มองไม่เห็น: เนื่องจากลงท้ายด้วยตัวคั่นจึงทำให้มีช่องว่างก่อนที่forไม่จำเป็น
  • Perl ช่วยให้คุณกำหนดให้กับตัวแปรที่กำหนดโดยตัวดำเนินการเงื่อนไขที่ประกอบcond ? var1 : var2 = new_valueไปด้วย:
  • นิพจน์บูลีนที่ถูกโยง&&และ||ใช้แทนเงื่อนไขที่เหมาะสม
  • $l-$r สั้นกว่า $l!=$r
  • จะออกบรรทัดใหม่แม้ในการแยกที่ไม่สมดุล บรรทัดว่างเปล่าเป็นไปตามกฎ! ฉันถาม!

สนใจที่จะอธิบายสำหรับพวกเราที่ไม่พูดเสียงเส้น? ดูเหมือนว่าคุณใช้วิธีไบนารีมาสก์คล้ายกับของฉันและฉันเห็น 64 หมายถึง '@' = 'A' - 1 และหลังจากนั้นฉันก็หลงทางมาก
dmckee --- ผู้ดูแลอดีตลูกแมว

การแก้ไขนี้ดีขึ้นหรือไม่
JB

ดี ฉันต้องคิดเกี่ยวกับการใช้ประโยชน์จากการเพิ่มแต่ละการนับไปทางซ้ายหรือสิ่งผลรวมที่เหมาะสม ควรเห็นได้ชัด แต่ฉันก็พลาดไป
dmckee --- ผู้ดูแลอดีตลูกแมว

3

J (109)

~.(/:{[)@:{&a.@(96&+)&.>>(>@(=/@:(+/"1&>)&.>)#[),}.@(split~&.>i.@#@>)@<@(96-~a.&i.)"1([{~(i.@!A.i.)@#)1!:1[1

เอาท์พุทสำหรับwordsplit:

┌─────┬─────┐
│lorw│dipst│
├─────┼─────┤
│diltw│oprs│
├─────┼─────┤
│iptw│dlors│
├─────┼─────┤
│dlors│iptw│
├─────┼─────┤
│oprs│diltw│
├─────┼─────┤
│dipst│lorw│
└─────┴─────┘

คำอธิบาย:

  • 1!:1[1: อ่านบรรทัดจาก stdin
  • ([{~(i.@!A.i.)@#): รับพีชคณิตทั้งหมด
  • "1: สำหรับการเปลี่ยนแปลงแต่ละครั้ง:
  • (96-~a.&i.): รับคะแนนตัวอักษร
  • }.@(split~&.>i.@#@>)@<: แบ่งการเรียงสับเปลี่ยนของคะแนนที่แต่ละช่องว่างยกเว้นก่อนและหลังหมายเลขสุดท้าย
  • >(>@(=/@:(+/"1&>)&.>)#[): ดูว่าพีชคณิตใดมีการจับคู่ครึ่งหนึ่งแล้วเลือกสิ่งเหล่านี้
  • {&a.@(96&+)&.>: เปลี่ยนคะแนนกลับเป็นตัวอักษร
  • ~.(/:{[): ลบความแตกต่างเล็กน้อย (เช่นordsl wpitและordsl wpti)

คำตอบของคุณบางคำซ้ำกัน
DavidC

@DavidCarraher: เอ่อฉันตาบอดหรืออันนี้ไม่ได้หรือไม่เป็นคำตอบล่าสุดของฉัน ฉันไม่เคยคัดลอกคำตอบของคนอื่นโดยมีจุดประสงค์ถึงแม้ว่าคุณจะทำได้ถูกต้องฉันโพสต์ที่นี่ในขณะที่เมาบางครั้งและไม่จำจนกว่าฉันจะได้รับจำนวนมากของ downvotes และปรากฎว่าฉันส่งสิ่งที่ไม่ได้ ใกล้เพื่อแก้ไข หากคุณเห็นฉันทำงานผิดปกติอาจจะแสดงความคิดเห็นที่ฉันทำงานผิดปกติแล้วฉันจะลบคำตอบที่ละเมิด หรือบางทีพวกเขาลงคะแนนเพราะนั่นคือสิ่งที่ downvote สำหรับ
marinus

ไม่มีเจตนาเล็กน้อย ยกตัวอย่างเช่นฉันหมายถึงว่าคำตอบแรกของคุณคือ {"lorw", "dipst"} เป็นคำตอบสุดท้ายที่ซ้ำกันของคุณ {"dipst", "lorw"} ลำดับของคำต่างกันเท่านั้น
DavidC

@DavidCarraher: อ้าว: PI คิดว่าคุณหมายถึงฉันได้คัดลอกคำตอบของใครบางคน ... แล้วคำถามนี้พูดว่า (ถ้าฉันตีความถูกต้อง) เพื่อลบรายการที่ซ้ำกันที่แต่ละส่วนเป็นเพียงการเรียงสับเปลี่ยนของกันและกัน แต่ไม่เอาออก คนที่สั่งซื้อของชิ้นส่วนที่แตกต่างกันเช่นถ้า{a,bc}พบแล้วจะลบแต่ไม่ได้ลบ{a,cb} {bc,a}(และแน่นอนฉันไม่ได้โกรธเคืองถ้าจริงผม / ได้ / ซ้ำคำตอบของใครบางคนที่ฉันต้องการมันถ้ามีคนชี้ให้มันออกมา.)
marinus

คุณดูเหมือนจะถูกต้อง คำแนะนำบอกว่ามันก็โอเคที่จะเพิกเฉยต่อคำ ("โปรดทราบว่ามันจะมีเพียงรายการเดียวสำหรับแต่ละกลุ่มของตัวอักษร") แต่พวกเขาไม่ต้องการมัน นี่อาจช่วยฉันสักสองสามตัว ขอบคุณ
DavidC

2

c99 - 379 อักขระที่จำเป็น

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int s(char*w,int l,int m){int b,t=0;for(b=0;b<l;++b){t+=(m&1<<b)?toupper(w[b])-64:0;}return t;}
void p(char*w,int l,int m){for(int b=0;b<l;++b){putchar((m&1<<b)?w[b]:32);}}
int main(){char w[99];gets(w);int i,l=strlen(w),m=(1<<l),t=s(w,l,m-1);
for(i=0;i<m;i++){if(s(w,l,i)==t/2){p(w,l,i);putchar(9);p(w,l,~i);putchar(10);}}}

วิธีนี้ค่อนข้างชัดเจน มีฟังก์ชั่นที่รวมคำตามหน้ากากและคำที่พิมพ์ออกมาตามหน้ากาก อินพุตจากอินพุตมาตรฐาน สิ่งหนึ่งที่แปลกก็คือรูทีนการพิมพ์จะแทรกช่องว่างสำหรับตัวอักษรที่ไม่อยู่ในหน้ากาก แท็บใช้เพื่อแยกกลุ่ม

ฉันไม่ได้ทำรายการโบนัสและไม่สามารถแปลงเพื่อสนับสนุนพวกเขาได้อย่างง่ายดาย

อ่านและแสดงความคิดเห็น:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int s(char *w, int l, int m){ /* word, length, mask */
  int b,t=0;                  /* bit and total */
  for (b=0; b<l; ++b){        
/*     printf("Summing %d %d %c %d\n",b,m&(1<<b),w[b],toupper(w[b])-'A'-1); */
    t+=(m&1<<b)?toupper(w[b])-64:0; /* Add to toal if masked (A-1 = @ = 64) */
  }
  return t;
}
void p(char *w, int l, int m){
  for (int b=0; b<l; ++b){ 
    putchar((m&1<<b)?w[b]:32);  /* print if masked (space = 32) */
  }
}
int main(){
  char w[99];
  gets(w);
  int i,l=strlen(w),m=(1<<l),t=s(w,l,m-1);
/*   printf("Word is '%s'\n",w); */
/*   printf("...length %d\n",l); */
/*   printf("...mask   0x%x\n",m-1); */
/*   printf("...total  %d\n",t); */
  for (i=0; i<m; i++){
/*     printf("testing with mask 0x%x...\n",i); */
    if (s(w,l,i)==t/2) {p(w,l,i); putchar(9); p(w,l,~i); putchar(10);}
    /* (tab = 9; newline = 10) */
  }
}

การตรวจสอบ

 $ wc wordsplit_golf.c
  7  24 385 wordsplit_golf.c
 $ gcc -std=c99 wordsplit_golf.c
 $ echo wordsplit | ./a.out
warning: this program uses gets(), which is unsafe.
 or sp          w  d  lit
wor   l            dsp it
 ords l         w    p it
w    p it        ords l  
   dsp it       wor   l  
w  d  lit        or sp   

1

Ruby: 125 ตัวอักษร

r=->a{a.reduce(0){|t,c|t+=c.ord-96}}
f=r[w=gets.chomp.chars]
w.size.times{|n|w.combination(n).map{|s|p([s,w-s])if r[s]*2==f}}

วิ่งตัวอย่าง:

bash-4.2$ ruby -e 'r=->a{a.reduce(0){|t,c|t+=c.ord-96}};f=r[w=gets.chomp.chars.to_a];w.size.times{|p|w.combination(p).map{|q|p([q,w-q])if r[q]*2==f}}' <<< 'wordsplit'
[["w", "o", "r", "l"], ["d", "s", "p", "i", "t"]]
[["w", "p", "i", "t"], ["o", "r", "d", "s", "l"]]
[["o", "r", "s", "p"], ["w", "d", "l", "i", "t"]]
[["w", "d", "l", "i", "t"], ["o", "r", "s", "p"]]
[["o", "r", "d", "s", "l"], ["w", "p", "i", "t"]]
[["d", "s", "p", "i", "t"], ["w", "o", "r", "l"]]

1

Mathematica 123 111

พบว่าส่วนย่อยของคำที่มี 1/2 "ASCII รวม" dของคำว่า จากนั้นค้นหาการเติมเต็มของชุดย่อยเหล่านั้น

d = "WORDSPLIT"

{#, Complement[w, #]}&/@Cases[Subsets@#,x_/;Tr@x==Tr@#/2]&[Sort[ToCharacterCode@d - 64]];
FromCharacterCode[# + 64] & /@ %

{{"IPTW", "DLors"}, {"LORW", "DIPST"}, {"OPRS", "DILTW"}, {"DILTW", "OPRS"}, {"DIPST", "LORW"} , {"DLORS", "IPTW"}}


1

J, 66 ตัวอักษร

ใช้ตัวเลขของ base2 ตัวเลขเพื่อเลือกชุดย่อยที่เป็นไปได้ทั้งหมด

   f=.3 :'(;~y&-.)"{y#~a#~(=|.)+/"1((+32*0&>)96-~a.i.y)#~a=.#:i.2^#y'
   f 'WordSplit'
┌─────┬─────┐
│Worl │dSpit│
├─────┼─────┤
│Wdlit│orSp │
├─────┼─────┤
│Wpit │ordSl│
├─────┼─────┤
│ordSl│Wpit │
├─────┼─────┤
│orSp │Wdlit│
├─────┼─────┤
│dSpit│Worl │
└─────┴─────┘

0

ทางออกของฉันอยู่ด้านล่าง มันเป็นแอนตี้ - กอล์ฟขนาดเท่ากัน แต่มันใช้งานได้ดีมาก รองรับการแยก n-way (แม้ว่าเวลาในการคำนวณจะนานมากสำหรับการแยกมากกว่า 3 ครั้ง) และรองรับการลบรายการที่ซ้ำกัน

class WordSplitChecker(object):
    def __init__(self, word, splits=2):
        if len(word) == 0:
            raise ValueError, "word too short!"
        if splits == 0:
            raise ValueError, "splits must be > 1; it is impossible to split a word into zero groups"
        self.word = word
        self.splits = splits

    def solve(self, uniq_solutions=False, progress_notifier=True):
        """To solve this problem, we first need to consider all the possible
        rearrangements of a string into two (or more) groups.

        It turns out that this reduces simply to a base-N counting algorithm,
        each digit coding for which group the letter goes into. Obviously
        the longer the word the more digits needed to count up to, so 
        computation time is very long for larger bases and longer words. It 
        could be sped up by using a precalculated array of numbers in the
        required base, but this requires more memory. (Space-time tradeoff.)

        A progress notifier may be set. If True, the default notifier is used,
        if None, no notifier is used, and if it points to another callable,
        that is used. The callable must take the arguments as (n, count, 
        solutions) where n is the number of iterations, count is the total 
        iteration count and solutions is the length of the solutions list. The
        progress notifier is called at the beginning, on every 1000th iteration, 
        and at the end.

        Returns a list of possible splits. If there are no solutions, returns
        an empty list. Duplicate solutions are removed if the uniq_solutions
        parameter is True."""
        if progress_notifier == True:
           progress_notifier = self.progress 
        solutions = []
        bucket = [0] * len(self.word)
        base_tuple = (self.splits,) * len(self.word)
        # The number of counts we need to do is given by: S^N,
        # where S = number of splits,
        #       N = length of word.
        counts = pow(self.splits, len(self.word))
        # xrange does not create a list in memory, so this will work with very
        # little additional memory.
        for i in xrange(counts):
            groups = self.split_word(self.word, self.splits, bucket)
            group_sums = map(self.score_string, groups)
            if len(set(group_sums)) == 1:
                solutions.append(tuple(groups))
            if callable(progress_notifier) and i % 1000 == 0:
                progress_notifier(i, counts, len(solutions))
            # Increment bucket after doing each group; we want to include the
            # null set (all zeroes.)
            bucket = self.bucket_counter(bucket, base_tuple)
        progress_notifier(i, counts, len(solutions))
        # Now we have computed our results we need to remove the results that
        # are symmetrical if uniq_solutions is True.
        if uniq_solutions:
            uniques = []
            # Sort each of the solutions and turn them into tuples.  Then we can 
            # remove duplicates because they will all be in the same order.
            for sol in solutions:
                uniques.append(tuple(sorted(sol)))
            # Use sets to unique the solutions quickly instead of using our
            # own algorithm.
            uniques = list(set(uniques))
            return sorted(uniques)
        return sorted(solutions)

    def split_word(self, word, splits, bucket):
        """Split the word into groups. The digits in the bucket code for the
        groups in which each character goes in to. For example,

        LIONHEAD with a base of 2 and bucket of 00110100 gives two groups, 
        "LIHAD" and "ONE"."""
        groups = [""] * splits
        for n in range(len(word)):
            groups[bucket[n]] += word[n]
        return groups

    def score_string(self, st):
        """Score and sum the letters in the string, A = 1, B = 2, ... Z = 26."""
        return sum(map(lambda x: ord(x) - 64, st.upper()))

    def bucket_counter(self, bucket, carry):
        """Simple bucket counting. Ex.: When passed a tuple (512, 512, 512)
        and a list [0, 0, 0] it increments each column in the list until
        it overflows, carrying the result over to the next column. This could
        be done with fancy bit shifting, but that wouldn't work with very
        large numbers. This should be fine up to huge numbers. Returns a new
        bucket and assigns the result to the passed list. Similar to most
        counting systems the MSB is on the right, however this is an 
        implementation detail and may change in the future.

        Effectively, for a carry tuple of identical values, this implements a 
        base-N numeral system, where N+1 is the value in the tuple."""
        if len(bucket) != len(carry):
            raise ValueError("bucket and carry lists must be the same size")
        # Increase the last column.
        bucket[-1] += 1 
        # Carry numbers. Carry must be propagated by at least the size of the
        # carry list.
        for i in range(len(carry)):
            for coln, col in enumerate(bucket[:]):
                if col >= carry[coln]:
                    # Reset this column, carry the result over to the next.
                    bucket[coln] = 0
                    bucket[coln - 1] += 1
        return bucket

    def progress(self, n, counts, solutions):
        """Display the progress of the solve operation."""
        print "%d / %d (%.2f%%): %d solutions (non-unique)" % (n + 1, counts, (float(n + 1) / counts) * 100, solutions) 

if __name__ == '__main__':
    word = raw_input('Enter word: ')
    groups = int(raw_input('Enter number of required groups: '))
    unique = raw_input('Unique results only? (enter Y or N): ').upper()
    if unique == 'Y':
        unique = True
    else:
        unique = False
    # Start solving.
    print "Start solving"
    ws = WordSplitChecker(word, groups)
    solutions = ws.solve(unique)
    if len(solutions) == 0:
        print "No solutions could be found."
    for solution in solutions:
        for group in solution:
            print group,
        print

ตัวอย่างผลลัพธ์:

Enter word: wordsplit
Enter number of required groups: 2
Unique results only? (enter Y or N): y
Start solving
1 / 512 (0.20%): 0 solutions (non-unique)
512 / 512 (100.00%): 6 solutions (non-unique)
dspit worl
ordsl wpit
orsp wdlit

1
ในความเห็นของฉันคำตอบที่ยอมรับว่าพยายามเป็นศูนย์ในการบรรลุเป้าหมายของคำถามเดิม (ความกะทัดรัดรหัส) ได้อย่างมีประสิทธิภาพนอกหัวข้อ คุณยอมรับว่าคำตอบนี้ไม่มีความเกี่ยวข้องกับ code-golf ดังนั้นแทนที่จะโพสต์ไว้เป็นคำตอบฉันขอแนะนำให้โพสต์ไว้ที่อื่นและวางลิงค์ไว้ในข้อคิดเห็นในคำถาม
Jeff Swensen

2
@Sugerman: เป็นการใช้งานอ้างอิงไม่ใช่ความพยายามที่จะชนะเกม ฉันชอบการนำการอ้างอิงมาใช้เป็นคำตอบแทนที่จะใช้พื้นที่ด้านบนของหน้าและฉันต้องการให้พวกเขาใช้งานในไซต์เพื่อลดความเสี่ยงของการเกิดการเชื่อมโยง
dmckee --- ผู้ดูแลอดีตลูกแมว

@Sugerman: ทำไมไม่ส่งมา? มันดีกว่าไม่มีอะไรเลย มันสามารถถูกย่อให้เล็กสุด แต่ทำไมต้องรำคาญ - ฉันไม่สามารถยอมรับคำถามของตัวเองได้ (ดีฉันทำได้แต่มันไม่ได้อยู่ในจิตวิญญาณของมัน)
Thomas O

เพราะที่ฐานของมันนี่คือคำถามและคำตอบ ไม่ควรโพสต์สิ่งที่ไม่ได้มีไว้เพื่อเป็นคำตอบ
Jeff Swensen

1
อย่างที่ฉันพูดในความคิดเห็นแรกของฉันฉันจะได้เชื่อมโยงกับมันในความคิดเห็นในคำถามหรือเนื่องจากคุณเป็นเจ้าของคำถามแก้ไขลิงก์ในนั้น นอกจากนี้ยังไม่มีอะไรผิดปกติในการส่งคำตอบให้กับคำถามของคุณตราบใดที่คุณไม่ยอมรับคำตอบของคุณโดยอัตโนมัติโดยไม่คำนึงถึงผู้อื่นทั้งหมด (และผลการลงคะแนน)
Jeff Swensen

0

ลัวะ - 195

a=io.read"*l"for i=0,2^#a/2-1 do z,l=0,""r=l for j=1,#a do b=math.floor(i/2^j*2)%2 z=(b*2-1)*(a:byte(j)-64)+z if b>0 then r=r..a:sub(j,j)else l=l..a:sub(j,j)end end if z==0 then print(l,r)end end

ข้อมูลที่ป้อนต้องอยู่ในรูปแบบแคป:

~$ lua wordsplit.lua 
>WORDSPLIT
WDLIT   ORSP
DSPIT   WORL
WPIT    ORDSL

0

Python - 127

w=rawinput()
for q in range(2**len(w)/2):
 a=[0]*2;b=['']*2
 for c in w:a[q%2]+=ord(c)-96;b[q%2]+=c;q/=2
 if a[0]==a[1]:print b

และนี่คือเวอร์ชันแบบแยกส่วนขนาด 182 ไบต์โดยไม่มีการซ้ำซ้อน:

n,w=input()
def b(q):
 a=[0]*n;b=['']*n
 for c in w:a[q%n]+=ord(c)-96;b[q%n]+=c;q/=n
 return a[0]==a[1] and all(b) and frozenset(b)
print set(filter(None,map(b,range(n**len(w)/n))))

อินพุตเป็นเช่น:

3, 'wordsplit'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.