স্কোলেম সিকোয়েন্স তৈরি করুন


10

স্কোলেম সিকোয়েন্স

একজন Skolem ক্রম একটি ক্রম 2nসংখ্যার যেখানে প্রত্যেক সংখ্যা iমধ্যে 1এবং nঠিক দুইবার হয় এবং দুই ঘটনার মধ্যে দূরত্ব iঠিক iধাপ। স্কোলিম সিকোয়েন্সগুলির কয়েকটি উদাহরণ এখানে রয়েছে:

1 1
1 1 4 2 3 2 4 3
16 13 15 12 14 4 7 3 11 4 3 9 10 7 13 12 16 15 14 11 9 8 10 2 6 2 5 1 1 8 6 5

নিম্নলিখিত ক্রম না Skolem সিকোয়েন্স:

1 2 1 2      (The distance between the 1's is 2, not 1)
3 1 1 3      (The number 2 is missing)
1 1 2 1 1 2  (There are four 1's)

উদ্দেশ্য

প্রদত্ত দৈর্ঘ্যের সমস্ত স্কোলেম অনুক্রমের সংখ্যা গণনা করার জন্য একটি প্রোগ্রাম, ফাংশন বা এক্সপ্রেশন লিখুন। আরও স্পষ্টতই, আপনার ইনপুটটি একটি পূর্ণসংখ্যা nএবং আপনার আউটপুটটি দৈর্ঘ্যের স্কোলেম সিকোয়েন্সগুলির সংখ্যা 2n। এই অনুক্রমের একটি OEIS এন্ট্রি রয়েছে । জন্য n = 0, আপনি হয় 0বা ফিরে আসতে পারেন 1। প্রথম কয়েকটি মান, থেকে শুরু করে 0are

0, 1, 0, 0, 6, 10, 0, 0, 504, 2656, 0, 0, 455936, 3040560, 0, 0, 1400156768

বিধি এবং স্কোরিং

এটি কোড গল্ফ। আউটপুট ফর্ম্যাট কারণ মধ্যে শিথিল।


শুধু কৌতূহলী, তবে 0, 1, 0, 0, 6...আপনার প্রশ্নটি কী? যে কোড স্নিপেট, তাই যদি কোন ভাষা হয়?
ফিলনটপি

2
আপনার আউটপুটটিতে প্রথম আইটেমটি কেন 0? আপনি যদি 0একটি বৈধ ইনপুট হিসাবে স্বীকার করতে যাচ্ছেন তবে আউটপুট হওয়া উচিত 1
পিটার টেলর

1
কিছু (আমার কোড সহ) বিশ্বাস করে যে শূন্যটি শূন্য রয়েছে। যদি 1 আপনাকে আরও ভাল বোধ করে তবে তা ফিরিয়ে দিন।
বুথবি

2
এএফআইকে প্রতিটি প্রসঙ্গে আপনি ধরে নেন যে এখানে কেবলমাত্র একটি খালি সিকোয়েন্স / নাল অবজেক্ট / খালি সেট ইত্যাদি / ফাংশন-থেকে-থেকে-খালি-সেট / খালি গ্রাফ / অন্য যাই হোক না কেন।
বাকুরিউ

1
@ বুথবি, আপনি কি নূথকে বোকা বলেছিলেন?
পিটার টেলর

উত্তর:


8

গল্ফস্ক্রিপ্ট, 48 46 টি অক্ষর

:b,1,{)2\?){{.2$&!{.2$|@@}*.+.4b?<}do;;}+%}@/,

দ্রুত সংস্করণ ( অনলাইনে চেষ্টা করুন ) - যুক্তিসঙ্গত দ্রুত n=8সঞ্চালিত হয় , যেমন প্রায় দুই সেকেন্ড সময় নেয়। এবং নির্বাচিত পদ্ধতির সত্যই কয়েকটি অক্ষর লাগে।

এই সংস্করণটি বিটমাস্কগুলির সাথেও কাজ করে। এটি 1 থেকে উপরের দিকে সম্ভাব্য ফলাফল অ্যারে বিল্ট করে, যেমন n=3:

1: 000011        000110 001100 011000 110000
2: 010111 101011 101110        011101 110101 111010

কিছু ফলাফলের (যেমন 000011) দুটি সম্ভাব্য ধারাবাহিকতা থাকে, অন্যের (যেমন 001100) কোনও কিছুই থাকে না এবং ফলাফল অ্যারে থেকে সরানো হয়।

কোডের ব্যাখ্যা:

