বাছাইযোগ্য বছরগুলি সন্ধান করুন


26

বছর 2013 একটি আকর্ষণীয় সম্পত্তি ছিল: অঙ্কগুলি যখন ক্রমান্বিত হয় ক্রমাগত হয় (0123)। আসুন এই ধরণের নম্বরটিকে একটি বাছাইযোগ্য নম্বর বলুন: একটি অ-নেতিবাচক পূর্ণসংখ্যা যার ভিত্তি -10 অঙ্কগুলি বাছাইয়ের পরে ক্রমাগত হয়। দুর্ভাগ্যক্রমে, এটি 2031 পর্যন্ত আর ঘটবে না, এবং এর পরে, 2103 না হওয়া পর্যন্ত Your

বিধি

  • ইনপুট এবং আউটপুট অবশ্যই বেস 10 এ থাকতে হবে।
  • আউটপুট যে কোনও যুক্তিসঙ্গত বিন্যাসে হতে পারে (সংখ্যা আক্ষরিক, স্ট্রিং আক্ষরিক, একক-আইটেম অ্যারে, ...)।
  • আপনার কোডটি 98764 অবধি সমস্ত ইনপুটগুলির জন্য 1 মিনিটের মধ্যে সঠিক আউটপুট তৈরি করতে হবে।

পরীক্ষার মামলা

    0 -> 1
    1 -> 2
    9 -> 10
   10 -> 12
   11 -> 12
   99 -> 102
  233 -> 234
  234 -> 243
  243 -> 312
 2016 -> 2031
 2031 -> 2103
 2103 -> 2130
 2130 -> 2134
 2134 -> 2143
 9876 -> 10234
98764 -> 98765

বাছাইযোগ্য সংখ্যাগুলি A215014 ফর্ম করে । 98765 অবধি সমস্ত এন্ট্রিগুলির একটি তালিকা এখানে পাওয়া যাবে

স্কোরিং

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।


কাজ বলতে কী বুঝ ? এটি যদি সত্যিই দীর্ঘ সময় নেয় তবে ঠিক আছে?
ডেনিস

@ ডেনিস 98764 অবধি সমস্ত ইনপুটগুলির জন্য এটি অবশ্যই 1 মিনিটের সাথে শেষ করতে হবে This পোস্টে এটি স্পষ্ট করা হয়েছে।
ETH প্রোডাকশনগুলি

@ এটিএইচ প্রডাকশনগুলি কি এগুলিতে কি আরও বড় ইনপুটগুলি সমর্থন করতে হবে?
মার্টিন এন্ডার

@ মার্টিনএন্ডার না, যদিও আমি বেশিরভাগ (সমস্ত না থাকলে) সমাধানগুলি আশা করি। প্রয়োজনীয়তা বেশি হওয়া উচিত?
ইটিএইচ প্রডাকশনগুলি

@ এথ প্রডাকশনগুলি আমার মনে হয় না, আমি কেবল এটি নিশ্চিত করতে চেয়েছিলাম।
মার্টিন এন্ডার

উত্তর:


9

পাইথন 2 , 61 বাইট

f=lambda n:-~n*(`sorted(`n+1`)`[2::5]in'0123456789')or f(n+1)

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


1
আমি এমন '0123456789'কিছু হতে চাই 1./81তবে এটি কার্যকরভাবে কাজ করে না।
xnor

সেরা আপনি 1./81.0000001যা পাচ্ছেন তা এখনও সঠিকভাবে কাজ করে না এবং দীর্ঘতর হয়
আলফি গুডাক্রে

@ অ্যালফি গুডাক্রে আপনি এর মাধ্যমে আরও ভাল করতে পারবেন 1./81-1e-10তবে এটি এখনও 10 বাইট এবং আপনাকে এখনও এটি কেটে যেতে হবে।
মার্টিন এন্ডার

7

জেলি , 11 10 9 বাইট

⁵ḶwṢ
‘Ç1#

একটি সিঙ্গলটন অ্যারে প্রদান করে। এটি অনলাইন চেষ্টা করুন!

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

‘Ç1#  Main link. Argument: n

‘     Increment; yield n+1.
 Ç1#  Apply the helper link to k = n+1, n+2, n+3, ... until one of them maps to a
      truthy value. Yield a singleton array containing that value of k.

⁵ḶwṢ  Helper link. Argument: k

