Sp | Lit wo (r) dS, S (P) สว่าง wO | rds


15

m | Y bR | ain คือ We | iRd F (o) RT (h) E La | sT fi (v) e YE | ars O | R s | o, (I) ฮา | ve C (u) T wO | rds ใน h (a) lf wh | En (I) s (e) e Th | em เมื่อไหร่ | ฉันเริ่มทำ | ถึงมัน | ถึง | oK a meN | ความพยายามของ TaL - B (u) TI เกือบ cou (l) ไม่ N (o) T d | o มัน N (o) w, ฉัน d | o อยู่ด้านหลังศีรษะของฉัน, (n) d แทบจะไม่ได้ ev | en ไม่ | iCe มัน อย่างไรก็ตามฉันคิดว่าสิ่งนี้จะเป็นการท้าทายที่ยิ่งใหญ่

คำนิยาม

สำหรับความท้าทายนี้จดหมายแต่ละฉบับจะได้รับคะแนนตามการตัดสินความกว้างของฉันในแบบอักษร sans-serif คุณจะใช้ความกว้างนี้เพื่อตัดคำเป็นสองเท่าของความกว้างเท่ากัน ตัวละครที่จะใช้ความท้าทายนี้คือตัวอักษรในกรณีที่ต่ำกว่าและสูง apostrophe และยัติภังค์

Width  Characters
1      i l I '
2      f j r t -
3      a b c d e g h k n o p q s u v x y z
4      m w A B C D E F G H J K L N O P Q R S T U V X Y Z
5      M W

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

อินพุต

ข้อมูลที่ป้อนจะประกอบด้วย "คำเดียว" (ซึ่งไม่จำเป็นต้องอยู่ในพจนานุกรม) คุณสามารถใช้คำนี้ในสิ่งที่คุณต้องการป้อนข้อความ (String, อักขระอาร์เรย์ ฯลฯ ) คำนี้จะมีเพียงตัวอักษร'และ-(ดูตารางด้านบน) เนื่องจากสิ่งที่คุณจะทำกับคำนี้ (ดูด้านล่าง) กรณีของการป้อนข้อมูลจะขึ้นอยู่กับดุลยพินิจของนักพัฒนา ขึ้นบรรทัดใหม่ที่ได้รับอนุญาตหากจำเป็น

งาน

เปลี่ยนรูปผ่านอินพุตทุกรูปแบบ (ตัวอักษรทั้งหมดที่ตำแหน่งตัวพิมพ์ใหญ่หรือเล็กทั้งหมดที่เป็นไปได้) ตัวอย่างเช่นสำหรับอินพุตit'sด้านล่างเป็นวิธีเรียงสับเปลี่ยนทั้งหมด:

it's
it'S
iT's
iT'S
It's
It'S
IT's
IT'S

ในการแยกการเรียงสับเปลี่ยนของคำในครึ่งหนึ่งคะแนนในอีกด้านหนึ่งของคำจะต้องเท่ากับจุดของอีกด้านหนึ่งของคำ อย่างไรก็ตามหากจดหมายติดอยู่ระหว่างสองส่วนคุณสามารถตัดจดหมายได้ครึ่งส่วน

โปรดทราบว่า "ครึ่ง" ไม่ได้หมายความว่าคุณได้ย้ายไปครึ่งทางในสตริง "ครึ่ง" หมายความว่าคะแนนของทั้งสองฝ่ายเท่ากัน

ตัวอย่าง:

Wคือ 5 คะแนน iคือ 1 จุด แยกการเปลี่ยนลําดับWiiiiiในช่วงครึ่งปีจะส่งผลให้W | iiiiiมี 5 |คะแนนในแต่ละด้านของ

Tคือ 3 คะแนน แยกการเปลี่ยนลําดับTTTTในช่วงครึ่งปีจะส่งผลให้TT | TTมี 6 |คะแนนในแต่ละด้านของ

