एक संख्या को त्रिकोण में घटाएँ


15

पूर्णांक n को देखते हुए , इसे अधिकतम त्रिकोणीय संख्याओं के योग में निरूपित करें (जहाँ T m , m त्रि त्रिभुजाकार संख्या को दर्शाता है , या पूर्णांक का योग 1 से m तक ) निम्नानुसार है:

  • जबकि n> 0 ,

    • सबसे बड़ा संभव त्रिकोणीय संख्या T m ज्ञात करें जैसे कि T mn

    • n के त्रिकोणीय-अपघटन प्रतिनिधित्व के लिए मी संलग्न करें ।

    • n से T m घटाएं ।

उदाहरण के लिए, 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 से घटाकर 44 को 8 बचे हैं।
  • 1 + 2 + 3 = 6 <8, लेकिन 1 + 2 + 3 + 4 = 10> 8।

    • दूसरा अंक 3 है ; 8 को 8 से घटाकर 2 बचे हैं।
  • 1 <2, लेकिन 1 + 2 = 3> 2।

    • तीसरा और चौथा अंक 1 और 1 होना चाहिए ।

पहले 9 त्रिकोणीय संख्याओं का प्रतिनिधित्व करने के लिए 9 के माध्यम से अंक 1 का उपयोग करें, फिर 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 के इनपुट के लिए ∞ के आउटपुट की आवश्यकता नहीं है। :)


लेकिन एक इनपुट करता जरूरत ∞ का उत्पादन करने के लिए?
user75200

जवाबों:


8

जावास्क्रिप्ट (ईएस 6), 52 बाइट्स

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

कैसे?

बल्कि स्पष्ट रूप से कंप्यूटिंग से टी मैं  = 1 + 2 + 3 + ... + मैं , हम साथ शुरू t = 0 और iteratively घटाना t + 1 से n जबकि टी <n , incrementing टी प्रत्येक यात्रा पर। जब स्थिति अब पूरी नहीं होती है, तो कुल टी टी को एन से घटाया जाता है और आउटपुट तदनुसार अपडेट किया जाता है। हम प्रक्रिया को 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

जावास्क्रिप्ट (ईएस 6), 61 57 बाइट्स

सहेजे गए 4 बाइट @Arnauld की बदौलत

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
अरनौलद

@Arnauld ओह वाह, यह बेहतर तरीका है। आपको इसे स्वयं पोस्ट करना चाहिए ...
ETHproductions

1
ठीक है। आपके संस्करण में, क्या ऐसा करना सुरक्षित होगा f=(n,p=q=0)और f(n,++q+p)?
अरनौलद

@Arnauld हाँ, धन्यवाद!
ETHproductions

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

रेटिना , ११५ १० 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 तक नीचे करने के लिए @Arnauld से कार्यप्रणाली की कोशिश की।

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 में बदलने के लिए मुझे कोई छोटा रास्ता नहीं मिला।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.