⁵     Set the return value to 10.
 Ḷ    Unlength; yield [0, ..., 9].
   Ṣ  Sort; yield the sorted array of k's decimal digits.
  w   Window-index; yield the 1-based index(truthy) of the digit array in
      [0, ..., 9], 0 (falsy) if not found.

6

এমএটিএল , 8 বাইট

`QtVSdqa

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা

`     % Do...while
  Q   %   Add 1. Takes input (implicit) in the first iteration
  t   %   Duplicate
  V   %   Convert to string. This gives an array of chars (same as a string)
      %   representing the digits
  S   %   Sort
  d   %   Consecutive differences between the chars (automatically converted
      %   to ASCII codes)
  q   %   Subtract 1. This gives an array where consecutive differences equal 
      %   to 1 are converted to 0, and the rest give a nonzero result
  a   %   True if any value is nonzero. This is the loop condition: if true
      %   (which means at least one consecutive difference was not 1), go on
      %   with the next iteration. Else exit loop
      % End do...while (implicit)
      % Display (implicit)

5

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

নীলকে ধন্যবাদ জানিয়ে একটি বিশাল 10 বাইট সংরক্ষণ করা হয়েছে

f=n=>[...++n+''].sort().some((v,i,a)=>v-i-a[0])?f(n):n

পরীক্ষার মামলা


2
mapকলব্যাকের তৃতীয় প্যারামিটারটি অ্যারে নিজেই রয়েছে তা উল্লেখ করে আপনি 2 বাইট সংরক্ষণ করতে পারেন তবে আপনি আরও ভাল করতে যেতে পারেন:f=n=>[...++n+''].sort().some((v,i,a)=>v-i-a[0])?f(n):n
নিল


4

পাওয়ারশেল ভি 2 +, 71 68 67 বাইট

param($n)do{$n++}until(-join(0..9)-match-join([char[]]"$n"|sort))$n

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

একটি পুনরাবৃত্তি সমাধান যা আমার মেশিনে তাত্ক্ষণিকভাবে চলে।

PS C:\Tools\Scripts\golfing> measure-command {.\find-the-sortable-years.ps1 98764} | fl totalseconds

TotalSeconds : 0.0487127

হ্যাঁ, এটি কোনও কোড-গল্ফের একটি do/ untilলুপ। দুঃখিত, দুঃখিত না। মূলত আমরা আমাদের ইনপুট $nথেকে $n|sortএড রেগেক্স -matchএস এর বিপরীতে লুপ করি 0123456789। তারপরে আমরা $nপাইপলাইনে রেখেছি এবং আউটপুট অন্তর্ভুক্ত।

-join(0..9)আক্ষরিক স্ট্রিংয়ের চেয়ে এক বাইট কম খাওয়া বুঝতে পেরে একটি বাইট সংরক্ষণ করা হয়েছে 0123456789


3

গণিত, 63 বাইট

#+1//.x_/;!Differences@Sort@IntegerDigits@x~MatchQ~{1...}:>x+1&

#+1যতক্ষণ Differences@Sort@IntegerDigits@x~MatchQ~{1...}মিথ্যা হয় ততক্ষণ পরবর্তী মানের সাথে প্রতিস্থাপন করে , যা বর্তমান মানটি বাছাইযোগ্য এমন শর্ত।

এখানে আরও একটি মজাদার ধারণা দেওয়া হয়েছে, দুর্ভাগ্যক্রমে এটি দীর্ঘ দীর্ঘ হয়ে গেছে:

