একটি অনির্ধারিত স্ট্রিংয়ে অনুপস্থিত নম্বরটি সন্ধান করুন


19

চ্যালেঞ্জ হ'ল অনির্ধারিত পূর্ণসংখ্যার একটি স্ট্রিংয়ে অনুপস্থিত নম্বর সনাক্ত করা।

আপনাকে অঙ্কের একটি স্ট্রিং দেওয়া হয়েছে (বৈধ ইনপুটটি নিয়মিত অভিব্যক্তির সাথে মিলবে ^[1-9][0-9]+$)। স্ট্রিংটি পূর্ণসংখ্যার ক্রমিক প্রতিনিধিত্ব করে। উদাহরণস্বরূপ 1234567891011,। সিকোয়েন্সের সমস্ত নম্বরগুলি সমেত 1এবং 2147483647অন্তর্ভুক্তের মধ্যে রয়েছে।

ক্রমটি সংখ্যার একটি সিরিজ যেখানে প্রতিটি সংখ্যা তার পূর্বসূরীর চেয়ে একটি বেশি। যাইহোক, এই ক্রম পারে এক এবং ক্রম থেকে শুধুমাত্র এক অনুপস্থিত সংখ্যা ধারণ করে। এটা সম্ভব যে প্রদত্ত স্ট্রিংয়ে ক্রমটি থেকে কোনও অনুপস্থিত সংখ্যা নেই contains স্ট্রিংটিতে সর্বদা ক্রম থেকে কমপক্ষে দুটি সংখ্যা থাকবে।

কোডটি অবশ্যই অনুপস্থিত মানটি আউটপুট করতে বা ফিরিয়ে আনতে হবে, বা 0( অনুপস্থিত মানটি 0পাওয়া যায় নি এমন ইভেন্টে এটি একটি - একটি মিথ্যা মান নয়)।

নিম্নলিখিত বৈধ ইনপুট এবং তাদের আউটপুট / রিটার্ন:

input                         output    actual sequence (for refrence)
123467                        5         1 2 3 4 _ 6 7
911                           10        9 __ 11
123125126                     124       123 ___ 125 126
8632456863245786324598632460  8632458   8632456 8632457 _______ 8632459 8632460  
123                           0         1 2 3
8632456863245786324588632459  0         8632456 8632457 8632458 8632459  

