এসপি | লিট ওয়া (আর) ডিএস, এস (পি) লিট ডব্লুও | আরডিএস


15

মি | ওয়াই বিআর | আইন আমরা | আইআরডি। এফ (ও) আরটি (জ) ই লা | এসটি ফাই (ভি) ই ওয়াই | আরস ও | আর এস | ও, (আই) হা | ভী সি (ইউ) টি ডব্লিউ ও | আরডিএস এ এইচ (এ) এলএফ হো | এন (আই) এস (ই) ই থ | এম। WH | EN আমি শুরু করলাম | এটি করা, এটি করা | ওকে a মেইন | তাল প্রচেষ্টা - বি (ইউ) টিআই প্রায় কোও (এল) ডি এন (ও) টি ডি | ও এটি। N (o) w, I d | o এটি আমার মাথার পিছনে, a (n) d hardly ev | en not | iCe it। যাইহোক, আমি ভেবেছিলাম যে এই সমস্যাটি একটি দুর্দান্ত চ্যালেঞ্জ।

সংজ্ঞা

এই চ্যালেঞ্জের জন্য, প্রতিটি চিঠিকে একটি সেন্স-সিরিফ ফন্টে এর প্রস্থের আমার বিচারের উপর ভিত্তি করে একটি পয়েন্ট স্কোর দেওয়া হবে। আপনি এই প্রস্থটি কোনও শব্দকে সমান প্রস্থের দুই ভাগে ভাগ করতে ব্যবহার করবেন। এই চ্যালেঞ্জটি যে অক্ষরগুলি ব্যবহার করবে সেগুলি হ'ল নিম্ন এবং উচ্চতর ক্ষেত্রে, অ্যাস্টোস্ট্রোফ এবং হাইফেনের বর্ণমালা।

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

আমার ব্যাখ্যা এবং পরীক্ষার |কেসগুলির জন্য , কোনও শব্দটি পরিষ্কারভাবে অর্ধেকভাবে বিভক্ত করা যায় এমন স্থানটি বোঝায়। (এবং )একটি চিঠির উভয় পাশে নির্দেশ করে যে চিঠিটি একটি পরিষ্কার বিভাজন তৈরি করতে অর্ধেক হয়ে যাবে।

ইনপুট

ইনপুটটিতে একটি একক "শব্দ" থাকবে (যা অভিধানে থাকা দরকার নেই)। আপনি যে শব্দটি পাঠ্য ইনপুট চান তা নিতে পারেন (স্ট্রিং, চর অ্যারে ইত্যাদি)। এই শব্দটিতে কেবল অক্ষর থাকবে ', এবং -(উপরের টেবিলটি দেখুন)। আপনি এই শব্দটি দিয়ে কী করবেন (নীচে দেখুন) এর ফলে ইনপুটটির ক্ষেত্রে বিকাশকারীদের বিবেচনার উপর ছেড়ে যায়। প্রয়োজনে ট্রেলিং করা নতুন লাইনের অনুমতি দেওয়া।

কাজটি

ইনপুটটির সমস্ত ফর্মের মাধ্যমে প্রসারিত করুন (সমস্ত সম্ভাব্য উপরের বা নিম্ন কেস পজিশনে সমস্ত অক্ষর)। উদাহরণস্বরূপ, it'sইনপুটটির জন্য , নীচে সমস্ত ক্রমবিন্যাস রয়েছে:

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

শব্দের ক্রমবিন্যাসকে অর্ধেক ভাগে ভাগ করতে শব্দের একপাশের পয়েন্টগুলি অবশ্যই শব্দের অন্য পাশের পয়েন্টগুলির সমান হতে হবে। তবে, যদি কোনও চিঠি দুটি এমনকি দুটি বিভাগের মধ্যে আটকে থাকে তবে আপনি একটি চিঠিও অর্ধেক কেটে ফেলতে পারেন।

