संतुलित टर्नरी कनवर्टर


32

चुनौती के विचार का श्रेय @AndrewPiliser को जाता है। सैंडबॉक्स में उनके मूल प्रस्ताव को छोड़ दिया गया था और चूंकि वह कई महीनों से यहां सक्रिय नहीं हैं, इसलिए मैंने चुनौती ली है।

संतुलित टर्नरी एक गैर-मानक अंक प्रणाली है। यह इस प्रकार है कि अंक 3 के एक कारक द्वारा मूल्य में वृद्धि करते हैं क्योंकि आप बाईं ओर आगे बढ़ते हैं - ऐसा100है9और100128 है।

हालाँकि, 0, 1 और 2 के मान के बजाय, अंक में -1, 0 और 1 के मान हैं । (आप किसी भी पूर्णांक को व्यक्त करने के लिए अभी भी इसका उपयोग कर सकते हैं।)

इस चुनौती के लिए, अंक अर्थ के +1रूप में लिखा जाएगा +, जैसा लिखा -1जाएगा -, और 0बस है 0। संतुलित टर्नरी -संख्या के सामने प्रतीक का उपयोग करने के लिए उन्हें नकारने के लिए उपयोग नहीं करता है जैसे कि अन्य अंक प्रणाली करते हैं - उदाहरण देखें।

आपका कार्य एक संपूर्ण कार्यक्रम लिखना है जो इनपुट के रूप में एक 32-बिट दशमलव हस्ताक्षरित पूर्णांक लेता है और इसे संतुलित टर्नरी में परिवर्तित करता है। किसी भी प्रकार के अंतर्निहित अंतर्निहित रूपांतरण कार्यों की अनुमति नहीं है (गणितज्ञ के पास संभवतः एक ...) है। इनपुट मानक इनपुट, कमांड-लाइन तर्क आदि पर हो सकता है।

अग्रणी शून्य इनपुट में मौजूद हो सकता है लेकिन आउटपुट में नहीं, जब तक कि इनपुट नहीं हो 0, इस मामले में आउटपुट भी होना चाहिए 0

उदाहरण

ये संतुलित त्रिगुट से दशमलव तक रूपांतरण हैं; आपको दूसरा तरीका बदलना होगा।

+0- = 1*3^2 + 0*3^1 + -1*3^0 = 9 + 0 + -1 = 8
+-0+ = 1*3^3 + -1*3^2 + 0*3^1 + 1*3^0 = 27 + -9 + 0 + 1 = 19
-+++ = -1*3^3 + 1*3^2 + 1*3^1 + 1*3^0 = -27 + 9 + 3 + 1 = -14

ओह रुको, मैंने अभी देखा कि संतुलित दर्जन भर पर एक सवाल है - क्या यह एक डुप्लिकेट है?

जैसा कि मैंने सैंडबॉक्स में उल्लेख किया है, मुझे लगता है कि यह मानक फ़ाइनल अभ्यावेदन के बारे में चुनौती के करीब है । लेकिन यह शायद एक डुप्लिकेट भी नहीं है।
मार्टिन एंडर

जवाबों:


22

पायथन 2: 58 वर्ण

n=input()
s=""
while n:s="0+-"[n%3]+s;n=-~n/3
print s or 0

संतुलित टर्नरी डिजिट-बाय-डिजिट को अंत से उत्पन्न करता है। पिछले अंक अवशेषों द्वारा दिया जाता है n%3किया जा रहा है -1, 0या, +1। हम फिर अंतिम अंक निकालते हैं और पायथन के फर्श-विभाजन का उपयोग करके 3 से विभाजित करते हैं n=(n+1)/3। उसके बाद, हम नए अंतिम अंक के साथ पुनरावृत्ति करते हैं जब तक कि संख्या 0 नहीं है।

खाली स्ट्रिंग के बजाय इनपुट के 0लिए एक विशेष मामले की आवश्यकता होती है 0


चश्मा इसकी अनुमति नहीं देते हैं, लेकिन यदि कोई प्रोग्राम के बजाय एक फ़ंक्शन लिख सकता है और 0 के लिए खाली स्ट्रिंग का उत्पादन कर सकता है, तो 40 चार्ट समाधान संभव होगा।

