मुझे मेरी संख्या में मदद करें!


25

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

चुनौती

2 ^ 53-1 से कम के गैर-नकारात्मक पूर्णांक को देखते हुए, यह तय करें कि क्या पूर्णांक में सबसे कम प्रतिनिधित्व है:

  • दशमलव
  • हेक्साडेसिमल
  • वैज्ञानिक संकेत

दशमलव

चूंकि यह मेरी भाषा का डिफ़ॉल्ट प्रारूप है, इसलिए इस प्रारूप के लिए किसी अतिरिक्त अंकन की आवश्यकता नहीं है। हर संख्या को दशमलव के लिए हमेशा की तरह दर्शाया गया है।

हेक्साडेसिमल

मेरी भाषाएं 0xहेक्साडेसिमल स्थिरांक के लिए उपसर्ग का उपयोग करती हैं । इसका मतलब यह है कि यदि किसी संख्या में 4 हेक्साडेसिमल अंक हैं, तो उस संख्या का प्रतिनिधित्व करने के लिए 6 बाइट्स लगेंगे।

वैज्ञानिक संकेत

मेरी भाषा वैज्ञानिक संकेतन के लिए निम्नलिखित प्रारूप का उपयोग करती है:

[वास्तविक आधार] ई [१० का पूर्णांक करनेवाला]

उदाहरण के लिए, के 700रूप में प्रतिनिधित्व किया जाएगा 7e3, और के 699रूप में प्रतिनिधित्व किया जाएगा 6.99e3, क्योंकि आधार -10 और 10 (गैर-समावेशी) के बीच होना चाहिए । इस चुनौती के प्रयोजनों के लिए, आधार हमेशा कम से कम 0 होगा, क्योंकि इनपुट संख्या गैर-नकारात्मक है।

उत्पादन

आपको यह पहचानने का एक तरीका लौटाना चाहिए कि कौन सा प्रारूप सबसे छोटा है (यानी दशमलव के लिए 0, हेक्स के लिए 1, वैज्ञानिक के लिए 2)। वैकल्पिक रूप से, आप स्वयं संख्या का सबसे छोटा प्रतिनिधित्व आउटपुट कर सकते हैं।

परीक्षण के मामलों

Decimal       | Hexadecimal  | Scientific        | Winner
--------------|--------------|-------------------|-------------
0             | 0x0          | 0e0               | Decimal
15            | 0xF          | 1.5e1             | Decimal
6999          | 0x1B57       | 6.999e3           | Decimal
7000          | 0x1B58       | 7e3               | Scientific
1000000000000 | 0xE8D4A51000 | 1e12              | Scientific
1000000000001 | 0xE8D4A51001 | 1.000000000001e12 | Hexadecimal
1000000001000 | 0xE8D4A513E8 | 1.000000001e12    | Hexadecimal
1000001000000 | 0xE8D4B45240 | 1.000001e12       | Scientific

स्कोरिंग

यह , इसलिए प्रत्येक भाषा के लिए सबसे कम बाइट्स में उत्तर जीतता है।


1
ऊपर जाने की आवश्यकता 2^63-1कुछ भाषाओं के लिए मुश्किल हो सकती है। आराम करने पर विचार करें कि कम मूल्य पर जैसे 2^32-1(इसलिए मान एक डबल फ़्लोटिंग पॉइंट डेटा प्रकार में फिट होते हैं)
लुइस मेंडेन

1
समझा। 2 ^ 52-1 के बारे में कैसे? वह आज भी फिट बैठता है double। केवल एक सलाह; जैसा कि आप फिट देखते हैं
लुइस मेंडू

1
10000010000001000001e6हालांकि यह भी लिखा जा सकता है ।
आउटगोल्फ

1
@JonathanAllan हाँ, यह @ आप, क्षमा करें। और नहीं, आप आदेशित सूची का उत्पादन नहीं कर सकते हैं; चूंकि यह एक निर्णय-समस्या है , इसलिए आपको एक एकल आउटपुट पर निर्णय लेने की आवश्यकता है। (लेकिन आपका कार्यान्वयन सूची को सॉर्ट कर सकता है और पहला आइटम आउटपुट कर सकता है।)
Musicman523