দয়া করে মনে রাখবেন যে "অর্ধেক" এর অর্থ এই নয় যে আপনি অর্ধেক স্ট্রিংয়ে চলে এসেছেন। "অর্ধ" এর অর্থ উভয় পক্ষের পয়েন্ট সমান।

উদাহরণ:

W5 পয়েন্ট। i1 পয়েন্ট। Wiiiiiঅর্ধেকের মধ্যে আদেশ বিভক্তকরণের ফলস্বরূপ W | iiiii, এর প্রতিটি পাশের 5 টি পয়েন্ট থাকবে |

T3 পয়েন্ট। TTTTঅর্ধেকের মধ্যে আদেশ বিভক্তকরণের ফলস্বরূপ TT | TT, এর প্রতিটি পাশের 6 টি পয়েন্ট থাকবে |

w4 পয়েন্ট। 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 অক্ষর পর্যন্ত সমস্ত ইনপুট) আউটপুট দিতে সক্ষম হতে হবে a কৃত্রিমভাবে আপনার ইনপুট ক্যাপ করবেন না।

খয়রাত

আমি জানি না এটি সম্ভাবনার ক্ষেত্রে রয়েছে কিনা। যাইহোক, আপনি গল্ফার - আপনি প্রতিনিধি জন্য কিছু করতে হবে। আমি একটি 200 রিপ্রেস অনুগ্রহ দিচ্ছি ( antidisestablishmentarianismএকটি গড় কম্পিউটারে (ওরফে মাইন)) 15 সেকেন্ডের নীচে সঠিক আউটপুট দেয় এমন একটি প্রোগ্রামের জন্য আমি এই অনুগ্রহ শর্তটি শেষ হয়ে গেলে আমি এটি শুরু করব bas দয়া করে মনে রাখবেন যে এই পরীক্ষার কেসটি কোনওভাবেই হার্ড কোডিং করা উচিত নয়।

@ ডিজিটাল ট্রুমা আমার অনুগ্রহকে চূর্ণ করল, দুই সেকেন্ডের মধ্যে ভালভাবে চলে আসছিল। তার উত্তর এখানে দেখুন


2
@ ম্যাকেনজিএমসি ক্লেন বাদে পাঁচজন আছে আমি এটিকে 2 ^ 23 = 8,388,608 এ নামছি।
জোনাথন অ্যালান

2
antidisestablishmentarianism(নন-গোল্ফী) এর জন্য আমার প্রথম গণনাটি 83307040(এবং সমস্ত পরীক্ষার কেসের সাথে মেলে) তবে এটি আমার ল্যাপটপে ~ 37 সেকেন্ড সময় নেয় (মনে রাখবেন এটি পাইথন। কারও কি এর জন্য একটি গণনা আছে?
জোনাথন অ্যালান


8
আমার মস্তিষ্ক অদ্ভুত আপনি সঠিক জায়গায় আছেন
লুইস মেন্ডো

6
আমারও তাই করার চেষ্টা করা উচিত নয়। আমি না | একই কাজ করার চেষ্টা করব না। আমি sho | uld n (o) tt (r) yt | od | ot (h) e sa | me। ও | এইচ সিআর | এপি ...
আর্নল্ড

উত্তর:


8

পাইথ , 75 74 73 70 বাইট

lfsm} ST-Bysded._Tm.n] ঘ * fmm ট | QD \ আমি + 4} ঘ "মেগাওয়াট" |} ঘ "মাস" জ |?} ঘ "fjrt -" + + 2} ঘ "মেগাওয়াট" -2 } d "'- 
lfsm} sT-Bysded._Tm.n] d * Fmm? k | qd \ i + 4} d" mw "| x} Ld + c" mw il' fjrt - ") জি 1 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

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

Godশ্বরের ভালবাসার জন্য, দয়া 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 থাকে It দ্রষ্টব্য যে পাইথ 0-সূচক ব্যবহার করে। এছাড়াও, স্থান আগে4 এটি থেকে আলাদা করা 1

