유효한 변수 이름입니까? 문자는 밑줄, 문자 또는 숫자

목표

변수 이름이 유효하고 출력 1인지 또는 유효한지 여부를 확인하는 프로그램 또는 함수를 작성 True하십시오. 0.5는 유효하지만 밑줄 (_)로 시작하고 0 또는 False유효하지 않은 경우 작성하십시오.

규칙

  • 대부분의 언어에서 변수 이름은 밑줄 또는 문자 (az, AZ, _)로 시작하고 나머지 문자는 밑줄, 문자 또는 숫자 인 경우에 유효합니다. (az, AZ, 0-9, _)
  • 출력 1 또는 True변수 이름이 유효하고 0이거나 False유효하지 않은 경우.
  • 그러나 밑줄로 변수를 시작하는 것은 좋지 않으므로 밑줄로 시작하고 이름이 유효하면 0.5를 리턴하십시오.

테스트 사례

입력

abcdefghijklmnop

산출

1

입력

_test_

산출

0.5 (밑줄로 시작)

입력

123abc

산출

0 (숫자로 시작)

입력

A_b1C_23

산출

1

입력

_!

산출

0 (유효하지 않기 때문에 0.5 아님)

입력

magical pony1

산출

0 (공백 없음)

표준 허점이 적용됩니다.

이것은 이므로 가장 짧은 코드가 승리합니다.

보너스 : 프로그램 / 함수 0가 빈 문자열 ( "")을 출력하면 -10 % 입니다.



답변

자바 스크립트 (ES6), 37-10 % = 33.3 바이트

@ edc65 덕분에 4 바이트 절약

@Mateon 덕분에 5.6 바이트 절약

s=>!/^\d|\W|^$/.test(s)/-~(s[0]=='_')


답변

05AB1E , 25 24 20 19 바이트

암호:

¬D'_Qsa·+¹žj-""Q*2/

설명:

¬                     # Push input and also push the first character.
 D                    # Duplicate the first character.
  '_Q                 # Check if it is equal to an underscore character.
     sa               # Swap and check the duplicate if it's an alphabetic character.
       ·              # Double the value.
        +             # Add both values up
         ¹            # Take the first input.
          žj-         # žj is short for [a-zA-Z0-9_]. This will be substracted from the
                        initial string.
             ""Q      # Check if the string is empty.
                *     # Multiply this with the first value.
                 2/   # Halve it, resulting into 0.0, 0.5, or 1.0.

요약하면, s의사 코드 의 문자열 공식 은 다음과 같습니다.

((s[0] == '_' + s.isalpha() × 2) × (s.remove([a-zA-Z0-9_]) == "")) / 2

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

CP-1252 인코딩을 사용합니다 .


답변

PHP (50-10 % = 45)

-2에 대한 Schism 덕분에 🙂

preg_match('/^[a-z_]\w*$/i',$s)?$s[0]=='_'?.5:1:0;

golflang 답변과 경쟁하지 않지만 어쨌든 시도 할 것이라고 생각했습니다.

preg_match('/^[a-z_]\w*$/i', $s) # Matches every a-zA-Z0-9_ string that doesnt start with a number
?   $s[0] == '_'                   # Then, if it starts with an _
    ?   .5                         # give 0.5 points
    :   1                          # If it doesn't, give 1
:   0;                             # If it didn't match the regex, give 0

주목할 점은 PHP에서 /u수정자가 없는 \wASCII 문자 만 선택 한다는 것입니다 . 다른 언어 / 정규 풍미에서는이 패턴이 작동하지 않습니다.

편집 : ASCII가 아닌 문자와 숫자가 포함 된 언어를 사용할 때 \ w 및 \ d를 사용하는 사람들이 많이 있습니다. 그것은 퍼즐이 아닙니다. 그들은 틀렸다. (아직 공감 / 댓글을 작성할 수 없습니다.이 방법으로 알려주세요.)


답변

망막, 30-10 % = 27 28-10 % = 25.2 29-10 % = 26.1 바이트

