कस्टम नंबर आधार कनवर्टर


30

जो शक्तियां किसी भी प्रारूप का उपयोग करके किसी भी संख्या को अपने स्वयं के संख्या आधार में जल्दी से परिवर्तित करने में सक्षम होना चाहती हैं।

इनपुट

आपके प्रोग्राम को 3 पैरामीटर स्वीकार करने होंगे।

  1. संख्या: स्ट्रिंग संख्या को परिवर्तित किया जाना है
  2. InputFormat: आधार स्ट्रिंग संख्या वर्तमान में है
  3. OutputFormat: आधार स्ट्रिंग जिसे संख्या में परिवर्तित किया जाना है।

उत्पादन

आपके प्रोग्राम को Numberपुराने नंबर के आधार InputFormatसे नए नंबर के आधार में बदलना होगाOutputFormat

उदाहरण

("1","0123456789","9876543210") = "8"
("985724","9876543210","0123456789ABCDEF") = "37C3"
("FF","0123456789ABCDEF","0123456789") = "255"
("FF","0123456789ABCDEF","01234567") = "377"
("18457184548971248772157", "0123456789","Aa0Bb1Cc2Dd3Ee4Ff5Gg6Hh7Ii8Jj9Kk,Ll.Mm[Nn]Oo@Pp#Qq}Rr{Ss-Tt+Uu=Vv_Ww!Xx%Yy*Zz") = ",sekYFg_fdXb"

अतिरिक्त

नया आधार 77 परीक्षण की आवश्यकता नहीं है, हालांकि यह काम करता है

  1. यदि आपकी भाषा में जहां आपको पहले एक नंबर में कनवर्ट करना है और 32 बिट के भीतर लॉक किया गया है तो आप इसे छोड़ सकते हैं।
  2. क्योंकि यह एक अतिरिक्त परीक्षा है।

सभी उदाहरणों को PHP 7.2 द्वारा bcmath एक्सटेंशन के साथ निम्न कोड (var mins but code formatted) का उपयोग करके तैयार किया गया था। वहाँ शायद एक छोटा रास्ता होगा यह सिर्फ जिस तरह से मैं सिस्टम के लिए आया था जो मुझे इस के साथ करने की ज़रूरत थी, यह देखना अच्छा होगा कि क्या कोई भी एक छोटे संस्करण के साथ आ सकता है।

PHP 7.2 (bcmath - एक्सटेंशन) 614 बाइट्स

<?php
function f($a, $b, $c)
{
    $d= str_split($b,1);
    $e= str_split($c,1);
    $f= str_split($a,1);
    $g=strlen($b);
    $h=strlen($c);
    $k=strlen($a);
    $r='';
    if ($c== '0123456789')
    {
        $r=0;
        for ($i = 1;$i <= $k; $i++)
            $retval = bcadd($retval, bcmul(array_search($f[$i-1], $d),bcpow($g,$k-$i)));
        return $r;
    }
    if ($b!= '0123456789')
        $l=f($a, $b, '0123456789');
    else
        $l= $a;
    if ($l<strlen($c))
        return $e[$l];
    while($l!= '0')
    {
        $r= $e[bcmod($l,$h)].$r;
        $l= bcdiv($l,$h,0);
    }
    return $r;
}

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

स्कोरिंग

यह कोड गोल्फ है; सबसे छोटा कोड जीतता है। मानक खामियां लागू होती हैं।


5
@WindmillCookies प्रारूप के तार में जो भी अक्षर हैं।
एडम

6
अच्छा पहला सवाल! :-)
Giuseppe


2
यह "अद्वितीय" आधार के लिए एक परीक्षण मामले को जोड़ने के लायक हो सकता है - जैसे ["zX", "tXdsyqzSDRP02", "brFNC02bc"] => "cb"। (या जो कुछ भी वास्तव में होना चाहिए, अगर वह गलत है)
निधि मोनिका का मुकदमा

2
मैं प्रारूप में 36 से अधिक पात्रों के साथ एक परीक्षण का मामला सुझाता हूं, किसी को भी बिल्ट-इन का उपयोग करके पकड़ने के लिए जो केवल बेस 36 तक जाता है
जो किंग

जवाबों:


13

....................... आप जानते हैं, मैंने देखा कि Zaआधार रूपांतरण किया था , लेकिन matl.suever पर दस्तावेज़ स्पष्ट नहीं थे कि यह आधार के पात्रों को स्वीकार करता है, इसलिए मैंने कोशिश नहीं की। मुझे चीर दो!
ग्यूसेप

