이것은 숫자입니까?


17

전주곡:

테스트 케이스 만들기를 훈련시키고 싶었으므로 쉽게 시도해 볼 것입니다.

도전:

주어진 (문자열) 입력 (보이는 ASCII 범위 내)을 가져 와서 숫자인지 추론하고 평가에 사용할 수있는 것을 출력하십시오.

규칙 :

  • 숫자는 문자 만 포함합니다 -0123456789,.
  • 답은 -1000000000에서 1000000000 사이의 숫자 만 인식하면되지만 임의로 큰 숫자를 인식 할 수 있습니다.
  • 전체 프로그램이나 함수를 작성할 수 있습니다.
  • 숫자이면 숫자를 식별하고 설명에 출력을 문서화하는 데 사용할 수있는 것을 반환하십시오 (예 :) My program outputs T if a number, F if not..
  • 입력은 ASCII 범위 내에서 임의의 문자 수이거나 비어 있습니다 (비어있는 경우 숫자가 아닌 경우 출력 한 내용을 반환 함).
  • 숫자는 소수점을 포함 할 수 있습니다 (예 :) 3.14. 그럴 경우 소수점 앞뒤에 적어도 하나의 숫자가 있어야합니다.
  • 숫자는 선행 또는 후행 0을 가질 수 있습니다 (예 :) 000001.00000.
  • 숫자의 정수 부분은 가독성을 위해 쉼표 (예 :)로 세 자리 청크로 나눌 수 있습니다 1,000.23456. 이 경우 그들은 오른쪽에서 왼쪽으로 매 3 자리 숫자를 나눌 수 있어야합니다 (예. 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라고 가정 할 수 있습니까?
Brad Gilbert b2gills

@ BradGilbertb2gills, 예.
n4melyh4xor

-123괜찮다 면 +456-> 좋고 나쁘다. 아니면 +파티에서 빠졌습니까?
chux-복원 Monica Monica

@chux, 파티 열차는 +가 도착하기 전에 떠났습니다. 다음에 더 나은 행운을 빕니다, +.
n4melyh4xor

2
사람들이 설명에 설명을 요구하면 질문을 편집해야합니다. 스펙을 알기 위해 주석을 읽을 필요는 없습니다. 답변과 일부 테스트 사례를 포함하도록 편집했습니다.
Peter Taylor

답변:


10

망막 , 28 29 31 40 34 바이트

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

그렇지 않으면 출력 1합니다 0. 내가 이해하는 한,이 경우 Retina는 정규 표현식이 입력과 일치하는 수를 출력합니다.

온라인으로 사용해보십시오!

테스트 스위트

편집

  • "소수점 뒤에 숫자가 있어야합니다"규칙을 준수하도록 수정되었습니다.
  • "핸들 네거티브"규칙을 준수하도록 수정되었습니다.
  • 옵션 쉼표 구분 기호를 준수하도록 수정되었습니다.
  • @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 수정! 또한 Retina에서 플래그 ( m와에 대한 플래그)를 어떻게 지정 g합니까?
Kritixi Lithos

`정규식 앞에 a 를 넣고 수정자는 그 앞에옵니다 (예 :) m`^.$. g.NET에는 존재하지 않으며 기본적으로 일치하는 항목이 있습니다.
Martin Ender

3

자바 스크립트, 46 49 바이트

이것은 나의 Retina 답변의 직접적인 포트입니다. JS를 사용한 유일한 이유는 아래 스낵 스 니펫을 사용하여 정규식을 쉽게 테스트 할 수 있기 때문입니다.

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 자만 사용할 수 있습니다. 이러한 IS 생활, 나는 가정
마테우스 Avellar

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]);

내장은 쉼표를 처리 할 수 ​​없으며 과학적 표기법을 허용합니다. 그래서 정규식 길을 걸어야했습니다. <?=is_numeric($argv[1]);24 바이트 였을 것입니다.


0

bash / Unix 도구, 64 바이트

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

이것을 파일로 저장하고 테스트 할 문자열을 명령의 첫 번째 인수로 전달하십시오.

숫자가 아닌 경우 출력은 0, 숫자의 경우 1입니다.

stdin에서 입력을 기꺼이 받아들이고 입력이 한 줄로만 구성되어 있음을 보장 할 수 있으면 끝에 <<< "$ 1"을 제거하여 57 바이트가 됩니다.

코드 자체의 경우, egrep에 대한 -c 옵션은 일치하는 행 수를 계산합니다 (0 또는 1 임).



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;}

언 골프 드 :

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;
}

0

파이썬 2, 79 바이트

정규식 솔루션

import re
lambda s:[s]==re.findall('-?(?:\d{1,3}(?:,\d{3}\d+)(?:\.?\d+)?',s)


-?                                          | Starts with 0-1 dashes
  (?:\d{1,3}(?:,\d{3})+                     | Have 1-3 digits and 1+ (comma followed by 3 digits)
                       |\d+)                | or 1+ digits
                            (?:\.?\d+)?     | Ends with dot and 1+ digits or nothing

온라인으로 사용해보십시오


0

C #, 75 바이트

bool t(string n){double v;return double.TryParse(n.Replace(",",""),out v);}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.