গিজ্বিজ্টের ক্রমের n সংখ্যাগুলি তৈরি করুন


19

ভূমিকা

গিজ্বিজ্টের সিকোয়েন্স ( A090822 ) সত্যিই সত্যই ধীরে ধীরে। বর্ণনা করা:

  • প্রথম 3 নবম পদে উপস্থিত হয় (ঠিক আছে)।
  • প্রথম 4 টি 220 তম পর্বে উপস্থিত হয় (অনেক দূরে, তবে সম্ভাব্য)।
  • প্রথম 5টি (প্রায়) 10 ^ (10 ^ 23) তম পদে (ঠিক না) উপস্থিত হয়।
  • প্রথম is কোথায় তা সত্যিই কেউ জানে না ... সন্দেহ হয় এটি এখানে ...

    2 ^ (2 ^ (3 ^ (4 ^ 5%)) তম পদ।

আপনি ধরে নিতে পারেন যে আপনাকে দুই-অঙ্কের সংখ্যার সাথে ডিল করতে হবে না।

ক্রমটি এর মতো উত্পন্ন হয়:

  1. প্রথম পদটি 1।
  2. তার পরের প্রতিটি শব্দটি এর আগে "ব্লক" পুনরাবৃত্তি করার পরিমাণ (যদি একাধিক পুনরাবৃত্তি "ব্লক" থাকে তবে সর্বাধিক পরিমাণ পুনরাবৃত্তি ব্লক ব্যবহৃত হয়)।

স্পষ্ট করার জন্য, এখানে প্রথম কয়েকটি পদ রয়েছে।

1 -> 1, 1(একটি পুনরাবৃত্তি ব্লক ( 1), সুতরাং অঙ্কটি রেকর্ড করা হয় 1)

1, 1 -> 1, 1, 2(দুটি পুনরাবৃত্তি ব্লক ( 1), সুতরাং অঙ্কটি রেকর্ড করা হয় 2)

1, 1, 2 -> 1, 1, 2, 1(একটি পুনরাবৃত্তি ব্লক ( 2বা 1, 1, 2), সুতরাং অঙ্কিত অঙ্কটি হ'ল 1)

1, 1, 2, 1 -> 1, 1, 2, 1, 1 (আপনি ধারণা পেতে)

1, 1, 2, 1, 1 -> 1, 1, 2, 1, 1, 2

1, 1, 2, 1, 1, 2 -> 1, 1, 2, 1, 1, 2, 2(দুটি পুনরাবৃত্তি ব্লক ( 1, 1, 2), সুতরাং অঙ্কটি রেকর্ড করা হয় 2)

কার্য

আপনার কাজটি যেমন প্রশ্নে বর্ণিত হয়েছে, গিজ্বিজ্ট ক্রমটির এন ডিজিট তৈরি করা।

নির্দেশনা

  • ইনপুটটি পূর্ণসংখ্যা হবে n
  • আপনার কোড ডিজিটগুলি যে কোনও আকারে আউটপুট করতে পারে (একটি তালিকা, একাধিক আউটপুট ইত্যাদি)।

এটি কোড গল্ফ, তাই বাইট জেতে সংক্ষিপ্ততম কোড।

উত্তর:


7

পাইথ, 25 22 21 বাইট

t_u+eSmtfxG*Td1._GGQN

ওপি নিশ্চিত করেছে যে আমাদের কেবল একক-অঙ্কের সংখ্যাগুলি পরিচালনা করতে হবে। এটি তালিকার অঙ্কের স্ট্রিং হিসাবে সংরক্ষণের অনুমতি দেয়। -> 3 বাইট সংরক্ষণ করা হয়েছে

অনলাইনে চেষ্টা করুন: বিক্ষোভ

ব্যাখ্যা:

t_u+...GQN      implicit: Q = input number
         N      start with the string G = '"'
  u     Q       do the following Q times:
    ...            generate the next number
   +   G           and prepend it to G
 _              print reversed string at the end
t               remove the first char (the '"')

এবং এখানে আমি পরবর্তী নম্বরটি কীভাবে উত্পন্ন করব তা এখানে:

eSmtfxG*Td1._G
           ._G    generate all prefixes of G
  m               map each prefix d to:
    f     1          find the first number T >= 1, so that:
       *Td              d repeated T times
     xG                 occurs at the beginning of G
 S                  sort all numbers
e                   take the last one (maximum)   

তালিকা সহ 21 বাইট

_u+eSmhhrcGd8SlGGtQ]1

অনলাইনে চেষ্টা করুন: বিক্ষোভ

মার্টিন এবং পিটার একই ধারণা ব্যবহার করে। প্রতিটি পদক্ষেপে আমি স্ট্রিংটি দৈর্ঘ্য 1, দৈর্ঘ্যের 2 টুকরো টুকরো টুকরো করে বিভক্ত করি ... তারপরে আমি সেগুলি দৈর্ঘ্য-এনকোড করে সর্বাধিক প্রথম রানটি পরের সংখ্যা হিসাবে ব্যবহার করি।

স্ট্রিং সহ 20 বাইট

t_u+eSmhhrcGd8SlGGQN

অনলাইনে চেষ্টা করুন: বিক্ষোভ

উপরের দুটি কোডের ধারণাগুলি একত্রিত করে।


1
আমাকে শেখানোর জন্য ধন্যবাদ। আমি ._পাইথের ফাংশন এবং অন্যান্য দরকারী ফাংশন সবসময় ভুলে যাই ।
লিকি নুন

আমি ব্যক্তিগতভাবে মূল সমাধানটি আরও পছন্দ করেছি তবে এহ।
ক্লিমেমিক

@ জাকুবে আহ। আমি একটি চেহারা থাকতে পারে? যদি হ্যাঁ, তবে ধন্যবাদ!
ক্লিষ্টিক

@ ডেরফেসপিসথন আমার মূল সমাধানটিতে একটি অতিরিক্ত বাইট গল্ফ করতে সক্ষম হয়েছিল। আমি মার্টিনের উপর ভিত্তি করে রান-লেংথ-এনকোডিং সমাধানও পোস্ট করেছিলাম এবং তারপরে দুটি বাইটগুলিকে একসাথে 20 বাইট সমাধান জেনারেট করতে সক্ষম করেছিলাম।
জাকুবে

5

সিজেম, 33 31 30 27 বাইট

1 বাইট বাঁচানোর জন্য পিটার টেলরকে ধন্যবাদ।

1sri({),:)1$W%f/:e`$W=sc+}

এটি এখানে পরীক্ষা করুন।

ব্যাখ্যা

1s      e# Initialise the sequence as "1".
ri(     e# Read input N and decrement.
{       e# For each I from 0 to N-1...
  )     e#   Increment to get I from 1 to N.
  ,     e#   Turn into a range [0 1 ... I-1].
  :)    e#   Increment each element to get [1 2 ... I].
  1$    e#   Copy sequence so far.
  W%    e#   Reverse the copy.
  f/    e#   For each element x in [1 2 ... I], split the (reversed) sequence
        e#   into (non-overlapping) chunks of length x. These are the potentially
        e#   repeated blocks we're looking for. We now want to find the splitting
        e#   which starts with the largest number of equal blocks.
  :e`   e#   To do that, we run-length encode each list blocks.
  $     e#   Then we sort the list of run-length encoded splittings, which primarily
        e#   sorts them by the length of the first run.
  W=    e#   We extract the last splitting which starts with the longest run.
  sc    e#   And then we extract the length of the first run by flattening
        e#   the list into a string and retrieving the first character.
  +     e#   This is the new element of the sequence, so we append it.
}/

