क्विट रोमन टर्नेरी नहीं


23

पूर्णांक n, 0 को देखते हुए, अंकों 139ABCDE…और 1-वर्ण विभाजक का उपयोग करके इसे गैर-स्थितीय आधार -3 अंकन में आउटपुट किया जाता है । प्रत्येक अंक 3 की एक निरंतर शक्ति है और विभाजक के बाईं ओर के अंक उपेक्षित हैं , जैसे A931 | B → 81 | (1 + 3 + 9 + 27) → 41 | एक अंक केवल एक बार दिखाई दे सकता है।

सख्ती से, एक अंक का मान दें:

  • इसका मान यदि अंक 1, 3 या 9 है
  • 27 यदि अंक है A
  • इसके लिए अंक के ठीक 3 गुना पहले मूल्य B।।Z

आपके आउटपुट को योग ( = के दाईं ओर अंकों का मूल्य |) - योग |= इनपुट के बाईं ओर अंकों के मूल्य को संतुष्ट करना चाहिए ।

उदाहरण

input     output
----------------
0         |
1         |1
7         3|91
730       |D1
9999      FEDC|GA9

आप एक विभाजक के रूप में एक अलग गैर-स्थान वर्ण का उपयोग कर सकते हैं । आपको कोई विभाजक नहीं होने दिया जाता है, इस स्थिति में सबसे बड़ा अंक सकारात्मक क्रम शुरू करता है। आपको 2 32PMIGDCBA9|RQNLH3 ) 1 ( ) से बड़ा कुछ भी संभालने की आवश्यकता नहीं है ।

आप एक पूर्ण कार्यक्रम या फ़ंक्शन लिख सकते हैं, और इनपुट और आउटपुट किसी भी सामान्य चैनल पर प्रदान किया जा सकता है।

यह , इसलिए आपका उत्तर बेहतर होगा!


2
(संबंधित का मतलब डुप्लिकेट नहीं है, शांत हो जाओ)
लीकी नून

8
क्या मैं अकेला हूँ जिसका कोई सुराग नहीं है, यहाँ क्या पूछा जा रहा है?
शैगी

3
@ शैगी ने इनपुट को 3 की शक्तियों और उनके नकारात्मक के योग के रूप में व्यक्त किया। एक नकारात्मक छोड़ दिया |और सकारात्मक इसे के दाईं ओर रखो।
मार्टिन एंडर

2
@ केविनक्रूजसेन "नहीं, ऑर्डर फ्री है।" - ओपी
user202729

3
@ user202729 आह, उस टिप्पणी को याद किया। धन्यवाद। ऐसा तब होता है जब नियम चुनौती में संपादित किए जाने के बजाय टिप्पणी में होते हैं .. ( FrownyFrog , क्या आप उस नियम को चुनौती में जोड़ सकते हैं: या तो परिसीमन के दोनों ओर आदेश ठीक है?)
केविन क्रूज़सेन

जवाबों:


5

जावा 10, 120 113 112 109 107 102 बाइट्स

n->{var r="|";for(char c=49;n++>0;c=(char)(c+=c>64?1:c*4%22%9),n/=3)r=n%3<1?c+r:n%3>1?r+c:r;return r;}

-3 की चाल का हिस्सा का उपयोग करके बाइट्स @Arnauld के जावास्क्रिप्ट (ES6) जवाब ,
बदल रहा है i=0और i++<1?49:i<3?51:i<4?57:i+61करने के लिए i=4और ++i>9?i+55:i>8?57:++i+43
-6 बाइट्स से छुटकारा पाने के लिए, सीधे @Arnauld के लिए धन्यवाद i

आउटपुट का आदेश: उच्चतम-से-निम्नतम, |-डेलिमिटर, निम्नतम-से-उच्चतम।

स्पष्टीकरण:

इसे ऑनलाइन आज़माएं।

