#Hashtag_or_not


25

このコードゴルフチャレンジでは、ハッシュタグを検証します!

#What_your_code_should_do

入力は文字列です。有効なハッシュタグであれば真の値を出力し、そうでなければ偽の値を出力します。

次の場合、文字列を有効なハッシュタグとして定義します...

  • ハッシュ(#)で始まります。
  • ハッシュタグの直後に番号がありません(たとえば#2016USElection、有効なハッシュタグではありません)。
  • 「特殊文字」(つまり、アルファベット、アンダースコア(_)、または数字以外の文字)はありません。

入力にはASCII文字のみが含まれると想定できます。(Unicodeを使用した場合も不公平になります。)

#ルール

基本的な規則が適用されます。

#例

真実:

#
#e
#_ABC 
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

偽物:

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

10
#、本当に有効なハッシュタグ?
アダム

4
ある#öäü有効?
chrki

7
#どのシステム、Facebook、Twitterでも有効なハッシュタグではありません。また、#_ ABCがそれらに対して再び有効であるかどうかはわかりませんが、確実ではありません。
マーティンバーカー

3
an alphabetはASCIIの大文字または小文字を意味すると思いますか?すなわちabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Rɪᴋᴇʀ

7
#はハッシュタグではありません。それはハッシュです。それに続く文字列は、ソーシャルメディアネットワークがハッシュタグと呼ぶものです。これはハッシュで始まるタグです。
i-CONICA 16

回答:


19

網膜、12バイト

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

1ハッシュタグなどを印刷し0ます。

オンラインでお試しください!(最初の行は、改行で区切られたテストスイートを有効にします。)

これは定義のかなり文字通りの実装である、ここで説明するのはあまりない:^$ちょうどアンカーはマッチが文字列全体、カバーすることを保証している#文字列で始まることを確認し#(?!\d)次の文字がことを保証しないが進めずに数字を(正規表現エンジンの位置)、\w*0個以上の文字、数字、またはアンダースコアで文字列の末尾に到達できることを確認します。

デフォルトでは、Retinaは指定された正規表現の一致数をカウントします。これが1有効なハッシュタグなどを提供する理由です0


Perlでは、(?!\d)ある(?=\D)...しかし、私はあなたが網膜を書いたのか分かりません。(?\D)なしで使用し=てバイトを保存することは可能ですか?(そうでない場合、それを実行できるように言語を編集する価値はありますか?)
msh210

2
@ msh210は(?!\d)異なり、(?=\D)後者は必要なことでいくつか前者は文字列の最後に満足している間に、現在位置の後の文字を。それにもかかわらず、現在、正規表現のフレーバーを調整することはできません(私は正規表現を.NETの正規表現エンジンに渡しているだけです)が、そのような変更はロードマップのどこか(非常に遠く)にあります。
マーティンエンダー

1
そうは言っても、私は=オプションを作るとは思わない。(?...)構文全体が拡張性のために選択されました。その後の文字?は決してオプションではなく、これがどの種類のグループであるかを決定し、その拡張性を放棄したいとは思わないからです。
マーティンエンダー

(あなたの最初のコメントについて)当たり前、もちろん、私はそれを指摘すべきでした。しかし、この答えとは無関係です。(2番目の)ええ、理にかなっています。やっぱり(?{and (??(?<(グループのキャプチャと後読みの両方)と(?-and (?1そしてもちろん基本的ながあり(?:ます。そして多分私は逃した。
msh210

6

Perl、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'

Martin Enderのおかげで2バイト節約しました(そして彼のlookaroundメソッドを使用してさらに4 バイト)


Perl、18バイト

17バイトのコード+1 -p

Martinのlookaroundを使用すると、これをはるかに短くすることができます!

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

マーティンのものをコピーして編集しましたよね?

@MatthewRoh 2番目の答えは、マーティンのメカニズムを使用しています。彼は私がそれを使用できると言っていましたが、私はそれを自分で思い付かなかったので、それを私の主な答えにしたくありませんでした!比較のために追加しました。この種のチャレンジでは、Retinaは依然としてPerlを簡単に破ります!
ドムヘイスティングス

6

JavaScript(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 *b1または0に変更して、真偽を示します。

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

文字列に常に少なくとも1つの文字が含まれる場合(つまり、空の文字列にならない場合)、1バイトを79バイト分削ることができます。

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

5

Python 3、41バイト

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

これは絶対に問題ないはずです。一致オブジェクトは真実であり、偽でNoneあるため、ドロップすることbool()は問題ないと思います。
リン

うん、私はそれについて考えました、それを明確にしてくれてありがとう!
ガボールフェケテ

これにより、「#fix meGábor」の真の値も生成されます。ところで、他の人にもルールが無視されるようになりましたが、これはスニペットを検討するために使用されていました。
マナトワーク

おかげで、あなたが書いたケースを処理するために書き直し、ラムダ関数にしました。
ガボールフェケテ

2
どうre.compile('#(?!\d)\w*$').matchf=BTW をドロップしてもかまいません。
リン

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

Python 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回答のメソッドを完全に忘れました: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

Mathematica、52 46 43バイト

@MartinEnderにより6 9バイトを保存しました

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

関数。入力として文字列を取得し、出力TrueまたはFalse出力として返します。非常に単純で、正規表現に一致するだけ/#(?!\d)\w*/です。


hello#world開始文字列と終了文字列のアンカーがないため、これは入力に対しては機能しないと信じる理由があります。私はMathematicaを知らないのでわかりません。
バリューインク

申し分なく、私はそれで生きることができます。あなたの+1を持っている
バリューインク

3

Dyalog APL22 20バイト

正規表現なし:

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

-2 ngnに感謝


1
ああすごい。APLを知っている人はまだいます。私が使ってから37年です!
オースペックス

@Auspex APLは正常に機能しますが、これらの年に追加された機能はほとんどありません。
アダム

3

Python 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私は削除する必要がありました+0後にn[1:]、残念ながら、まだ仕事しませんでした:/は「#D」に偽を与えました。
Yytsi

@LeakyNunはまだ動作しません:(ここでも、削除する必要がありました+0が、「#D」に失敗した私ものpython3でそれをテストしていないことを確認、それはPython2上で動作する場合。。
Yytsi

@LeakyNunただの偽。
イッツィー

@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バイトの場合。動作することの証明
リーキー修道女

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

Python 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 -スパム行為の

2
@TheBikingVikingそれは非競合の意味ではありません。非競合は、無効な提出の言い訳ではありません。正しい手順は、回答を削除して修正し、削除を取り消すことです。
メゴ


1

Ruby, 16 + 3 1 (n flag) = 19 17 bytes

Uses 0 as truthy and nil as falsy.

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

Run it as ruby -ne 'p~/^#(?!\d)\w*$/'. Thanks to @manatwork for fixing the bash error when running the program.


1
Do yourself a favor and always enclose code in single quotes. Otherwise the shell will attempt (or even worse, successfully perform) all kind of expansions. (Regarding the current issue with !, see Event Designators in man bash.)
manatwork

1

Standard ML, 121 118 107 bytes

(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;

Try it online! Functional solution without using regex. Declares an anonymous function which is bond to the implicit result identifier it.

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

4
isAlphaNum$orelse that's rather threatening...
cat

@cat this might be the sole positive thing one can say about such verbose boolean operators as orelse and andalso.
Laikoni

2
It's like, AlphaNum, orelse!! (orelse what?)
cat

One might consider the o explode at the end to be quite threatening too ...
Laikoni

1
SML seems quite scary, I don't think I could handle that all day :c
cat

1

Excel VBA, 54 bytes

Anonymous VBE immediate window function that takes input from cell [A1], checks if the value of the cell matches the Like pattern, and outputs as Boolean to the VBE immediate window

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



0

Lua, 39 bytes

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

Straightforward copypasta of match description. Outputs falsy nil if not hashtag, outputs truthly hashtag back otherwise.

Can be shortened for one more byte by using find if outputing list of two values (which is truthly) doesn't break rules.


I think this won't match a # on its own.
Martin Ender

@MartinEnder, of course. It shouldn't. None of the top answers do that either. Also codegolf.stackexchange.com/questions/85619/hashtag-or-not/…
Oleg V. Volkov

Whether # is a hashtag on Twitter or Facebook is irrelevant to this challenge. The specification is very clear on the fact that # should be considered a hashtag for the purposes of this challenge. And while I haven't checked all of the answers, all I did check do accept # as a hashtag, so I'm not sure which top answers you're referring to.
Martin Ender

0

Clojure, 130 135 132 bytes

  • +5 bytes to deal with an NPE that happened when the string consisted of only a hashtag.

  • -2 bytes by using 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))))

Ungolfed:

(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))))

Whoops, this actually gives a NPE for "#". Give me a sec.
Carcigenicate

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.