1
केवल दो संभावित आउटपुट के लिए परिभाषा द्वारा निर्णय-समस्या नहीं है ?
mbomb007

जवाबों:


5

05AB1E , 23 बाइट्स

hg̹gD<g>¹ÀðìÁ0ÜðÜg+)Wk

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

-1 Emigna को धन्यवाद ।

0हेक्साडेसिमल के लिए, 1दशमलव के लिए, 2वैज्ञानिक के लिए।


एक बाइट के साथ सहेजें '.ìÁ0
16

@Eignign ooh जो हमेशा गोल्फ सामान तैयार करता है।
आउटगोल्फ

4

05AB1E , 27 बाइट्स

Dg<¹À'.ìÁ0Ü'.Ü…ÿeÿIh…0xÿ)é¬

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

व्याख्या

D                            # duplicate input, one copy will be used as decimal notation
 g<                          # len(input)-1
   ¹À                        # push input and rotate left
     '.ìÁ                    # prepend a dot and rotate right
         0Ü'.Ü               # remove trailing zeroes and then any trailing dot
              …ÿeÿ           # format scientific notation
                  Ih         # input converted to hex
                    …0xÿ     # format hex
                        )    # wrap in a list
                         é   # sort by length
                          ¬  # get the first (shortest) item

ईव, यहां कुछ कम होना चाहिए।
आउटगोल्फ

@EriktheOutgolfer: शायद। मैं वैज्ञानिक संकेतन के साथ बहुत सारे बाइट्स खर्च करता हूं। यह शायद वास्तविक मूल्यों को नहीं बनाने के लिए कम होगा और केवल लंबाई की बजाय जांच करेगा।
एमिग्ना

हेक्स की लंबाई है len(hex(input)) + 2, अगर वह मदद करता है।
आउटगोल्फ

@EriktheOutgolfer: हाँ, हेक्स और दशमलव की लंबाई पाने के लिए 5 बाइट्स । यह वैज्ञानिक संकेतन है जो बाइट खर्च करेगा। हालांकि यह संभावना को हरा देगा।
एमिग्ना

2
@EriktheOutgolfer: का उपयोग करना ¹ इसके बजाय काDs :g¹hgÌ
Emigna

3

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

TṀµỊ¬+‘
DµL’DL+Ç,L
b⁴L+2;ÇỤḢ

एक monadic लिंक लौटने 1, 2या 3हेक्साडेसिमल, वैज्ञानिक या दशमलव क्रमशः के लिए।

इसे ऑनलाइन आज़माएं! या एक परीक्षण सूट देखें।

मैंने सोचा था कि यह कम होगा, लेकिन मैं इसे नहीं देख सकता इसलिए पोस्ट कर रहा हूं।

कैसे काम करता है यह राक्षसीपन ...

TṀµỊ¬+‘    - Link 1, length of mantissa + "e": list of decimal digits  e.g. [7,0,1,0]
T          - truthy indexes                                                 [1,  3  ]
 Ṁ         - maximum                                                             3
  µ        - monadic chain separation, call that m
   Ị       - insignificant? (abs(m)<=1) -- here: 1 for m=1, 0 otherwise          0
    ¬      - logical not                  i.e. 1 if a "." will be used           1
     +     - add m                                                               4
      ‘    - increment                    always uses an 'e'                     5

