#Hashtag_or_not


25

이 코드 골프 챌린지에서 해시 태그를 확인합니다!

#What_your_code_should_do

입력은 문자열입니다. 유효한 해시 태그이면 정확한 값을, 그렇지 않으면 거짓 값을 출력합니다.

다음과 같은 경우 문자열을 유효한 해시 태그로 정의합니다.

  • 해시 ( #)로 시작합니다 .
  • 해시 태그 바로 뒤에 숫자 #2016USElection가 없습니다 (예 : 유효한 해시 태그가 아닙니다).
  • "특수 문자"(예 : 알파벳, 밑줄 ( _) 또는 숫자 가 아닌 문자)는 없습니다 .

입력에 ASCII 문자 만 포함되어 있다고 가정 할 수 있습니다. (유니 코드도했다면 불공평 할 것입니다.)

# 규칙

기본 규칙이 적용됩니다.

# 예제

진실한 :

#
#e
#_ABC 
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

거짓 :

Hello, World!
#12thBday
#not-valid
#alsoNotValid!
#!not_a_hash

10
#정말 유효한 해시 태그?
Adám

4
#öäü유효?
chrki

7
#모든 시스템, Facebook 또는 Twitter에서 유효한 해시 태그가 아니며 #_ABC가 다시 유효한지 확실하지 않지만 확실하지는 않습니다.
Martin Barker

3
나는 an alphabetASCII 대문자 또는 소문자를 의미 한다고 가정 합니까? 즉 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?
Rɪᴋᴇʀ

7
#은 해시 태그가 아닙니다. 해시입니다. 그 뒤에 문자열이 오는 것은 소셜 미디어 네트워크가 해시 태그라고하는 것입니다. 해시로 시작하는 태그입니다.
i-CONICA

답변:


19

레티 나 , 12 바이트

^#(?!\d)\w*$

1해시 태그 등을 인쇄 합니다 0.

온라인으로 사용해보십시오! 첫 번째 줄은 줄 바꿈으로 구분 된 테스트 스위트를 활성화합니다.

별로 여기에 설명하기 위해,이 정의의 매우 문자 그대로의 구현은 다음 ^$보장 단지 앵커되는 경기 커버 전체 문자열, #확인하는과 문자열의 시작 #, (?!\d)다음 문자가 보장 되지 발전이없는 자리 ( 정규식 엔진의 위치), \w*0 자 이상의 문자, 숫자 또는 밑줄로 문자열의 끝에 도달 할 수 있는지 확인합니다.

기본적으로 Retina는 주어진 정규 표현식과 일치하는 횟수를 계산하므로 1유효한 해시 태그를 제공 0합니다.


펄에서 (?!\d)입니다 (?=\D)...하지만 난 당신이 망막을 작성한 방법을 모르겠어요. (?\D)없이 사용 =하고 바이트를 저장할 수 있습니까? (그렇지 않으면 언어를 편집 할 가치가 있습니까?)
msh210

2
@ msh210 (?!\d)(?=\D)후자가 현재 위치 뒤에 약간의 문자 가 필요 하지만 전자는 문자열의 끝에 만족 한다는 점과 다릅니다 . 그럼에도 불구하고, 정규식 풍미 조정은 현재 가능하지 않습니다 (정규식을 .NET의 정규식 엔진에 넘기고 있기 때문에). 그런 변경은 라인 어딘가 (매우) 로드맵에 있습니다.
마틴 엔더

1
즉, 나는 =옵션을 만들 것이라고 생각하지 않습니다 . 전체 (?...)구문은 확장 성을 위해 선택되었습니다. 다음 문자 ?는 선택 사항이 아니며 이것이 어떤 종류의 그룹인지 결정하므로 확장 성을 포기하고 싶지는 않습니다.
마틴 엔더

(첫 번째 의견입니다) 물론입니다. 그러나이 답변과 관련이 없습니다. 예, 말이 되네요 이 모든 또한 이후 (?{(??(?<(모두 lookbehind 그룹을 캡처하고 용) 및 (?-(?1및 물론 기본 (?:. 그리고 어쩌면 내가 놓쳤을 수도 있습니다.
msh210

6

펄, 22 바이트

21 바이트 코드 +1 -p

$_=/^#([a-z_]\w*)?$/i

유효한 해시 태그 인 경우 1을 인쇄하고 그렇지 않으면 빈 문자열을 인쇄합니다.

용법

perl -pe '$_=/^#([a-z_]\w*)?$/i' <<< '#'
1
perl -pe '$_=/^#([a-z_]\w*)?$/i' <<< '#_test'
1
perl -pe '$_=/^#([a-z_]\w*)?$/i' <<< '#1test'

저장 (2) 감사 바이트 마틴 청산 (자신의 사용 및 다른 4 lookaround 방법 )


펄, 18 바이트

17 바이트 코드 +1 -p

Martin의 둘러보기를 사용하면 훨씬 짧을 수 있습니다!

$_=/^#(?!\d)\w*$/

마틴의 것을 복사해서 편집 했죠?

@MatthewRoh 두 번째 답변은 Martin의 메커니즘을 사용합니다. 그는 내가 그것을 사용할 수 있다고 말했지만, 나는 그것을 직접 내놓지 않았기 때문에 그것이 내 주요 대답이되기를 원하지 않았습니다! 비교를 위해 추가했습니다. 이러한 유형의 도전에서 Retina는 여전히 Perl을 쉽게 이깁니다!
Dom Hastings

6

자바 스크립트 (ES6), 25 바이트

s=>/^#(?!\d)\w*$/.test(s)

F = s => /^#(?!\d)\w*$/.test(s)
input.oninput = () => result.innerHTML = input.value ? F(input.value) ? '\ud83d\udc8e' : '\ud83d\udca9' : '\ud83d\udcad';
#input, #result {
  vertical-align: middle;
  display: inline-block;
}
#input {
  line-height: 2em;
}
#result {
    font-size: 2em;
}
<input id="input" type="text"/> <span id="result">&#x1f4ad</span>


5

C, 80 바이트

함수 f()는 문자열을 인수로 사용하고 int *b진실 / 거짓을 나타 내기 위해 1 또는 0으로 수정 합니다.

f(char*p,int*b){for(*b=(*p==35)&&!isdigit(p[1]);*p;++p)*b&=isalnum(*p)||*p==95;}

문자열에 항상 하나 이상의 문자가 있으면 (즉, 빈 문자열이 아님) 바이트는 79 바이트 동안 제거 될 수 있습니다.

f(char*p,int*b){for(*b=(*p==35)&&!isdigit(p[1]);*++p;)*b&=isalnum(*p)||*p==95;}

5

파이썬 3, 41 바이트

import re
re.compile('#(?!\d)\w*$').match

이것은 절대적으로 괜찮습니다. 일치하는 객체는 진실하고 거짓이기 때문에 None삭제하는 bool()것이 좋습니다.
Lynn

그래, 나는 그것에 대해 생각했다, 그것을 명확히 해 주셔서 감사합니다!
Gábor Fekete

이것은 "#fix me Gábor"에 대한 진실한 가치를 생성합니다. BTW, 나는 다른 사람들도 규칙을 무시한다고 생각하지만, 우리는 스 니펫을 고려하는 데 사용했습니다.
manatwork

고마워, 나는 당신이 쓴 사건을 처리하고 그것을 람다 함수로 만들었습니다.
Gábor Fekete

2
어때요 re.compile('#(?!\d)\w*$').match? f=BTW 를 삭제 해도됩니다.
Lynn

4

Brachylog , 55 바이트

"#"|h"#",?b@lL'(eE,@A:"1234567890":"_"c'eE),@A:"_"ce~hL

이것은 정규식을 사용하지 않습니다.

설명

Main predicate, Input (?) is a string

  "#"                           ? = "#"
|                             Or
  h"#",                         First character of ? is "#"
  ?b@lL                         L is the rest of the chars of ? lowercased
  '(                            It is not possible for any char of L that...
    eE,                           Call this char E
    @A:"1234567890":"_"c          Concatenate the lowercase alphabet with the digits and "_"
    'eE                           E is not a member of that concatenated string
   ),                           
   @A:"_"c                      Concatenate the lowercase alphabet with "_"
   e~hL                         One char of that concatenated string is the first char of L

4

파이썬 3, 103 93 바이트

all((c=='_'or c.isalpha()*i>0)^(i<1and'#'==c)^(c.isdigit()*i>1)for i,c in enumerate(input()))

#존재는 True내가 단일 문자 입력에 인덱스 오류를 방지하기 위해 문자열을 열거했다, 여기에 나를 죽였다.


1
+1. 좋은! 나는 isalpha()내 py3 answer : D "#"에 대한 방법을 완전히 잊어 버렸습니다 .
Yytsi

4

PowerShell v2 +, 25 바이트

$args-match'^#(?!\d)\w*$'

Martin의 정규식을 사용 -match하여 입력과 결합 된 PowerShell 연산자로 마무리했습니다 $args. 진실 / 거짓 값의 경우 문자열 자체를 일치 (진실한 값) 또는 일치하지 않는 항목 (거짓 값)으로 반환합니다. 비교 연산자를 배열에 적용 하면 해당 연산자를 만족하는 모든 항목반환 되기 때문 입니다.

몇 가지 예 ( [bool]출력을보다 명확하게하기 위해 캐스트로 래핑 ) :

PS C:\Tools\Scripts\golfing> [bool](.\hashtag-or-not.ps1 '#2016Election')
False

PS C:\Tools\Scripts\golfing> [bool](.\hashtag-or-not.ps1 'Hello, World!')
False

PS C:\Tools\Scripts\golfing> [bool](.\hashtag-or-not.ps1 '#')
True

PS C:\Tools\Scripts\golfing> [bool](.\hashtag-or-not.ps1 '')
False

PS C:\Tools\Scripts\golfing> [bool](.\hashtag-or-not.ps1 '#USElection2016')
True

3

매스 매 티카, 52 46 43 바이트

@MartinEnder 로 인해 6 9 바이트를 저장 했습니다 .

StringMatchQ@RegularExpression@"#(?!\d)\w*"

기능. 문자열을 입력으로 사용하고 반환 True하거나 False출력으로 가져 옵니다 . 아주 간단하고 정규 표현식과 일치합니다 /#(?!\d)\w*/.


hello#world시작 및 끝 문자열 앵커가 없기 때문에 입력에 대해 작동하지 않을 것이라고 믿을만한 이유가 있습니다. 나는 Mathematica를 모른다. 그래서 나는 확실하지 않다.
밸류 잉크

좋아, 난 그걸로 살 수있어 +1
가치 잉크를 가지십시오

3

Dyalog APL , 22 20 바이트

정규식없이 :

{0≤⎕NC 1↓⍵,⎕A}∧'#'=⊃

ngn 덕분에 -2


1
오 와우. APL을 아는 사람들이 여전히 있습니다. 사용한 지 37 년이 지났습니다.
Auspex

@Auspex APL은 훌륭하고 살아 있지만 몇 년 동안 추가 된 기능은 거의 없습니다.
Adám

3

파이썬 2, 79 바이트

lambda x:x=='#'or(1>x[1].isdigit())&x[1:].replace('_','').isalnum()&('#'==x[0])

첫 골프 시도. 언 골프 버전 :

def f(x):
    if x == '#':
        return True
    else:
        return x[0]=='#' and x[1:].replace('_','').isalnum() and not x[1].isdigit()

좋은 답변, 사이트에 오신 것을 환영합니다!
DJMcMayhem

3

옥타브, 37 56 54 43 바이트

8 바이트를 제거해 주신 @LuisMendo에게 감사합니다!

@(s)s(1)==35&(isvarname(s(2:end))|nnz(s)<2)

골프는 아니지만 매우 내장되어 있습니다.
편집 : 원래 코드는 선행 '#'이없는 문자열을 허용했습니다. 정규식을 고수해야했을 것 같습니다.

ideone의 테스트 스위트 .


3

Python3 - 156 128 바이트

lambda n:n=="#"or(n[0]=="#")*all(any([47<ord(c)<58,64<ord(c)<91,ord(c)==95,96<ord(c)<123])for c in n[1:]+"0")*~(47<ord(n[1])<58)

정규식을 사용하지 않는 솔루션. 0은 거짓이며 다른 모든 값은 진실입니다.

바이트를 절약 해 준 @LeakyNun에게 감사합니다!


@LeakyNun 나는 +0after 를 제거해야 n[1:]했지만 슬프게도 여전히 작동하지 않았습니다 : / "#d"에 거짓을주었습니다.
Yytsi

@LeakyNun은 여전히 ​​작동하지 않습니다 :( 다시 제거해야 +0하지만 "#d"에서 실패합니다. Python3에서 테스트했습니다. Python2에서 작동하는지 확실하지 않습니다.
Yytsi

@LeakyNun 그냥 거짓입니다.
Yytsi

@LeakyNun IndexOutOfRange"#"과 False"#d"를 던집니다 .
Yytsi

lambda n:n=="#"or(n[0]=="#")*all(any([47<ord(c)<58,64<ord(c)<91,ord(c)==95,96<ord(c)<123])for c in n[1:]+"0")*~(47<ord(n[1])<58)128 바이트 작동한다는 증거
Leaky Nun

2

루아, 59 55 54 바이트

암호

s=arg[1]print(load(s:sub(2).."=0")and s:sub(1,1)=="#")

작동 방식 :

  1. 나머지 문자가 평가 된 Lua 식별자 일 수 있는지 확인하십시오 (Lua의 식별자는 해시 태그와 동일한 규칙을 따릅니다).
  2. 첫 번째 문자가입니다 #.

명령 행에서 입력을받습니다. 인쇄 true문자열이 유효한 해시 태그 인 경우, 그렇지 않으면 인쇄 nil.


2

Google 스프레드 시트, 30 바이트

셀에서 입력을받는 익명의 워크 시트 함수 A1는 RE2 표현식과 비교하여이를 확인하고 결과를 호출 셀에 출력합니다.

=RegexMatch(A1,"^#([a-z_]\w*)?


1

Sed 19 + 2 = 21 바이트

/^#([a-z_]\w*)?$/Ip

이것은 모든 비-해시 태그를 걸러 내고 유효한 해시 태그를 출력합니다.

로 실행하십시오 sed -rn "/^#$|^#[a-z]\w*$/Ip". Ctrl+로 종료하십시오 D(EOF 전송).


1

GNU grep, 15 + 2 = 17 바이트

grep -Ei '^#([a-z_]\w*)?$'

테스트:

$ echo '#
#e
#_ABC
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016
Hello, World!
#12thBday
#not-valid
#alsoNotValid!' | grep -Ei '^#([a-z_][a-z0-9_]*)?$'

산출:

#
#e
#_ABC
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

1

파이썬 3, 97 바이트 70 바이트 56 바이트

lambda x:s=x[2:];b=x[1];all(x!="#",[x[0]=="#",any[b.isalpha(),"_"in b],any[s.isalnum(),"_"in s]])

(코드 변경) 사람이 읽을 수 있음

x=input()
if x[0]=="#" and x[1].isalpha() and str(x)[2:].isalnum():
    print(True)
else:
    print(False)


좋은 답변, 사이트에 오신 것을 환영합니다! 기능도 허용되므로 다음을 사용하여이 부분을 상당히 줄일 수 있습니다.lambda x:all(True==[x[0]=="#",x[1].isalpha(),x[2:].isalpha()])
DJMcMayhem

문제 없습니다, 기꺼이 도와 드리겠습니다!
DJMcMayhem

1
나는 나쁜 소식을 가져 오는 것을 싫어하지만 OP가 진실이라고 말하는 '#'에 실패 하지는 않습니까? 해시 태그에 밑줄이 포함되어 있으면 실패하지 isalpha않습니까?
TheBikingViking

@TheBikingViking 죄송합니다, 지금 고치려고 노력하겠습니다
Dignissimus-Spammy

2
@TheBikingViking 그것은 경쟁이 아닌 의미가 아닙니다. 경쟁이 아닌 것은 잘못된 제출에 대한 변명이 아닙니다. 올바른 절차는 답변을 삭제하고 수정 한 다음 삭제를 취소하는 것입니다.
Mego

1

파이크, 19 바이트

\#.^It,!It\_D-PRkq|

여기 사용해보십시오!

오늘 밤 빠른 수정


1
@kenorb가 재부팅하여 더 이상 문제가 있으면 핑 (Pink)합니다
Blue

#123여전히 아무것도 반환하지 않고 0을 반환해서는 안됩니까?
kenorb

1
부울 거짓은 없습니다
Blue

1

루비, 16 + 3 1 ( n플래그) = 19 17 바이트

0진실하고 허위로 사용합니다 nil.

p~/^#(?!\d)\w*$/

로 실행하십시오 ruby -ne 'p~/^#(?!\d)\w*$/'. 프로그램을 실행할 때 bash 오류를 수정 한 @manatwork 덕분에.


1
호의를 베풀고 항상 작은 따옴표로 코드를 묶습니다. 그렇지 않으면 쉘은 모든 종류의 확장을 시도합니다 (또는 더 나쁘게도 성공적으로 수행합니다). 의 현재 문제와 관련하여 man bash의 Event Designators!참조하십시오 .
manatwork

1

표준 ML , 121 (118) 107 바이트

(fn#"#"::a=>(fn x::r=>x> #"@"andalso List.all(fn#"_"=>1=1|c=>Char.isAlphaNum c)a|e=>1=1)a|e=>1=0)o explode;

온라인으로 사용해보십시오! 정규식을 사용하지 않는 기능 솔루션. 암시 적 결과 식별자에 연결되는 익명 함수를 선언합니다 it.

> val it = fn : string -> bool    
- it "#valid_hash";
> val it = true : bool

4
isAlphaNum$orelse그것은 오히려 위협입니다 ...
cat

이 같은 자세한 부울 사업자에 대해 말할 수있는 유일한 긍정적 인 일이 하나가 될 수 @cat orelseandalso.
Laikoni

2
그것은처럼, AlphaNum, orelse! ( orelse what?)
고양이

o explode마지막에 너무 위협하는 것으로 간주 할 수도 있습니다 ...
Laikoni

1
SML은 꽤 무섭다, 나는 하루 종일 그것을 다룰 수 있다고 생각하지 않는다 : c
cat

1

Excel VBA, 54 바이트

cell [A1]에서 입력을 가져 와서 셀 값이 Like패턴 과 일치하는지 확인 Boolean하고 VBE 즉시 창에 대해 출력 하는 익명 VBE 즉시 창 함수

?Not[Left(A1,2)]Like"[#]#"And[A1]Like"[#][_a-zA-z0-9]*



0

루아, 39 바이트

print(arg[1]:match("^#[%a_][%a_%d]*$"))

경기 설명의 간단한 사본. nil해시 태그가 아닌 경우 거짓을 출력하고 , 그렇지 않으면 사실 해시 태그를 다시 출력합니다.

find두 값의 목록을 출력 할 때 (실제로) 규칙을 위반하지 않는 경우 사용하여 1 바이트를 더 단축 할 수 있습니다 .


나는 이것이 일치하지 않을 것 같아 # 자체적으로 .
마틴 엔더

물론 @MartinEnder. 해서는 안됩니다. 최고 답변 중 어느 것도 그렇게하지 않습니다. 또한 codegolf.stackexchange.com/questions/85619/hashtag-or-not/…
Oleg V. Volkov

#트위터 나 페이스 북의 해시 태그가이 과제와 관련이 없는지 여부 . 사양은 #이 과제의 목적을 위해 해시 태그로 간주되어야 한다는 사실에 대해 매우 명확합니다 . 나는 모든 답변을 확인하지 않은 반면, 모든 나는 확인했다 않습니다 동의 #나는 당신이 참조하고 위에있는 답변하지 않다, 그래서 해시 태그로.
마틴 엔더

0

Clojure에서, 130 (135) 132 바이트

  • 문자열이 해시 태그만으로 구성 될 때 발생하는 NPE를 처리하기 위해 +5 바이트.

  • 사용 바이트 -2 Character/isLetterOrDigit.

(fn[s](let[[h & r]s n(map int r)](and(= h\#)(not(<= 48(or(first n)0)57))(every? #(or(Character/isLetterOrDigit^long %)(= 95 %))n))))

언 골프 드 :

(defn hashtag? [s]
  (let [[h & r] s
        codes (map int r)]
    (and (= h \#)
         (not (<= 48 (or (first codes) 0) 57))
         (every?
           #(or (Character/isLetterOrDigit ^long %)
                (= 95 %))
           codes))))

이건 실제로 "#"에 NPE를 제공합니다. 잠시만 기다려 줘.
Carcigenicate

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