@Giuseppe Haha, मैंने इसे केवल इसलिए याद किया क्योंकि ऐसा लग रहा था कि यह एक आदेश है जो कुछ चतुर हैक या दो में उपयोग (ab) के लिए परिपक्व है। विडंबना यह है कि इसका पहला प्रयोग एक सीधे-सीधे निर्मित उत्तर के रूप में है। :)
सूंदर -

1
मेरा पहला विचार जब मैंने "ज़" देखा तो वह "प्रभु, हैरी ड्रेसडेन" था। +1।
निधि मोनिका का मुकदमा

8

आर , 124 बाइट्स

function(n,s,t,T=L(t),N=(match(!n,!s)-1)%*%L(s)^(L(n):1-1))intToUtf8((!t)[N%/%T^rev(0:log(N,T))%%T+1])
"!"=utf8ToInt
L=nchar

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

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


दुर्भाग्य से यह n = "0" के साथ काम नहीं करेगा ... आपको 2 बाइट्स जोड़ने चाहिए, log(N+1,T)लेकिन कभी-कभी एक अग्रणी शून्य का कारण बनता है जैसे कि जब आप 31 को बेस 10 से बेस 2 में परिवर्तित करते हैं :(
digEmAll

अग्रणी शून्य के बिना लघुगणक पर "शून्य अंक" से बचने के लिए, मुझे बहुत सारे अन्य समाधान नहीं log(N+!N,T)!
दिखते

@digEmAll ओपी की टिप्पणियाँ अभी भी थोड़ी अस्पष्ट हैं, लेकिन ऐसा लगता है कि शून्य का समर्थन करने की आवश्यकता नहीं है।
Giuseppe

ओह ठीक है .. फिर ठीक है :)
डाइजेक्सिल

7

एपीएल (डायलॉग यूनिकोड) , 22 बाइट्स

अनाम शिशु लाम्बा। InputFormatबाएं तर्क के OutputFormatरूप में और सही तर्क के रूप में लेता है, और Numberस्टड से संकेत देता है । मान लिया गया है ⎕IO( मैं ndex हे rigin) होने के लिए 0है, जो कई सिस्टम पर डिफ़ॉल्ट है।

{⍵[(≢⍵)⊥⍣¯1⊢(≢⍺)⊥⍺⍳⎕]}

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

{... } "dfn"; बाएं तर्क है, सही तर्क है
(यूनानी वर्ण: बाएं और दाएं अंत में ग्रीक वर्णमाला)

⍵[...]  निम्नलिखित के साथ आउटपुट स्वरूप को अनुक्रमित करें:

   इनपुट के लिए संकेत

  ⍺⍳ɩ इनपुट प्रारूप में उन पात्रों में से ndices

  (...)⊥  निम्नलिखित आधार में होने का मूल्यांकन करें:

   ≢⍺ इनपुट प्रारूप की लंबाई

   कि (अलग उपज ¯1से (≢⍺))

  ()⊥⍣¯1 निम्नलिखित आधार में परिवर्तित करें:

  ≢⍺ आउटपुट स्वरूप की लंबाई


7

जाप, 5 बाइट्स

2 सप्ताह के ब्रेक के बाद गोल्फ में वापस आना

nV sW

कोशिश करो


व्याख्या

           :Implicit input of U=Number, V=InputFormat & W=OutputFormat
 nV        :Convert U from base V to decimal
    sW     :Convert to base W string

7

C (gcc), 79 + 46 = 125 बाइट्स

char*O;l,n;g(n){n/l&&g(n/l);write(1,O+n%l,1);}

इस के साथ संकलित किया जाना चाहिए

-Df(s,i,o)=for(n=l=0;n=n*strlen(i)+index(i,s[l])-i,s[++l];);l=strlen(O=o);g(n)

झंडा। (हां, यह अविश्वसनीय रूप से स्केच है, यही कारण है कि मैं अपना पुराना उत्तर नीचे रख रहा हूं।) यह एक मैक्रो को परिभाषित करता है fजो एसटीडीयूएसटी के उत्तर को आउटपुट करता है ।

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

सी (जीसीसी), 133 131 बाइट्स

char*O;l;g(n){n/l&&g(n/l);write(1,O+n%l,1);}f(s,i,o,n)char*s,*i,*o;{for(n=0,l=strlen(O=o);n=n*strlen(i)+index(i,*s)-i,*++s;);g(n);}

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

यह एक फ़ंक्शन को परिभाषित करता है fजो STDOUT के उत्तर को आउटपुट करता है ।