FirstCase[FromDigits/@Union@@Permutations/@Join@@Array[Range,{9,10},0],x_/;x>#]&

এটির মধ্যে, আমি প্রথমে সমস্ত সাজানোর বছরগুলি তৈরি করছি এবং তারপরে আমি প্রথমটি নির্বাচন করব যা ইনপুটটির চেয়ে বড়।

আরও কয়েকটি ধারণা যা প্রথম প্রয়াসের চেয়ে কম হয়ে উঠেনি:

#+1//.x_/;Array[Range,{9,10},0]~FreeQ~Sort@IntegerDigits@x:>x+1&
#+1//.x_/;Subsequences@Range[0,9]~FreeQ~Sort@IntegerDigits@x:>x+1&
#+1//.x_/;0~Range~9~FreeQ~{___,##&@@Sort@IntegerDigits@x,___}:>x+1&

3

পিএইচপি, 105 103 89 বাইট

নতুন 89 বাইট সংস্করণ টিটাসকে ধন্যবাদ:

for(;!$p;){$t=str_split($n=++$argv[1]);sort($t);$p=strstr('0123456789',join($t));}echo$n;

ব্যবহার:

php -r "for(;!$p;){$t=str_split($n=++$argv[1]);sort($t);$p=strstr('0123456789',join($t));}echo$n;" 9000

পূর্ববর্তী 103 বাইট সংস্করণ জ্যান্সারহালকে ধন্যবাদ:

<?for($p=0;!$p;){$t=str_split($n=++$_GET[n]);sort($t);$p=strstr('0123456789',implode($t));}echo "$n\n";

পূর্ববর্তী 105 বাইট সংস্করণ:

<?for($n=$_GET[n]+1;;$n++){$t=str_split($n);sort($t);if(strstr('0123456789',implode($t))){echo$n;exit;}}

ব্যবহার: sortable-years.php?n=9000আউটপুট 9678

পরীক্ষার কেসগুলির সাথে অলোভিত সংস্করণ:

$test = array(0,1,9,10,11,99,233,234,243,2016,2031,2103,2130,2134,9876,98764);

foreach ($test as $argv[1]) {
    for(;!$p;){
        $t=str_split($n=++$argv[1]);
        sort($t);
        $p=strstr('0123456789',join($t));
    }
    echo "$n\n"; // add newline for testing
    $p=false; // reset $p for testing
}

Output:
1
2
10
12
12
102
234
243
312
2031
2103
2130
2134
2143
10234
98765

অনলাইন পরীক্ষা! (নতুন 89 বাইট সংস্করণ)

অনলাইন পরীক্ষা! (পূর্ববর্তী 103 বাইট সংস্করণ)

অনলাইন পরীক্ষা! (পূর্ববর্তী 105 বাইট সংস্করণ)

কার্যকর করার সময় সমস্ত পরীক্ষার ক্ষেত্রে <= 1 সেকেন্ড হতে পারে।



@ এক্সান্দার আপনার উন্নতির জন্য ধন্যবাদ। আসলে আমি এটিকে break( exitগল্ফযুক্ত সংস্করণে) দূরে নেওয়ার কোনও উপায় খুঁজতে চেষ্টা করছিলাম , আপনি এটি খুঁজে পেয়েছেন! গ্রেট।
মারিও

আমি যে লিঙ্কটি পোস্ট করেছি সেটি কেবলমাত্র এটি কীভাবে উন্নত করা যায় সে সম্পর্কে আপনাকে ধারণা দেওয়ার জন্য কোড ছিল, এটি এক্সডি সম্পূর্ণরূপে গল্ফ করেনি
Xenderhall

$i=0অপ্রয়োজনীয় (-4)। (-3) এর joinএকটি উপাধি implodeecho$nযথেষ্ট আউটপুট (-5)। $argv[1]পরিবর্তে $_GET[n]অনুমতি দেয় -rযা আপনাকে <?ট্যাগ (-2) বাদ দিতে দেয় ।
তিতাস

@ টিটাস আপনার দুর্দান্ত গল্ফিং টিপসের জন্য অনেক অনেক ধন্যবাদ, আমার এখনও এটি সম্পর্কে অনেক কিছু জানার আছে, এবং কিছু বিবরণেও আমাকে আরও মনোযোগ দিতে হয়েছিল যা আমি মিস করছি ... এর joinনাম হিসাবে আমি এখনও জানতাম না implode! php -rপ্যারামিটার সম্পর্কে , আমি আগে ব্যবহার করেছি তবে ইদানীং আমি এটি ব্যবহার করছি না কারণ (কেন জানি না) মাঝে মাঝে আমি কিছু ক্ষেত্রে এটি সঠিকভাবে কাজ করতে পারি না।
মারিও

2

পার্ল 6 , 49 বাইট

{first {$/eqv($/=.comb.sort).minmax.list},$_^..*}

ব্যাখ্যা

{

  first

  {

    $/             # sorted list from later

    eqv            # is it equivalent

    (

      $/           # store in match variable ( doesn't need to be declared )
      =
      .comb.sort   # sorted list of digits from currently tested value

    ).minmax       # the Range of digits
            .list  # flattened to a list
  },

  $_  ^..  *       # Range starting just after input

}

টেস্ট:

# give it a lexical name for clarity
my &code = {first {$/eqv($/=.comb.sort).minmax.list},$_^..*}

my @all = 'sortable.txt'.IO.lines;

my @gen = code(-1), &code ... ( * >= 98765 );

say @all eqv @gen; # True

say now - INIT now; # 16.3602371

2

সি #, 153 130 101 বাইট ( 122 99 83 নেমস্পেসের ঘোষণাগুলি বাদে)

using System.Linq;n=>{while(!"0123456789".Contains(string.Concat((++n+"").OrderBy(x=>x))));return n;}

-23 বাইটস পিঙ্কফ্লোয়েডএক্স 33 ধন্যবাদ

লিঙ্ক এনজি-কে অন্য -২৯ ধন্যবাদ (আমার সত্যই জানা উচিত ছিল যে এটিকে আরে রূপান্তর করার দরকার নেই)

অভিজাত রূপান্তর।

(যোগ করা বোনাস এটি আশ্চর্যজনকভাবে দ্রুত)


আপনার কিছুক্ষণ পরে স্ট্রিং, ব্যবহার $"{n}".ToCharArray()বা (""+n).ToCharArray()আপনার প্রয়োজন হবে না এবং ব্র্যাককেটের প্রয়োজন while(!s.Contains...)n++;নেই : বা আরও ভাল করে তাদের একত্রিত করুন এবং খালি লুপের বডিটি ছেড়ে দিন: while(!s.Contains(.....$"{n++}".ToCharArray()....);return n; এর সাথে ডিক্লেয়ার করুন var s="... "বা সম্পূর্ণরূপে অপসারণ করুন:while(!"0123456789".Contains(...
গোলাপফ্লয়েডএক্স 33

আমি মনে করি আপনি n++$"{++n}".ToCharArray()
প্রথমটিও

@ পিঙ্কফ্লোয়েডএক্স 33 আমি প্রস্তাবিত বেশিরভাগ পরিবর্তনগুলি যুক্ত করেছি, যদি না হয়!
আলফি গুডাক্রে

1
11 বাইটের পরিবর্তে সরান use System;এবং ব্যবহার stringকরুন Stringstring.Concatপরিবর্তে ব্যবহার করুন string.Joinএবং 1 বাইটের জন্য কেবল ২ য় প্যারামিটার রাখুন। পরিবর্তন ""+ ++nকরার জন্য ++n+""1 বাইট জন্য। অনুশীলন হিসাবে আপনার কাছে রেখে দেওয়া: আরও 14 টি বাইট সরানো যেতে পারে।
লিঙ্ক এনজি

@ লিঙ্কএনজি পরিবর্তন করা হয়েছে - অ্যারে এক্সডি
অ্যালফি গুডাক্রে

1

বেফুঞ্জ , 117 বাইট

&>1+0v
9`#v_>:9+0\4p1+:
1:$<v
0g1+>00p:55+%9+1\4p55+/:!#v_0
v+*g09:<".........." 9p09 <
>:00g-v^<
-9:p09_v|
$v@._<$<>

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

এক বছর বাছাই করা হলে আমাদের পরীক্ষা করার পদ্ধতিটি একটি "অ্যারে" তৈরি করা হয় (পাঁচটি লাইনে স্ট্রিংয়ে আক্ষরিক লিখিত) এবং বছরে প্রতিটি অঙ্কের জন্য, আমরা সেই সূচকে অ্যারেতে সেট করেছিলাম 1 একবার সমস্ত অঙ্ক হয়ে গেলে প্রক্রিয়াজাত করা হয়, আমরা ক্রমানুসারে কতগুলি 1 টি আছে তা গণনা করি এবং যদি সেই গণনাটি বছরের দৈর্ঘ্যের সমান হয় তবে আমরা ধরে নিতে পারি যে বছরটি সাজানো হয়েছে।

বিস্তারিত ব্যাখ্যা

&>1+                              Read the year and increment it.

    0v                            The "array" is initialized with zeros prior
9`#v_>:9+0\4p1+:                     to processing each year.

1:$<v                             For every digit, set the corresponding array index
0g1+>00p:55+%9+1\4p55+/:!#v_0       to one, and increment the year length counter.

                      p09 <       Initialise the sequence counter to zero.
                     9            Push a marker onto the stack.
        ".........."              Push the values from the array onto the stack.

v+*g09:<                          Increment the sequence counter for every 1 in the
>:00g-v^<                           array and reset it on every 0. Break if it equals
-9:p09_v|                           the year length or we encounter the end marker.

  @._<$<                          If we have a match, clear the stack and output the year.
$v      >                         If we've reached the marker, drop it try the next year.


1

পাইথন 2, 68 বাইট

n=input()+1
while''.join(sorted(`n`))not in'0123456789':n+=1
print n

@ ডেনিসের দ্বারা ভালভাবে পরাজিত হয়েছে তবে যেভাবেই হোক বিকল্প পদ্ধতি হিসাবে পোস্ট করেছেন।


1

সি #, 127 বাইট

using System.Linq;n=>{char[]s;while((s=(++n+"").OrderBy(x=>x).ToArray()).Select((x,i)=>i>0&&x-s[i-1]!=1).Any(x=>x));return n;};

3 টি বাইট দ্বারা বর্তমান সি জমাতে বীট করুন: পি ইতিমধ্যে পেটানো
আমি জানি এই উত্তরটি সহজেই পিটানো হবে ...
repl.it ডেমো

Ungolfed

n=>
{
    char[] s;
    while((
        // Store char array in variable to be referenced in Select()
        // Increment n and cast to string
        s=(++n+"")
            // Sort ascending, to array
            .OrderBy(x=>x)
            .ToArray())
        // Convert char to true if it's not at position 0,
        // and it is not 1 greater than the previous char
        .Select((x,i)=>i>0&&x-s[i-1]!=1)
        // All false: n is sortable
        // Any true: n is not sortable
        .Any(x=>x))
    // while loop body is empty
    ;
    return n;
};


1

পাইথন 2, 118 117 114 108 বাইট

x,s=input()+1,sorted
while[j for i,j in enumerate(s(str(x))[1:])if int(s(str(x))[i])+1!=int(j)]:x+=1
print x

সম্পাদনা করুন:

-1 বাইট ধন্যবাদ জিওবার ফেকেটকে

-6 বাইটস @ জাচারি টি কে ধন্যবাদ


sortedফাংশনটি আলিয়াস করে আপনি 1 বাইট সংরক্ষণ করতে পারেন ।
গ্যাবার ফেকেট

পাইথন 2 এ রূপান্তর করে আপনি কিছু বাইট সংরক্ষণ করতে পারবেন না?
জাকারি

হ্যাঁ আমি পারতাম, ধন্যবাদ, আমি এটি ভেবে দেখিনি।
Sonrad10

1

পিএইচপি, 90 89 88 বাইট

সম্পূর্ণ ভিন্ন পদ্ধতির:

while(array_unique($a=str_split($n=++$argv[1]))!=$a|max($a)-min($a)-count($a)+1);echo$n;

সাথে চালাও -r

ভাঙ্গন

while(
    array_unique(           // 3. unique values
        $a=str_split(       // 2. split to digits
            $n=++$argv[1]   // 1. increase number
        )
    )
    !=$a                    // 4. repeat while unique digits differ from original digits
    |                       // or
        max($a)-min($a)     // digit range
        -count($a)+1        // differs from count-1
    );
echo$n;                 // print result

0

ক্লোজার, 104 96 91 বাইট

দীর্ঘ পদ্ধতির নামগুলি এটিকে ছোট করে না ... কমপক্ষে map-indexedএবং -প্রধান গণনাগুলি একটি ঝরঝরে উপায়ে সম্পন্ন করুন।

সম্পাদনা 1 : ঝরঝরে, আমি ভুলে গিয়েছিলাম =একাধিক যুক্তিও নিতে পারি তাই স্বতন্ত্র মানগুলির সংখ্যা 1 হয় কিনা তা পরীক্ষা করার দরকার নেই don't

সম্পাদনা 2 : চালানোর দরকার নেই (sort(seq(str %))), (sort(str %))সমানভাবে ভাল কাজ করে।

(fn[i](first(filter #(apply =(map-indexed -(map int(sort(str %)))))(rest(iterate inc i)))))

Ungolfed:

(defn f [i]
  (let [is-sorted? #(= 1 (->> % str sort (map int) (map-indexed -) set count))]
    (->> i (iterate inc) rest (filter is-sorted?) first)))

0

আর, 87 বাইট

f=function(x)`if`(all(diff(sort(as.double(el(strsplit(c(x+1,""),"")))))==1),x+1,f(x+1))

যথারীতি যখন সংখ্যাগুলিকে অঙ্কে বিভক্ত করার কথা আসে তখন আর এর এটি করার কোনও স্থানীয় উপায় নেই। ফলস্বরূপ আমাদের ইনপুটটিকে একটি অক্ষরে রূপান্তর করতে হবে, একটি অক্ষর ভেক্টরে বিভক্ত করতে হবে এবং পরে কোনও সংখ্যাসূচক প্রকারে রূপান্তর করতে হবে।

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

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