#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 orelse와 andalso.
— 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.