একটি সংখ্যাকে ত্রিভুজগুলিতে বিভক্ত করুন


15

একটি পূর্ণসংখ্যা দেওয়া এন , সর্বোচ্চ ত্রিভুজীয় সংখ্যার (যেখানে একটি সমষ্টি সেটিকে পচা টি মিটার প্রতিনিধিত্ব করে মি ম ত্রিদলীয় নম্বর, বা 1 থেকে ইন্টিজার এর সমষ্টি মি নিম্নরূপ):

  • যখন এন> 0 ,

    • সবচেয়ে বড় সম্ভাব্য ত্রিভুজাকার সংখ্যা টি এম যেমন টি এম find n সন্ধান করুন

    • পরিশেষে যোগ মি এর ত্রিদলীয়-পচানি প্রতিনিধিত্বের এন

    • বিয়োগ টি মিটার থেকে এন

উদাহরণস্বরূপ, 44 এর একটি ইনপুট 8311 এর আউটপুট দেয় কারণ:

  • 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36 <44, তবে 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45> 44।

    • প্রথম সংখ্যাটি 8 ; আটটি বাম পেতে 44 থেকে 36 বিয়োগ করুন ।
  • 1 + 2 + 3 = 6 <8, তবে 1 + 2 + 3 + 4 = 10> 8।

    • দ্বিতীয় সংখ্যাটি 3 ; 2 টি বাম পেতে পেতে 8 থেকে 6 বিয়োগ করুন ।
  • 1 <2, তবে 1 + 2 = 3> 2।

    • তৃতীয় এবং চতুর্থ সংখ্যাটি অবশ্যই 1 এবং 1 হতে হবে ।

প্রথম 9 টি ত্রিভুজাকার সংখ্যার প্রতিনিধিত্ব করতে 1 থেকে 9 পর্যন্ত অঙ্কগুলি ব্যবহার করুন, তারপরে 35 তম ত্রিভুজাকার সংখ্যার মাধ্যমে 10 তম উপস্থাপন করতে z এর মাধ্যমে অক্ষরগুলি (মূলধন বা ছোট হাতের অক্ষর হতে পারে) ব্যবহার করুন। আপনাকে কখনই এমন ইনপুট দেওয়া হবে না যা বৃহত্তর "অঙ্ক" ব্যবহারের প্রয়োজন হবে।

ইনপুটটির সীমাগুলি 1 ≤ n <666 , এবং এটি সর্বদা পূর্ণসংখ্যা হবে।

সমস্ত সম্ভাব্য ইনপুট এবং আউটপুট এবং কয়েকটি নির্বাচিত পরীক্ষার কেস (ইনপুট হিসাবে তালিকাভুক্ত, তারপরে আউটপুট):

1 1
2 11
3 2
4 21
5 211
6 3
100 d32
230 k5211
435 t
665 z731

এর একটি আউটপুট একজন ইনপুট জন্য -1/12 প্রয়োজন হয় না। :)


কিন্তু একটি ইনপুট নেই প্রয়োজন ∞ একজন আউটপুট পাওয়া যায় কিভাবে?
ব্যবহারকারী 75200

উত্তর:


8

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

f=(n,t=0)=>t<n?f(n-++t,t):t.toString(36)+(n?f(n):'')

কিভাবে?

বরং স্পষ্টভাবে কম্পিউটিং চেয়ে টি আমি  = 1 + 2 + 3 + ... + I , আমরা দিয়ে শুরু টি = 0 এবং iteratively এই বিয়োগ টি + 1 টি থেকে এন যখন T <এন , বৃদ্ধিশীল টি প্রতিটি পুনরাবৃত্তির করেন। যখন শর্তটি আর পূর্ণ হয় না, তখন এন থেকে মোট টি টি বিয়োগ করা হয়েছে এবং সেই অনুযায়ী আউটপুট আপডেট করা হয়। আমরা প্রক্রিয়াটি n = 0 অবধি পুনরাবৃত্তি করি

নীচে n = 100 এর জন্য সমস্ত ক্রিয়াকলাপের সংক্ষিপ্তসার রয়েছে ।

 n  |  t | t < n | output
----+----+-------+--------
100 |  0 | yes   | ""
 99 |  1 | yes   | ""
 97 |  2 | yes   | ""
 94 |  3 | yes   | ""
 90 |  4 | yes   | ""
 85 |  5 | yes   | ""
 79 |  6 | yes   | ""
 72 |  7 | yes   | ""
 64 |  8 | yes   | ""
 55 |  9 | yes   | ""
 45 | 10 | yes   | ""
 34 | 11 | yes   | ""
 22 | 12 | yes   | ""
  9 | 13 | no    | "d"
----+----+-------+--------
  9 |  0 | yes   | "d"
  8 |  1 | yes   | "d"
  6 |  2 | yes   | "d"
  3 |  3 | no    | "d3"
