목표
변수 이름이 유효하고 출력 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
(공백 없음)
표준 허점이 적용됩니다.
이것은 code-golf 이므로 가장 짧은 코드가 승리합니다.
보너스 : 프로그램 / 함수 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
수정자가 없는 \w
ASCII 문자 만 선택 한다는 것입니다 . 다른 언어 / 정규 풍미에서는이 패턴이 작동하지 않습니다.
편집 : 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가 아닌 문자 / 숫자가없는 코드 페이지에서만 올바르게 작동합니다.