유효한 변수 이름입니까?


23

목표

변수 이름이 유효하고 출력 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 % 입니다.


1
진실 / 거짓 / 아무것도 출력 할 수 있습니까?
CalculatorFeline

5
파이썬에서는 점수 이하의 점수가 종종 사용됩니다. 클래스에는 init 함수 가 필요하며 클래스의 도우미 함수는 때때로 밑줄로 시작됩니다.
Rɪᴋᴇʀ

1
@EasterlyIrk는 미니 마크 다운을 조심합니다. 당신은 의미했다 __init__; 또한, 아니, 수업은하지 않습니다 필요__init__하지만, 일반적으로 한이
고양이

6
입력이 비어 있지 않다고 가정 할 수 있습니까? (현재 답변의 대부분은 빈 입력으로 실패한 것 같습니다.)
Dennis

1
그 보너스는 반올림 또는 내림합니까? 만약 그렇다면, 현재의 답변을 얻을 가치가 없습니다
Blue

답변:


13

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

@ edc65 덕분에 4 바이트 절약

@Mateon 덕분에 5.6 바이트 절약

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

3
이것이 펄이 아니라고 확신합니까?
seequ

8

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 인코딩을 사용합니다 .


6

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를 사용하는 사람들이 많이 있습니다. 그것은 퍼즐이 아닙니다. 그들은 틀렸다. (아직 공감 / 댓글을 작성할 수 없습니다.이 방법으로 알려주세요.)


프로그래밍 퍼즐 및 코드 골프 스택 교환에 오신 것을 환영합니다. 이것은 훌륭한 답변입니다. 종종 코드 골프 문제는 언어와 언어 사이에 있습니다. 이 솔루션에 +1을드립니다! 잘 했어.
wizzwizz4

1
을 사용하여 두 문자를 면도 할 수 있습니다 [a-z].../i.
Schism

@Schism 감사합니다. 내가 어떻게 잊었는지 모르겠다. 보통 나는 이런 종류의 정규식 퍼즐을
잘한다

1
편집 내용 :보다 구체적으로 설명 할 수있는 언어는 무엇입니까? 자바 스크립트 \d에서와 정확히 동일합니다 [0-9]. \wexactlly과 동일 [A-Za-z0-9_] developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/...
edc65

언어가 사용하는 코드 페이지는 관련이 없습니다. 정규식이 ASCII를 올바르게 처리하는 한 유효합니다. 현재 정규식 기반 답변은 모두 내 지식에 효과적입니다. 귀하의 언어로 변수 이름을 일치 시키려고하지 않습니다. 오히려 도전의 규칙에 따라 변수 이름을 일치 시키려고합니다.
Mego

5

망막, 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.

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


Waitwaitwait. 상기 ^\D.*단계는 0으로 시작 할 수 있습니까? 이상 하네.
CalculatorFeline

@CatsAreFluffy로 시작 _하고로 교체 한 경우 가능 0.5합니다. 그런 다음 0으로 시작합니다.
daavko

이것은 input에 1을 잘못 제공합니다 Ψ.
AdmBorkBork

@TimmyD 흥미로운. 왜 그렇게하는지 모르겠습니다. 빠른 검사는 그 표시 \w는하지 말아야 비 ASCII 문자를 일치한다 (나는 그것을 주려고 노력했습니다 ƜƝƞƟƠᎳᎴᎵᎶᎷᎸᎹ입력으로 참조). 이 부분은 나중에 살펴 보겠습니다. 가능한 해결 방법은 교체 보인다 \w와 함께 [a-zA-Z\d_].
daavko

3

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

3

파이크 , 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

파이썬 3, 36 바이트

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

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

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



2

고흐 , 29 바이트

÷"[^\W\d]\w*"g¦"_.*"g+÷2=0.5¿

다음을 사용하여 실행하십시오.

$ ./gogh no '÷"[^\W\d]\w*"g¦"_.*"g+÷2=0.5¿' "_test"

설명

                   “ Implicit input                               ”
÷                  “ Duplicate the TOS                            ”
"[^\W\d]\w*"g      “ Fully match the STOS against the TOS (regex) ”
¦                  “ Swap the STOS and TOS                        ”
"_.*"g             “ Fully match the STOS against the TOS (regex) ”
+                  “ Add the TOS to the STOS                      ”
÷                  “ Duplicate the TOS                            ”
2=                 “ Determine if the TOS is equal to 2           ”
0.5¿               “ Leave the correct output on the stack        ”
                   “ Implicit output                              ”

2

펄, 21 바이트

$_=!/\W|^\d//2**/^_/