wคือ 4 คะแนน a คือ 3 คะแนน การแยกการเปลี่ยนแปลงwawในครึ่งจะส่งผลw (a) wกับ 5.5 คะแนนในแต่ละด้าน คะแนนจากaการกระจายไปยังทั้งสองด้านตามที่aแบ่งออกเป็นครึ่ง

เอาท์พุต

เอาต์พุตของคุณเป็นจำนวนเต็มของจำนวนการเรียงสับเปลี่ยนที่ไม่ซ้ำกันของอินพุตที่สามารถแบ่งครึ่งได้อย่างหมดจด ขึ้นบรรทัดใหม่ที่ได้รับอนุญาตหากจำเป็น

กรณีทดสอบ

ฉันจะส่งออกพีชคณิตที่ถูกต้องทั้งหมดของอินพุตสำหรับกรณีทดสอบ จำไว้ว่านั่นไม่ใช่ส่วนหนึ่งของรายละเอียดสำหรับคุณ

ในผลลัพธ์กลางของฉันตัวเลขแสดงค่าจุดของตัวอักษรด้านบนดังนั้นผลลัพธ์จะง่ายขึ้นเล็กน้อยเมื่อมองเห็น

Input: a
( a ) 
  3   
( A ) 
  4   
Output: 2

Input: in
Output: 0

Input: ab
A | B 
4   4 
a | b 
3   3 
Output: 2

Input: abc
A ( B ) C 
4   4   4 
A ( b ) C 
4   3   4 
a ( B ) c 
3   4   3 
a ( b ) c 
3   3   3 
Output: 4

Input: will
W ( I ) L l 
5   1   4 1 
W ( I ) l L 
5   1   1 4 
W ( i ) L l 
5   1   4 1 
W ( i ) l L 
5   1   1 4 
w I | L l 
4 1   4 1 
w I | l L 
4 1   1 4 
w i | L l 
4 1   4 1 
w i | l L 
4 1   1 4 
Output: 8

Input: stephen
S T E ( P ) H E N 
4 4 4   4   4 4 4 
S T E ( p ) H E N 
4 4 4   3   4 4 4 
S T E | p h e n 
4 4 4   3 3 3 3 
S T e ( P ) H E n 
4 4 3   4   4 4 3 
S T e ( P ) H e N 
4 4 3   4   4 3 4 
S T e ( P ) h E N 
4 4 3   4   3 4 4 
S T e ( p ) H E n 
4 4 3   3   4 4 3 
S T e ( p ) H e N 
4 4 3   3   4 3 4 
S T e ( p ) h E N 
4 4 3   3   3 4 4 
S t E ( P ) H e n 
4 2 4   4   4 3 3 
S t E ( P ) h E n 
4 2 4   4   3 4 3 
S t E ( P ) h e N 
4 2 4   4   3 3 4 
S t E ( p ) H e n 
4 2 4   3   4 3 3 
S t E ( p ) h E n 
4 2 4   3   3 4 3 
S t E ( p ) h e N 
4 2 4   3   3 3 4 
S t e ( P ) h e n 
4 2 3   4   3 3 3 
S t e p | H E N 
4 2 3 3   4 4 4 
S t e ( p ) h e n 
4 2 3   3   3 3 3 
s T E ( P ) H E n 
3 4 4   4   4 4 3 
s T E ( P ) H e N 
3 4 4   4   4 3 4 
s T E ( P ) h E N 
3 4 4   4   3 4 4 
s T E ( p ) H E n 
3 4 4   3   4 4 3 
s T E ( p ) H e N 
3 4 4   3   4 3 4 
s T E ( p ) h E N 
3 4 4   3   3 4 4 
s T e ( P ) H e n 
3 4 3   4   4 3 3 
s T e ( P ) h E n 
3 4 3   4   3 4 3 
s T e ( P ) h e N 
3 4 3   4   3 3 4 
s T e ( p ) H e n 
3 4 3   3   4 3 3 
s T e ( p ) h E n 
3 4 3   3   3 4 3 
s T e ( p ) h e N 
3 4 3   3   3 3 4 
s t E ( P ) h e n 
3 2 4   4   3 3 3 
s t E p | H E N 
3 2 4 3   4 4 4 
s t E ( p ) h e n 
3 2 4   3   3 3 3 
s t e P | H E N 
3 2 3 4   4 4 4 
s t e p | H E n 
3 2 3 3   4 4 3 
s t e p | H e N 
3 2 3 3   4 3 4 
s t e p | h E N 
3 2 3 3   3 4 4 
Output: 37

