ডেনিস নম্বর উত্পন্ন করুন


69

এই চ্যালেঞ্জটি পিপিসিজি ব্যবহারকারী ডেনিসের কাছে প্রোগ্রামিং ল্যাঙ্গুয়েজ কুইজের অংশীদারদের অংশ অর্জনের জন্য শ্রদ্ধাঞ্জলি ।

এ খুঁজছি ডেনিস 'PPCG প্রফাইল পাতা আমরা কিছু প্রশংসনীয় চিত্তাকর্ষক কাপড় দেখতে পারেন:

ডেনিসের প্রোফাইল

বর্তমানে তিনি আটষট্টি উপর রয়েছে হাজার খ্যাতি, তাঁকে দ্বিতীয় উপার্জন সামগ্রিক প্রতিনিধির প্রায় ত্রিশ হাজার দ্বারা তৃতীয় স্থান অতিক্রম করে গেছে। তিনি সম্প্রতি একজন নতুন মডারেটরের হয়ে আমাদের নির্বাচনে জয়লাভ করেছেন এবং তাঁর নামের পাশে একটি চকচকে নতুন হীরা পেয়েছেন । তবে আমি ব্যক্তিগতভাবে মনে করি ডেনিসের সবচেয়ে আকর্ষণীয় অংশটি হ'ল তার পিপিসিজি ব্যবহারকারী আইডি নম্বর: 12012।

প্রথম নজরে 12012প্রায় একটি প্যালিনড্রোমের মতো দেখায় , এমন একটি সংখ্যা যা বিপরীত অবস্থায় একই রকম পড়ে, তবে এটি একটু দূরে। এটা তোলে যে শব্দ কবিতা প্রভৃতি উলটা করিয়া পড়িলেও একই থাকে হতে পারে 21012যদি আমরা প্রথম অবস্থানের অদলবদল 1এবং 2, এবং এটি যে শব্দ কবিতা প্রভৃতি উলটা করিয়া পড়িলেও একই থাকে হতে পারে 12021যদি আমরা গত অদলবদল 1এবং 2। এছাড়াও, কনভেনশন অনুসরণ করে যে কোনও সংখ্যায় শূন্যের নেতৃত্ব দেওয়া হয় না, প্রথমটি অদলবদল করে 1এবং 0ফলাফলগুলি 02112বা এর পরিবর্তে 2112যা অন্য প্যালিনড্রোম।

আসুন একটি ডেনিস নম্বরকে ধনাত্মক পূর্ণসংখ্যা হিসাবে সংজ্ঞায়িত করুন যা নিজেই প্যালিনড্রমিক নয় তবে কোনও দুটি অঙ্কের কমপক্ষে একটি জোড়ের অবস্থান অদলবদল করে একটি প্যালিনড্রোমে পরিণত করা যেতে পারে। অর্ডার একটি ডেনিস সংখ্যা ডিজিটের স্বতন্ত্র জোড়া করে একটি (অগত্যা স্বতন্ত্র নয়) যে শব্দ কবিতা প্রভৃতি উলটা করিয়া পড়িলেও একই থাকে করতে অদলবদল করা যাবে সংখ্যা।

সুতরাং ক্রম 12012তার সংখ্যা 3 3 থেকে স্বতন্ত্র জোড়া আছে ( 12012, , ) প্রায় palindromes উত্পাদন করতে অদলবদল করা যাবে না। সবচেয়ে ছোট অর্ডার 3 ডেনিস নম্বর হতে পারে।120121201212012

10সবচেয়ে ছোট ডেনিস নম্বর এবং এর অর্ডার 1 রয়েছে কারণ চারপাশে স্যুইচিং হয় 1এবং ওরফে 0দেয় যা একটি প্যালিনড্রোম।011

একটি সংখ্যার কাল্পনিক শীর্ষ জিরোগুলি পরিবর্তনযোগ্য অংক হিসাবে গণনা করে না। উদাহরণস্বরূপ, পরিবর্তন 8908করার 08908এবং প্রথম দুটি সংখ্যা সোয়াপিং যে শব্দ কবিতা প্রভৃতি উলটা করিয়া পড়িলেও একই থাকে পেতে 80908অবৈধ। 8908কোনও ডেনিস নম্বর নয়।

