ছড়া স্কিমগুলি গণনা করুন


26

একটি "ছড়া প্রকল্প" চিঠির একটি স্ট্রিং aথেকে z, যেমন যে অক্ষরের প্রথম ঘটনার আরোহী অর্ডার (ফাঁক ছাড়া) আছে, থেকে শুরু a। উদাহরণস্বরূপ (প্রথম ঘটনা চিহ্নিত করা সহ):

abccdbebdcfa
^^^ ^ ^   ^

দৈর্ঘ্যের ছড়া স্কিমগুলির সংখ্যা বেল সংখ্যাN দিয়ে দেওয়া হয় । ( OEIS A000110 ) B(N)

চ্যালেঞ্জ

আপনার কাজটি এই ছড়া স্কিমগুলির একটি অঙ্ক বাস্তবায়ন করা, অর্থাত্ ছড়া স্কিমগুলিতে সংখ্যার দ্বিখণ্ডিত ম্যাপিং। আপনাকে একটি ইতিবাচক পূর্ণসংখ্যার N <= 26পাশাপাশি একটি অ-নেতিবাচক পূর্ণসংখ্যা দেওয়া হবে 0 <= i < B(N)। বিকল্পভাবে, আপনি পরিসীমাটি ব্যবহার করতে পারেন 1 <= i <= B(N)। আপনার দৈর্ঘ্যের একটি ছড়া স্কিম আউটপুট করা উচিত N, যাতে প্রতিটি iপৃথক স্ট্রিং দেয়।

আপনি STDIN (অথবা নিকটতম বিকল্প), কমান্ড-লাইন আর্গুমেন্ট বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট নিয়ে কোনও প্রোগ্রাম বা ফাংশন লিখতে এবং STDOUT (বা নিকটতম বিকল্প), ফাংশন রিটার্ন মান বা ফাংশন (আউট) প্যারামিটারের মাধ্যমে ফলাফল আউটপুট করতে পারেন।

আপনি নিম্ন বা বড় হাতের অক্ষর (ধারাবাহিকভাবে) ব্যবহার করতে পারেন।

আপনার কোড সময় যুক্তিসঙ্গত পরিমাণ যে কোন বৈধ ইনপুট হ্যান্ডেল করতে সক্ষম হতে হবে (যেমন বেশী না মাত্র কয়েক ঘন্টার বেশি জন্য N = 26, সবচেয়ে খারাপ ক্ষেত্রে i)। এটি Nধীরে ধীরে (ছোট ঘাঁটিগুলির জন্য) দিয়ে ধীরে ধীরে স্কেল করে এমন সমাধানগুলির মঞ্জুরি দেয় তবে এমন সমাধানগুলিকে রৈখিকভাবে স্কেল করতে নিষিদ্ধ করে i(যেমন B(N))। বিশেষত, এর অর্থ এই যে আপনি স্কিমগুলি Nবাতিল না করা পর্যন্ত আপনি দৈর্ঘ্যের সমস্ত বৈধ ছড়া স্কিমের মাধ্যমে পুনরাবৃত্তি করতে পারবেন না i

স্ট্যান্ডার্ড বিধি প্রযোজ্য।

উদাহরণ

iস্কিমগুলিতে হুবহু দায়িত্ব অর্পণ করা (অর্থাত্ প্রদত্ত প্রকল্পগুলির ক্রম N) আপনার উপর। তবে বলুন যে আপনি অভিধানিক ক্রমটি বেছে নিয়েছেন, আপনার সমাধানটি নিম্নলিখিত টেবিলের সাথে মিলিত হওয়া উচিত ( -অবৈধ ইনপুট নির্দেশ করে):

N\i 1    2    3    4    5    6    7    8    9    10   11   12   13   14   15
1   a    -    -    -    -    -    -    -    -    -    -    -    -    -    -
2   aa   ab   -    -    -    -    -    -    -    -    -    -    -    -    -
3   aaa  aab  aba  abb  abc  -    -    -    -    -    -    -    -    -    -
4   aaaa aaab aaba aabb aabc abaa abab abac abba abbb abbc abca abcb abcc abcd