n->{              // Method with integer parameter and String return-type
  var r="|";      //  Result-String, starting at the delimiter "|"
  for(char c=49;  //  Character, starting at '1'
      n++>0       //  Loop as long as `n` is larger than 0
                  //  Increasing it by 1 with `n++` at the start of every iteration
      ;           //    After every iteration:
       c=(char)(  //     Change character `c` to:
          c+=c>64?//      If the current `c` is an uppercase letter:
              1   //       Simpy go to the next letter using `c+1`
             :    //      Else:
              c*4%22%9),
                  //       Change '1' to '3', '3' to '9', or '9' to 'A' 
       n/=3)      //     Integer-divide `n` by 3
     r=           //     Change the result to:
       n%3<1?     //      If `n` modulo-3 is 0:
        c+r       //       Prepend the character to the result
       :n%3>1?    //      Else-if `n` modulo-3 is 2:
        r+c       //       Append the character to the result
       :          //      Else:
        r;        //       Leave `r` unchanged
   return r;}     //  Return the result-String

1
मुझे लगता है कि यह काम करता है: १०३ बाइट्स
अरनाउल्ड

@ अर्नुलद अच्छा लगा! और rलूप बॉडी में लगाकर -1 और बाइट । धन्यवाद!
केविन क्रूज़सेन

@Arnauld जिज्ञासा से बाहर, ब्रूट-फ़ॉरेस्ट क्या दिखता है जैसे आपने इन अंतिम दो मैजिक नंबरों के लिए उपयोग किया है (जब आप अभी भी उपयोग करते थे i, और जब आप फिर से उपयोग करते हैं c)?
केविन क्रूज़सेन

1
मैंने पहले ही इसे फेंक दिया है ...: - / लेकिन यहाँ आखिरी है । (बहुत अकुशल, लेकिन इतने छोटे मूल्यों के लिए यह ठीक है।)
अरनुल्द

(इसके अलावा, मुझे वास्तव में परीक्षण करना चाहिए कि क्या यह कोड में p=1शामिल है या नहीं *1अगर यह है - भले ही यह उस मामले में एक बेहतर सूत्र का नेतृत्व नहीं करता है।)
अरनॉल्ड


5

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

लोअरकेस में आउटपुट, जो उम्मीद है कि ठीक होना चाहिए।

f=(n,s=(k=4,'|'),c=++k>8?k.toString(36):++k-5)=>n?f(++n/3|0,[c+s,s,s+c][n%3]):s

इसे ऑनलाइन आज़माएं!

करने के लिए इसी तरह के लीकी "निंजा मास्टर" नून का जवाब है और यह भी के आधार पर XNOR का जवाब

अंक रूपांतरण

हम k = 4 से शुरू करते हैं । जबकि k 9 से कम है , हम इसे प्रत्येक पुनरावृत्ति पर दो बार बढ़ाते हैं और 5 घटाते हैं । उसके बाद, हम इसे केवल एक बार बढ़ाते हैं और इसे बेस -36 में बदल देते हैं।

  k  | ++k > 8       | k.toString(36) | ++k - 5  | result
-----+---------------+----------------+----------+--------
  4  | k=5  -> false |                | k=6 -> 1 | 1
  6  | k=7  -> false |                | k=8 -> 3 | 3
  8  | k=9  -> true  | '9'            |          | '9'
  9  | k=10 -> true  | 'a'            |          | 'a'
  10 | k=11 -> true  | 'b'            |          | 'b'
 ... | ...           | ...            | ...      | ...



2

स्टैक्स , 30 29 बाइट्स

£└≤☻╘pÿ╖╡A[ô%æτ⌐}►ºôßHl4⌡π%^ 

इसे चलाएं और डीबग करें

बैलेंस्ड टर्नीरी कन्वर्टर में मेरे स्टैक्स उत्तर का पोर्ट ।

व्याख्या

समझाने के लिए अनपैक्ड संस्करण का उपयोग करता है।