:b           # save the input into variable b for later use
,            # make the list 0..b-1 (the outer loop)
1,           # puts the list [0] on top of the stack - initially the only possible
             # combination
{)           # {...}@/ does the outer loop counting from i=1 to b
  2\?)       # computes the smalles possible bit mask m=2^i+1 with two bits set 
             # and distance of those equal to i (i.e. i=1: 11, i=2: 101, ...)
  {          # the next loop starts with this bitmask (prepended to code via
             # concatination {...}+
             # the loop itself iterates the top of the stack, i.e. at this point 
             # the result array                 
             # stack here contains item of result array (e.g. 00000011)
             # and bitmask (e.g. 00000101)
    {        # the inner-most loop tries all masks with the current item in the result set
      .2$&!  # do item and result set share not single bit? then - {...}*
      {
        .2$| # then generate the new entry by or-ing those two
        @@   # push it down on the stack (i.e. put working items to top)
      }*
      .+     # shift the bit mask left by one
      .4b?<  # if still in the range loop further
    }do;;    # removes the remainders of the loop (i.e. item processed and mask)
  }+%        # stack now contains the new result array
}@/
,            # length of result array, i.e. the number of Skolem sequences

বাঁধা সমাধানগুলি দ্রুত গ্রহণ করা।
বুথবি

6

জে এক্সপ্রেশন, 47 টি অক্ষর

 +/*/"1((=&{:+.2-#@])#;.2)\"1~.(i.!+:y)A.,~>:i.y

উদাহরণ:

    y=:5
    +/*/"1((=&{:+.2-#@])#;.2)\"1~.(i.!+:y)A.,~>:i.y
10

y=:5আমার মেশিনে প্রায় 30 সেকেন্ড সময় নেয় ।