এখানে একটি সংক্ষিপ্ত সিজেম স্ক্রিপ্ট যা কোনও নির্দিষ্ট দৈর্ঘ্যের জন্য সমস্ত বৈধ ছড়া স্কিম তৈরি করে (তবে 10 এর বেশি চেষ্টা করবেন না বা আপনি কিছুক্ষণ অপেক্ষা করবেন)।

সম্পর্কিত চ্যালেঞ্জ


5
আমি একটি (সু-গল্ফড) বহু-কালিক সমাধান (ইন N) এর উপর একটি অনুগ্রহ রাখতে পারি , তবে শর্ত থাকে যে এটি মোটামুটি তুচ্ছ হিসাবে দেখা না দেয় এবং আমি এটি খুঁজে পেতে কেবল খুব বোকা was
মার্টিন ইন্ডার

যদিও অনুগ্রহটি বহুপদী সময় সমাধানের জন্য প্রস্তুত, আমি এখনও সময়সীমার সাথে মেলে এমন ক্ষতিকারক-সময় সমাধানগুলি দেখতে চাই। (আমার নিজস্ব গণিতের রেফারেন্স প্রয়োগকরণ বর্তমানে চ্যালেঞ্জটি জিততে পারে))
মার্টিন এন্ডার

বি (২)) হ'ল সবচেয়ে ক্ষুদ্রতম বেল সংখ্যা যা 64৪-বিট পূর্ণসংখ্যায় ফিট করে না। লোভী ব্যক্তি। :-(
Anders Kaseorg

উত্তর:


3

সিজেম, 68 66 বাইট

r~:W)1a*{__(;\);_,,.*.+}W(*r~{X@\=_2$\/:CX<!{X:C):X;}&C*-C'a+o}W*;

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

এটি আমার প্রথম সিজেএম প্রোগ্রাম। এটি আমার পার্ল সমাধানের বন্দর হিসাবে জীবন শুরু করেছিল এবং প্রাথমিকভাবে এটি 130 বাইটের বেশি ছিল। আরও গল্ফিং পরামর্শ স্বাগত।

আমার পার্ল প্রোগ্রাম হিসাবে, এটি দুটি অংশে।

Part 1:
r~:W                                         | Read the first input (n) and store it in W
    )1a*                                     | Create an array of n+1 1s
        {              }W(*                  | Repeat n-1 times:
         __                                  | Duplicate array twice
           (;\);                             | Remove first element of 1st array. Swap
                                             | arrays. Remove last element of 2nd array
                _,,                          | Duplicate array. Count items. Create range
                   .*.+                      | Multiply arrays. Add 1st array to result

Part 2:
r~                                           | Read the second input (i)
   {                                  }W*    | Repeat n times:
    X@                                       | Push y (initially 1). Bring item 2 (last array) to top
     \=                                      | Swap top two items. Pop array[y] (v)
       _2$                                   | Duplicate v. Copy item 2 (i) to top
          \/:CX                              | Swap i & v. i/v. Store in C (c). Push y
               <!{       }&                  | If !(i/v < c):
                  X:C):X;                    | c = y. ++y (store in X)
                           C*-C'a+o          | i -= c * v. Push y. Push "a". Add c. Print
                                         ;   | Discard top item (integer 0)