139$VA+cz{;3%+,^3/~;wY1|I@'|ay2|I@L
139$VA+c                               "139AB...Z", make a copy
        z                              Empty array to store the digits
          {         w                  Do the following until 0.
           ;3%+                           Append `b%3` to the digits
                                          Originally, `b` is the input
              ,^3/                        `b=(b+1)/3`
                  ~;                       Make a copy of `b` which is used as the condition for the loop

                     Y                 Save array of digits in `y` for later use
                      1|I              Find index of 1's
                         @             Find the characters in "139AB...Z" corresponding to those indices
                          '|           A bar
                            ay2|I@     Do the same for 2's
                                  L    Join the two strings and the bar and implicit output

1

C # .NET, 103 बाइट्स

n=>{var r="|";for(var c='1';n++>0;c=(char)(c>64?c+1:c+c*4%22%9),n/=3)r=n%3<1?c+r:n%3>1?r+c:r;return r;}

मेरे जावा 10 उत्तर का पोर्ट । एक सीधा बंदरगाह (के अलावा हैं n->करने के लिए n=>) संभव हो गया होता, मैं इस बहुभाषी साथ अपने जावा जवाब संपादित होता। दुर्भाग्य से, हालांकि, c+=वर्णों पर या c=49C # में संभव नहीं है, इसलिए यह ढीला पोर्टेड उत्तर है।

इसे ऑनलाइन आज़माएं।



1

रूबी , 87 84 82 बाइट्स

2 बाइट्स @ benj2240 की बदौलत सहेजे गए।

->n,s=[?1,?3,?9,*?A..?Z],r=[""]*3{r[-m=n%3]+=s.shift
n=n/3+m/2
n>0?redo:r[1,2]*?|}

इसे ऑनलाइन आज़माएं!


मैं झूठ बोल रहा हूँ अगर मैंने कहा कि मैं पूरी तरह से इस कोड का पालन कर रहा हूं, लेकिन मुझे पता है कि आप redoचाल के साथ 2 बाइट्स से हटेंगे: इसे ऑनलाइन आज़माएं!
बेंज 2240

1

जे , 129 बाइट्स

f=:3 :0
a=.'139',u:65+i.26
s=.'|'while.y>0 do.if.1=c=.3|y do.s=.s,{.a end.y=.<.y%3
if.c=2 do.s=.s,~{.a 
y=.1+y end.a=.}.a end.s
)

इसे ऑनलाइन आज़माएं!

बहुत लंबा, विशेष रूप से एक जे कार्यक्रम के लिए ...

स्पष्टीकरण:

f =: 3 : 0
   a =. '139',u:65+i.26   NB. a list '139ABC...Z'
   s =. '|'               NB. initialize the list for the result  
   while. y>0 do.         NB. while the number is greater than 0
      c =. 3|y            NB. find the remainder (the number modulo 3)
      y =. <.y%3          NB. divide the number by 3 
      if. c = 1 do.       NB. if the remainder equals 1
         s =. s,{.a       NB. Append the current power of 3 to the result
      end.
      if. c = 2 do.       NB. if the remainder equals 2 
         s =. s,~{.a      NB. prepends the result with the current power of 3
         y =. 1+y         NB. and increase the number with 1
      end.
      a =. }.a            NB. next power of 3 
   end.
   s                      NB. return the result  
)

1

सी int:: 138 123 बाइट्स long: 152 131 बाइट्स

मैंने इसके दो संस्करण बनाए हैं, क्योंकि चुनौतियों का एक अधिकतम काम के अधिकतम इनपुट की सीमा 0x100000000थोड़ी अजीब है। एक संस्करण 32 बिट पूर्णांकों के साथ काम करता है (जो स्पष्ट कारणों के लिए सीमा को विफल करता है), दूसरा संस्करण 64 बिट्स के साथ काम करता है (जो दिए गए सीमा से आगे जाता है, कीमत पर 14 8 अतिरिक्त बाइट्स )।

32 बिट संस्करण:

char b[22],*r=b;f(v,l)char*l;{v%3>1?*r++=*l,v++:0;v&&f(v/3,l+1);v%3?*r++=*l:0;}g(v){f(v,"139ABCDEFGHIJKLMNOPQR");*r=0;r=b;}

64 बिट संस्करण:

char b[22],*r=b;f(long v,char*l){v%3>1?*r++=*l,v++:0;v&&f(v/3,l+1);v%3?*r++=*l:0;}g(long v){f(v,"139ABCDEFGHIJKLMNOPQR");*r=0;r=b;}

यह समान है सिवाय इसके कि यह पूर्णांक चर को घोषित करता है long (जो कि लिनक्स पर 64 बिट्स है)।

अनगोल्ड longसंस्करण:

char buffer[22],*result=buffer;
f(long value,char*letter){
    if(value%3>1){
        *result++=*letter,value++;
    }
    if(value){
        f(value/3,letter+1);
    }
    if(value%3){
        *result++=*letter;
    }
}
g(long value){
    f(value,"139ABCDEFGHIJKLMNOPQR");
    *result=0;
    result=buffer;
}

जैसा कि आप देख सकते हैं, यह पुनरावर्ती सभ्य द्वारा काम करता है: यदि शेष 1 है, तो संबंधित चरित्र को पुनरावर्ती कॉल के बाद आउटपुट स्ट्रिंग में जोड़ा जाता है। यदि शेष 2 है, तो आउटपुट पुनरावर्तन से पहले किया जाता है। इस मामले में, मैं नकारात्मक अंक को सही ढंग से संभालने के लिए एक से एक मूल्य बढ़ाता हूं। इससे शेष को शून्य में बदलने का अतिरिक्त लाभ है, जिससे मुझे उपयोग करने की अनुमति मिलती हैvalue%3 बाद में पुनरावृत्ति के लिए शर्त के रूप में ।

रूपांतरण का परिणाम वैश्विक बफर में रखा गया है। g()आवरण शून्य का काम है, जिसके परिणामस्वरूप स्ट्रिंग समाप्त सही ढंग से, और रीसेट करने पर resultअपनी शुरुआत करने के लिए सूचक (जो भी कैसे हैg() "रिटर्न" परिणाम)।

longइस कोड के साथ संस्करण का परीक्षण करें :

#include <stdio.h>

char b[22],*r=b;f(long v,char*l){v%3>1?*r++=*l,v++:0;v&&f(v/3,l+1);v%3?*r++=*l:0;}g(long v){f(v,"139ABCDEFGHIJKLMNOPQR");*r=0;r=b;}

void printConversion(long value) {
    g(value);
    printf("%ld: %s\n", value, r);
}

int main() {
    for(long i = 0; i <= 40; i++) {
        printConversion(i);
    }
    printConversion(0x7fffffff);
    printConversion(0xffffffffu);
    printConversion(0x100000000);
}

आगे संभव है, लेकिन विनाशकारी गोल्फिंग:

  • -4 बाइट्स: पॉइंटर रीसेट को हटाकर फ़ंक्शन को एक-शॉट बनाते हैं g()

  • -5 बाइट्स: कॉलर को स्ट्रिंग टर्मिनेशन करने के लिए मजबूर करें, स्ट्रिंग को बिना टर्मिनेशन के लौटाए और स्ट्रिंग bufferके अंत में result


1

चारकोल , 36 बाइट्स

NθF³⊞υ⟦⟧F⁺139α«⊞§υθι≔÷⊕θ³θ»F²«×|ι↑⊟υ

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। स्पष्टीकरण:

Nθ

मूल्य इनपुट करें।

F³⊞υ⟦⟧

पूर्वनिर्धारित खाली सूची में तीन खाली सूचियों को पुश करें।

F⁺139α«

पात्रों 139और बड़े अक्षर के माध्यम से लूप ।

⊞§υθι

मूल्य के साथ सूचियों की सूची को सांकेतिक रूप से अनुक्रमित करें और वर्तमान चरित्र को इसे धक्का दें।

≔÷⊕θ³θ»

मान को 3 से विभाजित करें लेकिन पहले 1 जोड़कर इसे गोल करें।

F²«×|ι

दो बार लूप। दूसरी बार, प्रिंट करें |

↑⊟υ

प्रत्येक लूप हम सूची से अंतिम प्रविष्टि को पॉप करते हैं; पहली बार यह हमें ऐसी प्रविष्टियाँ देता है, 2जिनमें शेष थी (जो एक संतुलित टर्नरी अंक से मेल खाती है -1), जबकि दूसरी बार यह हमें एक संतुलित टर्नरी अंक के अनुरूप प्रविष्टियाँ देती है 1। परिणामी सरणी सामान्य रूप से लंबवत रूप से प्रिंट होगी, लेकिन प्रिंट दिशा को ऊपर की ओर रद्द करने से घूर्णन होता है।




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