g=lambda n:n and g(-~n/3)+"0+-"[n%3]or""

n*"."andफ़ंक्शन-केवल मामले में उपयोग करने के लिए बेहतर है । इसके अलावा print s or 0बेहतर काम करता है: पी
नब्ब

@ नब्ब गुड कॉल ऑन s or 0। मैंने कोशिश की थी n*"."and, लेकिन यह कब विफल हो जाता है n<0
xnor

@ मार्टिनबटनर पाइथ का लंबा जवाब सिर्फ एक गैर इष्टतम एल्गोरिदम के उपयोग के कारण था।
ऑप्टिमाइज़र

@ ऑप्टिमाइज़र खैर, जाहिर है, और इसीलिए मैंने पायथन जवाब को बेहतर बनाया है जो पहले बेहतर एल्गोरिथ्म मिला। : पी
मार्टिन एंडर

6

सीजेएम, 24 बाइट्स

मैं स्वतंत्र रूप से इस के साथ आया था और मुझे लगता है कि यह, शायद, इसे संभालने का एकमात्र तरीका है।

li{_3%"0+-"=\_g+3/}h;]W%

एल्गोरिदम, इसके xnor के उत्तर के समान है।

इसे यहाँ ऑनलाइन आज़माएँ

यह कैसे काम करता है :

li{               }h                 "Read input, convert to integer and run the code block"
                                     "until stack has 0 on top";
   _3%                               "Copy and get modulus 3";
      "0+-"=                         "Take the correct character based on the above modulus";
            \_g+                     "Swap, copy and take signum of the number and add"
                                     "that to it, incrementing the number if positive,"
                                     "decrementing otherwise";
                3/                   "Integer divide by 3 and continue until 0";
                    ;]               "Pop the residual 0 and wrap everything in array";
                      W%             "Reverse to get in binary format (right handed)";

क्या "वेतन वृद्धि सकारात्मक है, अगर नकारात्मक नकारात्मक वृद्धि" थोड़ा आवश्यक है? सिर्फ इन्क्रीमेंट क्यों नहीं?
इसहाक

@isaacg इसे आज़माएं;)
ऑप्टिमाइज़र

क्या CJam का विभाजन अलग है?
isaacg

@ आइसाकग - गोलाई - नहीं। CJam पूर्णांक विभाजन गोल नहीं है। यह फर्श
ऑप्टिमाइज़र

लेकिन शून्य या मंजिल की ओर?
इसहाक

6

जावास्क्रिप्ट (E6) 68

एक पूरा कार्यक्रम, जैसा कि अनुरोध किया गया है, आई / ओ के साथ पॉपअप। कोर आर फ़ंक्शन, 49 बाइट्स है।

अन्य पुनरावर्ती समाधानों से इतना अलग नहीं है, मुझे लगता है। "0" के लिए एक विशेष मामले से बचने के लिए स्ट्रिंग और संख्या के बीच स्वचालित रूपांतरण का लाभ उठाना

 alert((R=(n,d=(n%3+3)%3)=>n?R((n-d)/3+(d>1))+'0+-'[d]:'')(prompt()))

FireFox / FireBug कंसोल में टेस्ट करें , सिर्फ R फंक्शन का उपयोग करके

['0','8','19','-14','414'].map(x =>x +': '+R(x))

उत्पादन

["0: 0", "8: +0-", "19: +-0+", "-14: -+++", "414: +--0+00"]

क्या मैं कुछ भूल रहा हूँ? d=(n%3+3)%3जब d=n%3एक ही मूल्य का पैदावार होता है, तो इसका क्या मतलब है d?
RLH

@RLH नकारात्मक मानों के लिए नहीं (जावास्क्रिप्ट में नहीं)। -20% 3 === -2% 3 === -2। इसके बजाय -20 mod 3 1 होना चाहिए, (-20% 3 + 3)% 3 वास्तव में 1 है
edc65

6

पायथ, 71 24 23

L?+y/hb3@"0+-"%b3bk|yQ0