점수에는 스위치의 +1 바이트 가 포함됩니다 -p. Ideone에서 사용해보십시오 .


말할 수 있니? -$_||$_=... 빈 대답을 설명하기 위해? ( perl에서 noop -이기 때문에 사용 +)
Ven

아니요, 런타임 오류입니다. 그러나 그것이 효과가 있어도 점수가 더 나빠질 것입니다.
Dennis

최소한의 테스트 만 했으므로 신뢰할 수 있습니다. 21 바이트의 10 %가 많지 않다는
공평

2

Pyth, 19 바이트

c!:z"\W|^\d"0h!xz\_

Pyth Compiler로 사용해보십시오 .

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

작동 원리

c!:z"\W|^\d"0h!xz\_  (implicit) Save the input in z.

  :z        0        Test if z matches the following regex:
    "\W|^\d"           A non-word character or a digit at the beginning.
                     This returns True iff z is an invalid name.
 !                   Apply logical NOT to yield True iff z is a valid name.
               xz\_  Find the first index of the underscore in z.
                     This yields 0 iff z begins with an underscore.
             h!      Apply logical NOT and increment.
                     This yields 2 if z begins with an underscore, 1 otherwise.
c                    Divide the two results.

2

계수 , 84 * 0.9 = 76.5

USE: regexp
[ R/ [_a-zA-Z]\w*/ R/ _.*/ [ matches? 1 0 ? ] bi-curry@ bi 0 = 1 2 ? / ]

리스너 (repl)에서 실행되고 문자열을 사용하여 따옴표 (익명 함수)를 정의하고 {0 | 1/2 | 1 }.

단어로 정의하면 97 자입니다.

USE: regexp
: v ( s -- n ) R/ [_a-zA-Z]\w*/ R/ _.*/ [ matches? 1 0 ? ] bi-curry@ bi 0 = 1 2 ? / ;

작동 방식 :

R/ [_a-zA-Z]\w*/ R/ _.*/두 개의 정규식을 정의합니다. 각 정규 표현식에 bi-curry@부분적으로 견적 [ matches? 1 0 ? ]을 적용 하여 스택에 두 개의 커리 된 견적을 남깁니다.bi각 인용문을 인수 문자열에 적용합니다.

각 항목 (선택한 인용문)은 일치 여부에 따라 1 또는 0을 남깁니다. 첫 번째는 잘 구성된 이름과 일치하고 두 번째는 밑줄로 시작하는 이름과 일치합니다.

0 = 1 2 ? / 마지막 값은 0 인 경우 1로, 1 인 경우 2로 바뀝니다. 그런 다음 첫 번째 (1 또는 0, 유효 또는 유효하지 않음)를 두 번째 (2 또는 1, 밑줄로 시작하거나하지 않음)로 나눕니다. .

이쪽은 루우입니다! 조금 더 축소에 대한 조언은 ...

그리고 나는 정규 표현식을 싫어한다!

추신.

{ 0 } [ "" v ] unit-test
{ 0 } [ "" v ] unit-test
{ 0 } [ "1" v ] unit-test
{ 0 } [ "1var" v ] unit-test
{ 0 } [ "var$" v ] unit-test
{ 0 } [ "foo var" v ] unit-test
{ 1 } [ "v" v ] unit-test
{ 1 } [ "var" v ] unit-test
{ 1 } [ "var_i_able" v ] unit-test
{ 1 } [ "v4r14bl3" v ] unit-test
{ 1/2 } [ "_" v ] unit-test
{ 1/2 } [ "_v" v ] unit-test
{ 1/2 } [ "_var" v ] unit-test
{ 1/2 } [ "_var_i_able" v ] unit-test
{ 1/2 } [ "_v4r14bl3" v ] unit-test

모든 시험 합격;)


그냥 궁금해, 공백이 정말로 필요한가? 언어를 모르거나 통역사가 있기 때문에 확실하게 말할 수 없습니다.
Mama Fun Roll

@MamaFunRoll 네, 최고의 골프 ​​언어는 아닙니다! Forth 전통에서는 구분 문자 만 공백 문자입니다.
페더

아, 알겠습니다 여기, 공감하십시오.
Mama Fun Roll

예이! 이제는 어디에서나 내 의견을 사로 잡을 수 있습니다!
페더

2

Dyalog APL , 19 바이트-10 % = 17.1

{(0≤⎕NC⍵)÷1+'_'=⊃⍵}

