क्या यह एक संख्या है?


17

प्रस्तावना:

मैं परीक्षण मामलों को प्रशिक्षित करना चाहता था, इसलिए मैं उन्हें कुछ आसान करने की कोशिश कर रहा हूं।

चुनौती:

किसी भी दिए गए (स्ट्रिंग) इनपुट (दृश्यमान ASCII रेंज के भीतर) को लें और घटाएं कि क्या यह एक संख्या और आउटपुट है जिसका मूल्यांकन करने के लिए उपयोग किया जा सकता है।

नियम:

  • एक संख्या में केवल वर्ण होंगे -0123456789,.
  • उत्तर केवल -1000000000 और 1000000000 (अनन्य) के बीच की संख्या को पहचानने के लिए आवश्यक हैं, लेकिन मनमाने ढंग से बड़ी संख्या को पहचान सकते हैं।
  • आप एक पूर्ण कार्यक्रम या एक फ़ंक्शन लिख सकते हैं।
  • यदि कोई संख्या, ऐसी किसी भी चीज़ को लौटाती है, जिसका उपयोग उसे समझने और विवरण में आउटपुट (उदाहरण के लिए My program outputs T if a number, F if not.) करने के लिए किया जा सकता है ।
  • इनपुट ASCII सीमा के भीतर या खाली होने पर वर्णों की कोई भी राशि होगी (यदि कोई संख्या नहीं तो आप जो भी आउटपुट देंगे उसे खाली कर देंगे)।
  • संख्याओं में दशमलव बिंदु (पूर्व 3.14) शामिल हो सकता है । यदि वे करते हैं, तो उनके पास दशमलव बिंदु से पहले कम से कम एक अंक और इसके बाद कम से कम एक अंक होना चाहिए।
  • संख्याओं में अग्रणी या अनुगामी शून्य (उदा। 000001.00000) हो सकता है।
  • संख्या के पूर्णांक भाग को पठनीयता के लिए तीन अंकों के अल्पविराम (पूर्व 1,000.23456) के साथ विभाजित किया जा सकता है । इस मामले में वे करने के लिए छोड़ दिया सही से हर तीन अंक विभाजित किया जाना चाहिए (उदा। 1,234,567, 10,000.202, 123,234.00, 0,123.293)।
  • नकारात्मक संख्या एक अग्रणी -(पूर्व -1.23) द्वारा इंगित की जाती है । +सकारात्मक संख्या को इंगित करने के लिए एक अग्रणी की अनुमति नहीं है, और परिणाम में झूठा होना चाहिए।
  • अपवादों को मान्य और Exception on line N [...]घटिया आउटपुट के रूप में नहीं गिना जाता है (सिवाय तब जब वे आउटपुट को मानक आउट स्ट्रीम में पारित कर सकते हैं (पूर्व में नंबर / नॉनम्बर के लिए आउटपुट के रूप में डाला जा सकता है यदि स्ट्रिंग को मानक स्ट्रीम में डाल दिया जाए।

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

( My program outputs T if a number, F if not.संस्करण मानकर )

123 -> T [on integer]
-123 -> T [negative numbers need to be handled]
0 -> T [on zero]
123.456 -> T [on floating point]
123,456.789 -> T [on evenly divided by 3 digits with comas]
123456789 -> T [thousand separators are not required]
0000001.00000 -> T [on leading/trailing zeros]
00.00 -> T [on zero and leading/trailing zeros]
999999999.9999999999999999999999999999999999999999999999999999 -> T [on close to the maximum value]
-999999999.9999999999999999999999999999999999999999999999999999 -> T [on close to the minimum value]
 -> F [on empty]
lolz -> F [on non-number value]
n4melyh4xor -> F [on non-number with digits]
  1.2 -> F [on space-padded]
9.3 1.3 -> F [on anyhow separated multiple numbers]
1e5 -> F [no scientific notation]
50cl05e.buty3ts0f4r -> F [on input with letters obscuring the number]
1,2,3,4.5678 -> F [on badly readability-divided number]
1,234.5,678 -> F [on readability-divided floating point part]
.234 -> F [on no leading zero]
+1 -> F [no leading + sign]
1.234.3 -> F [only one decimal point]
12345,678 -> F [on separator stopping mid-way]

, कम से कम वर्ण विजेता है।


क्या हम मान सकते हैं कि इनपुट हमेशा ASCII है?
ब्रैड गिल्बर्ट b2gills

@ ब्रैडगिलबर्टब २ जील्स, हाँ।
n4melyh4xor

यदि -123ठीक है, तो किस बारे में +456-> अच्छा या बुरा। या +पार्टी से बाहर रखा गया है?
chux -

@chux, वहां पहुंचने से पहले पार्टी ट्रेन रवाना हो गई। अगली बार बेहतर किस्मत, +
n4melyh4xor

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

जवाबों:


10

रेटिना , 28 29 31 40 34 बाइट्स

^-?\d{1,3}((,\d{3})*|\d*)(\.\d+)?$

आउटपुट 1अगर सत्य है, 0अन्यथा। जहां तक ​​मैं समझता हूं, इस मामले में रेटिना इनपुट पर रेगेक्स की संख्या से मेल खाती है।

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

परीक्षण सूट

संपादित करता

  • "दशमलव स्थान के बाद अंक" नियम का पालन करने के लिए निश्चित है
  • "हैंडल निगेटिव" नियमों का पालन करने के लिए निश्चित
  • वैकल्पिक अल्पविराम विभाजकों का अनुपालन करने के लिए निश्चित है
  • @MartinEnder द्वारा नोट किए गए हजारों विभाजकों के साथ फिक्स्ड बग
  • सशर्त दिखावे को हटाकर गोल्फ

RegExplanation

^-?\d{1,3}((,\d{3})*|\d*)(\.\d+)?$
^                                $  This marks the start and end of regex
 -?                                 Optional hyphen for negative number
   \d{1,3}                          Matches between 1 and 3 digits
          (             )           Capturing group
           (,\d{3})*                 Matches at least zero of comma and three numbers (in the case of separators)
                    |                OR
                     \d*             Matches at least zero digits (in the case of no separators)
                        (\.\d+)?    Matches an optional . and at least one digit (for decimal numbers)

@MartinEnder फिक्स्ड! इसके अलावा, आप रेटिना में झंडे (के लिए झंडे mऔर कहते हैं g) को कैसे निर्दिष्ट करते हैं ?
कृति लिथोस

`रेगेक्स के सामने रखें , और फिर संशोधक उसके सामने जाएं, जैसे m`^.$g.NET में मौजूद नहीं है, मैच डिफ़ॉल्ट रूप से वैश्विक हैं।
मार्टिन एंडर

3

जावास्क्रिप्ट, 46 49 बाइट्स

यह मेरे रेटिना उत्तर का सीधा पोर्ट है। जेएस का उपयोग करने का एकमात्र कारण यह है कि नीचे स्नैक स्निपेट का उपयोग करके रेगेक्स का परीक्षण करने का एक आसान तरीका है

f=s=>/^-?\d{1,3}((,\d{3})*|\d*)(\.\d+)?$/.test(s)

f=s=>/^-?\d{1,3}((,\d{3})*|\d*)(\.\d+)?$/.test(s)
<input oninput=p.innerText=f(value)><p id=p></p>


यदि यह कुछ नियमों (जैसे अल्पविराम नियम) के लिए नहीं थे, तो कोई भी isNaN(+prompt())16 वर्णों के लिए कर सकता था । ऐसा जीवन है, मुझे लगता है
मैथ्यूस एवलर

2

पर्ल 6 , 42 बाइट्स

{?/^\-?[\d**1..3[\,\d**3]+|\d+][\.\d+]?$/}

कोशिश करो

विस्तारित:

{  # bare block lambda with implicit parameter 「$_」

  ? # turn the following into a Bool result

  /  # match implicitly against 「$_」

    ^                 # beginning of string

    \- ?              # optional leading 「-」

    [

      \d ** 1..3      # 1 to 3 digits
      [
        \,            # comma
        \d ** 3       # three digits
      ]+              # repeat at least once

    |                 # or

      \d+             # at least one digit

    ]

    [ \. \d+ ]?       # 「.」 followed by at least one digit optionally

    $  # end of string

  /
}

1

PHP, 62 बाइट्स

<?=preg_match("#^-?(\d+|\d{1,3}(,\d{3})*)(\.\d+)?$",$argv[1]);

बिलिन कॉमा को संभाल नहीं सकता है और यह वैज्ञानिक संकेतन को स्वीकार करता है; तो मैं regex रास्ता चलना था। <?=is_numeric($argv[1]);24 बाइट्स होती।


0

बैश / यूनिक्स उपकरण, 64 बाइट्स

egrep -c '^-?([0-9]+|[0-9]{1,3}(,[0-9]{3})+)(\.[0-9]+)?$'<<<"$1"

इसे एक फ़ाइल के रूप में सहेजें, और स्ट्रिंग को कमांड के पहले तर्क के रूप में जांचने के लिए पास करें।

एक नंबर के लिए आउटपुट 0 है, एक संख्या के लिए 1 है।

यदि आप स्टड से इनपुट स्वीकार करने के लिए तैयार हैं और यदि आप गारंटी दे सकते हैं कि इनपुट में सिर्फ एक लाइन है, तो आप अंत में <<< "$ 1" को हटा सकते हैं, जिसके परिणामस्वरूप 57 बाइट्स मिलेंगे।

कोड के लिए के रूप में, .rerep के लिए -c विकल्प मिलान लाइनों की संख्या को गिनता है (जो कि 0 या 1 होगी)।


0

पायथ, 25 अक्षर

:zCiCM"૧򡊪񛨮򶟉񠫊򆻛񓰚祥񯯏󪬡򢝉񁘍񲲂쪤"^T6

क्रिक्सेटी लिथोस के रेगेक्स को संपीड़ित करता है

इसे ऑनलाइन आज़माएं। बेसिक बहुभाषी विमान के बाहर यूनिकोड वर्णों का उपयोग करता है, जो TIO जाहिरा तौर पर संभाल नहीं सकता है? यह छोटा ऐप स्ट्रिंग के लिए गलत आकार की रिपोर्ट करता है, हालांकि। यह चरित्र / बाइट काउंटर इसे सही पाता है


0

C89, 195 बाइट्स

b,d,c,i;f(char*s){b=*s;for(d=c=i=0;i++,*(s++),d+=*s=='.',c+=*s==',',b=c?i&(i%4!=3)&*s==','?0:b:b;)if(*s==45&!i);else if((*s==32)|(*s==46)|*s==43|!isdigit(*s)&*s!=46&*s!=44)||!(d-1))b=0;return b;}

Ungolfed:

bool is_base10_number (const char* const str) {

  if(!str[0])return false;

  size_t
    dpts = 0,
    cmas = 0;

  for (size_t i = 0; i < strlen(str); i++) {

    if ((str[i] == '-') && (!i)){
      continue;
    }

    if (
      (str[i] == ' ')
      || (str[0] == '.')
      || (str[0] == '+')
      ||
      (
        (!isdigit(str[i]))
        && (str[i] != '.')
        && (str[i] != ',')
      )
    ) {
      return false;
    }

    dpts += str[i] == '.';
    cmas += str[i] == ',';

    if (cmas) {
      if (i & ((i % 4) != 3) & str[i] == ',') {
        return false;
      }
    }

  }

  if (dpts > 1) { return false; }

  return true;
}


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