두 버전 모두 빈 입력을 올바르게 처리하기 때문에 보너스를받을 수 있습니다 (outputs 0)

.NET 정규식 기능 중 하나에 의해 발생하는 버그를 수정해야했습니다.이 기능은 일부 (유니 코드) 문자를 “단어”문자로 간주합니다. 다행스럽게도 두 버전 모두 단일 바이트 만 필요했습니다. ECEXScript 표준을 준수하는 정규식 일치 동작을 만들기 위해 수정자를 추가해야했습니다. 그것에 대한 자세한 내용은 여기참조하십시오 .

@ MartinBüttner가 만든 새로운 28 29 바이트 버전. 감사!

^ _
$ _¶_
Mme` ^ (?! \ d) \ w + $
2
0.5

설명

먼저 입력이 밑줄로 시작하는지 확인합니다. 그렇다면 입력 사이에 개행 문자가 복제됩니다. 예를 들어 : _test_-> _test_\n_test_여기서 \n줄 바꿈입니다. 그런 다음 우리는 숫자로 시작하지 않는 것도 일치하려고 노력하지만, “단어”문자 (임의의 수의 뒤에 a-z, A-Z, 숫자 및 밑줄) 각 라인에 . 입력이 밑줄로 시작하여 두 줄로 바뀐 경우 두 줄과 모두 일치합니다. 그런 다음 2 개의 일치 항목이 있는지 확인하고로 바꿉니다 0.5. 비어 있거나 유효하지 않은 줄은 항상 0 개의 일치 항목을 생성하고 유효한 변수 이름은 항상 1 개의 일치 항목을 생성합니다.


내 자신의 30 31 바이트 버전

Ae` ^ \ d | \ W
^ _. *
0.5
^ \ D. *
1
^ $
0

설명

입력 숫자로 시작 또는 비 단어 문자 (이외의 다른 포함 된 경우 우선, 우리는 확인 a-z, A-Z, 숫자 및 밑줄). 그렇다면 유효하지 않기 때문에 버려집니다. 그런 다음 밑줄로 시작하는지 확인합니다. 그렇다면로 바뀝니다 0.5. 그것은 숫자가 아닌 문자로 시작하면 그 다음 우리는 확인 (첫 번째 문자 중 하나 인이 시점에서 0, a-z또는 A-Z. 만 a-z하고 A-Z분명, 비 자리입니다). 그렇다면,로 대체됩니다 1. 그런 다음 빈 문자열을 확인하고로 바꿉니다 0.

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


답변

MATL , 27 바이트

1)95=2/8M3Y2m+G7M95h4Y2hmA*

이 언어의 현재 버전 (15.0.0) 에서 작동 합니다.

입력은 작은 따옴표가있는 문자열입니다.

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

설명

1)      % take input implicitly. Get its first element
95=     % true if it equals 95 (underscore)
2/      % divide by 2: gives 0.5 if underscore, 0 if not
8M      % push first element of input again
3Y2     % predefined literal: string with all letters
m       % true if it's a letter
+       % add. Gives 1 if letter, 0.5 if underscore
G       % push input again
7M      % push string with all letters again
95h     % concatenate underscore
4Y2h    % predefined literal: string with all digits. Concatenate
mA      % true if all input chars belong to that concatenated string
*       % multiply. Display implicitly


답변

파이크 , 21 바이트

(비경쟁, 추가 문자열 빼기, 다양한 문자열 상수)

Qh~u{Q~J\_+-|!Qh\_qh/

설명:

Qh~u{                 - Check first char isn't a digit
     Q~J\_+-          - Is the input alphanumeric + "_"
            |!        - Combine
              Qh\_q   - Is the first char an "_"
                   h/ - Combine


답변

파이썬 3, 36 바이트

lambda s:s.isidentifier()/-~(s[:1]=='_')

코드 길이 는 40 바이트 이며 -10 % 보너스를받을 수 있습니다 있습니다.

이것은 ASCII가 아닌 문자 / 숫자가없는 코드 페이지에서만 올바르게 작동합니다.