char*O;           // declare variable to store output charset
l;                // will be set to length of O
g(n){             // helper function to print the result
  n/l&&g(n/l);    // recursively calls itself if there are more digits
  write(1,        // output to stdout...
   O+n%l,1);      // the byte at (n mod output base) in O
}
f(s,i,o,n)        // main function
char*s,*i,*o;{    // declare string inputs
for(n=0,          // initialize n to 0
l=strlen(O=o);    // assign output charset so we don't have to pass it to g
n=n*strlen(i)     // repeatedly multiply n by input base...
+index(i,*s)-i,   // ... add the index of the digit in input charset...
*++s;);           // and move to the next digit until there's none left
g(n);             // call the helper function on the resulting integer
}

आप डिकोडिंग लूप को बदलने और बदलने के putcharबजाय 2 बाइट्स बचा सकते writeहैं: इसे ऑनलाइन आज़माएं!
एरिक

इस indexफ़ंक्शन ने मुझे एक बाइट के साथ-साथ मेरे दृष्टिकोण से बचाया, इसके बारे में नहीं पता था;)
फेलिक्स पाम्स

6

05AB1E , 5 बाइट्स

ÅβIÅв

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

यह 05AB1E की विरासत संस्करण में काम नहीं करता है । यह केवल नए संस्करण पर काम करता है, अमृत फिर से लिखना।

यह काम किस प्रकार करता है

ÅβIÅв - पूर्ण कार्यक्रम।
Custom - कस्टम बेस से दशमलव में कनवर्ट करें।
  I - तीसरा इनपुट पुश करें।
   Åв - दशमलव से कस्टम आधार में परिवर्तित करें। 

आप यह कहते हैं कि यह केवल 05AB1E v2 में काम करता है (निश्चित नहीं कि यदि यह सही संस्करण संख्या है ..), लेकिन आपने फिर भी एक TIO- लिंक प्रदान किया है। क्या अमृत संस्करण पहले से ही TIO पर है ?! : एस या यह अधिकांश परीक्षण मामलों के लिए काम करता है, लेकिन कुछ किनारे मामले हैं जहां यह केवल नए संस्करण में काम करता है?
केविन क्रूज़सेन

2
05AB1E v2 अब TIO पर उपलब्ध है। 05AB1E (विरासत) (इसे tio बार में खोजें) पुराने का नाम है 05AB1E और 05AB1E नए का नाम है। मुझे पता है कि आप पहले ही चैट रूम में देख चुके हैं, लेकिन मैं इसे अन्य उपयोगकर्ताओं के लिए एक संदर्भ के रूप में यहाँ छोड़ दूँगा।
श्री एक्सकोडर

5

MATL , 5 बाइट्स