----+----+-------+--------
  3 |  0 | yes   | "d3"
  2 |  1 | yes   | "d3"
  0 |  2 | no    | "d32"

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



4

ডিসি, 74 বাইট

?sa[2k_1K/1 4/la2*+v+0k1/dlardd*+2/-sadd10<t9>ula0<s]ss[87+P]st[48+P]sulsx

এটা ভয়াবহ।

?sa             stores the input
[2k             sets precision to 2 so dc doesn't truncate 1/4
_1K/1 4/la2*+v+ uses the quadratic formula to find k, the next value to print
0k1/d           truncates k to an integer
lardd*+2/-sa    subtracts kth triangular number from the input 
dd10<t9>u       determines whether to print k as a letter or a digit         
la0<s]ss        loops when a is greater than 0
[87+P]st        prints k as a letter
[48+P]su        prints k as a digit (not p, as that leaves a trailing newline)
lsx             starts the main loop

3

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

@ আরনাউল্ডকে 4 টি বাইট সংরক্ষণ করা হয়েছে

f=(n,p=q=0)=>n?p-~q>n?q.toString(36)+f(n-p):f(n,++q+p):''

1
আমার ছিলf=(n,t=0)=>n?t+1>n?t.toString(36)+f(n):f(n-++t,t):1
আর্নল্ড

@ আরনল্ড ওহ বাহ, এটাই আরও ভাল। আপনার নিজের এটি পোস্ট করা উচিত ...
ETH প্রোডাকশনগুলি

1
ঠিক আছে. আপনার সংস্করণে, এটি করা কি নিরাপদ হবে f=(n,p=q=0)এবং f(n,++q+p)?
আর্নল্ড

@ আরনাউল্ড হ্যাঁ, ধন্যবাদ!
ইটিএইচ প্রোডাকশনগুলি 2:25 '

2

জাভা 7, 81 বাইট

int i=0;String c(int n){return i<n?c(n-++i):Long.toString(i,36)+(n>(i=0)?c(n):"");}

পোর্ট থেকে @Arnauld এর আশ্চর্যজনক জাভাস্ক্রিপ্ট (ES6) উত্তর
আমার নিজের পদ্ধতির প্রায় 2x দীর্ঘ ছিল ..

এখানে চেষ্টা করুন।

ব্যাখ্যা:

int i=0;                  // Temp integer `i` (on class level)
String c(int n){          // Method with integer parameter and String return-type
  return i<n?             //  If `i` is smaller than the input integer
    c(n-++i)              //   Return a recursive call with input minus `i+1` (and raise `i` by 1 in the process)
   :                      //  Else:
    Long.toString(i,36)+  //   Return `i` as Base-36 +
     (n>(i=0)?            //   (If the input integer is larger than 0 (and reset `i` to 0 in the process)
      c(n)                //    Recursive call with the input integer
     :                    //   Else:
      "");                //    an empty String)
}                         // End of method

2

রেটিনা , 115 108 38 34 বাইট

.+
$*¶
(\G¶|¶\1)+
0$1
+T`_w¶`w_`.¶

[এটি অনলাইনে ব্যবহার করে দেখুন!] (পরীক্ষার স্যুট অন্তর্ভুক্ত) বড় হাতের অক্ষর ব্যবহার করে। সম্পাদনা: @ মার্টিনএেন্ডারের উত্তরটি নির্লজ্জভাবে অভিযোজিত করে 70 74 বাইট সংরক্ষণ করা এই সংখ্যাটি কি ত্রিভুজাকার? ব্যাখ্যা: সংখ্যাটি অ্যানারিতে রূপান্তরিত হয়, তারপরে সংখ্যাটি শেষ না হওয়া পর্যন্ত বৃহত্তম সম্ভাব্য ত্রিভুজাকার সংখ্যাটি বারবার মিলিত হয়। প্রতিটি ম্যাচ তারপর বেস 36 এ রূপান্তরিত হয়।



0

আর, 87 বাইট

মূলত, আমি সম্ভাব্য ত্রিভুজাকার সংখ্যাগুলি প্রিসেট করার চেষ্টা করেছি। এটি 105 বাইট সহ এই কোডে নেতৃত্ব দিয়েছে:

pryr::f(n,{l=cumsum(1:35)
k=''
while(n){y=tail(which(l<=n),1)
n=n-l[y]
k=paste0(k,c(1:9,letters)[y])}
k})

এটি আরও সূচকের প্রয়োজন তাই বাইটগুলি হ্রাস করে 87 এ নামানোর জন্য আমি @ আরনল্ড থেকে পদ্ধতিটি চেষ্টা করেছি।

pryr::f(n,{k='';while(n){t=0;while(t<n){t=t+1;n=n-t};k=paste0(k,c(1:9,letters)[t])};k})

উভয় কোডই প্রিসেট বর্ণগুলি ব্যবহার করে, যেহেতু আমি তাদের 36 টি বেসে রূপান্তর করার জন্য একটি ছোট উপায় খুঁজে পাইনি।

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