यह एक पुनरावर्ती समाधान है, जो @ xnor के 40 चरित्र के पुनरावर्ती कार्य पर आधारित है। yआधुनिक 3 इंडेक्स का उपयोग करके अंतिम अंक को खोजने के लिए इनपुट की संतुलित टर्नरी का निर्माण करता है, और फिर इस तथ्य का उपयोग करता है कि बाकी अंक फ्लोर्ड डिवीजन का उपयोग करके (n + 1) / 3 के लिए संतुलित टर्नरी के बराबर हैं। फिर, यह फ़ंक्शन को कॉल करता है, परिणाम लौटाता है, या यदि इनपुट 0 है।

इसे यहाँ आज़माएँ।


क्या एक ऑनलाइन पायथ दुभाषिया है?

वहाँ है, मैं इसे पोस्ट में जोड़ दूँगा।
isaacg

आपका लिंक टूट गया है। मैं इसे ऑनलाइन कोशिश करता हूं ! , जिसका उपयोग आप अभी से करेंगे जब भी आपको किसी चीज़ के लिए दुभाषिया की आवश्यकता होगी। वैसे, आपका कोड काम नहीं करता है, मेरे लिए यह केवल इनपुट वापस करता है।
पावेल

@ पावेल ने दो साल पहले काम किया था, जब मैंने इसे लिखा था। वर्तमान ऑनलाइन Pyth दुभाषिया pyth.herokuapp.com है। यदि आप उपरोक्त कोड चलाना चाहते हैं, तो आप दुभाषिया को पीछे से देख सकते हैं, फिर github.com/isaacg1/pyth से , जिसमें भाषा का पूर्ण संस्करण नियंत्रित इतिहास है।
isaacg

3

गणितज्ञ - 157 154 146 128

गोल्फ संस्करण:

f=(s="";n=#;i=Ceiling@Log[3,Abs@#]~Max~0;While[i>=0,s=s<>Which[n>=(1+3^i)/2,n-=3^i;"+",n>-(1+3^i)/2,"0",1>0,n+=3^i;"-"];i--];s)&

और अस्थिरता के लिए इंडेंटेशन के साथ:

f = (s = ""; n = #; i = Ceiling@Log[3, Abs@#]~Max~0;
 While[i >= 0, 
  s = s<>Which[
   n >= (1 + 3^i)/2, n -= 3^i; "+",
   n > -(1 + 3^i)/2, "0", 
   1 > 0, n += 3^i; "-"
  ];
 i--];
s)&

उपयोग:

f[414]

आउटपुट:

+--0+00

पात्रों की संख्या कम करने में मार्टिन ब्यूटनर को बहुत धन्यवाद।


3

गणितज्ञ, ५४ वर्ण

Xnor की पुनरावृत्ति के समान

यूनिकोड प्रतीकों को बदलने के लिए उपयोग किया जाता है Floor, Part,!=

If[(t=⌊(#+1)/3⌋)≠0,#0@t,""]<>{"0","+","-"}〚#~Mod~3+1〛&

उत्पादन

fसंक्षिप्तता के लिए संग्रहित किया जाता है और यूनिकोड इनसे लिखे बिना आप नहीं देख सकते

f=If[(t=Floor[(#+1)/3])!=0,#0@t,""]<>{"0","+","-"}[[#~Mod~3+1]]&
f /@ {8, 19, -14, 414} // Column

+0-
+-0+
-+++
+--0+00

3

जीएनयू सेड, 236 बाइट्स

/^0/bV
:
s/\b9/;8/
s/\b8/;7/
s/\b7/;6/
s/\b6/;5/
s/\b5/;4/
s/\b4/;3/
s/\b3/;2/
s/\b2/;1/
s/\b1/;0/
s/\b0//
/[^;-]/s/;/&&&&&&&&&&/g
t
y/;/1/
:V
s/111/3/g
s/3\b/3:/
s/311/33!/
s/31/3+/
y/3/1/
tV
s/1/+/
y/1:/!0/
/-/{s/-//
y/+!/!+/
}
y/!/-/

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

व्याख्या

कोड की पहली छमाही (पहली पंक्ति से कम) दशमलव को यूनरी में अनुवादित करता है और सीधे " सेड में गोल्फिंग के लिए टिप्स " से आता है । तब यह एक समय में एक ट्रिनरी को संतुलित करने के लिए यूनिरी का अनुवाद करता है, जिसे मैं स्वयं एक उदाहरण देकर काम करूंगा।

अंतिम आउटपुट से पहले, त्रिगुट अंक -, 0, और +प्रतिनिधित्व कर रहे हैं !, :और +क्रमश:।

एक दिलचस्प परिणाम के लिए, हम साथ शुरू करते हैं -48, जिसे यूनाइटरी ( -अक्षत के साथ ) में बदल दिया गया है । पहले (दाएं-सबसे) ट्रिट की गणना करने के लिए, हमें शेष 48 first 3 की गणना करनी होगी। हम इसे 111s की जगह s से बदल सकते हैं 3:

-111111111111111111111111111111111111111111111111 │ s/111/3/g
# => -3333333333333333

48, 3 का कोई शेष नहीं है, इसलिए कोई भी शेष नहीं 1है, और हम जानते हैं कि हमारी पहली विशेषता है :(0 के लिए), इसलिए हम इसे प्रतिस्थापित करते हैं:

-3333333333333333 │ s/3\b/3:/
# => -3333333333333333:

अब हमारे पास "अपने स्थान" हैं, इसलिए हम जानते हैं कि शेष 3एस का प्रतिनिधित्व करते हैं। गणित को काम करते रहने के लिए हमें उन्हें 3 से विभाजित करना होगा, अर्थात उन्हें 1s से बदलना होगा :

-3333333333333333: │ y/3/1/
# => -1111111111111111:

आइए अपने गणित की दोबारा जांच करें: हमारे पास 1111111111111111थ्रेस प्लेस में 16 (अनरी ) हैं और :उन लोगों की जगह पर शून्य ( ) है। वह 3 That's16 + 1✕0 = 48 है। अब तक बहुत अच्छा है।

अब हम फिर से शुरू करते हैं। 111एस के साथ बदलें 3:

-1111111111111111: │ s/111/3/g
# => -333331:

इस बार हमारा शेष भाग है 1, इसलिए हमने +थ्रस्ट प्लेस में रखा और शेष 3एस को 1एस के साथ बदल दिया :

-333331: │ s/31/3+/; y/3/1/
# => -11111+:

पवित्रता की जाँच का समय: हमारे पास एक ५ (यूनीरी 11111) नाइन जगह में, १ ( +) जगह में, और ० ( :) वाले स्थान में: ९✕५ + ३✕१ + १✕० = ४.! फिर से हम 111s को 3s से बदलते हैं :

-11111+: │ s/111/3/g
# => -311+:

इस बार हमारा शेष 2 ( 11) है। इसमें दो ट्रिट ( +!) लगते हैं , जिसका मतलब है कि हमारे पास एक कैरी है। जैसे दशमलव अंकगणित में इसका मतलब है कि हम सबसे सही अंक लेते हैं और शेष कॉलम को बाईं ओर जोड़ते हैं। हमारी प्रणाली में, इसका मतलब है कि हम !निन्स स्थान में रखते हैं और इसके बाईं ओर एक और तीन जोड़ते हैं, फिर 27 वें स्थान का प्रतिनिधित्व करने के लिए 3एस के साथ सभी को प्रतिस्थापित करें 1:

-311+: │ s/311/33!/; y/3/1/
# => -11!+:

अब हमारे पास कोई 3s शेष नहीं है, इसलिए हम किसी भी शेष अयोग्य अंकों को उनके अनुरूप ट्रिट के साथ बदल सकते हैं। दो ( 11) है +!:

-11!+: │ s/11/+!/
# => -+!!+:

वास्तविक कोड में यह दो चरणों में किया जाता है, s/1/+/और y/1:/!0/, बाइट्स को बचाने के लिए। दूसरा चरण :एस के साथ भी बदलता है 0, इसलिए यह वास्तव में ऐसा करता है:

-11!+: │ s/1/+/; y/1:/+0/
# => -+!!+0

अब हम जांचते हैं कि हमारे पास ऋणात्मक संख्या है या नहीं। हम करते हैं, इसलिए हमें साइन से छुटकारा पाना होगा और फिर प्रत्येक ट्रिट को पलटना होगा:

-+!!+0 │ /-/ { s/-//; y/+!/!+/; }
# => !++!0

अंत में, हम !s को -s से प्रतिस्थापित करते हैं :

!++!0 │ y/!/-/
# => -++-0

बस!


2

स्टैक्स , 17 बाइट्स

ë1·âΓM¿├>Ö≥Er☺à┤3

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

अब तक का सबसे छोटा उत्तर, लेकिन कुछ गोल्फ भाषाओं द्वारा आसानी से पीटा जाना चाहिए। एल्गोरिथ्म @ xnor के पायथन उत्तर के समान है।

ASCII समकक्ष:

z{"0+-";3%@+,^3/~;wr

1

जावास्क्रिप्ट 108 102 (ES6, कोई पुनरावर्ती कॉल नहीं)

t=a=>{v="";if(0==a)v="0";else for(a=(N=0>a)?-a:a;a;)v="0+-"[r=(a%3+3)%3]+v,2==r&&++a,a=a/3|0;return v}

मूल प्रविष्टि 108 पर

t=a=>{v="";if(0==a)v="0";else for(a=(N=0>a)?-a:a;a;)v=(N?"0-+":"0+-")[r=a%3]+v,2==r&&++a,a/=3,a|=0;return v}

नहीं @ edc65 के जवाब के रूप में कल्पना के रूप में ... मैं इसे आगे कम करने में किसी भी मदद की सराहना करेंगे ...


1

क्लोजर, 242 बाइट्स

#(clojure.string/join""(map{1"+"0"0"-1"-"}(loop[x(vec(map read-string(clojure.string/split(Integer/toString % 3)#"")))](let[y(.indexOf x 2)](if(< y 0)x(let[z(assoc x y -1)](recur(if(= y 0)(vec(cons 1 z))(assoc z(dec y)(inc(x(dec y))))))))))))

क्या यह अब तक का सबसे लंबा क्लोजर है?

Ungolfed (टिप्पणियों के साथ):

(use '[clojure.string :only (split join)]);' (Stupid highlighter)
; Import functions

(defn ternary [n]
  (join ""
  ; Joins it all together
    (map {1 "+" 0 "0" -1 "-"}
    ; Converts 1 to +, 0 to 0, -1 to -
      (loop [x (vec (map read-string (split (Integer/toString n 3) #"")))]
      ; The above line converts a base 10 number into base 3,
      ; and splits the digits into a list (8 -> [2 2])
        (let [y (.indexOf x 2)]
        ; The first occurrence of 2 in the list, if there is no 2,
        ; the .indexOf function returns -1
          (if (< y 0) x
          ; Is there a 2? If not, then output the list to
          ; the map and join functions above.
            (let [z (assoc x y -1)]
            ; Converts where the 2 is to a -1 ([2 2] -> [-1 2])
              (recur
                (if (= y 0) (vec (cons 1 z))
                  ; If 2 is at the 0th place (e.g. [2 2]),
                  ; prepend a 1 (e.g. [-1 2] -> [1 -1 2])
                  (assoc z (dec y) (inc (x (dec y)))))))))))))
                  ; Else increment the previous index
                  ; (e.g. [1 -1 2] -> [1 0 -1])

1

8 वें , 179 171 167 वर्ण

यहां यह 8 वें में एक पूर्ण कार्यक्रम है जो एक दशमलव हस्ताक्षरित पूर्णांक को इनपुट के रूप में लेता है और इसे संतुलित टर्नरी में परिवर्तित करता है

 
: f "" swap repeat dup 3 n:mod ["0","+","-"] swap caseof rot swap s:+ swap dup n:sgn n:+ 3 n:/mod nip while drop s:rev ;
"? " con:print 16 null con:accept >n
f cr . cr
 

परीक्षा

 
? 414
+--0+00
 

पहली बार कार्यक्रम एक संख्या को बदलने के लिए पूछता है (आवश्यकतानुसार)। फिर, fनिम्नलिखित पंक्ति में अधिक संख्याओं को परिवर्तित करने के लिए शब्द को लागू करना संभव है :

 
[ 8 , 19 , -14 , ] ( nip dup . space f . cr ) a:each drop 
 

उत्पादन

 
8 +0-
19 +-0+
-14 -+++
 

कोड स्पष्टीकरण

 
"? " con:print 16 null con:accept >n
 

यह इनपुट हैंडलिंग का कोड है। कोड का मूल शब्द के अंदर है fगोल्फ कोर्स से दूर मैंने >btइसके बजाय शब्द का इस्तेमाल किया होगा f। यहाँ यह f(टिप्पणियों के साथ) का एक ungolfed संस्करण है :

 
: f \ n -- s
    ""   \ used for the first symbol concatenation
    swap \ put number on TOS to be used by loop
    repeat
        dup 
        3 n:mod      \ return the remainder of the division by 3
        [ "0" , "+" , "-" , ] 
        swap caseof  \ use remainder to take proper symbol
        rot          \ put previous symbol on TOS 
        swap         \ this is required because "" should come first
        s:+          \ concatenate symbols
        swap         \ put number on TOS 
        dup
        n:sgn n:+    \ add 1 if positive or add -1 if negative
        3 n:/mod nip \ put quotient only on TOS
    while drop
    s:rev            \ reverse the result on TOS
;
 

0

जावा, 327 269 ​​अक्षर

कोड गोल्फिंग में मेरा पहला प्रयास है। मैं उन छोटी भाषाओं में से किसी को भी नहीं जानता, इसलिए यहाँ जावा में एक समाधान है। मैं इसे और छोटा करने की सलाह की सराहना करता हूं।

import java.util.*;class a{public static void main(String[] h){int i=Integer.parseInt(new Scanner(System.in).nextLine());String r="";while(i!=0){if(i%3==2||i%3==-1){r="-"+r;}else if(i%3==1||i%3==-2){r="+"+r;}else{r="0"+r;}i=i<0?(i-1)/3:(i+1)/3;}System.out.println(r);}}

इसे यहाँ आज़माएँ: http://ideone.com/fxlBBb

संपादित करें

BufferedReaderद्वारा प्रतिस्थापित Scanner, मुझे throwsक्लॉज हटाने की अनुमति देता है , लेकिन आयात (+2 वर्ण) बदलना पड़ा। Integerद्वारा बदल दिया गया int। दुर्भाग्य से, कार्यक्रम अगर वहाँ नहीं है संकलन नहीं होगा String[] hमें main


1
आप Scannerअपने बजाय का उपयोग करके कुछ बाइट्स को बचाने में सक्षम हो सकते हैं BufferedReader। इसके अलावा, String[] hऔर throws java.lang.Exceptionशायद आवश्यक नहीं हैं, और आप intइसके बजाय का उपयोग करके कुछ और बाइट्स बचा सकते हैं Integer

0

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

v=>[...v].map(x=>t=3*t+((+x!=+x)?(x+1)-0:0),t=0)&&t

पात्रों के माध्यम से पाश। पहले पिछले कुल 3 बार गुणा करें, फिर यदि NNN (वर्ण) सत्य है, तो स्ट्रिंग (वर्ण + "1") को संख्या में परिवर्तित करें और इसे जोड़ें, अन्यथा शून्य।




0

एपीएल (एनएआरएस), 26 चार्ट, 52 बाइट्स

{+/(3*¯1+⍳≢⍵)ׯ2+⌽'-0+'⍳⍵}

परीक्षा:

  h←{+/(3*¯1+⍳≢⍵)ׯ2+⌽'-0+'⍳⍵}
  h '+0-'
8
  h '+-0+'
19
  h '-+++'
¯14
  h ,'-'
¯1
  h ,'0'
0
  h ,'+'
1

यदि if का उपयोग किया जाता है तो यह कम हो सकता है लेकिन यह निषिद्ध है ...

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