DµL’DL+Ç,L - Link 2, lengths of scientific and decimal notations: non-negative-integer, n
D          - cast to decimal list
 µ         - monadic chain separation, call that d
  L        - length of d (number of decimal digits of n)
   ’       - decrement (value of exponent)
    D      - cast to decimal list (exponent's digits)
     L     - length (number of characters in the exponent)
       Ç   - call last link (1) as a monad(d) (number of characters in mantissa + "e")
         L - length of d (number of decimal digits of n)
        ,  - pair

b⁴L+2;ÇỤḢ - Main link: non-negative-integer, n
 ⁴        - literal 16
b         - convert n to base 16
  L       - length (number of hexadecimal digits)
   +2     - add two (number of characters including the "0x")
      Ç   - call the last link (2) as a monad (characters in scientific and decimal)
     ;    - concatenate ([charsInHexadecimal, charsInScientific, charsInDecimal])
       Ụ  - sort indexes by value
        Ḣ - head (1-based-index in the above list of (one of) the shortest)

1
28 बाइट्स !? साथ ही C # ...: P
TheLethalCoder

1
@ TheLethalCoder निश्चित रूप से एक भ्रामक चुनौती है - वहाँ एक GL होना चाहिए जो वैज्ञानिक अंकन के लिए संख्याओं को प्रारूपित कर सके!
जोनाथन एलन

@ TheLethalCoder वहाँ एक 75 बाइट जेली जवाब एक और सवाल पर पोस्ट किया गया है कि बहुत पहले नहीं है। क्या याद नहीं रख सकते। आह यह एक था , लेकिन यह एक 83 है।
ड्रेको 18s

@ Draco18s मेरा दोनों मैं देखते हैं! टिप्पणी ने मुझे इस पर गौर किया जो 8 महीने पहले 91 पर खड़ा था; मैंने इसे 85 पर गिरा दिया :)
जोनाथन एलन

मुझे Google को वाक्यांश "सबसे लंबी जेली" को ले जाना था ताकि उन्हें खोजने के लिए codegolf.stackexchange.com तक सीमित रखा जा सके। : पी वहाँ एक तीसरा था, लेकिन यह केवल एक पैलेट 57 बाइट्स था .... आपका भी
ड्रेको १।

2

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

दशमलव के लिए 0 लौटाता है, हेक्साडेसिमल के लिए 1, वैज्ञानिक के लिए -1।

n=>(l=Math.log,D=l(n)/l(10),H=l(n)/l(16)+2,S=n.toExponential().length-1,S<H?-(S<D):+(H<D))

व्याख्या

  • log(n) / log(10): बेस -10 लघुगणक n; लगभग nएक दशमलव के रूप में लंबाई ।

  • log(n) / log(16) + 2: बेस -16 nप्लस 2 का लघुगणक ; मोटे तौर पर nएक हेक्साडेसिमल प्लस की लंबाई के रूप में पूर्वनिर्मित 0x

  • n.toExponential().length - 1: वैज्ञानिक प्रारूप (जैसे ) के n.toExponential()साथ एक स्ट्रिंग लौटाता है, लेकिन हम इसकी लंबाई को 1 से घटाकर बाहरी के लिए खाता है ।n7e+3+

अब हम सभी 3 अभ्यावेदन की लंबाई है D, Hऔर S, हम की तुलना:
S<H?-(S<D):+(H<D)


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

यह सबसे कम लंबाई के साथ प्रारूप में संख्या को आउटपुट करता है। @ झबरा के हटाए गए प्रयास से प्रेरित ।

n=>[n+'','0x'+n.toString(16),n.toExponential().replace('+','')].sort((x,y)=>x.length-y.length)[0]


अच्छा :) मुझे आश्चर्य है कि आप इसे नीचे गोल्फ के समाधान पर मेरे परित्यक्त प्रयास से कुछ भी पिला सकते हैं? आप इसे पृष्ठ के अंत में हटाए गए पोस्टों में पाएंगे।
झबरा

@ शगुन तुम्हारा मौलिक रूप से भिन्न है क्योंकि यह स्वरूपित संख्या को आउटपुट करता है। मैंने इसके बजाय एक अलग उत्तर को बंद कर दिया। :)
darrylyeo

1

सी #, 106 97 96 143 132 बाइट्स

using System.Linq;n=>new[]{n+"",$"0x{n:X}",(n+"").Insert(1,".").TrimEnd('0','.')+"e"+((n+"").Length-1)}.OrderBy(s=>s.Length).First()

C # में सक्रिय रूप से ulong.ToStringप्रारूप विनिर्देशक eउच्च संख्या पर सटीक खो देता है इसलिए मुझे इसे मैन्युअल रूप से करना होगा। वहाँ शायद यह करने के लिए एक छोटा तरीका है, लेकिन यह अब के लिए काम करता है। यह इस चुनौती के लिए भी गलत तरीके से प्रारूपित करता है इसलिए मुझे इसे वैसे भी आउटपुट करना होगा।