Input: splitwords
S P L I T | W O r d s 
4 4 4 1 4   5 4 2 3 3 
<snip>
s p l i t w | o R d S 
3 3 1 1 2 4   3 4 3 4 
Output: 228

Input: 'a-r
' a ( - ) R 
1 3   2   4 
' a | - r 
1 3   2 2 
Output: 2

Input: '''''-
' ' ' ( ' ) ' - 
1 1 1   1   1 2 
Output: 1

ชัยชนะ

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

เงินรางวัล

ฉันไม่รู้ว่าสิ่งนี้อยู่ในขอบเขตของความเป็นไปได้หรือไม่ อย่างไรก็ตามคุณเป็นนักกอล์ฟคุณจะทำทุกอย่างเพื่อตัวแทน ฉันกำลังเสนอเงินรางวัล 200 rep (ฉันจะเริ่มต้นเมื่อเงื่อนไขความสมบูรณ์นี้เป็นจริงตามที่ดูเหมือนเป็นไปไม่ได้สำหรับฉัน) สำหรับโปรแกรมที่ให้ผลลัพธ์ที่ถูกต้องantidisestablishmentarianismภายใน 15 วินาทีบนคอมพิวเตอร์โดยเฉลี่ย (aka ของฉัน) โปรดทราบว่ากรณีทดสอบนี้จะต้องไม่ใช้รหัสอย่างหนัก แต่อย่างใด

@ DigitalTrauma บดรางวัลของฉันเข้ามาภายในไม่กี่วินาที ตรวจสอบคำตอบของเขาที่นี่


2
@MackenzieMcClane ยกเว้นมีห้าฉันกำลังจะลงไปที่ 2 ^ 23 = 8,388,608
Jonathan Allan

2
การนับครั้งแรกของฉันสำหรับantidisestablishmentarianism(ไม่ใช่ผู้เล่นกอล์ฟ) คือ83307040(และการจับคู่กรณีทดสอบทั้งหมด) แต่ใช้เวลาประมาณ 37 วินาทีในแล็ปท็อปของฉัน ทุกคนมีนับมันได้หรือไม่
Jonathan Allan

2
43 วินาทีที่TIO
Jonathan Allan

8
สมองของฉันแปลก ๆคุณอยู่ในที่ที่ถูกต้อง
Luis Mendo

6
ฉันไม่ควรพยายามทำเช่นเดียวกัน ฉัน sho | uld ไม่พยายามทำเช่นเดียวกัน ฉัน sho | uld n (o) tt (r) yt | od | ot (h) e sa | ฉัน O | h cr | ap ...
Arnauld

คำตอบ:


8

Pyth , 75 74 73 70 ไบต์

lfsm} ST-Bysded._Tm.n] d * FMM k | QD \ i + 4} d "mw" |} d "อิล ' "H? |} d" fjrt - "+ 2} d" mw" -2 } d "'- 
lfsm} sT-Bysded._Tm.n] d * Fmm? k | qd \ i + 4} d" mw "| x} Ld + c" mw il' fjrt - ") G1 4-2} d "'- 
lfsm} sT-Bysded._Tm.n] d * Fm <, | x} Ld + c" mw il' fjrt - ") G1 4 | qd \ i + 4} d" mw "-2} d "'-
lfsm} sT-Bysded._Tm.n] d * Fm <, | x} Ld + c "mw il 'fjrt -") G1 4 | qd \ i + 4} d "mw" h} dG

ลองออนไลน์!

สำหรับความรักของพระเจ้าโปรดอย่าแม้แต่ลองantidisestablishmentarianismใช้ล่ามด้วย คุณจะผิดพลาด

คำอธิบาย

lfsm}sT-Bysded._Tm.n]d*Fm<,|x}Ld+c"mw il' fjrt-")G1 4|qd\i+4}d"mw"h}dG

ให้เราแบ่งรหัสนี้ออกเป็นส่วน X

ส่วนแรก: สร้างเวอร์ชันที่ใส่กล่องและทำแผนที่กับค่า

m<,|x}Ld+c"mw il' fjrt-")G1 4|qd\i+4}d"mw"h}dG

ให้เราชัดเจนที่นี่ ในไม่มีส่วนหนึ่งของกระบวนการที่มีตัวอักษรตัวพิมพ์ใหญ่ เราเพียงต้องการแมปตัวอักษรหนึ่งตัวกับสองค่า (และเครื่องหมายวรรคตอนเป็นค่าเดียว) โดยไม่ต้องใช้ตัวพิมพ์ใหญ่ เราจะตัดสินใจว่าตัวละครตัวไหนที่เราต้องการสองค่าและตัวละครตัวไหนที่เราจะต้องการ:

m<,|x}Ld+c"mw il' fjrt-")G1 4|qd\i+4}d"mw"h}dGQ  Q implicitly appended
m                                             Q  for d in Q:
                                           }dG       d in alphabet?
                                          h          +1 (T/F as 1/0)
 <   take the first ^ elements of the following array
     for d in alphabet, it will take 2 elements;
     for d being ' or -, it will take 1 element.
  ,          pair up the following two values
   |x}Ld+c"mw il' fjrt-")G1 4                  this is the first value
                             |qd\i+4}d"mw"    this is the second value

อย่างที่คุณเห็นแม้แต่ส่วนแรกก็ยาวเกินไป

ค่าแรกคือสำหรับรุ่นตัวพิมพ์เล็กซึ่งรวมถึงและ' -ค่าที่สองใช้สำหรับเวอร์ชันตัวพิมพ์ใหญ่ด้วย'และ-จะไม่ใช้

ค่าแรก:

|x}Ld+c"mw il' fjrt-")G1 4
       "mw il' fjrt-"        does what it says on the tin
      c              )       split on spaces, creating an
                             array with three elements
     +                G      append another element, which
                             is the alphabet, as a fail-safe;
                             now the array has 4 elements
  }Ld                        check if d is in each array
                             as with above, True becomes 1
                             and False becomes 0 (T/F as 1/0)
 x                     1     find the first occurrence of 1
|                        4   logical or with 4. If it was 0,
                             it would become 4 now.

สตริงแรกมี"mw"ที่ดัชนี 0 มันมีค่าเป็น 4 ซึ่งอธิบายถึงความต้องการของตรรกะหรือ โปรดทราบว่า Pyth ใช้การจัดทำดัชนี 0 นอกจากนี้ยังมีช่องว่างก่อนที่คือการแยกได้จาก41

ค่าที่สอง (ตัวพิมพ์ใหญ่):

|qd\i+4}d"mw"
 qd\i          d=="i"
|              logical OR
       }d"mw"  is d in "mw"? That is, is d "m" or "w"?
     +4        +4

ถ้าdเป็น"i"เช่นนั้นจะให้1ในขั้นตอนแรก มิฉะนั้นจะดำเนินการต่อ หากdเป็น"m"หรือ"w"จากนั้นขั้นตอนที่สามให้1ซึ่งจะถูกเพิ่มเพื่อให้4 5ถ้าdไม่ได้"m"หรือ"w"แล้วจะช่วยให้ขั้นตอนที่สาม0ซึ่งจะถูกเพิ่มเพื่อให้44

ส่วนที่สอง: การทำงานให้เสร็จ

lfsm}sT-Bysded._Tm.n]d*F

สิ่งนี้ได้รับการเสริมสู่ส่วนแรกซึ่งในทางเทคนิคจะไม่แยกออกจากส่วนที่สอง (มันยังคงเป็นหนึ่งคำสั่ง) ดังนั้นค่าจากส่วนแรกจะถูกส่งไปทางขวา

บทสรุป: ในส่วนแรกเราทำการแมปตัวอักษรกับค่าที่เป็นไปได้ (ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่สำหรับตัวอักษรเพียงค่าเดียวสำหรับเครื่องหมายวรรคตอนสองตัว) สำหรับการป้อนข้อมูลหนึ่งจะได้รับ"ab"[[3,4],[3,4]]

ในการสร้างเวอร์ชันที่ใส่กล่องที่แตกต่างกัน (ซึ่งควรจะทำในส่วนแรก แต่นั่นจะล้น) เราใช้ผลิตภัณฑ์คาร์ทีเซียนซ้ำ ๆ จากนั้นจึงแผ่ผลลัพธ์ออกมา ปัญหาเกิดขึ้นเมื่อมีจดหมายเพียงฉบับเดียว (ทดสอบครั้งแรก) เพราะผลิตภัณฑ์คาร์ทีเซียนจะไม่ให้เราอาร์เรย์และคำสั่งแบน ( .n) ถูกล้นไปเพื่อให้ผลลัพธ์ที่แปลกกับตัวเลข เราจะดูว่าฉันหลีกเลี่ยงปัญหานี้ได้อย่างไร

lfsm}sT-Bysded._Tm.n]d*F
                      *F  reduce by Cartesian product
                 m   d    for d in each unflattened version:
                    ]         [d] (wrap in array)
                  .n          flatten
 f                filter for resulting arrays as T
              ._T all prefixes of T
   m              for d in each prefix:
          sd          find the sum of d
         y            double
       -B   ed        [above, above - last element of d]
    }sT               is the sum of T in the above array of 2 elements?
  s               sum the 1/0 generated in each prefix
                  any non-zero value is regarded as truthy
l                 length

ถ้ามันถูกแบ่งตรงกลางโดย|คำนำหน้าจะมีผลรวมเป็นสองเท่าเป็นผลรวมของผลรวม

ถ้ามันถูกหารด้วย()ผลรวมของคำนำหน้าจะเพิ่มเป็นสองเท่าลบด้วยค่าในวงเล็บจะเป็นผลรวมของผลรวม


ใช่เมื่อฉันมีเวลา (ฉันขอโทษสำหรับตารางงานที่ยุ่งของฉัน)
Leun Nun

11

c, 378 ไบต์; ประมาณ 0.6 วินาทีสำหรับantidisestablishmentarianism

คำตอบ Updated ฉันอ่านความคิดเห็น @ JonathanAllan เกี่ยวกับis และในตอนแรกฉันไม่เข้าใจการเพิ่มประสิทธิภาพนี้ แต่ตอนนี้ฉันเห็นว่าเนื่องจากทั้งคู่iและIมีความกว้าง 1 เราจึงสามารถนับพีชคณิตที่เกี่ยวข้องสองครั้งโดยตรวจสอบเพียงครั้งเดียว ก่อนหน้านี้โซลูชันของฉันใช้หลายเธรดเพื่อกระจายโหลดบน CPU หลาย ๆ ตัวและด้วยเหตุนี้ฉันจึงสามารถผ่านความเป็นไปได้ทั้งหมด 2 28บนเครื่องของฉัน ขณะนี้ด้วยการปรับให้iเหมาะสมไม่จำเป็นต้องยุ่งกับเธรด - เธรดเดียวทำงานได้อย่างง่ายดายภายในเวลา จำกัด

ไม่มีฟังก์ชั่น c ado - golfed เพิ่มเติม:

char m[128]={[39]=10,[45]=20};f(s,l,p)char *s;{m[65]?:bcopy("PPPPPPPPPPPdPPPPPPPPPdPPP      <<<<<(<<(<P<<<<(<(<<P<<<",m+65,58);int g,h,u=0,v=0,x=0,y=0,c=0;if(p<l){g=s[p];if(g>64&&g-'i'){s[p]-=32;c+=f(s,l,p+1);}s[p]=g;c+=((g=='i')+1)*f(s,l,p+1);}else{for(l--,p=0,g=m[s[p]],h=m[s[l]];p<=l;){y=v;x=u;if(u+g>v+h){v+=h;h=m[s[--l]];}else{u+=g;g=m[s[++p]];}}c=u==v||y==x;}return c;}

ฟังก์ชั่นวนซ้ำfใช้พารามิเตอร์ 3 ตัวคือตัวชี้ไปยังสตริงอินพุตความยาวสตริงและออฟเซ็ตในสตริงเพื่อเริ่มการประมวลผล (ควรเป็น 0 สำหรับการโทรระดับบนสุด) ฟังก์ชันส่งคืนจำนวนการเปลี่ยนลำดับ

ลองมันออนไลน์ TIO ดูเหมือนว่าโดยทั่วไปแล้วจะทำงานผ่านการทดสอบทั้งหมด (รวมถึงantidisestablishmentarianismภายใน 2 วินาที

ทราบว่ามีบางอย่างใน unprintables สตริงที่เอ็ดbcopy() m[]TIO ดูเหมือนว่าจะจัดการกับสิ่งเหล่านี้ได้อย่างถูกต้อง

Ungolfed:

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>

int width_tbl[] = {
    ['\''] = 1,
    ['-'] = 2,
    ['A'] = 4,4,4,4,4,4,4,4,1,4,4,4,5,4,4,4,4,4,4,4,4,4,5,4,4,4,
    ['a'] = 3,3,3,3,3,2,3,3,1,2,3,1,4,3,3,3,3,2,3,2,3,3,4,3,3,3
};

int
f (char *str, int len, int pos) {
    int lidx, ridx;
    int tot_width = 0;
    int lwidth, rwidth;
    int tot_lwidth = 0, tot_rwidth = 0;
    int prev_tot_lwidth = 0, prev_tot_rwidth = 0;
    char tmp;
    int perm_cnt = 0;

    if (pos < len) {
        tmp = str[pos];
        if (isalpha(tmp) && (tmp != 'i')) {
            str[pos] = toupper(str[pos]);
            perm_cnt += f(str, len, pos+1);
        }
        str[pos] = tmp;
        perm_cnt += ((tmp == 'i') + 1) * f(str, len, pos+1);
    } else {
        //puts(str);
        lidx = 0;
        ridx = len - 1;
        lwidth = width_tbl[str[lidx]];
        rwidth = width_tbl[str[ridx]];
        while (lidx <= ridx) {
            prev_tot_rwidth = tot_rwidth;
            prev_tot_lwidth = tot_lwidth;
            if (tot_lwidth + lwidth > tot_rwidth + rwidth) {
                tot_rwidth += rwidth;
                rwidth = width_tbl[str[--ridx]];
            } else {
                tot_lwidth += lwidth;
                lwidth = width_tbl[str[++lidx]];
            }
        }
        if (tot_lwidth == tot_rwidth) {
            perm_cnt = 1;
        } else if (prev_tot_rwidth == prev_tot_lwidth) {
            perm_cnt = 1;
        }
    }
    return perm_cnt;
}


int main (int argc, char **argv) {
    int i;
    int perm_cnt;

    if (argc > 0) {
        char *str = strdup(argv[1]);
        assert(str);

        perm_cnt = f(str, strlen(str), 0);

        printf("n = %d\n", perm_cnt);
    }

    return 0;
}

ฉันมี MacBook Pro รุ่นกลางปี ​​2558 ที่ใช้ MacOS 10.12.4 คอมไพเลอร์เป็นเสียงดังกราวเริ่มต้นของ MacOS ฉันกำลังรวบรวมกับ:

cc splitwords.c -O2 -o splitwords

ใช้งานการทดสอบทั้งหมดรวมถึงการantidisestablishmentarianismให้:

$ time ./splitwords
Testcase "a": n = 2
Testcase "in": n = 0
Testcase "ab": n = 2
Testcase "abc": n = 4
Testcase "will": n = 8
Testcase "stephen": n = 37
Testcase "splitwords": n = 228
Testcase "'a-r": n = 2
Testcase "'''''-": n = 1
Testcase "antidisestablishmentarianism": n = 83307040