অ্যালগরিদম যতটা ধীর হতে পারে:

  • ~.(i.!+:y)A.,~>:i.yপ্রতিটি অনুক্রমের উত্পাদন 1 2 .. y 1 2 .. yএবং সদৃশ এন্ট্রি অপসারণ
  • ((=&{:+.2-#@])#;.2)\"1 নির্ণয়:
    • (...)\"1 প্রতিটি সারির প্রতিটি উপসর্গের জন্য:
      • #;.2 শেষ উপাদানটির প্রতিটি ঘটনার আগে উপাদানগুলিকে গণনা করে
      • #@] গণনাগুলির সংখ্যা গণনা করে (যেমন শেষ উপাদানটির উপস্থিতির সংখ্যা)
      • =&{: গণনা তালিকার এবং মূল তালিকার "" শেষ উপাদান "এর" সমতা "" নির্ধারণ করে।
      • +.একটি যৌক্তিক OR। =&{:+.2-#@]"গণনা তালিকার সর্বশেষ উপাদান এবং মূল তালিকার] হয় সমান, অথবা দুটিয়ের পরিবর্তে [গণনা তালিকায়] কেবলমাত্র একটি উপাদান রয়েছে" পড়ছে।
  • */"1 শর্ত সারণির সারিগুলিতে গুণমান (লজিক্যাল এ্যান্ড), স্কুলেম সিকোয়েন্সগুলি কোন অনুগমনগুলি তা নির্ধারণ করে।
  • +/ একসাথে এবং শূন্যগুলি যোগফল।

6

গল্ফস্ক্রিপ্ট (46 টি অক্ষর)

:&1,\,{0,2@)?)2&*{2${1$^}%@+\2*}*;+}/{4&?(=},,

এটি একটি অভিব্যক্তি যা স্ট্যাকের ইনপুট নেয়। এটি একটি সম্পূর্ণ প্রোগ্রামে রূপান্তর করতে যা স্টিডিনে ইনপুট নেয়, প্রিপেন্ড করে~

এটি মোটামুটি অকার্যকর - আমি 56 টি অক্ষর থেকে একে একে গল্ফ করার জন্য যে পরিমাণ बचत করেছি তা বেশিরভাগ ক্ষেত্রে লুপের পরিসীমাটি এমনভাবে বাড়ানো হয়েছিল যা ভুল ফলাফল প্রবর্তন করে না তবে বর্জ্য গণনা করে।

পদ্ধতিটি কার্টেসিয়ান পণ্যগুলিকে বিটওয়ালাভাবে মাস্কিং করছে। n=4উদাচীত কোডের জন্য উদাহরণস্বরূপ (মুখোশগুলির জন্য বাইনারি ব্যবহার করে) কার্টেসিয়ান পণ্যের প্রতিটি উপাদানের জোরকে গণনা করবে [00000011 00000110 ... 11000000] x [00000101 00001010 ... 10100000] x ... x [00010001 ... 10001000]। 8 বিট সহ যে কোনও ফলাফল কেবল নন-ওভারল্যাপিং মুখোশ দ্বারা অর্জন করা যেতে পারে।

গতির চেয়ে আকারের জন্য অনুকূলিতকরণের জন্য, কোডটি আংশিক পণ্যগুলি ( S1 u S1xS2 u S1xS2xS3 ...) সংগ্রহ করে এবং প্রতিটি পণ্যকে এমন 2nউপাদানগুলির পরিবর্তে করে তোলে 2n-1-iযা আসলে কোনও বৈধ ক্রমকে অবদান রাখতে পারে।

দ্রুততা

গল্ফযুক্ত সংস্করণটি n=5আমার কম্পিউটারে 10 সেকেন্ডের জন্য এবং 5 মিনিটেরও বেশি সময় ধরে চলে n=6। মূল অলংগ সংস্করণটি n=5এক সেকেন্ডেরও কম সময়ে n=6এবং প্রায় 1 মিনিটের মধ্যে গণনা করে । মধ্যবর্তী ফলাফলগুলিতে একটি সাধারণ ফিল্টার সহ, এটি n=830 সেকেন্ডের মধ্যে গণনা করতে পারে । লুপগুলি যতটা সম্ভব সীমাবদ্ধ রাখা এবং অন্তর্বর্তী সংঘর্ষগুলি ফিল্টার করে আমি এটিকে 66 টি চর হিসাবে (একটি প্রোগ্রাম হিসাবে - 65 টি বর্ণ হিসাবে একটি অভিব্যক্তি হিসাবে) গল্ফ করেছি:

~:&1,\,{0,\).2\?)2&*@-{.{[\].~^.@~+<{;}*}+3$%@+\2*}*;\;}/{4&?(=},,

অভিশাপ। ঠিক যখন আমি ভেবেছিলাম আমার 48char J দ্রষ্টব্য পোস্ট করার পক্ষে যথেষ্ট ভাল।
জন ডিভোরাক

অভিশাপ। আমাদের 47-চরিত্রের টাই খুব বেশি দিন স্থায়ী হয়নি। +1
জন ডিভোরাক

5

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

~:/..+?:d(,{d+/base(;:w;/,{.w?)w>1$?=},,/=},,/1=+

nSTDIN এ নম্বর আশা করে । এটি কোড-গল্ফ - n5 টির বেশি সংখ্যক কোডটি ব্যবহার করে দেখুন না ।


আউচ, 5 এর বেশি নেই?
বুথবি

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

0

Ageষি, 70

এটি আমার আসল চেয়ে কিছুটা ছোট orter

sum(1for i in DLXCPP([(i-1,j,i+j)for i in[1..n]for j in[n..3*n-i-1]]))

কিভাবে এটা কাজ করে:

একটি 0/1 ম্যাট্রিক্স দেওয়া, সেই ম্যাট্রিক্সের জন্য সঠিক কভার সমস্যাটি হ'ল সর্ব-সংখ্যক ভেক্টরের সাথে সংখ্যক (পূর্ণসংখ্যা হিসাবে) সারিগুলির একটি উপসেট সন্ধান করা। উদাহরণ স্বরূপ,

11001
10100
01001
00011
00010

একটি সমাধান আছে

10100
01001
00010

সমস্যার প্রতি আমার প্রিয় পদ্ধতির হ'ল এগুলি একটি যথাযথ কভার সমস্যায় ফেলে দেওয়া। স্কোলেম সিকোয়েন্সগুলি দক্ষতার সাথে এটিকে সহজতর করে তোলে। আমি একটি সঠিক কভার সমস্যা তৈরি করি যেখানে সমাধানগুলি দৈর্ঘ্যের স্কোলেম সিকোয়েন্সগুলির সাথে সম্মতিতে রয়েছে 2n। উদাহরণস্বরূপ, সমস্যার একটি সারিতে n=6হয়

  a   |  b  
001000|001001000000 # S[b] = S[b+a+1] = a

যেখানে অবস্থানের 1 এর a < nঅর্থ দাঁড়ায় যে চিহ্নটি aব্যবহৃত হয়। বাকী অবস্থানগুলি ক্রমের প্রকৃত অবস্থানের সাথে সামঞ্জস্য। একটি সঠিক কভার প্রতিটি প্রতীক হুবহু একবার ব্যবহৃত হওয়ার সাথে মিল করে এবং প্রতিটি অবস্থান ঠিক একবারে পূরণ করা হয়। নির্মাণ করে, কোনও kঅবস্থানের কোনও প্রতীক kতার অংশীদার থেকে দূরে থাকা।

সেজে DLXCPPহ'ল "ডান্সিং লিঙ্কস" বাস্তবায়ন - এটি হ'ল কভার সমস্যাটিকে ব্যতিক্রমী কৃপণভাবে সমাধান করে। এটি আমার প্রিয় অ্যালগোরিদমগুলির মধ্যে একটি, এবং সেজে ঠিক তলদেশে থাকা মিশ্রিত অঙ্ককে আনন্দ দেয় makes


বাহ, নাচের লিঙ্ক। ব্যবহার len(list(...))4 টি অক্ষর সাশ্রয় করবে।
রে

@ রে আমার কম্পিউটারটি কেবল মারা যাবে যদি আমি len(list(...))এন = 16 এর জন্য গণনা করি । এবং এটি পুরোপুরি রানটাইমকে হত্যা করবে।
বুথবি

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