अगर मैं के मूल्य के लिए एक स्ट्रिंग सेट nके रूप में var s=n+"";यह स्पष्ट वापसी और अतिरिक्त घुंघराले ब्रेसिज़ की वजह से लंबे समय तक बाहर काम करता है।

यह प्रत्येक भिन्न मान के सरणी से सबसे छोटा मान लौटाता है [0] = decimal, [1] = hexadecimal, [2] = scientific

पूर्ण / प्रारूपित संस्करण:

using System.Linq;
Func<ulong, string> f = n =>
    new[]
    {
        n + "",
        $"0x{n:X}",
        (n + "").Insert(1, ".").TrimEnd('0', '.') + "e" + ((n + "").Length - 1)
    }.OrderBy(s => s.Length).First();

वैज्ञानिक उत्पादन की गणना करने का सही तरीका है:

(n < 1 ? n + "" : (n + "").Insert(1, ".").TrimEnd('0', '.')) + "e" + ((n + "").Length - 1)

हालाँकि, जैसा मैं देख रहा हूं 0, 0e0मैं उस विशेष मामले को हटा सकता हूं।


1

अजगर 2, 83 77 बाइट्स

संख्या का सबसे छोटा प्रतिनिधित्व आउटपुट करता है।

import re
lambda n:min(`n`,hex(n),re.sub('\.?0*e\+0?','e','%.15e'%n),key=len)

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

Ungolfed:

import re
n=input()
d=`n`
h=hex(n)
s=re.sub('(.)\.?0*e\+0?',r'\1e','%.15e'%n)
print min(d,h,s,key=len)

रेगेक्स पीछे चल रहे शून्य और दशमलव बिंदु को हटा देता है यदि आवश्यक हो, साथ ही साथ प्लस चिह्न और अग्रणी शून्य से घातांक यदि एक है।


मुझे लगता है Lकि इनपुट रेंज में बैकटिक्स बड़ी संख्या में जुड़ेंगे । strउस से बचना होगा।
xnor

@xnor हमें जिस अधिकतम पूर्णांक का समर्थन करना है वह पायथन के intप्रतिनिधित्व के भीतर है । मोटे तौर पर शुरू होता है 2**63
mbomb007

क्या आपको रेगेक्स सबबिंग करने की आवश्यकता है? क्या आप केवल +पात्रों को निकाल सकते हैं str.replace?
संगीतज्ञ ५२३

1
@ musicman523 यह काफी लंबा होगा। Zgeos और दशमलव बिंदु को हटाने के लिए regex सबबिंग को वैसे भी करने की आवश्यकता है, और +जब मैं उस पर होता हूं, तो इसे निकालने के लिए केवल 2 बाइट्स होते हैं ।
mbomb007

1

ओम , 35 बाइट्स

l┼xl2+┼DRîsRl≥al≤Dla°┼îa/ì\?≥;+WD╤k

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

दशमलव के लिए आउटपुट 0, हेक्स के लिए 1 और वैज्ञानिक के लिए 2 है।

स्पष्टीकरण:

l                                      Implicit input, get length                                          
 ┼                                     Input again
  x                                    To hex
   l                                   Get length
    2+                                 Add 2 because of "0x"
      ┼                                Get input again
       D                               Duplicate on the stack
        RîsR                           Remove zeroes at the end (reverse, to int, to string, reverse)
            l                          Get length (= length of base)
             ≥                         Add 1 because to count "e" in the scientific notation
              a                        Swap top two values on the stack
               l≤                      Get length - 1 ( = get the exponent of 10 in scientific notation)
                 D                     Duplicate on the stack
                  l                    Get length ( = length of the exponent)
                   a                   Swap. Now on top of the stack we have the exponent again
                    °                  10^exponent
                     Ō                Get input for the fourth time
                       a/              Divide input by the 10^exp calculated earlier
                         ì\?           If this thing is not an integer...
                            ≥;         ...add one to count the "."
                              +        Sum base length ( + "e") + exponent length ( + ".")
                               W       Wrap stack in array
                                D      Duplicate
                                 ╤k    Get index of min value

0

