#Hashtag_or_not


25

Dalam tantangan kode golf ini, Anda akan memverifikasi tagar!

#What_your_code_should_do

Input adalah sebuah string. Keluarkan nilai kebenaran jika tagar yang valid, dan nilai palsu sebaliknya.

Kami mendefinisikan string sebagai Hashtag yang valid jika ...

  • Dimulai dengan hash ( #).
  • Tidak memiliki nomor tepat setelah tagar (mis. Tagar #2016USElectiontidak valid).
  • Itu tidak memiliki "karakter khusus" (yaitu karakter apa pun yang bukan alfabet, garis bawah ( _) atau angka).

Anda dapat mengasumsikan bahwa input hanya berisi karakter ASCII. (Akan tidak adil jika kita melakukan Unicode juga.)

# Aturan

Aturan main berlaku.

#Contoh

Benar:

#
#e
#_ABC 
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

Falsy:

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

10
Benarkah #hashtag yang valid?
Adám

4
Apakah #öäüvalid
chrki

7
#bukan hashtag yang valid oleh sistem apa pun, Facebook atau Twitter juga melanggar aturan yang ditetapkan juga saya tidak yakin #_ABC valid lagi pada mereka tetapi saya tidak yakin akan hal itu.
Martin Barker

3
Saya asumsikan an alphabetberarti huruf besar atau kecil ascii? yaitu abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?
R

7
# A bukan tagar. Ini hash. Itu, diikuti oleh string adalah apa yang disebut jaringan media sosial sebagai tagar. Ini adalah tag, yang dimulai dengan hash.
i-CONICA

Jawaban:


19

Retina , 12 byte

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

Cetakan 1untuk tagar dan 0lainnya.

Cobalah online! (Baris pertama memungkinkan suite tes yang dipisahkan dengan linefeed.)

Tidak banyak yang dijelaskan di sini, ini adalah implementasi definisi yang sangat literal: ^dan $hanya jangkar yang memastikan bahwa kecocokan mencakup seluruh string, #memeriksa apakah string dimulai dengan #, (?!\d)memastikan bahwa karakter selanjutnya bukan digit (tanpa memajukan posisi mesin regex), \w*periksa bahwa kita dapat mencapai ujung string dengan nol atau lebih huruf, digit atau garis bawah.

Secara default, Retina menghitung jumlah kecocokan dari regex yang diberikan, itulah sebabnya ini memberikan 1tag hash yang valid dan 0sebaliknya.


Di Perl, (?!\d)adalah (?=\D)... tapi saya tidak tahu bagaimana Anda menulis Retina. Apakah mungkin Anda dapat menggunakan (?\D)tanpa =dan menyimpan byte? (Jika tidak, apakah perlu mengedit bahasa sehingga bisa dilakukan?)
msh210

2
@ msh210 (?!\d)berbeda dari (?=\D)yang terakhir memerlukan beberapa karakter setelah posisi saat ini sementara yang pertama puas dengan akhir string. Terlepas dari itu, menyesuaikan rasa regex saat ini tidak mungkin (karena saya hanya menyerahkan regex ke mesin regex .NET), tetapi membuat perubahan seperti itu ada di peta jalan di suatu tempat (sangat jauh) di telepon.
Martin Ender

1
Yang mengatakan, saya tidak berpikir saya akan membuat =opsional. Seluruh (?...)sintaks dipilih untuk ekstensibilitas, di mana karakter setelah ?tidak pernah opsional dan menentukan jenis grup ini, dan saya tidak berpikir saya ingin menyerah pada ekstensibilitas itu.
Martin Ender

(ulang komentar pertama Anda) Duh, tentu saja, saya harus mencatat itu. Tetapi ini tidak relevan dengan jawaban ini. (kembali kedua) Ya, masuk akal. Lagipula ada juga (?{dan (??dan (?<(keduanya untuk menangkap kelompok dan untuk melihat di belakang) dan (?-dan (?1dan tentu saja dasar (?:. Dan mungkin beberapa yang saya lewatkan.
msh210

6

Perl, 22 byte

21 byte kode +1 untuk -p

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

Mencetak 1 jika hashtag yang valid, kosongkan jika tidak.

Pemakaian

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

Disimpan 2 byte, terima kasih untuk Martin Ender (dan 4 lainnya menggunakan metode lookaround- nya )


Perl, 18 byte

17 byte kode +1 untuk -p

Menggunakan lookaround Martin ini bisa jauh lebih pendek!

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

Anda menyalin satu Martin dan mengeditnya, kan?

@ MatthewRoh Jawaban kedua menggunakan mekanisme Martin ya. Dia bilang aku bisa menggunakannya, tapi aku tidak ingin itu menjadi jawaban utamaku karena aku sendiri tidak memunculkannya! Saya telah menambahkannya untuk perbandingan. Retina masih dapat mengalahkan Perl dengan mudah dalam jenis tantangan ini!
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

Fungsi f()mengambil string sebagai argumen dan memodifikasi int *bke 1 atau 0 untuk menunjukkan kebenaran / kepalsuan.

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

Jika string selalu memiliki setidaknya satu karakter (yaitu tidak pernah string kosong), byte dapat dicukur menjadi 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

Ini harus benar-benar baik-baik saja. Karena benda korek Noneapi itu benar dan palsu, saya pikir menjatuhkan benda bool()itu tidak apa-apa.
Lynn

Ya saya memikirkannya, terima kasih sudah menjelaskannya!
Gábor Fekete

Ini menghasilkan nilai kebenaran untuk "# fix me Gábor" juga. BTW, saya melihat aturan semakin diabaikan oleh orang lain, tetapi ini kami anggap sebagai cuplikan, yang biasanya tidak diterima sebagai jawaban kecuali pertanyaan secara eksplisit mengizinkannya.
manatwork

Terima kasih, saya menulis ulang untuk menangani case yang Anda tulis dan menjadikannya fungsi lambda.
Gábor Fekete

2
Bagaimana dengan re.compile('#(?!\d)\w*$').match? Bisa diterima f=, BTW.
Lynn

4

Brachylog , 55 byte

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

Ini tidak menggunakan regex.

Penjelasan

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

The #makhluk Truemembunuh saya di sini, saya harus menghitung string untuk menghindari kesalahan indeks pada input karakter tunggal.


1
+1. Bagus! Saya benar-benar lupa isalpha()metode pada jawaban py3 saya: D "#" benar, juga menghancurkan saya.
Yytsi

4

PowerShell v2 +, 25 byte

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

Menggunakan regex Martin , baru saja dibungkus dengan -matchoperator PowerShell ditambah dengan input $args. Untuk nilai-nilai truthy / falsey, ini akan mengembalikan string itu sendiri pada pertandingan (nilai kebenaran) atau tidak ada pada non-pertandingan (nilai falsey). Ini karena ketika operator perbandingan diterapkan terhadap array, ia mengembalikan apa pun yang memuaskan operator itu.

Beberapa contoh (dibungkus [bool]gips untuk membuat output lebih jelas):

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 byte

Disimpan 6 9 byte karena @MartinEnder .

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

Fungsi. Mengambil string sebagai input, dan mengembalikan Trueatau Falsesebagai output. Cukup sederhana, hanya cocok melawan regex /#(?!\d)\w*/.


Saya punya alasan untuk percaya bahwa ini tidak akan berfungsi untuk input seperti hello#worldkarena Anda tidak memiliki jangkar string awal dan akhir. Saya tidak tahu Mathematica jadi saya tidak yakin.
Value Ink

Baiklah, saya bisa hidup dengan itu. Miliki +1 Anda
Value Ink

3

Dyalog APL , 22 20 byte

Tanpa RegEx:

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

-2 Terima kasih kepada ngn


1
Oh wow. Masih ada orang yang tahu APL. Sudah 37 tahun sejak saya menggunakannya!
Auspex

@Auspex APL baik dan hidup, tetapi beberapa fitur telah ditambahkan pada tahun-tahun itu.
Adám

3

Python 2, 79 byte

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

Upaya bermain golf pertama. Versi tidak disatukan:

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

Jawaban yang bagus, dan selamat datang di situs!
DJMcMayhem

3

Oktaf, 37 56 54 43 byte

Terima kasih kepada @LuisMendo karena menghapus 8 byte!

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

Tidak terlalu golf, tetapi sangat built-inny.
Sunting: Kode asli menerima string tanpa '#' memimpin. Saya kira saya harus terjebak dengan regex.

Test suite pada 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)

Solusi yang tidak menggunakan regex. 0 adalah falsey dan setiap nilai lainnya benar.

Terima kasih kepada @LeakyNun untuk menghemat byte!


@ LeakyNun Saya harus menghapus +0setelah n[1:], tapi sayangnya, masih tidak berfungsi: / Memberi false ke "#d".
Yytsi

@ LeakyNun masih tidak bekerja :( Sekali lagi, harus menghapus +0tetapi gagal pada "#d". Saya mengujinya di Python3. Tidak yakin apakah itu akan bekerja pada Python2
Yytsi

@ LeakyNun Benar-benar salah.
Yytsi

@ LeakyNun Melempar IndexOutOfRangeuntuk "#" dan Falseuntuk "#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)untuk 128 byte. Bukti bahwa itu berhasil
Leaky Nun

2

Lua, 59 55 54 byte

Kode

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

Bagaimana itu bekerja:

  1. Periksa apakah sisa karakter dapat menjadi pengenal Lua yang tepat (pengidentifikasi di Lua mengikuti aturan yang sama dengan tagar.)
  2. Periksa apakah karakter pertama adalah a #.

Mengambil input dari baris perintah. Mencetak truejika string adalah tagar yang valid, jika tidak, akan dicetak nil.


2

Google Sheets, 30 byte

Fungsi lembar kerja anonim yang mengambil input dari sel A1mengeceknya terhadap ekspresi RE2 dan mengeluarkan hasilnya ke sel yang memanggil.

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


1

Sed 19 + 2 = 21 byte

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

Ini menyaring semua tagar non-hashtag dan output yang valid.

Jalankan sebagai sed -rn "/^#$|^#[a-z]\w*$/Ip". Berhenti dengan Ctrl+ D(kirim EOF).


1

GNU grep, 15 + 2 = 17 byte

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

Uji:

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

Keluaran:

#
#e
#_ABC
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

1

Python 3, 97 Bytes 70 Bytes 56 Bytes

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

(Kode berubah) Dapat dibaca manusia

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


Jawaban yang bagus, dan selamat datang di situs! Fungsinya juga diperbolehkan, jadi Anda bisa mempersingkat ini denganlambda x:all(True==[x[0]=="#",x[1].isalpha(),x[2:].isalpha()])
DJMcMayhem

Tidak masalah, senang saya bisa membantu!
DJMcMayhem

1
Saya benci menjadi pembawa berita buruk, tetapi bukankah ini gagal untuk '#' , yang menurut OP benar? Tidakkah itu juga gagal jika tagar berisi garis bawah, yang salah di bawah isalpha?
TheBikingViking

@TheBikingViking maaf, saya akan mencoba untuk memperbaikinya sekarang
Dignissimus - Spammy

2
@TheBikingViking Bukan itu artinya tidak bersaing. Non-bersaing bukan alasan untuk pengiriman yang tidak valid. Prosedur yang benar adalah menghapus jawabannya, memperbaikinya, lalu menghapusnya.
Mego

1

Pyke, 19 byte

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

Coba di sini!

Perbaikan cepat untuk malam ini


1
@kenorb me-reboot-nya, ping saya jika ada masalah lagi
Biru

#123mengembalikan apa-apa, tidak boleh mengembalikan 0?
kenorb

1
Tidak ada yang salah boolean
Biru

1

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

Penggunaan 0sebagai truthy dan nilsebagai falsy.

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

Jalankan sebagai ruby -ne 'p~/^#(?!\d)\w*$/'. Terima kasih kepada @manatwork untuk memperbaiki kesalahan bash saat menjalankan program.


1
Bantulah diri Anda dan selalu lampirkan kode dalam tanda kutip tunggal. Kalau tidak, shell akan berusaha (atau lebih buruk lagi, berhasil melakukan) semua jenis ekspansi. (Mengenai masalah saat ini dengan !, lihat Event Designators in man bash.)
manatwork

1

Standar ML , 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;

Cobalah online! Solusi fungsional tanpa menggunakan regex. Menyatakan fungsi anonim yang terikat dengan pengidentifikasi hasil implisit it.

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

4
isAlphaNum$orelseitu agak mengancam ...
kucing

@cat, ini mungkin satu-satunya hal positif yang dapat dikatakan tentang operator boolean verbose seperti orelsedan andalso.
Laikoni

2
Itu seperti AlphaNum, orelse!! ( orelse what?)
kucing

Orang mungkin menganggap bahwa o explodepada akhirnya juga cukup mengancam ...
Laikoni

1
SML tampaknya cukup menakutkan, saya pikir saya tidak bisa mengatasinya sepanjang hari: c
cat

1

Excel VBA, 54 byte

Fungsi jendela langsung VBE anonim yang mengambil input dari sel [A1], memeriksa apakah nilai sel cocok dengan Likepola, dan menampilkan Booleanke jendela langsung 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 langsung dari deskripsi pertandingan. Output palsu niljika tidak hashtag, output sebenarnya hashtag kembali sebaliknya.

Dapat disingkat menjadi satu byte lagi dengan menggunakan findjika menampilkan daftar dua nilai (yang sebenarnya) tidak melanggar aturan.


Saya pikir ini tidak akan cocok #dengan sendirinya.
Martin Ender

@ MartinEnder, tentu saja. Seharusnya tidak. Tidak ada jawaban teratas yang melakukannya. Juga codegolf.stackexchange.com/questions/85619/hashtag-or-not/…
Oleg V. Volkov

Apakah #tagar di Twitter atau Facebook tidak relevan dengan tantangan ini. Spesifikasinya sangat jelas pada fakta yang #harus dianggap sebagai tagar untuk keperluan tantangan ini. Dan sementara saya belum memeriksa semua jawaban, semua yang saya periksa lakukan diterima #sebagai tagar, jadi saya tidak yakin jawaban teratas yang Anda maksud.
Martin Ender

0

Clojure, 130 135 132 byte

  • +5 byte untuk menangani NPE yang terjadi ketika string hanya terdiri dari tagar.

  • -2 byte dengan menggunakan 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))))

Tidak Disatukan:

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

Aduh, ini sebenarnya memberi NPE untuk "#". Beri aku waktu sebentar.
Carcigenicate

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.