:) জন্য +1 (আরও 5 জন যেতে হবে ...)
লিকি নুন

5

সিজেম ( 30 29 27) 24 বাইট)

'1ri{{)W$W%/e`sc}%$W>+}/

অনলাইন ডেমো

এটি মার্টিনের সাথে একটি যৌথ প্রচেষ্টা।

  • রান-লেংথ এনকোডিংয়ের চতুর ব্যবহার (e`পুনরাবৃত্তি সনাক্ত করতে ) হ'ল মার্টিন
  • এর ব্যবহারও তাই W$স্ট্যাক পরিচালনা সহজ করার জন্য
  • আমি $W>+নীচে বিচ্ছিন্নভাবে বর্ণিত হিসাবে, বিশেষ-কেসিং ব্যবহার করে বেশ কয়েকটি বৃদ্ধি / হ্রাস ক্রিয়াকলাপগুলি সরিয়েছি

আমার প্রথম 30-বাইট পদ্ধতির:

1ari{,1$f{W%0+_@)</{}#}$W>+}/`

অনলাইন ডেমো

ব্যবচ্ছেদ

1a        e# Special-case the first term
ri{       e# Read int n and iterate for i=0 to n-1
  ,1$f{   e#   Iterate for j=0 to i-1 a map with extra parameter of the sequence so far
    W%0+  e#     Reverse and append 0 to ensure a non-trivial non-repeating tail
    _@)</ e#     Take the first j+1 elements and split around them
    {}#   e#     Find the index of the first non-empty part from the split
          e#     That's equivalent to the number of times the initial word repeats
  }
  $W>+    e#   Add the maximal value to the sequence
          e#   NB Special case: if i=0 then we're taking the last term of an empty array
          e#   and nothing is appended - hence the 1a at the start of the program
}/
`         e# Format for pretty printing

3

হাস্কেল, 97 বাইট

f 1=[1]
f n|x<-f$n-1=last[k|k<-[1..n],p<-[1..n],k*p<n,take(k*p)x==([1..k]>>take p x)]:x
reverse.f

তৃতীয় লাইন একটি বেনামি ফাংশন সংজ্ঞায়িত করে যা একটি পূর্ণসংখ্যা নেয় এবং পূর্ণসংখ্যার একটি তালিকা দেয় returns এটি কর্মে দেখুন।

ব্যাখ্যা

fপূর্ববর্তী ক্রমটি পুনরাবৃত্ত ব্লক দিয়ে শুরু হয় কিনা তা পুনরাবৃত্তভাবে পরীক্ষা করে সাহায্যকারী ফাংশনটি বিপরীতে ক্রমটি তৈরি করে। kপুনরাবৃত্তির সংখ্যা এবং pএটি ব্লকের দৈর্ঘ্য।

f 1=[1]                                   -- Base case: return [1]
f n|x<-f$n-1=                             -- Recursive case; bind f(n-1) to x.
  last[k|k<-[1..n],                       -- Find the greatest element k of [1..n] such that
  p<-[1..n],                              -- there exists a block length p such that
  k*p<n,                                  -- k*p is at most the length of x, and
  take(k*p)x                              -- the prefix of x of length p*k
    ==                                    -- is equal to
  ([1..k]>>take p x)                      -- the prefix of length p repeated k times.
  ]:x                                     -- Insert that k to x, and return the result.
reverse.f                                 -- Composition of reverse and f.


1

রেটিনা , 66 60 বাইট

+1`((\d+)?(?<1>\2)*(?<!\3(?>(?<-1>\3)*)(?!.*\2)(.+)))!
$1$#1