{... ... }적합한 인수에 의해 표현된다 익명 함수
⊃⍵첫 문자 (스페이스 비우면 제공)
'_'=언더 '과 동일한 경우, 1, 0, 그렇지 않으면
1+초기 언더 1 달리 경우 2 평가
⎕NC⍵ 클래스 이름 ; 유효하지 않은 이름이면 -1, 정의되지 않은 경우 0 (그러나 유효한 이름), 정의 된 경우 2-9 (따라서 유효한)


1

매스 매 티카, 93 바이트

If[#~StringMatchQ~RegularExpression@"[A-Za-z_][0-9A-Za-z_]*",If[#~StringTake~1=="_",.5,1],0]&

이것이 더 골프를 칠 있는지 확실하지 않습니다 .


1

펄, 34 + 1 = 35 바이트

$_=/^([^\W\d])\w*$//(($1 eq"_")+1)

-p플래그를 사용합니다 .

설명

$_=/^([^\W\d])\w*$//(($1 eq"_")+1)
   /^([^\W\d])\w*$/                 matches any string that starts with an underscore or a letter of the alphabet followed by 0 or more alphanumeric + underscore characters. The first character is stored in a capture group
                   /                divide result by
                    (($1 eq"_")+1)  (capture == "_") + 1. This is 1 if the first character was not an underscore and 2 if it was.
$_=                                 assign to $_ and implicitly print

[_a-zA-Z]-> [^\W\d]perl이 JavaScript와 동일하게 작동한다면, 당신도해야한다고 생각합니다\w*
Downgoat

@Downgoat 잘 작동하는 것 같습니다 \w+.
스파게티


@ Downgoat 아, 맞아. 내가 참조.
스파게티

1

파이썬, 84-10 % = 76 바이트

lambda x:[0,[[.5,1][x[0]>'z'],0][x[0]<'A']][x.replace('_','a').isalnum()]if x else 0

0

자바 스크립트 ES7, 37 바이트

x=>!x.match(/\W|^\d/)/2**/^_/.test(x)

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

작동 방식 :

x=>                                   // Fat arrow function
   !x.match(/\W|^\d/)                 // Gives false if contains non word or starting 
                                      //   with a digit. Booleans in numeric context will 
                                      //   be 0 or 1
                      2**             // 2 to the power of...
                         /^_/.test(x) // gives true if starting with '_'. 
                                      //   true -> 1 -> 2**1 -> 2
                                      //   false -> 0 -> 2**0 -> 1
                     /                // Devide the lValue boolean with the numeric rValue:
                                      // lValue = 0 or 1
                                      // rValue = 2 or 1

@Dennis의 포트 Perl 답변


0

루비, 44 바이트

->(s){s=~/^(_|\d)?\w*$/?$1?$1==?_?0.5:0:1:0}

스테이 비 람다에 대한 매개 변수에 대한 변수가 필요하지 않습니다
Charles

또한 여분의 삼항을 제거하는 방법을 알아낼 수 있다면 아마도 약간의 바이트를 절약 할 수 있습니다. 아마 /^([a-z_]).../i그 대신에/^(_|\d)?.../
Charles

@NotthatCharles D' oh ... 네 말이 맞아. 나는 기회가있을 때 자세히 살펴볼 것이다
Flambino

0

루비, 57-10 % = 51.3 바이트

->(s){case s
when'',/^\d/,/\W/
0
when/^_/
0.5
else
1
end}

아주 순진한 접근


51.3 바이트입니다. :)
Xesau

@Xesau 으악-당황. 지금 수정 :)
Flambino

3 진 체인을 사용하는 경우 엄청난 양의 바이트를 절약 할 수 있습니다.->(s){s=~/^$|^\d|\W/?0:s=~/^_/?0.5:1}
Value Ink

@KevinLau True- 이미 그 정맥 에 또 다른 루비 답변 을 추가 했습니다.
Flambino

0

루아, 82-10 % = 73.8

v=function(s)return(s:match("^[_%a]+[_%w]*$")and 1or 0)*(s:match("_")and.5or 1)end

테스트 사례 :

print(v("a") == 1) -- true
print(v("1") == 0) -- true
print(v("_") == 0.5) -- true
print(v("") == 0) -- true
print(v("1a") == 0) -- true
print(v("a1") == 1) -- true
print(v("_1") == 0.5) -- true
print(v("_a") == 0.5) -- true
print(v("1_") == 0) -- true
print(v("a_") == 0.5) -- true

STDIN을 사용하여 10 바이트 이상을 먹을 수 있다고 생각합니다.
Leaky Nun

0

루아, 68 * .9 = 61.2 바이트

s=arg[1]print(s:find("^[%a_][%w_]*$")and(s:find("^_")and.5or 1)or 0)

명령 행에서 인수를 취합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.