দ্বিতীয় মান (বড় হাতের):

|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যা 4দিতে যোগ করা হয়4

দ্বিতীয় অংশ: কাজ করা হচ্ছে

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

যদি এটি মধ্যভাগে বিভক্ত হয় |তবে উপসর্গটি মোটের যোগফল হয়ে দ্বিগুণ হবে।

যদি এটি দ্বারা বিভক্ত হয় (), তবে উপদণ্ডগুলির মধ্যে উপ- যোগফলের দ্বিগুণ বিয়োগফলটি মোটের যোগফল হবে।


হ্যাঁ, আমার যখন সময় হবে। (আমি আমার ব্যস্ততার জন্য ক্ষমা চাইছি))
লিকি নুন

11

সি, 378 বাইট; প্রায় 0.6 এর জন্যantidisestablishmentarianism

আপডেট উত্তর । আমি @ সম্পর্কে JonathanAllan এর মন্তব্য পড়া iগুলি, এবং প্রথম আমি এই অপ্টিমাইজেশান বুঝতে পারে না, কিন্তু এখন আমি দেখতে যে যেহেতু উভয় iএবং I1 এর একটি প্রস্থ আছে, তাহলে আমরা যুক্ত একাধিক বিন্যাসন দুইবার শুধুমাত্র একবার যাচাই করতে থাকার সঙ্গে নির্ভর করতে পারেন। পূর্বে আমার সমাধান একাধিক সিপিইউতে বোঝা ছড়িয়ে দিতে একাধিক থ্রেড ব্যবহার করেছিল এবং এটির সাথে আমি আমার মেশিনে সমস্ত 2 28 সম্ভাবনার মধ্য দিয়ে যেতে পেরেছিলাম । এখন সঙ্গেi অপ্টিমাইজেশনের সাথে থ্রেডগুলির সাথে জগাখিচু করার দরকার নেই - একক থ্রেড সময় সীমাবদ্ধতার মধ্যে সহজেই কাজটি করে।

আরও অ্যাডো ছাড়া - গল্ফড সি ফাংশন:

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

পুনরাবৃত্তি ফাংশনটি f3 পরামিতি নেয় - প্রক্রিয়াকরণ শুরু করতে স্ট্রিংয়ের ইনপুট স্ট্রিংয়ের একটি পয়েন্টার, স্ট্রিংয়ের দৈর্ঘ্য এবং অফসেট (শীর্ষ স্তরের কলের জন্য 0 হওয়া উচিত)। ফাংশন অনুমতির সংখ্যা প্রদান করে।

এটি অনলাইনে চেষ্টা করুন । টিআইও সাধারণত সমস্ত টেস্টকেসগুলি ( antidisestablishmentarianism2 সেকেন্ডের কম সহ) সহ চলতে পারে বলে মনে হয় ।

নোট করুন যে স্ট্রিং-এ কিছু প্রিন্টেবল রয়েছে যা bcopy()এড হয়েছে m[]। টিআইও মনে হয় এগুলি সঠিকভাবে পরিচালনা করছে।

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

আমার 2015-এর মাঝামাঝি ম্যাকবুক প্রো চলছে ম্যাকস 10.12.4 এ। সংকলকটি হ'ল ডিফল্ট ম্যাকোএস বিড়ম্বনা। আমি সংকলন করছি:

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 শুমার উপপাদ্য (বা সমমানের সমন্বয়কারী গণনা পদ্ধতি), যাতে আমি ভাল পারদর্শী নই।
জনাথন অ্যালান

আপনি আমার প্রত্যাশা যেমন নষ্ট করেছিলেন তেমনি ধ্বংস করে দিয়েছি। এভাবেই আপনি পুনরাবৃত্তিটি ব্যবহার করেন :)
স্টিফেন

1

জাভাস্ক্রিপ্ট (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

সি, 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){
কেভিন ক্রুইজসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.