#Hashtag_or_not


25

Bu kod golf mücadelesinde, hashtag'leri doğrulayacaksınız!

#What_your_code_should_do

Giriş bir dizedir. Geçerli bir karma etiket ise bir truthy değeri ve aksi takdirde sahte bir değer çıktı.

Eğer bir dize geçerli bir Hashtag olarak tanımlanırsa

  • Bir karma ( #) ile başlar .
  • Hashtag'den hemen sonra bir numarası yoktur (örneğin #2016USElectiongeçerli bir karma etiket değildir).
  • Herhangi bir "özel karakter" e (yani bir alfabe, alt çizgi ( _) veya sayı olmayan herhangi bir karakter) sahip değildir .

Girişin yalnızca ASCII karakterleri içerdiğini varsayabilirsiniz. (Unicode da yaparsak haksızlık olur.)

#rules

Temel kuralları geçerlidir.

#Examples

Truthy:

#
#e
#_ABC 
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

Falsy:

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

10
#gerçekten geçerli bir hashtag?
Adám

4
#öäügeçerli?
chrki

7
#herhangi bir sistem, Facebook ya da Twitter tarafından geçerli bir etiket değildir, ayrıca #_ABC'nin yine onlar üzerinde geçerli olduğundan emin değilim, ancak bunlardan emin değilim.
Martin Barker

3
Ben varsayalım an alphabetaracı ascii büyük harf veya küçük harf? yani abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?
Rɪᴋᴇʀ

7
A # bir karma etiketi değil. Bu bir karma. Bunu, bir dize izledi, sosyal medya ağlarının bir hashtag olarak adlandırdığı şey. Bir karma ile başlayan bir etiket.
i-CONICA

Yanıtlar:


19

Retina , 12 bayt

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

1Hashtag'leri ve diğerlerini yazdırır 0.

Çevrimiçi deneyin! (İlk satır, satır besleme ayrılmış bir test takımı sağlar.)

Burada çok açıklamak, bu tanım oldukça değişmez uygulamasıdır: ^ve $sağlanması sadece çapalar olduğu maç kapakları tüm dizeyi, #çekler bir ile dizesinin başladığı #, (?!\d)sonraki karakterin olmasını sağlar değil ilerleyen olmadan bir rakam ( regex motorunun konumu), \w*dizenin sonuna sıfır veya daha fazla harf, rakam veya alt çizgi ile ulaşabileceğimizi kontrol eder.

Varsayılan olarak, Retina verilen regex'in eşleşme sayısını sayar, bu nedenle bu 1geçerli etiketler için ve diğerlerini verir 0.


Perl yılında (?!\d)ise (?=\D)... ama Retina yazdım bilmiyorum. Eğer kullanabilirsiniz mümkün mü (?\D)olmadan =ve bir bayt kaydetmek? (
Olmazsa

2
@ msh210 (?!\d)farklıdır (?=\D)ikincisi gerektirdiğini de bazı eski dizenin sonuna memnun iken mevcut konumda sonra karakter. Her şeye rağmen, regex lezzetini ayarlamak şu anda mümkün değil (çünkü regex'i .NET'in regex motoruna veriyorum), ancak bu değişiklikleri yapmak yol çizgisinde bir yere (çok uzak) gidiyor.
Martin Ender

1
Bu =isteğe bağlı yapacağımı sanmıyorum dedi . (?...)Sözdiziminin tamamı genişletilebilirlik için seçildi, bundan sonraki karakter ?hiçbir zaman isteğe bağlı değildir ve bunun ne tür bir grup olduğunu belirler ve bu genişletilebilirlikten vazgeçmek istediğimi sanmıyorum.
Martin Ender

(İlk yorumunuz) Duh, elbette, şunu not etmeliyim ki. Fakat bu cevapla alakasız. (senin ikincisin) Evet, mantıklı. Her şeyden önce var (?{ve (??ve (?<(hem grupları yakalamak hem de göz gezdirmek için) ve (?-ve (?1elbette temel (?:. Ve belki bir kısmı özledim.
msh210

6

Perl, 22 bayt

İçin 21 bayt kodu +1 -p

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

Geçerli bir karma etiket ise 1, aksi halde boş dize yazdırır.

kullanım

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

Martin Ender için 2 bayt kurtarıldı (ve arama yöntemini kullanarak başka bir 4 )


Perl, 18 bayt

İçin 17 bayt kodu +1 -p

Martin'in görünüşünü kullanmak bu çok daha kısa olabilir!

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

Martin'inki kitabını kopyalayıp düzenledin, değil mi?

@MatthewRoh İkinci cevap, Martin mekanizmasını evet kullanıyor. Kullanabileceğimi söyledi, ama başıma gelmediğim için asıl cevabım olmasını istemedim! Karşılaştırma için ekledim. Retina, bu tür zorluklarda Perl'i kolayca yener!
Dom Hastings,

6

JavaScript (ES6), 25 bayt

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 bayt

İşlev f(), dizgeyi argüman olarak alır ve int *btruthy / falsy'yi belirtmek için 1 veya 0 olarak değişir.

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

Dize her zaman en az bir karaktere sahipse (yani hiçbir zaman boş bir dize), 79 bayt için bir bayt tıraş edilebilir:

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

5

Python 3, 41 bayt

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

Bu kesinlikle iyi olmalı. Eşleşen nesneler gerçeğe yakın ve yanlış Noneolduğu için bool(), düşürmeyi tamam olduğunu düşünüyorum .
Lynn,

Evet bunu düşündüm, açıkladığın için teşekkürler!
Gábor Fekete

Bu da “#fix me Gábor” için çok değer veriyor. BTW, kuralların başkaları tarafından da göz ardı edildiğini görüyorum, ancak bu, soru açıkça izin vermediği sürece genellikle cevap olarak kabul edilmeyen bir snippet'i değerlendirirdik.
Manatwork

Teşekkürler, yazdığınız davayı ele almak için yeniden yazdım ve bir lambda işlevi yaptım.
Gábor Fekete

2
Ne dersiniz re.compile('#(?!\d)\w*$').match? f=BTW'yi düşürmek kabul edilebilir .
Lynn,

4

Brachylog , 55 bayt

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

Bu, regex kullanmaz.

açıklama

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 bayt

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

#Varlık Trueben tek karakter girişine bir dizin hatasını önlemek için dize numaralandırılamıyor vardı burada beni öldürdü.


1
+1. Güzel! isalpha()Py3 cevabımdaki yöntemi tamamen unuttum : D "#" doğru, ayrıca beni mahvetti.
Yytsi

4

PowerShell v2 +, 25 bayt

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

Martin regex'ini kullanarak , PowerShell'in -matchoperatörüne girdiyle birleşti $args. Truthy / falsey değerleri için bu, dizinin kendisini bir eşleşmede (bir truthy değerinde) veya eşleşmeyen bir şeyde (bir falsey değeri) döndürür. Bunun nedeni, bir karşılaştırma işleci bir diziye karşı uygulandığında, bu işleci karşılayan her şeyi döndürmesidir .

Birkaç örnek ( [bool]çıktıyı daha net hale getirmek için alçıya sarılmış ):

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 bayt

MartinEnder nedeniyle kaydedilmiş 6 9 bayt .

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

İşlev. Bir dizeyi girdi olarak alır ve döndürür Trueveya Falseçıktı olarak alır. Oldukça basit, sadece regex karşı eşleşir /#(?!\d)\w*/.


Bunun hello#worldbaşlangıç ​​ve bitiş dize çapalarınız olmadığı için bunun gibi girdiler için işe yaramayacağına inanmak için nedenlerim var. Mathematica'yı bilmiyorum ama emin değilim.
Value Ink,

Tamam, bununla yaşayabilirim. +1
Value

3

Dyalog APL , 22 20 bayt

RegEx olmadan:

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

-2 ngn sayesinde


1
Vayy. APL'yi tanıyan insanlar var. Kullandığımdan 37 yıl geçti!
Auspex

@Auspex APL gayet iyi ve canlı, ancak bu yıllarda çok az özellik eklenmiştir.
Adám

3

Python 2,79 bayt

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

İlk golf denemesi. Ungolfed versiyonu:

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

Güzel cevap ve siteye hoş geldiniz!
DJMcMayhem

3

Octave, 37 56 54 43 bayt

8 baytı kaldırmak için @LuisMendo'ya teşekkürler!

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

Çok golf değil, ama çok yerleşik.
Düzenleme: Orijinal kod, baştaki '#' işareti olmayan dizeleri kabul eder. Galiba regex ile sıkışmış olmalıydım.

İdeone üzerinde test paketi .


3

Python3 - 156 128 bayt

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)

Regex kullanmayan bir çözüm. 0 falsey ve diğer her değer hakikaten.

Bayt tasarrufu için @LeakyNun teşekkürler!


@LeakyNun ben kaldırmak zorunda +0SONRA n[1:], ama ne yazık ki, hala iş vermedi: "# gün" için / Gave false.
Yytsi

@LeakyNun hala iş yapmaz :( Yine kaldırmak zorunda +0ama "# gün" konulu başarısız olsa Python3 üzerinde test edilmedi emin Python2 üzerinde çalışacak eğer..
Yytsi

@ LeakyNun Sadece düz yanlış.
Yytsi,

@LeakyNun IndexOutOfRange"#" ve False"#d" için atar .
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 bayt için İşe yaradığını
ispatlayan

2

Lua, 59 55 54 bayt

kod

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

Nasıl çalışır:

  1. Karakterlerin geri kalanının geçerli bir Lua tanımlayıcısı olup olmadığını kontrol edin (Lua'daki tanımlayıcılar hashtag'lerle aynı kuralları izler.)
  2. İlk karakterin a olup olmadığını kontrol edin #.

Komut satırından girdi alır. Yazdırır truedize geçerli bir hashtag ise, aksi takdirde yazdırır nil.


2

Google Sayfaları, 30 bayt

Hücreden girdi alan adsız bir çalışma sayfası işlevi, A1onu RE2 ifadesine karşı denetler ve sonucu çağıran hücreye verir.

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


1

Sed 19 + 2 = 21 bayt

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

Bu, tüm hashtag'leri filtreler ve geçerli hashtag'leri çıkarır.

Olarak çalıştır sed -rn "/^#$|^#[a-z]\w*$/Ip". Ctrl+ Dİle çıkın (EOF gönder).


1

GNU grep, 15 + 2 = 17 bayt

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

Ölçek:

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

Çıktı:

#
#e
#_ABC
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

1

Python 3, 97 Bayt 70 Bayt 56 Bayt

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

(Kod değişti) İnsan tarafından okunabilir

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


Güzel cevap ve siteye hoş geldiniz! İşlevlere de izin verilir, bu yüzden bunu biraz daha kısaltabilirsinizlambda x:all(True==[x[0]=="#",x[1].isalpha(),x[2:].isalpha()])
DJMcMayhem

No problem, glad I could help!
DJMcMayhem

1
I hate to be the bringer of bad news, but doesn't this fail for '#', which the OP says is truthy? Won't it also fail if the hashtag contains any underscores, which are false under isalpha?
TheBikingViking

@TheBikingViking sorry, I will try to fix this now
Dignissimus - Spammy

2
@TheBikingViking That's not what non-competing means. Non-competing is not an excuse for an invalid submission. The correct procedure is to delete the answer, fix it, then undelete it.
Mego

1

Pyke, 19 bytes

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

Try it here!

Quick fix for tonight


1
@kenorb rebooted it, ping me if any more issues
Blue

#123 returns still nothing, shouldn't return 0?
kenorb

1
Nothing is a boolean false
Blue

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.