ইনপুটটি !অঙ্ক হিসাবে অবিচ্ছিন্ন পূর্ণসংখ্যার (যদিও এটি অন্য কোনও অ-সংখ্যাযুক্ত অক্ষরে পরিবর্তিত হতে পারে)। আউটপুট কেবল অঙ্কের একটি স্ট্রিং।

এটি অনলাইন চেষ্টা করুন! (বিকল্প হিসাবে, সুবিধার জন্য এখানে একটি সংস্করণ রয়েছে যা দশমিক ইনপুট নেয় ))

পরীক্ষার উদ্দেশ্যে, এটি একটি ছোট সংশোধন করে প্রচুর পরিমাণে বাড়িয়ে দেওয়া যেতে পারে , যা এক মিনিটের মধ্যে ইনপুট 220 এ পরীক্ষার অনুমতি দেয়:

+1`((\d+)?(?<1>\2)*(?=!)(?<!\3(?>(?<-1>\3)*)(?!.*\2)(.+)))!
$1$#1

এটি অনলাইন চেষ্টা করুন! ( দশমিক সংস্করণ। )

আপনি যদি আরও বেশি সংখ্যক পরীক্ষা করতে চান, তবে এটি কেবল কিছু বড় ইনপুট খাওয়ানো ভাল এবং :প্রাথমিকের পরে কিছু দেওয়া উচিত +। এটি রেটিনা বর্তমান ক্রমটি মুদ্রণ করে প্রতিবার নতুন ডিজিটের সম্পূর্ণ গণনা শেষ করতে সক্ষম করবে (সমস্ত সংখ্যার বাইরে একসাথে)।

ব্যাখ্যা

সমাধানটিতে একটি একক রেজেক্স সাবস্টিটিউশন থাকে, যা ফলাফল পরিবর্তন করা বন্ধ না হওয়া পর্যন্ত ইনপুটটিতে বারবার প্রয়োগ করা হয়, যা এই ক্ষেত্রে ঘটে কারণ রেজেক্স আর মেলে না। +শুরুতে এই লুপ প্রবর্তন করে। এটি 1এমন একটি সীমা যা রেটিনাকে কেবল প্রথম ম্যাচটি প্রতিস্থাপন করতে বলে (এটি কেবলমাত্র প্রথম পুনরাবৃত্তির জন্য প্রাসঙ্গিক)। প্রতিটি পুনরাবৃত্তিতে, মঞ্চটি একটি প্রতিস্থাপন করে! ক্রমের পরবর্তী অঙ্কের সাথে (বাম দিক থেকে) করে।

যথারীতি, আপনার যদি ভারসাম্যপূর্ণ গোষ্ঠীগুলির প্রাইমারের প্রয়োজন হয় তবে আমি আপনাকে আমার এসও উত্তরে উল্লেখ করব

এখানে রেজেক্সের একটি বর্ণিত সংস্করণ। নোট করুন যে লক্ষ্যটি হচ্ছে গ্রুপে সর্বাধিক সংখ্যক পুনরাবৃত্ত ব্লক ক্যাপচার করা 1

(                 # Group 1, this will contain some repeated block at the end
                  # of the existing sequence. We mainly need this so we can
                  # write it back in the substitution. We're also abusing it
                  # for the actual counting but I'll explain that below.
  (\d+)?          # If possible (that is except on the first iteration) capture
                  # one of more digits into group 2. This is a candidate block
                  # which we're checking for maximum repetitions. Note that this
                  # will match the *first* occurrence of the block.
  (?<1>\2)*       # Now we capture as many copies of that block as possible
                  # into group 1. The reason we use group 1 is that this captures
                  # one repetition less than there is in total (because the first
                  # repetition is group 2 itself). Together with the outer
                  # (unrelated) capture of the actual group one, we fix this
                  # off-by-one error. More importantly, this additional capture
                  # from the outer group isn't added until later, such that the
                  # lookbehind which comes next doesn't see it yet, which is
                  # actually very useful.
                  # Before we go into the lookbehind note that at the end of the
                  # regex there's a '!' to ensure that we can actually reach the
                  # end of the string with this repetition of blocks. While this 
                  # isn't actually checked until later, we can essentially assume
                  # that the lookbehind is only relevant if we've actually counted
                  # repetitions of a block at the end of the current sequence.

  (?<!            # We now use a lookbehind to ensure that this is actually the
                  # largest number of repetitions possible. We do this by ensuring
                  # that there is no shorter block which can be matched more
                  # often from the end than the current one. The first time this
                  # is true (since, due to the regex engine's backtracking rules,
                  # we start from longer blocks and move to shorter blocks later),
                  # we know we've found the maximum number of repetitions.
                  # Remember that lookbehinds are matched right-to-left, so
                  # you should read the explanation of the lookbehind from
                  # bottom to top.
    \3            # Try to match *another* occurrence of block 3. If this works,
                  # then this block can be used more often than the current one
                  # and we haven't found the maximum number of repetitions yet.
    (?>           # An atomic group to ensure that we're actually using up all
                  # repetitions from group 1, and don't backtrack.
      (?<-1>\3)*  # For each repetition in group 1, try to match block 3 again.
    )
    (?!.*\2)      # We ensure that this block isn't longer than the candidate
                  # block, by checking that the candidate block doesn't appear
                  # right of it.
    (.+)          # We capture a block from the end into group 3.
  )               # Lookbehind explanation starts here. Read upwards.
)
!                 # As I said above, this ensures that our block actually reaches
                  # the end of the string.

সবশেষে শেষ হয়ে যাওয়ার পরে, আমরা আবার লিখিত $1(এর মাধ্যমে মুছে ফেলা !) পাশাপাশি সেই গ্রুপে ক্যাপচারের সংখ্যাটি $#1যা সর্বাধিক সংখ্যার পুনরাবৃত্তির সাথে মিলে যায়।


কেন রেটিনা সংখ্যার পরিবর্তে অবিরাম সমাধান নেয়?
ক্লিষ্টিক

@ ডেরফেসপিজথন কারণ এটি সস্তা এবং and কমত্যের দ্বারা অনুমোদিত । আপনি ইনপুট একটি দশমিক সংখ্যা হতে হবে তা নির্দিষ্ট করে (আপনি সেক্ষেত্রে সমাধানটি পরিবর্তন করতে পেরে আমি খুশি) অবিচ্ছিন্ন মুক্ত।
মার্টিন এন্ডার

আহ, শোধন জন্য ধন্যবাদ। মাত্র কৌতূহলের বাইরে, আপনি দশমিকের জন্য একটি উত্তর (মন্তব্যগুলিতে) রাখতে পারেন? যদি তাই হয়, ধন্যবাদ।
ক্লিমেমিক

@ ডেরফেসপিজথন দশমিক ইনপুট ব্যবহার করে পৃথক লিঙ্ক যুক্ত করেছে।
মার্টিন ইন্ডার

গল্ফ করা শেষ হলে ব্যাখ্যা?
ক্যালকুলেটরফলাইন

0

রুবি, 84 বাইট

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

->n{s='';n.times{s+=(1..n).map{|i|s=~/(\d{#{i}})\1+$/?$&.size/i: 1}.max.to_s};s[-1]}

ইতিমধ্যেই তৈরি হওয়া ক্রম দেওয়া s, এটা সর্বাঙ্গে মানচিত্র iথেকে 1থেকে s.length( nএই ক্ষেত্রে ব্যবহার করা হয়েছিল যেহেতু বাইট সংরক্ষণ করতে n>=s.length) এবং তারপর দৈর্ঘ্য সঙ্গে একটি subsequence এর পুনরাবৃত্তির সংখ্যা সাহায্যের নিরূপণ করা এই Regex ব্যবহার i:

/(.{#{i}})\1+$/
/(                 # Assign the following to group 1
  .{#{i}}          # Match `i` number of characters
         )         # End group 1
          \1+      # Match 1 or more repetitions of group 1
             $/    # Match the end of string

একটি ম্যাচ যে দৈর্ঘ্য পাওয়া যায়, তাহলে তা দেওয়া ম্যাচের দৈর্ঘ্য বিভাজক দ্বারা পুনরাবৃত্তির সংখ্যা গণনা করে $&দ্বারা i, subsequence দৈর্ঘ্য; যদি কোনও মিল খুঁজে পাওয়া যায় নি, তবে এটি হিসাবে বিবেচিত হবে 1। ফাংশনটি এই ম্যাপিং থেকে সর্বাধিক সংখ্যক পুনরাবৃত্তি সন্ধান করে এবং স্ট্রিংয়ের শেষে সেই সংখ্যাটি যুক্ত করে।

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