#Hashtag_or_not


25

Trong thử thách golf mã này, bạn sẽ xác minh hashtags!

#What_your_code_should_do

Đầu vào là một chuỗi. Xuất ra một giá trị trung thực nếu đó là một hashtag hợp lệ và mặt khác là giá trị giả.

Chúng tôi xác định một chuỗi là Hashtag hợp lệ nếu ...

  • Nó bắt đầu bằng hàm băm ( #).
  • Nó không có số ngay sau hashtag (ví dụ: #2016USElectionkhông phải là hashtag hợp lệ).
  • Nó không có bất kỳ "ký tự đặc biệt" nào (tức là bất kỳ ký tự nào không phải là bảng chữ cái, dấu gạch dưới ( _) hoặc số).

Bạn có thể giả sử rằng đầu vào chỉ chứa các ký tự ASCII. (Sẽ không công bằng nếu chúng tôi cũng làm Unicode.)

#Quy tắc

Quy tắc cơ bản được áp dụng.

# Ví dụ

Sự thật:

#
#e
#_ABC 
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

Giả mạo:

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

10
#thực sự là một hashtag hợp lệ?
Adám

4
#öäühợp lệ không?
chrki

7
#không phải là một hashtag hợp lệ bởi bất kỳ hệ thống nào, Facebook hay Twitter, nó cũng phá vỡ các quy tắc được đặt ra cũng không chắc chắn #_ABC có hiệu lực một lần nữa đối với họ nhưng tôi không chắc chắn về điều đó.
Martin Barker

3
Tôi giả sử an alphabetcó nghĩa là chữ hoa hoặc chữ thường? tức là abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?
Rɪᴋᴇʀ

7
Một # không phải là một hashtag. Đó là một hàm băm. Nó, theo sau là một chuỗi là những gì các mạng truyền thông xã hội gọi là hashtag. Đó là một thẻ, bắt đầu bằng một hàm băm.
i-CONICA 18/07/2016

Câu trả lời:


19

Võng mạc , 12 byte

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

In 1cho hashtags và 0cách khác.

Hãy thử trực tuyến! (Dòng đầu tiên cho phép bộ kiểm tra được phân tách bằng nguồn cấp.)

Không có gì nhiều để giải thích ở đây, đây là một cách thực hiện đúng theo định nghĩa: ^$chỉ là các neo đảm bảo rằng trận đấu bao trùm toàn bộ chuỗi, #kiểm tra xem chuỗi bắt đầu bằng a #, (?!\d)đảm bảo rằng ký tự tiếp theo không phải là chữ số (không tiến lên vị trí của công cụ regex), \w*kiểm tra xem chúng ta có thể đến cuối chuỗi bằng không hoặc nhiều chữ cái, chữ số hoặc dấu gạch dưới.

Theo mặc định, Retina đếm số lượng kết quả khớp của regex đã cho, đó là lý do tại sao điều này mang lại 1cho các thẻ băm hợp lệ và mặt 0khác.


Trong Perl, (?!\d)(?=\D)... nhưng tôi không biết bạn đã viết Retina như thế nào. Có thể bạn có thể sử dụng (?\D)mà không cần =và lưu một byte? (Nếu không, có đáng để chỉnh sửa ngôn ngữ để điều đó có thể thực hiện được không?)
msh210

2
@ msh210 (?!\d)khác với (?=\D)ở chỗ sau yêu cầu một số ký tự sau vị trí hiện tại trong khi vị trí cũ hài lòng với phần cuối của chuỗi. Bất kể điều đó, việc điều chỉnh hương vị regex hiện không thể thực hiện được (vì tôi chỉ giao regex cho công cụ regex của .NET), nhưng thực hiện các thay đổi như vậy nằm ở lộ trình ở đâu đó (rất xa).
Martin Ender

1
Điều đó nói rằng, tôi không nghĩ rằng tôi sẽ làm cho =tùy chọn. Toàn bộ (?...)cú pháp đã được chọn để mở rộng, trong đó ký tự sau ?không bao giờ là tùy chọn và xác định đây là loại nhóm nào và tôi không nghĩ rằng tôi muốn từ bỏ khả năng mở rộng đó.
Martin Ender

(là bình luận đầu tiên của bạn) Duh, tất nhiên, tôi nên lưu ý rằng. Nhưng nó không liên quan đến câu trả lời này. (lại là thứ hai của bạn) Vâng, có ý nghĩa. Có sau khi tất cả còn (?{(??(?<(cho cả nhóm chụp và cho lookbehind) và (?-(?1và tất nhiên là cơ bản (?:. Và có lẽ một số tôi đã bỏ lỡ.
msh210

6

Perl, 22 byte

Mã 21 byte +1 cho -p

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

In 1 nếu đó là hashtag hợp lệ, chuỗi trống khác.

Sử dụng

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

Đã lưu 2 byte nhờ Martin Ender (và 4 người khác sử dụng phương pháp nhìn của anh ta )


Perl, 18 byte

17 byte mã +1 cho -p

Sử dụng cái nhìn của Martin này có thể ngắn hơn nhiều!

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

Bạn đã sao chép một cái của Martin và chỉnh sửa nó, phải không?

@MatthewRoh Câu trả lời thứ hai sử dụng cơ chế của Martin có. Anh ấy đã nói rằng tôi có thể sử dụng nó, nhưng tôi không muốn nó là câu trả lời chính của tôi vì tôi đã không tự mình nghĩ ra nó! Tôi đã thêm nó để so sánh. Retina vẫn dễ dàng đánh bại Perl trong loại thử thách này!
Dom Hastings

6

JavaScript (ES6), 25 byte

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 byte

Hàm f()lấy chuỗi làm đối số và sửa đổi int *bthành 1 hoặc 0 để biểu thị tính trung thực / giả.

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

Nếu chuỗi luôn có ít nhất một ký tự (nghĩa là không bao giờ là chuỗi rỗng), một byte có thể bị loại bỏ trong 79 byte:

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

5

Python 3, 41 byte

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

Điều này sẽ hoàn toàn tốt. Vì các đối tượng phù hợp là trung thực và Nonelà chim ưng, tôi nghĩ rằng bỏ rơi bool()là được.
Lynn

Vâng tôi nghĩ về điều đó, cảm ơn vì đã làm rõ nó!
Gábor Fekete

Điều này cũng tạo ra giá trị trung thực cho dịch vụ #fix me Gábor '. BTW, tôi thấy các quy tắc cũng bị người khác bỏ qua, nhưng điều này chúng tôi thường xem xét một đoạn trích, thường không được chấp nhận là câu trả lời trừ khi câu hỏi cho phép rõ ràng.
manatwork

Cảm ơn, tôi đã viết lại nó để xử lý trường hợp bạn đã viết và biến nó thành một hàm lambda.
Gábor Fekete

2
Thế còn re.compile('#(?!\d)\w*$').match? Có thể chấp nhận bỏ f=, BTW.
Lynn

4

Brachylog , 55 byte

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

Điều này sử dụng không có regex.

Giải trình

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 byte

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

Các #con Truegiết tôi ở đây, tôi đã phải liệt kê chuỗi để tránh một lỗi chỉ mục trên các đầu vào nhân vật duy nhất.


1
+1. Tốt đẹp! Tôi hoàn toàn quên isalpha()phương thức trên câu trả lời py3 của mình: D "#" là đúng, cũng đã phá hủy tôi.
Yytsi

4

PowerShell v2 +, 25 byte

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

Sử dụng biểu thức chính của Martin , chỉ cần đóng gói trong -matchtoán tử của PowerShell cùng với đầu vào $args. Đối với các giá trị trung thực / falsey, điều này sẽ trả về chính chuỗi trên một kết quả khớp (một giá trị trung thực) hoặc không có gì trên một kết quả không khớp (một giá trị falsey). Điều này là do khi một toán tử so sánh được áp dụng đối với một mảng, nó sẽ trả về bất cứ thứ gì thỏa mãn toán tử đó.

Một vài ví dụ (được gói trong một [bool]dàn diễn viên để làm cho đầu ra rõ ràng hơn):

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

Toán học, 52 46 43 byte

Đã lưu 6 9 byte do @MartinEnder .

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

Chức năng. Lấy một chuỗi làm đầu vào và trả về Truehoặc Falselà đầu ra. Khá đơn giản, chỉ cần phù hợp với regex /#(?!\d)\w*/.


Tôi có lý do để tin rằng điều này sẽ không hoạt động cho các đầu vào như hello#worldvì bạn không có các chuỗi neo đầu và cuối. Tôi không biết Mathicala mặc dù vậy tôi không chắc chắn.
Mực giá trị

Được rồi, tôi có thể sống với điều đó. Có +1 của bạn
Ink Value

3

APL Dyalog , 22 20 byte

Không có RegEx:

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

-2 nhờ ngn


1
Tuyệt vời. Vẫn có những người biết APL. Đã 37 năm kể từ khi tôi sử dụng nó!
Auspex

@Auspex APL vẫn hoạt động tốt, nhưng khá ít tính năng đã được thêm vào trong những năm đó.
Adám

3

Python 2, 79 byte

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

Nỗ lực chơi gôn đầu tiên. Phiên bản bị đánh cắp:

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

Câu trả lời tốt đẹp, và chào mừng đến với trang web!
DJMcMayhem

3

Octave, 37 56 54 43 byte

Cảm ơn @LuisMendo vì đã xóa 8 byte!

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

Không phải là rất golf, nhưng rất tích hợp.
Chỉnh sửa: Mã ban đầu được chấp nhận chuỗi không có '#' hàng đầu. Tôi đoán tôi nên bị mắc kẹt với regex.

Bộ thử nghiệm trên ideone .


3

Python3 - 156 128 byte

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)

Một giải pháp không sử dụng regex. 0 là falsey và mọi giá trị khác là sự thật.

Cảm ơn @LeakyNun vì đã lưu byte!


@LeakyNun Tôi đã phải xóa phần +0sau n[1:], nhưng thật đáng buồn, vẫn không hoạt động: / Đã sai thành "#d".
Yytsi

@LeakyNun vẫn không hoạt động :( Một lần nữa, phải xóa +0nhưng không thành công trên "#d". Tôi đã thử nghiệm nó trên Python3. Không chắc là nó có hoạt động trên Python2 không
Yytsi 18/07/2016

@LeakyNun Chỉ đơn giản là sai.
Yytsi

@LeakyNun Ném IndexOutOfRangecho "#" và Falsecho "#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)cho 128 byte. Bằng chứng là nó hoạt động
Leaky Nun

2

Lua, 59 55 54 byte

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

Làm thế nào nó hoạt động:

  1. Kiểm tra xem phần còn lại của các ký tự có thể là định danh Lua valud hay không (số nhận dạng trong Lua tuân theo các quy tắc giống như hashtags.)
  2. Kiểm tra xem ký tự đầu tiên là a #.

Lấy đầu vào từ dòng lệnh. In truenếu chuỗi là một hashtag hợp lệ, nếu không, nó sẽ in nil.


2

Google Sheets, 30 byte

Một hàm bảng tính ẩn danh nhận đầu vào từ ô sẽ A1kiểm tra nó dựa vào biểu thức RE2 và đưa kết quả ra cho ô gọi.

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


1

Sed 19 + 2 = 21 byte

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

Điều này lọc ra tất cả các hashtag không và xuất ra các hashtag hợp lệ.

Chạy như sed -rn "/^#$|^#[a-z]\w*$/Ip". Thoát với Ctrl+ D(gửi EOF).


1

GNU grep, 15 + 2 = 17 byte

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

Kiểm tra:

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

Đầu ra:

#
#e
#_ABC
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

1

Python 3, 97 Byte 70 Byte 56 Byte

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

(Mã đã thay đổi) Con người có thể đọc được

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


Câu trả lời tốt đẹp, và chào mừng đến với trang web! Các chức năng cũng được cho phép, vì vậy bạn có thể rút ngắn điều này khá nhiều vớilambda x:all(True==[x[0]=="#",x[1].isalpha(),x[2:].isalpha()])
DJMcMayhem

Không có vấn đề, vui mừng tôi có thể giúp đỡ!
DJMcMayhem

1
Tôi ghét phải là người đưa tin xấu, nhưng điều này không thành công cho '#' , mà OP nói là sự thật? Sẽ không thất bại nếu hashtag chứa bất kỳ dấu gạch dưới nào, sai ở dưới isalpha?
TheBikingViking

@TheBikingViking xin lỗi, tôi sẽ cố gắng khắc phục điều này hiện nay
Dignissimus - gây ra spam

2
@TheBikingViking Đó không phải là ý nghĩa của việc không cạnh tranh. Không cạnh tranh không phải là một lý do cho một đệ trình không hợp lệ. Quy trình đúng là xóa câu trả lời, sửa nó, sau đó phục hồi nó.
Mego


1

Ruby, 16 + 3 1 ( ncờ) = 19 17 byte

Công dụng 0 như là sự thật và giả nil.

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

Chạy nó như ruby -ne 'p~/^#(?!\d)\w*$/'. Cảm ơn @manatwork đã sửa lỗi bash khi chạy chương trình.


1
Làm cho mình một ưu tiên và luôn luôn bao gồm mã trong dấu ngoặc đơn. Nếu không, shell sẽ cố gắng (hoặc thậm chí tệ hơn, thực hiện thành công) tất cả các loại mở rộng. (Liên quan đến vấn đề hiện tại với !, hãy xem Người thiết kế sự kiện trong bash man.)
manatwork

1

ML chuẩn , 121 118 107 byte

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

Hãy thử trực tuyến! Giải pháp chức năng mà không cần sử dụng regex. Khai báo một hàm ẩn danh là liên kết với định danh kết quả ngầm định it.

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

4
isAlphaNum$orelseđiều đó khá đe dọa ...
con mèo

@cat đây có thể là điều tích cực duy nhất người ta có thể nói về các toán tử boolean dài dòng như vậy orelseandalso.
Laikoni

2
Nó giống như AlphaNum, orelse!! ( orelse what?)
mèo

Người ta có thể coi o explodecuối cùng là khá đe dọa ...
Laikoni

1
SML có vẻ khá đáng sợ, tôi không nghĩ rằng mình có thể xử lý việc đó cả ngày: c
mèo

1

VBA Excel, 54 byte

Hàm cửa sổ tức thời VBE ẩn danh lấy đầu vào từ ô [A1], kiểm tra xem giá trị của ô có khớp với Likemẫu không và xuất ra như Booleancửa sổ ngay lập tức VBE

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



0

Lua, 39 byte

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

Copypasta đơn giản của mô tả trận đấu. Đầu ra giảnil nếu không hashtag, xuất ra hashtag thật sự ngược lại.

Có thể rút ngắn thêm một byte bằng cách sử dụng findnếu đầu ra danh sách hai giá trị (đó là sự thật) không phá vỡ quy tắc.


Tôi nghĩ rằng điều này sẽ không phù hợp với một #mình.
Martin Ender

@MartinEnder, tất nhiên. Nó không nên. Không có câu trả lời hàng đầu nào làm điều đó cả. Ngoài ra codegolf.stackexchange.com/questions/85619/hashtag-or-not/ mẹo
Oleg V. Volkov

Cho dù #là một hashtag trên Twitter hay Facebook đều không liên quan đến thử thách này. Thông số kỹ thuật rất rõ ràng về thực tế #nên được coi là một hashtag cho mục đích của thử thách này. Và trong khi tôi chưa kiểm tra tất cả các câu trả lời, tất cả những gì tôi đã kiểm tra đều chấp nhận #dưới dạng hashtag, vì vậy tôi không chắc câu trả lời hàng đầu nào mà bạn đề cập đến.
Martin Ender

0

Clojure, 130 135 132 byte

  • +5 byte để xử lý một NPE đã xảy ra khi chuỗi chỉ bao gồm một hashtag.

  • -2 byte bằng cách sử dụng 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))))

Ung dung:

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

Rất tiếc, điều này thực sự mang lại một NPE cho "#". Hãy cho tôi một giây.
Carcigenicate

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.