sundar ने ऐसा करने के लिए असली बिल्टिन पाया! मेरे गूंगे के बजाय उस उत्तर को बढ़ाओ: --(

ZAwYA

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

          % implicit input N, the number, and S, the digits of the Source base
ZA        % base2dec, convert string N using S as digits into a base 10 integer
w         % swap stack elements, with implicit input T, the digits of the Target base
YA        % dec2base, reverse the ZA operation with digits coming from T instead.

4

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

⍘⍘SSS

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

  S     Input the "number"
   S    Input the input format
 ⍘      Convert to number using that format
    S   Input the output format
⍘       Convert to string using that format
        Implicitly print

BaseStringसमारोह स्वचालित रूप से पहले पैरामीटर के प्रकार पर निर्भर संख्या और स्ट्रिंग के बीच धर्मान्तरित।


3

पायथन 2 , 132 129 122 121 बाइट्स

lambda n,a,b:g(sum(len(a)**i*a.find(j)for i,j in enumerate(n[::-1])),b)
g=lambda n,c:c[n:n+1]or g(n/len(c),c)+c[n%len(c)]

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

एक अनाम फ़ंक्शन (धन्यवाद, एरिक द आउटगोलर !) जो मूल संख्या को आधार 10 पूर्णांक में परिवर्तित करता है, फिर पूर्णांक और नया बेस स्ट्रिंग को फ़ंक्शन जी () में उत्तीर्ण करता है, जो पुन: नए आधार में परिवर्तित होता है। अब OutputFormat की लंबाई को g () के पैरामीटर के रूप में पास करता है।

लोअर बायटेकाउंट के लिए जी () अपडेट किया गया। (धन्यवाद, डेनिस )

बदला हुआ सूचकांक () ढूंढें () के साथ। (धन्यवाद, मिस्टर एक्सकोडर !)

असंगठित व्याख्या:

def f(n, a, b):
    # reverse the string to that the least significant place is leftmost
    # Ex: 985724 -> 427589
    n = n[::-1]
    # get the value of each place, which is its index in the InputFormat, times the base to the power of the place
    # Ex: 427589, 9876543210 -> 5*10^0, 7*10^1, 2*10^2, 4*10^3, 1*10^4, 0*10^5 -> [5,70,200,4000,10000,0]
    n = [a.find(j)*len(a)**i for i,j in enumerate(n)]
    # add all of the values together to bet the value in base 10
    # Ex: (5 + 70 + 200 + 4000 + 10000 + 0) = 14275
    n = sum(n)

    # call the convert to base function
    return g(n, b)

def g(n, c):
    # string slice, which will return an empty string if n:n+1 is not in range
    # an empty string is falsey
    if c[n:n+1]:
        return c[n:n+1]
    else:
        # get current least significant digit
        rem = c[n%len(c)]
        # get the rest of the integer
        div = n/len(c)

        # get the converted string for the rest of the integer, append the calculated least significant digit
        return g(div,c)+rem

1
आपको जरूरत नहीं है f=, अनाम कार्यों को डिफ़ॉल्ट रूप से अनुमति दी जाती है।
आउटगॉल्फ

@ एग्री द आउटगोलर की अनुमति है कि जब अनाम फ़ंक्शन दूसरे फ़ंक्शन को कॉल करता है, तो?
त्रिगुटर्नोमेट्री

जब तक आप अपने बाइटकाउंट में अन्य सामान शामिल करते हैं, हां, आपको चर और आयात मॉड्यूल को परिभाषित करने की अनुमति है।
आउटगॉल्फ

1
हेल्पर फंक्शन बन सकता है g=lambda n,c:c[n:n+1]or g(n/len(c),c)+c[n%len(c)]
डेनिस

1
और मुख्य एक बन सकता है lambda n,a,b:g(sum(len(a)**i*a.find(j)for i,j in enumerate(n[::-1])),b,len(b))
श्री Xcoder

2

जेली , 11 बाइट्स

iⱮ’ḅL{ṃ⁵ṙ1¤

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

तर्क क्रम: InputFormat, संख्या, OutputFormat। उचित भागने के साथ तर्कों को उद्धृत करना सुनिश्चित करें!


मुझे यकीन नहीं है कि मैंने स्पष्ट रूप से परम के आदेश को बताया ...
मार्टिन बार्कर

@MartinBarker परम्स क्रम 2, 1, 3 में लिए गए हैं। मैं चुनौती में एक विशिष्ट आदेश की आवश्यकता नहीं देख सकता, और यह हतोत्साहित किया जाएगा।
आउटगोल्फर

3
@MartinBarker प्रो टिप: इस तरह की चीजों के साथ लचीला हो। मुझे किसी कार्य को हल करते समय आदानों का क्रम पूरी तरह से अप्रासंगिक लगता है, इसलिए मेरा सुझाव है कि आप किसी भी मनमाने ढंग से चुने गए मापदंडों का आदेश देने की अनुमति देते हैं
श्री एक्सकोडर

मैं इसे वैसे भी छड़ी करने वाला था जैसे कि अभी इसे परखने की कोशिश कर रहा हूं।
मार्टिन बार्कर

2

पायथ, 21 बाइट्स

s@LeQjimx@Q1dhQl@Q1le

परीक्षण सूट

स्पष्टीकरण:
s@LeQjimx@Q1dhQl@Q1le  | Code
s@LeQjimx@Q1dhQl@Q1leQ |  with implicit variables
       m               | Map the function
        x   d          |   index of d in
         @Q1           |    the second string in the input
             hQ        |  over the first string in the input
      i                | Convert the resulting list to int from base
               l@Q1    |  length of the second string in the input
     j                 | Convert the int into a list in base
                   leQ |  length of the last string in the input
 @LeQ                  | Turn each number in the list into the character from the numbers index in the last string in the input
s                      | Concatenate the strings in to one string
                       | Implicit print


2

पर्ल 6 , 100 97 बाइट्स

{$^c.comb[(":"~$^b.chars~[$^a.comb>>.&{index $b,$_}].perl).EVAL.polymod($c.chars xx*)].join.flip}

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

अनाम कोड ब्लॉक जो क्रम, इनपुट, इनपुट प्रारूप और आउटपुट प्रारूप में 3 स्ट्रिंग्स लेता है, फिर एक स्ट्रिंग लौटाता है

स्पष्टीकरण:

{  # Anonymous code block
  $^c.comb[  # Split the output format into characters
           (":"~$^b.chars~[$^a.comb>>.&{index $b,$_}].perl) # The radix syntax in a string e.g ":3[1,2,3]"
           .EVAL  # Eval'ed to produce the base 10 version
           .polymod($c.chars xx*)  # Converted to a list in the output base (reversed)
          ] # Convert the list into indexes of the output format
           .join  # Join the characters to a string
           .flip  # And unreversed
}

2

VBA, 182 बाइट्स

एक घोषित सबरूटीन जो इनपुट लेता है, nभाषा में yऔर परियोजनाओं को भाषा में z

Sub f(n,y,z)
l=Len(n)
For i=-l To-1
v=v+(InStr(1,y,Mid(n,-i,1))-1)*Len(y)^(l+i)
Next
l=Len(z)
While v
v=v-1
d=v Mod l+1
v=v\l
If d<0Then v=v+1:d=d-l
o=Mid(z,d+1,1)&o
Wend
n=o
End Sub

2

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

के रूप में इनपुट लेता है (input_format)(output_format)(number)

s=>d=>g=([c,...n],k=0)=>c?g(n,k*s.length+s.search(c)):k?g(n,k/(l=d.length)|0)+d[k%l]:n

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


क्षमा करें, यह स्ट्रिंग के इनपुट प्रारूप को एक सरणी में बदलने के रूप में मान्य नहीं है जो ऐसा कुछ नहीं है जो सीएलआई इनपुट के माध्यम से किया जा सकता है। और प्रोग्राम किया जाना चाहिए कि आपको मान्य होने के लिए पहले परम के लिए सरणी में स्ट्रिंग को विभाजित करने की आवश्यकता है।
मार्टिन बार्कर

@MartinBarker आप किस नियम का उल्लेख कर रहे हैं? वैसे भी 3 तार लेने के लिए अद्यतन किया गया।
अरनौलड

इनपुट पैरामीटर के सभी 3 कहते हैं कि "स्ट्रिंग" सी ++ के रूप में एक स्ट्रिंग को सीधे पढ़ा जा सकता है और इसे जावास्क्रिप्ट के साथ एक सरणी के रूप में उपयोग नहीं किया जा सकता है।
मार्टिन बार्कर

1

सी (जीसीसी) , 130 129 बाइट्स

v;c(r,i,s,t)char*r,*i,*t;{for(r[1]=v=0;*i;v=v*strlen(s)+index(s,*i++)-s);for(s=strlen(t),i=1;*r=t[v%s],v/=s;memmove(r+1,r,++i));}

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

के indexबजाय का उपयोग करते हुए -1 बाइटstrchr

यह एक सरल पुनरावृत्त दृष्टिकोण है, sizeof(int) == sizeof(char *)बाइट्स को बचाने के लिए कुछ चर (और इस तरह से TIO पर दुरुपयोग ) का पुन: उपयोग कर रहा है ।

इनपुट:

  • i इनपुट नंबर
  • s स्रोत आधार वर्ण
  • t आधार पात्रों को लक्षित करें

आउटपुट:

  • r परिणाम संख्या (एक बफर के लिए सूचक)

स्पष्टीकरण:

v;                                        // value of number
c(r,i,s,t)char*r,*i,*t;{
    for(r[1]=v=0;                         // initialize value and second
                                          // character of output to 0
        *i;                               // loop while not at the end of
                                          // input string
         v=v*strlen(s)+index(s,*i++)-s);  // multiply value with source base
                                          // and add the value of the current
                                          // digit (position in the base string)
    for(s=strlen(t),i=1;                  // initialize s to the length of the
                                          // target base string, length of
                                          // result to 1
        *r=t[v%s],v/=s;                   // add character for current digit
                                          // (value modulo target base) and
                                          // divide value by target base until
                                          // 0 is reached
        memmove(r+1,r,++i));              // move result string one place to
                                          // the right
}

bcopy(r,r+1,++i)इसके बजाय सुझाव देंmemmove(r+1,r,++i)
सीलिंगकैट


1

जावा 10, 131 बाइट्स

स्ट्रिंग के रूप में एक स्ट्रिंग लेम्बडा और एक स्ट्रिंग वापस करने के लिए पैरामीटर।

(i,f,o)->{int n=0,b=o.length();var r="";for(var c:i.split(r))n=n*f.length()+f.indexOf(c);for(;n>0;n/=b)r=o.charAt(n%b)+r;return r;}

यह ऑनलाइन की कोशिश करो

Ungolfed

(i, f, o) -> {
    int n = 0, b = o.length();
    var r = "";
    for (var c : i.split(r))
        n = n * f.length() + f.indexOf(c);
    for (; n > 0; n /= b)
        r = o.charAt(n % b) + r;
    return r;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.