পার্ট 1 অ্যাড দ্বারা নির্মিত অ্যারে ডিবাগ করার ]_`o~যন্ত্রাংশ 1 & 2. যদি n হল মধ্যে 5, অ্যারে ভালো চেহারা হবে: [[1 1 1 1 1 1] [1 2 3 4 5] [2 5 10 17] [5 15 37] [15 52]]। প্রতিটি অ্যারের 0 টি সূচক ব্যবহার করা হয় না, কেবল অফসেট গণনা না করে এগুলি সহজ করে তোলে। অ্যারেগুলি এইভাবে গণনা করা হয়:

[2 5 10 17] [2 5 10 17] [2 5 10 17]        | Duplicate twice
[2 5 10 17] [2 5 10 17] [5 10 17]          | Discard first item of array
[2 5 10 17] [5 10 17] [2 5 10 17]          | Swap last two arrays
[2 5 10 17] [5 10 17] [2 5 10]             | Discard last item of array
[2 5 10 17] [5 10 17] [2 5 10] [2 5 10]    | Duplicate array
[2 5 10 17] [5 10 17] [2 5 10] 3           | Count items in array
[2 5 10 17] [5 10 17] [2 5 10] [0 1 2]     | Integer to range 0 - n-1
[2 5 10 17] [5 10 17] [0 5 20]             | Multiply arrays [2*0 5*1 10*2]
[2 5 10 17] [5 15 37]                      | Add arrays [5+0 10+5 17+20]

পরেরটি গণনার সময় এটি পুরানো অ্যারের একটি অনুলিপি রাখে। অ্যারেগুলি পর্ব 2 দ্বারা বিপরীত ক্রমে পড়ে এবং ফেলে দেওয়া হয়।


13

পাইথন 2, 153

u=[1]*999;i=60;exec"u[i]=i%30*u[i-30]+u[i-29];i+=1;"*900
def x(l,n,a=0):m=u[30*l+a];c=n>=a*m;return'.'*l and chr(65+min(n/m,a))+x(l-1,[n%m,n-m*a][c],a+c)

এটি বর্ণানুক্রমিক ক্রম এবং 0-ভিত্তিক সূচক ব্যবহার করে।

দিন lচিঠির একটি প্রত্যয় দৈর্ঘ্য বোঝাতে এবং aস্বতন্ত্র অক্ষর যে পূর্ববর্তী অংশ ব্যবহার করা হয়েছিল সংখ্যা বোঝান। তারপরে একটি ফাংশন p(l,a)যা বাকী অক্ষরগুলি নির্বাচন করার উপায়গুলির গণনা করে 40 বাইট হতে পারে:

p=lambda l,a:l<1or a*p(l-1,a)+p(l-1,a+1)

যাইহোক, এটি চ্যালেঞ্জের জন্য খুব ধীর, সুতরাং পরিবর্তে প্রয়োজনীয় মানগুলি পূর্বনির্ধারিত হয় এবং uঅ্যারেতে সংরক্ষণ করা হয় । গণনার প্রতিটি পর্যায়ে, পরের বর্ণটি যদি aইতিমধ্যে ব্যবহৃত একটিতে থাকে তবে n = k * পি (l - 1, a) + n ' যেখানে k বর্ণমালার 0-সূচকযুক্ত অক্ষর এবং n' হয় nপরবর্তী ফাংশন কলের মান , যাতে বাকী অক্ষরগুলি সম্পর্কে তথ্য থাকে। যদি কোনও নতুন বর্ণ ব্যবহৃত হয়, তবে n = a * p (l - 1, a) + n '


1
সবচেয়ে খারাপ ক্ষেত্রে ইনপুট পেতে এটি কতক্ষণ সময় নেয়?
মাইকেল ক্লেইন

1
@ মিশেলক্লেন একটি স্বল্প পরিমাণের সময়।
feersum

এটি হ'ল আমি যা করার পরিকল্পনা করছিলাম (যদি আমি জেএসের সাথে এটি না করতাম তবে)। সুন্দর কাজ! +1
ETH প্রোডাকশনগুলি

11

হাস্কেল (জিএইচসি 7.10), 150 বাইট

s=(1,\_->[]):s
k!((y,b):l@((x,a):_))|let h i|i<x=k:a i|(p,q)<-divMod(i-x)y=p:b q=(x+k*y,h):(k+1)!l
n#i=(['a'..]!!).fromEnum<$>snd(iterate(0!)s!!n!!0)i

অপারেটর দৈর্ঘ্যের তম (শূন্য-সূচকযুক্ত) ছড়া স্কিমটি n # iগণনা করে । এটি ও (n²) (বড়-পূর্ণসংখ্যার) ক্রিয়াকলাপগুলিতে চলে, স্বয়ংক্রিয় স্মৃতিচারণের জন্য হাস্কেলের অলস অসীম তালিকার সুবিধা গ্রহণ করে। নমুনা রান:in

*Main> 26 # 0
"abcdefghijklmnopqrstuvwxyz"
*Main> 26 # 1
"abcdefghijklmnopqrstuvwxya"
*Main> 26 # 2
"abcdefghijklmnopqrstuvwxyb"
*Main> 26 # 49631246523618756271
"aaaaaaaaaaaaaaaaaaaaaaaabb"
*Main> 26 # 49631246523618756272
"aaaaaaaaaaaaaaaaaaaaaaaaab"
*Main> 26 # 49631246523618756273
"aaaaaaaaaaaaaaaaaaaaaaaaaa"
*Main> [1 # i | i <- [0..0]]
["a"]
*Main> [2 # i | i <- [0..1]]
["ab","aa"]
*Main> [3 # i | i <- [0..4]]
["abc","aba","abb","aab","aaa"]
*Main> [4 # i | i <- [0..14]]
["abcd","abca","abcb","abcc","abac","abaa","abab","abbc","abba","abbb","aabc","aaba","aabb","aaab","aaaa"]

(26 এর পরিবর্তে যদি সর্বোচ্চ এন 25 হয়, তবে .fromEnumএটি অপসারণ করা যেতে পারে, কারণ বি (25) একটি 64-বিটে ফিট করে Int))


1
দুর্দান্ত লাগছে। আপনি সহজে গ্রাঙ্কিংয়ের জন্য কম গল্ফযুক্ত সংস্করণ যুক্ত করতে আপত্তি করবেন?
মাইকেল ক্লিন

4

পার্ল 257 + 1 (-p পতাকা) = 258

পার্ল 182 + 10 (-pMbignum পতাকা) = 192

($n,$i)=split;@m=[@a=(1)x($n+1)];while($a[2]){push@m,[@a=map{$a[$_]*$_+$a[$_+1]}0..$#a-1]}$_='';$y=1;while($w=pop@m){$c=int($i/($v=$$w[$y]));$c=$y++if($c>=$y);$i-=$c*$v;$_.=chr$c+65}

অনেক বাইট সংরক্ষণ করার জন্য দেব-নুলকে ধন্যবাদ ! আমি এখন সিজেএম সংস্করণটি থেকে যা শিখেছি তার ভিত্তিতে এটি আবার লিখেছি।

ইনডেক্সড 0 বর্ণানুক্রমিক ক্রমে ছড়া গণনা করে।

দুটি অংশ: পার্ট 1 হ'ল 128 90 বাইট এবং পার্ট 2 এর জন্য একটি ম্যাট্রিক্স গণনা করে খণ্ড 2 129 92 বাইট এবং প্রতিটি অক্ষর গণনা করার জন্য কিছু সহজ গণিত করে। আমি যদি ম্যাট্রিক্স থেকে মুক্তি পেয়ে এটিকে দুটি সহজ সংখ্যার সাথে প্রতিস্থাপন করতে পারি তবে আমি প্রতিটি সংখ্যার জন্য ম্যাট্রিক্সের মাধ্যমে একটি একক পথ গণনা করতে পারি এবং প্রচুর বাইট সংরক্ষণ করতে পারি! স্পষ্টতই, এই ধারণাটি কার্যকর হয় না!

দুর্ভাগ্যক্রমে, এটি i9007199254740992 এর চেয়ে বেশি মানের জন্য সঠিক ছড়াগুলি আউটপুট দেয় না , তবে এটি কম মানগুলির জন্য সুন্দরভাবে কাজ করে! আমি 11 বাইট ব্যয়ে বিগনাম লাইব্রেরি যুক্ত করেছি। এটি কমান্ড লাইন দিয়ে চালানো হয় perl -pMbignum bell-rhyme.pl-pMbignum = 10 বাইট এটি কোনও ইনপুট মানের জন্য খুব দ্রুত।


2

ওরাকল এসকিউএল 11.2, 412 284 283 বাইট

WITH a AS(SELECT CHR(96+LEVEL)d,LEVEL b FROM DUAL CONNECT BY LEVEL<=:i),v(s,c,n)AS(SELECT d,1,1 FROM a WHERE b=1 UNION ALL SELECT s||d,b,LENGTH(REGEXP_REPLACE(s||d,'([a-z])\1+','\1'))FROM v,a WHERE(b<=n OR b=c+1)AND LENGTH(s)<:n)SELECT s FROM v WHERE:n=LENGTH(s)AND:i<=:n ORDER BY 1;

দুর্ভাগ্যক্রমে এটি কেবল 8-এর দৈর্ঘ্য পর্যন্ত চলে Any এর চেয়ে আরও বড় কোনও মান ফলাফল: ORA-01489: স্ট্রিং সংমিশ্রণের ফলাফল খুব দীর্ঘ

আন golfed

WITH a AS(SELECT CHR(96+LEVEL)d,LEVEL b FROM DUAL CONNECT BY LEVEL<=:i),
v(s,c,n) AS
(
  SELECT d,1,1 FROM a WHERE b=1
  UNION ALL
  SELECT s||d,b,LENGTH(REGEXP_REPLACE(s||d,'([a-z])\1+','\1')) 
  FROM v,a 
  WHERE (b<=n OR b=c+1) AND LENGTH(s)<:n
)
SELECT s FROM v WHERE LENGTH(s)=:n AND :i<=:n ORDER BY 1;

ভিউটি কলামে a: i অক্ষর এবং খটিতে তাদের মান উত্পন্ন করে।

পুনরাবৃত্ত ভিউ ভি স্ট্রিমটিকে প্যারামিটার ভি হিসাবে তৈরি করা হয়, সিতে ব্যবহৃত সর্বশেষ বর্ণের মান এবং n এর ক্ষেত্রে ব্যবহৃত সবচেয়ে বড় অক্ষরের মান। এন প্যারামিটারটি কোনও সদৃশ অক্ষর ছাড়াই স্ট্রিংয়ের দৈর্ঘ্যের সমান, রেজেেক্সটি কী তা নির্ধারণ করে।

কোনও অক্ষর যদি এর মান <= ইতিমধ্যে ব্যবহৃত সর্বাধিক অক্ষরের মান হয় তবে এটি ব্যবহারের পরবর্তী অক্ষর valid

কোনওভাবে ক্যোয়ারির জন্য LENGTH (গুলি) <: n অংশটি প্রয়োজন, কোয়েরিটি কীভাবে কাজ করে তা সম্পর্কে অবশ্যই আমি কিছু মিস করছি।

মূল SELECT অবৈধ ইনপুটগুলি এবং দৈর্ঘ্যের লক্ষ্যমাত্রা পৌঁছানোর আগেই নির্মিত ছোট্ট স্ট্রিংগুলি ফিল্টারিংয়ের যত্ন নেয়।

412 বাইট সংস্করণ

WITH a AS(SELECT * FROM(SELECT d,b,ROW_NUMBER()OVER(PARTITION BY b ORDER BY d)l FROM(SELECT CHR(64+DECODE(MOD(LEVEL,:i),0,:i,MOD(LEVEL,:i)))d,CEIL(LEVEL/:i)b FROM DUAL CONNECT BY LEVEL<=:i*:n))WHERE l<=b),v(s,c,p)AS(SELECT d,1,l FROM a WHERE b=1 UNION ALL SELECT s||d,c+1,l FROM v,a WHERE c+1=b AND(l<=LENGTH(REGEXP_REPLACE(s,'([A-Z])\1+','\1'))OR l=p+1))SELECT s FROM v WHERE LENGTH(s)=:n AND :i<=:n ORDER BY 1;

26 দিয়ে 412 বাইট ক্যোয়ারির চেষ্টা করবেন না It এটি ডাটাবেসটিকে সীমাবদ্ধ মোডে রাখে, কমপক্ষে আমার ম্যাকবুকের ডকার পাত্রে চালিত এক্স এক্স সংস্করণে। আমি কাজের জায়গায় এক্সেডাটা চেষ্টা করতে পারতাম, তবে দুঃখের বিষয় আমার এখনও জীবিকা নির্বাহের জন্য কাজ করা দরকার।


0

গণিত, 136 বাইট

(For[j=2^#-1;t=#2,c=1;m=0;x=t;r=If[#>0,++m,c*=m;d=x~Mod~m+1;x=⌊x/m⌋;d]&/@j~IntegerDigits~2;;c<=t,t-=c;--j];FromCharacterCode[r+64])&

সম্পূর্ণতার জন্য, এখানে আমার গল্ফ রেফারেন্স বাস্তবায়ন। বিদ্যমান উত্তরের বিপরীতে, এটি বহুপক্ষীয় সময়ে চলবে না (এটি Nবেস 2 সহ সূচকযুক্ত) তবে সময়ের সীমাবদ্ধতা পূরণ করে (সবচেয়ে খারাপ পরিস্থিতি এখনও আধ ঘন্টাের মধ্যে চলতে পারে)।

ধারণাটি হ'ল:

  • প্রতিটি ছড়া স্কিমের জন্য আমরা সেই অবস্থানগুলি সনাক্ত করতে পারি যেখানে এখন পর্যন্ত সর্বাধিক চরিত্রটি বৃদ্ধি পেয়েছে:

    ABCDEFGHDIJDEKBBIJEIKHDFII
    ^^^^^^^^ ^^  ^
    

    আমরা সেই চিহ্নগুলিকে বাইনারি সংখ্যা হিসাবে বিবেচনা করতে পারি যা এ জাতীয় সমস্ত কাঠামোর উপরে পুনরাবৃত্তি করা সহজ করে। আমাদের 2 এন -1 থেকে 2 এন (বা অন্য উপায়ে) থেকে পুনরাবৃত্তি করতে হবে যা সূচকীয় সময় জটিলতা থেকে আসে।

  • এই জাতীয় প্রতিটি কাঠামোর জন্য এটি নির্ধারণ করা সহজ যে এরকম কতগুলি স্ট্রিং রয়েছে: কেবলমাত্র চিহ্নিতকরণগুলির মধ্যে ফাঁকগুলি নির্দ্বিধায় চয়ন করা যেতে পারে এবং ফাঁকের সামনের সর্বাধিকটি আমাদের জানায় যে প্রতিটি অবস্থানে কতগুলি পৃথক অক্ষর বৈধ are এটি একটি সাধারণ পণ্য। এই সংখ্যাটি যদি এর চেয়ে কম হয় তবে iআমরা এটিকে বিয়োগ করি i। অন্যথায়, আমরা অনুরোধ করা ছড়া প্রকল্পের কাঠামোটি খুঁজে পেয়েছি।
  • প্রদত্ত কাঠামোর স্কিমগুলি গণনার জন্য, আমরা কেবল iএকটি মিশ্র-বেস নম্বর হিসাবে উপস্থাপন করি (বা এর মধ্যে কী রয়েছে) যেখানে বাকী অবস্থানগুলিতে অনুমোদিত অক্ষরের সংখ্যা দ্বারা অঙ্কগুলির ওজন নির্ধারিত হয়।

আমি ভাবছি যে এটি জমা দেওয়া অন্যান্য ভাষাগুলির মধ্যে কিছু সংক্ষিপ্ত সমাধানের অনুমতি দেয় কারণ এটির কোনও স্মৃতি বা পূর্বরূপ প্রয়োজন হয় না।

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