पीएचपी , 90 बाइट्स

दशमलव के लिए 0 प्रिंट, हेक्साडेसिमल के लिए 1 और वैज्ञानिक के लिए 2

एक टाई के मामले में उच्चतम संख्या प्रिंट होगी

<?=array_flip($m=[$l=log10($a=$argn)^0,2+(log($a,16)^0),strlen(($a/10**$l).$l)])[min($m)];

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

PHP , 91 बाइट्स

दशमलव के लिए 0 प्रिंट, हेक्साडेसिमल के लिए 1 और वैज्ञानिक के लिए 2

एक टाई के मामले में सबसे कम संख्या प्रिंट होगी

<?=array_search(min($m=[$l=log10($a=$argn)^0,2+(log($a,16)^0),strlen(($a/10**$l).$l)]),$m);

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

पीएचपी , 103 बाइट्स

दशमलव के लिए 0 प्रिंट, हेक्साडेसिमल के लिए 1 और वैज्ञानिक के लिए 2

एक टाई के मामले में सभी नंबर प्रिंट होंगे

foreach($m=[$l=log10($a=$argn)^0,2+(log($a,16)^0),strlen(($a/10**$l).$l)]as$k=>$v)echo$v-min($m)?"":$k;

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

पीएचपी , 109 बाइट्स

सबसे कम समाधान के साथ एक सरणी आउटपुट

for(;!$p=preg_grep("#^.{".++$i."}$#",[$a=$argn,"0x".dechex($a),$a/10**($l=log10($a)^0)."e$l"]););print_r($p);

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


0

सी, 187 185 बाइट्स

main(){long long N;scanf("%lli",&N);long long D=log10(N)+1,H=log(N)/log(16)+3,F,S,i=1;while(N>i&&!(N%i))i*=10,F++;S=ceil(log10(D-1))+1+D-F+(D-F>1);printf("%i",N?H>D?2*(D>S):1+(H>S):N);}

decompressed:

void main(){
    long long N;
    scans("%lli", &N);
    long long D = log10(N) + 1; // Length of number (decimal)
    long long H = log(N)/log(16) + 3; // Length of number (hexadecimal)
    long long F; // Number of 0s at the end of decimal number
    long long S; // Length of number (scientific notation)
    long long i; // Counter (more or less)
    // Get number of zeros at the end of decimal number
    while(N > i && (N % i) == 0){
        i = i * 10;
        F++;
    }
    S = ceil(log10(D - 1)) + 1 + D - F + (D-F>1); // (Power) + (e) + (multiplier + (1 if len(multiplier) > 1))
    printf("%i", N!=0 ?
                (H > D ? 2 * (D > S) : 1 + (H > S)) 
              : 0); // Print the shortest number
}

दशमलव के लिए प्रिंट 0, हेक्स के लिए 1, वैज्ञानिक अंकन के लिए 2।


0

टीआई-बेसिक, 130 बाइट्स

Input N:If not(N:Goto 0:1+int(log(N→D:3+int(logBASE(N,16→H:0→F:1→I:While N>I and not(fPart(N/I:10I→I:F+1→F:End:log(D-1→L:1+D-F+(D-F>1):Ans+int(L)+(0≠fPart(L→S:(H>D)2(D>S)+(H≤D)(1+(H>S)→N:Lbl 0:N

या, वैकल्पिक रूप से:

�N>θN>�0>1p��ND>3p�������BASEN+16H>0F>1I>�NlI@��N�I>10II>Fp1F>�>�Dq1L>1pDqFpDqFl1>rp�Lp0o�LS>HlD2DlSpHmD1pHlSN>�0>N

या, हेक्स में:

dc4e3eceb84e3ed7303e3170b1c04e04443e3370b1bbbcbbbfbbb642415345104e2b313604483e3004463e3104493ed14e6c4940b8ba4e83493e31304904493e46703104463ed43ec0447131044c3e317044714670104471466c31113e7270b14c117010306fba4c04533e10486c44113210446c53117010486d441110317010486c5311044e3ed6303e4e

दशमलव के लिए प्रिंट 0, हेक्स के लिए 1, वैज्ञानिक अंकन के लिए 2

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