#Hashtag_or_not


25

У цьому виклику коду для гольфу ви перевірите хештеги!

#What_your_code_should_do

Введення - це рядок. Виведіть значення truthy, якщо це дійсний хештег, а фальш-значення - в іншому випадку.

Ми визначаємо рядок як дійсний хештег, якщо ...

  • Починається з хеша ( #).
  • У нього немає номера відразу після хештега (наприклад #2016USElection, недійсний хештег).
  • У ньому немає «спеціальних символів» (тобто будь-якого символу, який не є алфавітом, підкресленням ( _) або числом).

Можна припустити, що вхід містить лише символи ASCII. (Було б несправедливо, якби ми зробили і Unicode.)

# Правила

Діють основні правила .

# Приклади

Truthy:

#
#e
#_ABC 
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

Фальсі:

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

10
Це #дійсно дійсний хештег?
Adám

4
Чи #öäüдійсно?
chrki

7
#не є дійсним хештегом будь-якої системи, Facebook чи Twitter, він також порушує встановлені правила. Я не впевнений, що #_ABC знову діє на них, але я не впевнений у цьому.
Мартін Баркер

3
Я припускаю, що an alphabetозначає пропис великої чи малої літери? тобто abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?
Rɪᴋᴇʀ

7
A # - не хештег. Це хеш. З нею слідує рядок - те, що соціальні мережі називають хештегом. Це тег, який починається з хеша.
i-CONICA

Відповіді:


19

Сітківка , 12 байт

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

Друкує 1хештеги та 0інше.

Спробуйте в Інтернеті! (Перший рядок включає тестовий набір, відокремлений виведенням ліній.)

Тут не так багато пояснювати, це досить буквальна реалізація визначення: ^і $це лише якір, що гарантує, що збіг охоплює всю рядок, #перевіряє, що рядок починається з а #, (?!\d)гарантує, що наступний символ не є цифрою (без просування вперед положення двигуна регулярних виразів) \w*перевіряє, чи можемо ми досягти кінця рядка з нулем або більше літер, цифр або підкреслення.

За замовчуванням Retina підраховує кількість збігів даного регулярного виразу, тому це дає 1дійсні теги хешу та 0інше.


У Perl, (?!\d)це (?=\D)... але я не знаю, як ти написав Retina. Чи можливо ви могли використовувати (?\D)без =байта і зберегти його? (Якщо ні, чи варто редагувати мову, щоб це було можливо?)
msh210

2
@ msh210 (?!\d)відрізняється (?=\D)тим, що останній вимагає певного символу після поточної позиції, тоді як перший задоволений кінцем рядка. Незалежно від цього, коригувати смак регулярного виразів наразі неможливо (оскільки я просто передаю регекс двигуну .gege).
Мартін Ендер

1
При цьому, я не думаю, що я буду робити =необов'язковим. Весь (?...)синтаксис був обраний для розширюваності, оскільки символ після символу ?ніколи не є необов'язковим і визначає, що це за група, і я не думаю, що я хочу відмовитися від розширення.
Мартін Ендер

(Ваш перший коментар) Ду, звичайно, я повинен це зазначити. Але це відповідь не має значення. (Ваша друга) Так, має сенс. Зрештою, є (?{і (??і (?<(і для захоплення груп, і для огляду), і, (?-і, (?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'

Збережено 2 байти за Мартіна Ендера (та ще 4, використовуючи його метод пошуку )


Perl, 18 байт

17 байт код +1 для -p

Використовуючи орієнтацію Мартіна, це може бути значно коротше!

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

Ви скопіювали таку Мартіну та відредагували, правда?

@MatthewRoh У другій відповіді використовується механізм Мартіна так. Він сказав, що я можу це використати, але я не хотів, щоб це була моєю головною відповіддю, оскільки я сама не придумала цього! Я додав його для порівняння. Сітківка все ще легко перемагає 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 *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 me Gábor". До речі, я бачу, що правила також ігноруються іншими, але це ми використовували для розгляду фрагменту, який зазвичай не приймається як відповідь, якщо питання прямо не дозволяє їм.
манатура

Дякую, я переписав його для обробки випадку, який ви написали, і зробив це функцією лямбда.
Габор Фекете

2
Як щодо re.compile('#(?!\d)\w*$').match? Допустимо скинути f=, BTW.
Лінн

4

Брахілог , 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*$'

Використовуючи регекс Мартіна , щойно завернувся в -matchоператор PowerShell, поєднаний із входом $args. Для значень truthy / falsey це поверне собі рядок на відповідність (значення truthy) або нічого на не збіг (значення фальси). Це тому, що коли оператор порівняння застосовується до масиву, він повертає все, що задовольняє цього оператора.

Кілька прикладів (загорнуті в [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

Математика, 52 46 43 байт

Збережено 6 9 байт завдяки @MartinEnder .

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

Функція. Приймає рядок як вхідний, і повертає, Trueабо Falseяк вихідний. Досить простий, просто відповідає проти регулярного виразів /#(?!\d)\w*/.


У мене є підстави вважати, що це не спрацює для таких входів, hello#worldоскільки у вас немає початкових і кінцевих якорів. Я не знаю Mathematica, хоча тому я не впевнений.
Значення чорнила

Добре, я можу з цим жити. Майте свою +1
Ink Value

3

Діалог APL , 22 20 байт

Без RegEx:

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

-2 завдяки ngn


1
Ух ти. Ще є люди, які знають APL. Минуло 37 років, як я його використав!
Auspex

@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 байт

Дякуємо @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 - фальси, і будь-яке інше значення - truthy.

Дякуємо @LeakyNun за збереження байтів!


@LeakyNun Мені довелося видалити +0після n[1:], але, на жаль, все ще не вийшло: / Дав помилку на "#d".
Yytsi

@LeakyNun все ще не працює :( Знову довелося видалити, +0але не вдалося на "#d". Я протестував це на Python3. Не впевнений, чи буде він працювати на Python2
Yytsi

@LeakyNun Просто неправдиво.
Yytsi

@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 байт. Доказ того, що це працює
Leaky Nun

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

Пітон 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
Я ненавиджу бути переносником поганих новин, але чи не провадить це "#" , яке, як каже ОП, є правдою? Чи не вийде також, якщо хештег містить підкреслення, під якими є помилкові isalpha?
TheBikingViking

@TheBikingViking Вибачте, я зараз спробую це виправити
Dignissimus - Spammy

2
@TheBikingViking Це не те, що означає неконкуренція. Неконкурент - це не привід для недійсного подання. Правильна процедура - видалити відповідь, виправити її, а потім відновити її.
Мего

1

Пайк, 19 байт

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

Спробуйте тут!

Швидке виправлення на сьогоднішній день


1
@kenorb перезавантажив його, пінгуючи мене, якщо виникнуть проблеми
Blue

#123повертає все ще нічого, не повинен повернути 0?
kenorb

1
Ніщо не булева помилка
Blue

1

Ruby, 16 + 3 1 ( nпрапор) = 19 17 байт

Використовується 0як надійна, так і хибна nil.

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

Виконати це як ruby -ne 'p~/^#(?!\d)\w*$/'. Завдяки @manatwork за виправлення помилки bash під час запуску програми.


1
Зробіть собі прихильність і завжди додайте код в окремі лапки. Інакше оболонка спробує (або ще гірше, успішно виконати) всі види розширень. (Щодо поточного випуску !, див .
Дизайнери

1

Стандартний ML , 121 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 це може бути єдиним позитивним, що можна сказати про таких багатослівних булевих операторів, як orelseі andalso.
Laikoni

2
Це як AlphaNum, orelse!! ( 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

Луа, 39 байт

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

Пряма копія опису відповідності. Виходи хибніnil якщо не хештег, істинно виводить хештег інакше.

Можна скоротити ще один байт, використовуючи, findякщо виведення списку з двох значень (що є правдою) не порушує правила.


Я думаю, що це #самостійно не відповідає .
Мартін Ендер

@MartinEnder, звичайно. Це не повинно. Жоден із найкращих відповідей цього не робить. Також codegolf.stackexchange.com/questions/85619/hashtag-or-not/…
Олег Вікторович Волков

Будь #хештег у Twitter чи Facebook не має значення для цього виклику. Специфікація дуже чітка щодо того, що #слід вважати хештегом для цілей цього виклику. І хоча я не перевірив усі відповіді, все, що я перевірив , приймаю #як хештег, тому я не впевнений, на які найвищі відповіді ви звертаєтесь.
Мартін Ендер

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.