#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 '16

7
#在任何系统,Facebook或Twitter上都不是有效的主题标签,它也违反了所设置的规则,也不确定不确定#_ABC是否对它们再次有效,但我不确定。
马丁·巴克

3
我假设an alphabet是ascii大写还是小写字母?即abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Rɪᴋᴇʀ

7
#不是主题标签。这是一个哈希。它后面跟着一个字符串,是社交媒体网络所称的主题标签。这是一个标签,以哈希开头。
i-CONICA

Answers:


19

视网膜,12字节

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

打印1主题标签等0

在线尝试!(第一行启用换行分隔的测试套件。)

在这里无需多解释,这是该定义的字面实现:^并且$只是定位符,确保匹配项覆盖整个字符串,#检查字符串以a开头#(?!\d)确保下一个字符不是数字(不进行前移) regex引擎的位置),\w*检查我们是否可以使用零个或多个字母,数字或下划线到达字符串的末尾。

默认情况下,Retina会计数给定正则表达式匹配项的数量,这就是为什么这会1提供有效的哈希标记,0否则给出的原因。


在Perl中,... (?!\d)(?=\D),但我不知道您是如何编写Retina的。是否可以(?\D)不使用而=保存一个字节?(如果没有,是否值得编辑语言以便可行?)
msh210 '16

2
@ msh210 (?!\d)的不同之处(?=\D)在于,后者在当前位置之后需要一些字符,而前者对字符串的结尾感到满意。无论如何,目前尚无法调整regex风格(因为我只是将regex交给.NET的regex引擎),但是要进行这样的更改是在路线图的某个地方(很远)。
马丁·恩德

1
就是说,我不认为我会=选择。(?...)选择整个语法是为了实现可扩展性,因为后面的字符?绝不是可选的,它决定了它是哪种组,我想我不想放弃这种可扩展性。
马丁·恩德

(是您的第一条评论)当然,我应该指出。但这与这个答案无关。(是您的第二句话)是的,很有道理。毕竟还有(?{and (??(?<(两者都是用于捕获组并用于向后查找)和(?-and (?1当然还有basic (?:。也许有些我错过了。
msh210 '16

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'

保存了2个字节,感谢Martin Ender(另外4个使用他的环视方法


Perl,18个字节

17个字节的代码+1,用于 -p

使用马丁的环顾四周,这可能要短得多!

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

您复制了Martin的作品并进行了编辑,对吗?

@MatthewRoh第二个答案是使用马丁的机制。他确实说我可以使用它,但是我不希望它成为我的主要答案,因为我自己没有提出它!我已添加它以进行比较。在这种挑战中,Retina仍然轻松击败Perl!
Dom Hastings

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 *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

Python 3,41个字节

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

这绝对是可以的。由于匹配对象是真实的,而且None是错误的,因此我认为删除bool()可以。
林恩

是的,我想过,谢谢您的澄清!
加博尔·费克特

这也为“ #fix meGábor”产生了真实的价值。顺便说一句,我看到规则也被其他人所忽略,但是我们曾经考虑将其作为片段,除非问题明确允许,否则通常不接受作为答案。
manatwork'7

谢谢,我改写了它来处理您编写的案例,并使其成为lambda函数。
加博尔·费克特(GáborFekete)

2
怎么re.compile('#(?!\d)\w*$').match样 删除f=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 '16

4

PowerShell v2 +,25个字节

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

使用Martin的正则表达式,将其包装在PowerShell的-match运算符中,再加上input $args。对于true / falsey值,这将在匹配项(真实值)上返回字符串本身,或者在不匹配项(falsey值)上返回字符串本身。这是因为当对数组应用比较运算符时,它会返回满足该运算符的所有内容。

几个示例(包装在[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*"

功能。将字符串作为输入,然后返回TrueFalse作为输出。非常简单,只需与regex匹配即可/#(?!\d)\w*/


我有理由相信,这对于输入没有用,hello#world因为您没有开始和结束字符串锚点。我不知道Mathematica,所以我不确定。
价值墨水

好吧,我可以忍受。让您的+1
价值墨水


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字节

感谢@LuisMendo删除了8个字节!

@(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”设置了错误。
Yttsi '16

@LeakyNun仍然不起作用:(再次,必须删除+0但在“ #d”上失败。尽管我在Python3上进行了测试。不确定它是否在Python2上有效
Yttsi '16

@LeakyNun只是简单的错误。
Yytsi '16

@LeakyNun引发IndexOutOfRange“#”和False“ #d”。
Yytsi '16

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

Lua 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所说的'#'难道不是真的吗?如果主题标签包含任何下划线,下划线是否为false,也会失败isalpha吗?
TheBikingViking

@TheBikingViking抱歉,我现在将尝试解决此问题
Dignissimus-Spammy

2
@TheBikingViking这不是非竞争的意思。不竞争不是提交无效作品的借口。正确的过程是删除答案,修复问题,然后取消删除。
Mego


1

Ruby,16 + 3 1(n标志)= 19 17个字节

用途0为truthy和nil作为falsy。

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

运行为ruby -ne 'p~/^#(?!\d)\w*$/'。感谢@manatwork在运行程序时修复了bash错误。


1
帮自己一个忙,始终将代码括在单引号中。否则,shell将尝试(甚至更糟的是,成功执行)所有类型的扩展。(关于当前的问题!,请参阅man bash中的事件指示符。)
manatwork 2002年

1

标准ML121个 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 '16

2
就像AlphaNumorelse!! (orelse what?

有人可能会认为o explode结尾处的威胁也很大……
Laikoni

1
SML似乎很吓人,我想我整日都无法应付:c

1

Excel VBA,54个字节

匿名VBE立即窗口函数,它从单元格获取输入[A1],检查单元格的值是否与Like模式匹配,并输出Boolean有关VBE立即窗口的信息

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


0

C#,92个字节

s=>s[0]=='#'&s.Length>1&&(s[1]<48|s[1]>57)&s.Skip(1).All(x=>char.IsLetterOrDigit(x)|x=='_');

C#lambda(Predicate),其中输入为a string,输出为a bool

在线尝试!


0

Lua,39个字节

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

比赛描述的直接副本。输出falsy nil如果不包括hashtag,输出亦真亦幻包括hashtag回,否则。

find如果使用输出两个值的列表(这是正确的)不会违反规则,则可以缩短一个字节。


我认为这不会单独匹配#
马丁·恩德

@MartinEnder,当然。不应该这样 最重要的答案都没有这样做。还要codegolf.stackexchange.com/questions/85619/hashtag-or-not/…–
Oleg V. Volkov

无论#是在Twitter主题标签或Facebook是无关紧要的这一挑战。#出于这一挑战的目的,应将其视为主题标签这一事实非常明确。虽然我没有检查所有答案,但是我检查过的所有内容接受#为主题标签,因此我不确定您要指的是哪个最佳答案。
Martin Ender

0

Clojure中,130个 135 132字节

  • +5个字节来处理字符串仅包含井号的NPE。

  • 使用-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's

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.