real    0m0.573s
user    0m0.564s
sys 0m0.003s
$

นี่คือไม่ดีที่สุด อัลกอรึทึมนั้นบังคับให้มันผ่านความเป็นไปได้ทั้งหมด (โมดูโลi- ดูความคิดเห็นด้านบน) และนับจำนวนคำที่อาจแยกออกตามเกณฑ์


งานที่ดีจริงๆผมคิดว่ามันน่าจะเป็นไปได้ที่จะประเมินผลใน O (n) โดยใช้ผลกระทบคงที่ของ 7 ชั้นเรียนของตัวอักษรi, -, ', l, mw, fjrtและabcdeghknopqsuvxyzแต่มันจะใช้เวลาการประยุกต์ใช้ที่Pólyaแจงนับทฤษฎีบท (หรือวิธีการแจงนับ combinatorial เทียบเท่า) ซึ่งฉันไม่รอบรู้
Jonathan Allan

คุณทำลายความคาดหวังของฉันตามที่คาดไว้ นี่คือวิธีที่คุณใช้การเรียกซ้ำ :)
Stephen

1

JavaScript (ES6), 199 169 167 ไบต์

คาดว่าสตริงอินพุตเป็นตัวพิมพ์เล็ก ช้าเกินไปสำหรับเงินรางวัล