এই সমস্ত কিছুই ইনপুট হিসাবে একটি 'স্ট্রিং' হিসাবে বর্ণিত হয়েছে, ভাষা যদি নির্বিচারে বড় সংখ্যক পরিচালনা করতে সক্ষম হয় ( dcএবং mathematica, আমি আপনার দু'জনের দিকেই দেখি) ইনপুটটি স্ট্রিংয়ের পরিবর্তে নির্বিচারে বড় সংখ্যা হতে পারে যদি এটি তৈরি করে কোড সহজ।

রেফারেন্সের জন্য, এটি প্রোগ্রামারগুলি দ্বারা অনুপ্রাণিত হয়েছিল SE এসই প্রশ্ন: স্ট্রিংয়ের অনুক্রমে অনুপস্থিত নম্বরটি সন্ধান করুন


4
আপনি কি নিশ্চিত যে এটি দ্ব্যর্থহীন?
মার্টিন এন্ডার

@ মার্টিনব্যাটনার আমি এ সম্পর্কে কিছুটা ভেবেছি এবং এমন পরিস্থিতি নিয়ে আসতে সক্ষম হইনি যেখানে ক্রম 1 বাড়ছে (এটি সমস্যা হতে পারে) একটি দ্ব্যর্থক পরিস্থিতি রয়েছে।

পূর্ণসংখ্যার তালিকার জন্য ওইআইএস-এ কি এমন একটি প্রবেশ রয়েছে যা সঠিকভাবে একটি উপাদান হারিয়েছে?
mbomb007

@ mbomb007 অসীম অনেকগুলি তালিকা রয়েছে বলে আমি মনে করি না। এবং এটি যে কেবল একটি বড় ওলে স্ট্রিং। আপনি কীভাবে এটি সংজ্ঞায়িত করবেন তা নিশ্চিত নন। এই বিষয়টির জন্য, একটি আকর্ষণীয় সিএস প্রশ্নটি "এমন ভাষা যা এই সমস্ত স্ট্রিং গ্রহণ করে" be এটি অবশ্যই নিয়মিত নয়। আমি তার সিএফ সন্দেহ।

1
আমি সিকোয়েন্সটিকে একটি চ্যালেঞ্জের বিষয় হিসাবে তৈরি করেছি: কোডগলফ.স্ট্যাকেক্সচেঞ্জ
q3513

উত্তর:


5

হাস্কেল, 115 112 বাইট

g b|a<-[b!!0..last b]=last$0:[c|c<-a,b==filter(/=c)a]
maximum.map(g.map read.words.concat).mapM(\c->[[c],c:" "])

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

ব্যাখ্যা

এটি একটি নিষ্ঠুর শক্তি সমাধান: সমস্ত সম্ভাব্য উপায়ে স্ট্রিংকে শব্দের মধ্যে বিভক্ত করুন, শব্দগুলি পূর্ণসংখ্যায় পার্স করুন, দেখুন এটি কোনও উপাদান অনুপস্থিত (তার উপাদানটি ফেরত দেওয়া, এবং 0অন্যথায়) এর একটি পরিসীমা কিনা এবং সমস্ত বিভক্তির উপরে সর্বাধিক গ্রহণ করুন। অনুপস্থিত-উপাদান-সহ চেক সহায়তার কার্যক্রমে সম্পন্ন হয় g, যা একটি তালিকা নেয় bএবং [head of b..last of b]যে সীমাটি নেই সেগুলিতে একমাত্র উপাদানটি প্রদান করে bবা 0যদি এটির অস্তিত্ব নেই।

g b|                         -- Define g b
    a<-[b!!0..last b]=       -- (with a as the range [head of b..last of b]) as:
    last$0:[...]             --  the last element of this list, or 0 if it's empty:
            c|c<-a,          --   those elements c of a for which
            b==filter(/=c)a  --   removing c from a results in b.
mapM(\c->[[c],c:" "])        -- Main function: Replace each char c in input with "c" or "c "
map(...)                     -- For each resulting list of strings:
  g.map read.words.concat    --  concatenate, split at spaces, parse to list of ints, apply g
maximum                      -- Maximum of results (the missing element, if exists)

2

জাভাস্ক্রিপ্ট (ES6), 117 বাইট

s=>eval(`for(i=l=0;s[i];)for(n=s.slice(x=i=m=0,++l);s[i]&&!x|!m;x=s.slice(x?i:i+=(n+"").length).search(++n))m=x?n:m`)

ব্যাখ্যা

মোটামুটি দক্ষ পদ্ধতির। সমস্ত পরীক্ষার ক্ষেত্রে তাত্ক্ষণিকভাবে শেষ হয়।

একটি সংখ্যা হিসাবে ইনপুট স্ট্রিংয়ের শুরু থেকে প্রতিটি সাবস্ট্রিং পায় nএবং হারিয়ে যাওয়া সংখ্যা initialises mকরতে 0। এরপরে এটি বার বার nস্ট্রিংয়ের শুরু থেকে সরিয়ে দেয় , ইনক্রিমেন্ট nএবং এর জন্য স্ট্রিংটি অনুসন্ধান করে। যদি index of n != 0, এটি পরীক্ষা করে m। যদি m == 0, সেট করে রাখা m = nএবং চালিয়ে যান, তবে তা না থাকলে একাধিক নিখোঁজ সংখ্যা রয়েছে তাই এই স্ট্রিংটি থেকে চেক করা বন্ধ করুন। সম্পূর্ণ স্ট্রিং অপসারণ না করা অবধি এই প্রক্রিয়াটি চলতে থাকবে।

var solution =

s=>
  eval(`                     // use eval to use for loops without writing {} or return
    for(
      i=                     // i = index of next substring the check
      l=0;                   // l = length of initial substring n
      s[i];                  // if it completed successfully i would equal s.length
    )
      for(
        n=s.slice(           // n = current number to search for, initialise to subtring l
          x=                 // x = index of n relative to the end of the previous n
          i=                 // set i to the beginning of the string
          m=0,               // m = missing number, initialise to 0
          ++l                // increment initial substring length
        );
        s[i]&&               // stop if we have successfully reached the end of the string
        !x|!m;               // stop if there are multiple missing numbers
        x=                   // get index of ++n
          s.slice(           // search a substring that starts from the end of the previous
                             //     number so that we avoid matching numbers before here
            x?i:             // if the previous n was missing, don't increment i
            i+=(n+"").length // move i to the end of the previous number
          )
          .search(++n)       // increment n and search the substring for it's index
      )
        m=x?n:m              // if the previous number was missing, set m to it
  `)                         // implicit: return m
<input type="text" id="input" value="8632456863245786324598632460" />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


2

জাভাস্ক্রিপ্ট (ES6) 114

s=>eval("for(d=0,n=-9,z=s;z=z.slice((n+'').length);z.search(++n)?z.search(++n)?n=(z=s).slice(x=0,++d):x=n-1:0);x")  

কম গল্ফ এবং ব্যাখ্যা করা হয়েছে

f=s=>{
  d = 0  // initial digit number, will be increased to 1 at first loop 
  n = -9 // initial value, can not be found
  z = s  // initializa z to the whole input string
  // at each iteration, remove the first chars of z that are 'n' 
  // 'd' instead of 'length' would be shorter, but the length can change passing from 9 to 10 
  for(; z=z.slice((n+'').length); ) 
  {
    ++n; // n is the next number expected in sequence
    if (z.search(n) != 0)
    {
      // number not found at position 0
      // this could be the hole
      // try to find the next number
      ++n;
      if (z.search(n) != 0)
      {
        // nope, this is not the correct sequence, start again
        z = s; // start to look at the whole string again
        x = 0; // maybe I had a candidate result in xm but now must forget it
        ++d;   // try a sequence starting with a number with 1 more digit
        n = z.slice(0,d) // first number of sequence
      }
      else
      {
        // I found a hole, store a result in x but check the rest of the string
        x = n-1
      }
    }
  }      
  return x // if no hole found x is 0
}

পরীক্ষা

F=s=>eval("for(d=0,n=-9,z=s;z=z.slice((n+'').length);z.search(++n)?z.search(++n)?n=(z=s).slice(x=0,++d):x=n-1:0);x")

console.log=x=>O.textContent+=x+'\n'

elab=x=>console.log(x+' -> '+F(x))

function test(){ elab(I.value) }

;['123467','911','123125126','8632456863245786324598632460',
  '123','124125127','8632456863245786324588632459']
.forEach(t=>elab(t))
<input id=I><button  onclick='test()'>Try your sequence</button>
<pre id=O></pre>


2

সি, 183 168 166 163 বাইট

n,l,c,d,b[9];main(s,v,p)char**v,*p;{for(;s>1;)for(d=s=0,n=atoi(strncpy(b,p=v[1],++l)),p+=l;*p&&s<2;)p+=memcmp(p,b,c=sprintf(b,"%d",++n))?d=n,s++:c;printf("%d",d);}

Ungolfed

n,l,c,d,b[9];

main(s,v,p)char**v,*p;
{
    /* Start at length 1, counting upwards, while we haven't
       found a proper number of missing numbers (0 or 1) */
    for(;s>1;)
        /* Start at the beginning of the string, convert the
           first l chars to an integer... */
        for(d=s=0,n=atoi(strncpy(b,p=v[1],++l)),p+=l;*p&&s<2;)
            /* If the next number is missing, then skip, otherwise
               move forward in the string.... */
            p+=memcmp(p,b,c=sprintf(b,"%d",++n))?d=n,s++:c;

    printf("%d",d); /* print the missing number */
}

2
এই 891112সংখ্যার বিভিন্ন দৈর্ঘ্য রয়েছে এমন ইনপুটগুলির জন্য কীভাবে কাজ করে ?
জাগারব

@ জগারব এটি ঠিক কাজ করে। sprintfকল অনুপস্থিত সংখ্যা দৈর্ঘ্য ফেরৎ নির্বিশেষে যদি এটা চেয়ে দীর্ঘতর পূর্ববর্তী বা না।
কোল ক্যামেরন

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