নন-ডেনিস নম্বরগুলিতে অর্ডার 0 রয়েছে বলে বলা যেতে পারে।

চ্যালেঞ্জ

এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা ইতিবাচক পূর্ণসংখ্যামূলক N এ গ্রহণ করে এবং কিছু যুক্তিসঙ্গত বিন্যাসে যেমন এর অর্ডার সহ Nth ক্ষুদ্রতম ডেনিস নম্বর প্রিন্ট করে 12012 3বা প্রদান করে (12012, 3)

উদাহরণস্বরূপ, 12012774 তম ডেনিস নম্বর তাই যদি 774আপনার প্রোগ্রামের ইনপুট হয় তবে আউটপুটটি এমন কিছু হওয়া উচিত 12012 3। (কৌতূহলীভাবে, 774 হ'ল আরেকটি ডেনিস নম্বর))

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

এখানে প্রথম 20 টি ডেনিস নম্বর এবং রেফারেন্সের জন্য তাদের আদেশ রয়েছে:

N       Dennis  Order
1       10      1
2       20      1
3       30      1
4       40      1
5       50      1
6       60      1
7       70      1
8       80      1
9       90      1
10      100     1
11      110     2
12      112     1
13      113     1
14      114     1
15      115     1
16      116     1
17      117     1
18      118     1
19      119     1
20      122     1

এখানে এন = 1000 পর্যন্ত একই তালিকা রয়েছে।


31

28
@ ক্লাউডিউ এটি ওইআইএস- যুক্ত করা হয়েছে।
user48538

উত্তর:


13

পাইথ, 44 বাইট

L/lf_ITs.e.e`sXXNkZYbN=N`b2,Je.f&!_I`ZyZQ0yJ

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষার স্যুট

পাইথের একটি বোকা ছোট্ট বাগ (?) একটি 41 বাইট সমাধান নষ্ট করে দিয়েছে।

ব্যাখ্যা:

L/lf_ITs.e.e`sXXNkZYbN=N`b2
L                             define a function y(b), which returns:
                      =N`b       assign the string representation of b to N
        .e             N         map each (k=Index, b=Value) of N to:
          .e         N             map each (Y=Index, Z=Value) of N to:
              XXNkZbN                switch the kth and Yth value in N
            `s                       get rid of leading zeros
       s                         combine these lists
   f_IT                          filter for palindromes
  l                              length
 /                        2      and divide by 2

,Je.f&!_I`ZyZQ0yJ
   .f        Q0     find the first input() numbers Z >= 0, which satisfy
      !_I`Z            Z is not a palindrom
     &                 and 
           yZ          y(Z) != 0
  e                 get the last number
 J                  and store in J
,J             yJ   print the pair [J, y(J)]

এবং এই 'বোকা ছোট্ট বাগ (?)' কী
ক্যালকুলেটরফলাইন

নিবন্ধসমূহ এটা উদ্বেগ .f। এই প্রশ্নের কারণেই আমি এখানে টানার অনুরোধ জানিয়েছি: github.com/isaacg1/pyth/pull/151
Jakube

42

সিজেম, 45 বাইট

0{{)_s:C,2m*{~Ce\is_W%=},,2/:O!CCW%=|}g}ri*SO

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

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

0          e# Push 0 (candidate).
{          e# Loop:
  {        e#   Loop:
    )_     e#     Increment the candidate and push a copy.
    s:C    e#     Cast to string and save in C.
    ,      e#     Get the length of C, i.e., the number of digits.
    2m*    e#     Push all pairs [i j] where 0 ≤ i,j < length(C).
    {      e#     Filter:
      ~    e#       Unwrap, pushing i and j on the stack.
      Ce\  e#       Swap the elements of C at those indices.
      is   e#       Cast to int, then to string, removing leading zeroes.
      _W%= e#       Copy, reverse and compare.
    },     e#     Keep the pairs for which = returned 1, i.e., palindromes.
    ,2/    e#     Count them and divide the count by 2 ([i j] ~ [j i]).
    :O     e#     Save the result (the order) in O.
    !      e#     Negate logically, so 0 -> 1.
    CCW%=  e#     Compare C with C reversed.
    |      e#     Compute the bitwise NOT of both Booleans.
           e#     This gives 0 iff O is 0 or C is a palindrome.
  }g       e#   Repeat the loop while the result is non-zero.
}ri*       e# Repeat the loop n times, where n is an integer read from STDIN.
           e# This leaves the last candidate (the n-th Dennis number) on the stack.
SO         e# Push a space and the order.

50
আমি ইতিমধ্যে প্রতিনিধির টুপি আঘাত করেছি, কিন্তু আমি করতে হয়েছে প্রথম উত্তর পোস্ট করুন।
ডেনিস

1
বিতৃষ্ণা। আমি কীভাবে নিজেকে 42 টি আপভোটের সাথে মন্তব্য করতে বাধ্য করব?
নিডজেজেকব

আমি 42 তম
আপভোট

7

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

import Data.List
p x=x==reverse x
x!y=sum[1|(a,b)<-zip x y,a/=b]==2
o n|x<-show n=sum[1|v<-nub$permutations x,x!v,p$snd$span(<'1')v,not$p x]
f=([(x,o x)|x<-[-10..],o x>0]!!)

p তালিকাটি প্যালিনড্রোম কিনা তা পরীক্ষা করে।

x!yহয় Trueতালিকা iff xএবং y(যা একই দৈর্ঘ্য থাকা উচিত) ঠিক দুই জায়গায় পৃথক। বিশেষ করে, যদি xএকটি বিন্যাস হয় y, x!yকিনা তা নির্ধারণ করে তবে তা "সোয়াপ" হয়।

o nএর ডেনিস-ক্রম সন্ধান করে n। এটি এর ক্রমবিন্যাসের মধ্যে অদলবদলের জন্য ফিল্টার করে x = show nএবং তারপরে এই স্বাপগুলির মধ্যে কতটি প্যালিনড্রোম। এই গণনাটি সম্পাদন করে এমন তালিকা বোঝার একটি অতিরিক্ত প্রহরী রয়েছে not (p x)যার অর্থ একটি প্যালিনড্রোম শুরু 0হলে এটি ফিরে আসবে n

snd (span (<'1') v)বিট ঠিক হয় dropWhileকিন্তু এক বাইট খাটো; এটি পরিণত "01221"হয় "1221"

fএকটি তালিকা থেকে ইনডেক্স (i, o i)যেখানে o i > 0(অর্থাত iএকটি ডেনিস সংখ্যা।) সেখানে স্বাভাবিকভাবে হিসাবে, একটি বন্ধ-বাই-এক এরর এখানে হবে (!!)0 থেকে গন্য কিন্তু সমস্যা 1. থেকে বড়, মোট ছাত্র আমি থেকে অনুসন্ধান শুরু করে এই সমস্যার সমাধানের জন্য পরিচালিত -10(যা আমার প্রোগ্রাম দ্বারা একটি ডেনিস নম্বর হিসাবে বিবেচিত হয়েছে!) যার ফলে সমস্ত নম্বর ডান দাগে ধাক্কা।

f 774হয় (12012,3)


6

পাইথন 2, 176

i=input()
n=9
c=lambda p:`p`[::-1]==`p`
while i:n+=1;x=`n`;R=range(len(x));r=[c(int(x[:s]+x[t]+x[s+1:t]+x[s]+x[t+1:]))for s in R for t in R[s+1:]];i-=any(r)^c(n)
print n,sum(r)

আমি ভাবতে পারি না যে আমার অদলবদল কোডটি বিশেষত সর্বোত্তম, তবে এটি আমি অর্জন করতে সক্ষম হয়েছি এটি সেরা। আমি প্রায়শই স্ট্রিং এবং পূর্ণসংখ্যার মধ্যে রূপান্তর করি তাও পছন্দ করি না ...

প্রতিটি সংখ্যার জন্য, এটি দুটি সংখ্যার অদলবদলের সমস্ত প্যালিনড্রোম কিনা তার একটি তালিকা তৈরি করে। যখন এই মানগুলির অন্তত একটি সত্য হয় এটি কাউন্টারকে হ্রাস করে এবং মূল সংখ্যাটি প্যালিনড্রোম নয়। যেহেতু 0+Trueপাইথন ইন 1চূড়ান্ত তালিকার যোগফল ডেনিস নম্বর ক্রম জন্য কাজ করে।


5

মরিচা, 390 বাইট

fn d(mut i:u64)->(u64,i32){for n in 1..{let mut o=0;if n.to_string()==n.to_string().chars().rev().collect::<String>(){continue}let mut s=n.to_string().into_bytes();for a in 0..s.len(){for b in a+1..s.len(){s.swap(a,b);{let t=s.iter().skip_while(|&x|*x==48).collect::<Vec<&u8>>();if t.iter().cloned().rev().collect::<Vec<&u8>>()==t{o+=1}}s.swap(a,b);}}if o>0{i-=1;if i<1{return(n,o)}}}(0,0)}

নতুন জাভা? : /

অবহেলিত এবং মন্তব্য করেছেন:

fn main() {
    let (num, order) = dennis_ungolfed(774);
    println!("{} {}", num, order);  //=> 12012 3
}

fn dennis_ungolfed(mut i: u64) -> (u64, i32) {
    for n in 1.. {
        let mut o = 0;  // the order of the Dennis number
        if n.to_string() == n.to_string().chars().rev().collect::<String>() {
            // already a palindrome
            continue
        }
        let mut s = n.to_string().into_bytes();  // so we can use swap()
        for a in 0..s.len() {  // iterate over every combination of (i, j)
            for b in a+1..s.len() {
                s.swap(a, b);
                // need to start a new block because we're borrowing s
                {
                    let t = s.iter().skip_while(|&x| *x == 48).collect::<Vec<&u8>>();
                    if t.iter().cloned().rev().collect::<Vec<&u8>>() == t { o += 1 }
                }
                s.swap(a, b);
            }
        }
        // is this a Dennis number (order at least 1)?
        if o > 0 {
            // if this is the i'th Dennis number, return
            i -= 1;
            if i == 0 { return (n, o) }
        }
    }
    (0, 0)  // grr this is necessary
}

4

জেলি , 33 বাইট (প্রতিদ্বন্দ্বী)

ṚḌ=
=ċ0^2°;ḌÇ
DŒ!Qç@ÐfDL©Ṡ>ѵ#Ṫ,®

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

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

DŒ!Qç@ÐfDL©Ṡ>ѵ#Ṫ,®  Main link. No arguments.

              µ      Combine the chain to the left into a link.
               #     Find; execute the chain with arguments k = 0, 1, 2, ...
                     until n values of k result in a truthy value, where n is an
                     integer read implicitly from STDIN. Return those n values.

D                      Decimal; convert k to the list of its digits in base 10.
 Œ!                    Generate all permutations of the digits.
   Q                   Unique; deduplicate the list of permutations.
      Ðf               Filter:
    ç@  D                Call the helper link on the second line with the
                         unpermuted digits (D) as left argument, and each
                         permutation as the right one.
                       Keep permutations for which ç returns a truthy value.
         L©            Compute the length (amount of kept permutations) and save
                       it in the register.
           Ṡ           Sign; yield 1 if the length is positive, and 0 otherwise.
            >Ṅ         Compare the sign with the result from the helper link on
                       the first line. This will return 1 if and only if the
                       length is positive and Ñ returns 0.
                Ṫ      Tail; extract the last value of k.
                 ,®    Pair it with the value in the register.


=ċ0^2°;ḌÇ              Helper link. Arguments: A, B (lists of digits)

=                      Compare the corresponding integers in A and B.
 ċ0                    Count the zeroes, i.e., the non-matching integers.
   ^2                  Bitwise XOR the amount with 2.
     °                 Convert to radians. This will yield 0 if exactly two
                       corresponding items of A and B are different ,and a
                       non-integral number otherwise.
      ;                Prepend the result to B.
       Ḍ               Convert the result from decimal to integer. Note that
                       leading zeroes in the argument won't alter the outcome.
        Ç              Call the helper link on the first line.


ṚḌ=                    Helper link. Argument: m (integer)

Ṛ                      Convert m to decimal and reverse the digits.
 Ḍ                     Convert back to integer.
  =                    Compare the result with m.

2

এপিএল, 87

2↓⎕{⍺(2⊃⍵+K⌊~A∧.=⌽A)X,K←+/{⍵∧.=⌽⍵}¨1↓∪,{⍕⍎Y⊣Y[⌽⍵]←⍵⊃¨⊂Y←A}¨∘.,⍨⍳⍴A←⍕X←1+3⊃⍵}⍣{=/2↑⍺}3⍴0

লুপের দেহটি 4 সংখ্যার একটি ভেক্টরকে রিটার্ন দেয়: 1) ইনপুট থেকে পড়ে তার বাম যুক্তি , 2) ডেনিস সংখ্যার এখনও অবধি, 3) বর্তমান মান X- লুপের কাউন্টার, এবং 4) এর Kক্রমটি প্যালিনড্রোমের যোগফল হিসাবে গণনা করা হয় 1-অদলবদলের অনুমতি অনুসারে। এটি শেষ হয় যখন প্রথম দুটি উপাদান সমান হয়ে যায় এবং শেষ দুটি ফলাফলের পরে ফিরে আসে।


2

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

যথারীতি, জাভাস্ক্রিপ্ট সংযোগকারীদের (বা, সম্ভবত এটি আমার অদক্ষতা ...) এর অদক্ষতার জন্য জ্বলজ্বল করে । এখানে আমি প্রদত্ত দৈর্ঘ্যের সমস্ত বাইনারি সংখ্যা এবং মাত্র 2 টি সেট সেট করে সমস্ত সম্ভাব্য অদলবদ অবস্থানগুলি পাই।

ফায়ারফক্সে নীচে স্নিপেট চলমান পরীক্ষা করুন (এমএসআইই যেমন ইকামাস্ক্রিপ্ট comp অনুগামী এবং ক্রোমে এখনও ডিফল্ট পরামিতি অনুপস্থিত)

F=c=>(P=>{for(a=9;c;o&&--c)if(P(n=++a+'',o=0))for(i=1<<n.length;k=--i;[x,y,z]=q,u=n[x],v=n[y],!z&&u-v&&(m=[...n],m[x]=v,m[y]=u,P(+(m.join``))||++o))for(j=0,q=[];k&1?q.push(j):k;k>>=1)++j;})(x=>x-[...x+''].reverse().join``)||[a,o]

// TEST

function go(){ O.innerHTML=F(I.value)}


// Less Golfed
U=c=>{
  P=x=>x-[...x+''].reverse().join``; // return 0 if palindrome 
  
  for(a = 9; // start at 9 to get the first that is known == 10
      c; // loop while counter > 0
      o && --c // decrement only if a Dennis number found
      )
  {  
    o = 0; // reset order count
    ++a;
    if (P(a)) // if not palindrome
    {  
      n = a+''; // convert a to string
      for(i = 1 << n.length; --i; ) 
      {
        j = 0;
        q = [];
        for(k = i; k; k >>= 1)
        {
          if (k & 1) q.push(j); // if bit set, add bit position to q
          ++j;
        } 
        [x,y,z] = q; // position of first,second and third '1' (x,y must be present, z must be undefined)
        u = n[x], v = n[y]; // digits to swap (not valid if they are equal)
        if (!z && u - v) // fails if z>0 and if u==v or u or v are undefined
        {
          m=[...n]; // convert to array
          m[x] = v, m[y] = u; // swap digits
          m = +(m.join``); // from array to number (evenutally losing leading zeroes)
          if (!P(m)) // If palindrome ...
            ++o; // increase order count 
        }  
      }
    }
  }  
  return [a,o];
}

//////
go()
<input id=I value=774><button onclick="go()">-></button> <span id=O></span>


1

awk, 199

{for(;++i&&d<$0;d+=o>0)for(o=j=_;j++<l=length(i);)for(k=j;k++<l;o+=v!=i&&+r~s){split(t=i,c,v=s=r=_);c[j]+=c[k]-(c[k]=c[j]);for(e in c){r=r c[e];s=s||c[e]?c[e]s:s;v=t?v t%10:v;t=int(t/10)}}print--i,o}

গঠন

{
    for(;++i&&d<$0;d+=o>0)
        for(o=j=_;j++<l=length(i);)
            for(k=j;k++<l;o+=v!=i&&+r~s)
            {
                split(t=i,c,v=s=r=_);
                c[j]+=c[k]-(c[k]=c[j]);
                for(e in c)
                {
                    r=r c[e];
                    s=s||c[e]?c[e]s:s;
                    v=t?v t%10:v;
                    t=int(t/10)
                }
            }
    print--i,o
}

ব্যবহার

এটি আপনার কনসোলে আটকে দিন এবং echoআপনি চাইলে নম্বরটি প্রতিস্থাপন করুন

echo 20 | awk '{for(;++i&&d<$0;d+=o>0)for(o=j=_;j++<l=length(i);)for(k=j;k++<l;o+=v!=i&&+r~s){split(t=i,c,v=s=r=_);c[j]+=c[k]-(c[k]=c[j]);for(e in c){r=r c[e];s=s||c[e]?c[e]s:s;v=t?v t%10:v;t=int(t/10)}}print--i,o}'

এটি উচ্চ সংখ্যায় ধীর হয়ে যায়;)

অবহেলিত পুনরায় ব্যবহারযোগ্য সংস্করণ

{
    dennisFound=0

    for(i=0; dennisFound<$0; )
    {
        i++
        order=0

        for(j=0; j++<length(i); )
        {
            for(k=j; k++<length(i); )
            {
                split(i, digit, "")
                digit[j]+=digit[k]-(digit[k]=digit[j]) # swap digits

                tmp=i
                iRev=iFlip=iFlipRev=""

                for(e in digit)
                {
                    if(tmp>0)                        # assemble reversed i
                        iRev=iRev tmp%10
                    tmp = int( tmp/10 )

                    iFlip=iFlip digit[e]             # assemble flipped i

                    if(iFlipRev>0 || digit[e]>0)     # assemble reversed flipped i
                        iFlipRev=digit[e] iFlipRev   # without leading zeros
                }
                if(iRev!=i && 0+iFlip==iFlipRev) order++  # i is not a palindrome,
            }                                             # but flipped i is
        }
        if(order>0) dennisFound++
    }
    print i, order
}

1

রুবি, 156

->i{s=?9
(o=0;(a=0...s.size).map{|x|a.map{|y|j=s+'';j[x],j[y]=j[y],j[x];x>y&&j[/[^0].*/]==$&.reverse&&o+=1}}
o<1||s==s.reverse||i-=1)while i>0&&s.next!;[s,o]}

রুবি বৈশিষ্ট্যটি ব্যবহার করে যেখানে কলগুলি "19".next!রিটার্নগুলিকে "20"পিছনে পিছনে ধরণের রূপান্তর না করতে এড়াতে ব্যবহার করে; আমরা নেতৃত্বকে অগ্রাহ্য করার জন্য কেবল একটি রেজেক্স ব্যবহার করি 0s। প্যালিনড্রোমিক স্যুইচগুলি পরীক্ষা করতে স্ট্রিং পজিশনের সমস্ত জুড়ে আইট্রেটস। আমি মূলত এটি একটি পুনরাবৃত্ত ফাংশন লিখেছি কিন্তু এটি স্ট্যাকটি ফাঁস করে।

774 এর আউটপুট হল ["12012", 3](উদ্ধৃতি চিহ্নগুলি অপসারণে আরও 4 টি বাইট লাগবে তবে আমি মনে করি স্পেকটি তাদের অনুমতি দেয়)।

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