f=(s,r=[],t=R=0,i=3,x=parseInt("k1048cccctt"["i'l-fjrtmw".search(c=s[0])+1],36)+8>>i&7)=>x&&(c?(i&&f(s,r,t,0),f(s.slice(1),[x,...r],t+x)):R+=r.some(x=>t==x|!(t-=2*x)))

กรณีทดสอบ


1

C, 403 394 ไบต์

ขอบคุณเควิน!

r;char*g[]={"","ilI'","fjrt-","","mw","MW",0},**p,b[99];q(c){for(p=g;*p;p++)if(strchr(*p,c))return p-g;return c>='a'&&c<='z'?3:4;}f(char*w,int l){int i,n,c,t,x,y;if(*w){for(i=0;i<2;i++)x=tolower(*w),y=toupper(*w),!i||x!=y?b[l]=i%2?x:y,b[l+1]=0,f(w+1,l+1):0;}else{t=0;for(c=0;c<2;c++)for(i=0;i<l;i++){x=y=0;for(n=0;n<l;n++)c==0||n!=i?((n<i)?(x+=q(b[n])):(y+=q(b[n]))):0;t|=x==y;}r+=t;}return r;}

ลองออนไลน์

รหัสไม่ได้รับการตอบกลับ:

int getwidth(int c)
{
    char **p, *g[] = { "", "ilI'", "fjrt-", "", "mw", "MW", 0};
    for (p=g; *p; p++)
    {
        if (strchr(*p,c))
            return p-g;
    }
    return c >= 'a' && c <= 'z' ? 3 : 4;
}

int test(char* w, int l)
{
    int i, n, c, t, x, y;

    if (*w)
    {
        for (i=0;i<2; i++)
        {
            x = tolower(*w);
            y = toupper(*w);
            if (!i || x != y)
            {
                b[l] = i % 2 ? x : y;
                b[l + 1] = 0;
                test(w + 1, l+1);
            }
        }
    }
    else
    {
        t = 0;
        for (c=0; c<2; c++)
        {
            for (i=0; i<l; i++)
            {
                x = 0;
                y = 0;
                for (n=0; n<l; n++)
                {
                    if (c == 0 || n != i)
                    {
                        if (n < i)
                            x += getwidth(b[n]);
                        else
                            y += getwidth(b[n]);
                    }
                }
                t |= x == y;
            }
        }
        r += t;
    }
    return r;
}

คุณลืมตีกอล์ฟที่นี่: f(char* w, int l){->f(char*w,int l){
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.