#Hashtag_or_not


25

В этом кодовом соревновании по гольфу вы проверите хэштеги!

#What_your_code_should_do

Ввод - это строка. Выведите истинное значение, если оно является допустимым хэштегом, и ложное значение в противном случае.

Мы определяем строку как действительный хэштег, если ...

  • Начинается с хеша ( #).
  • Он не имеет номера сразу после хэштега (например #2016USElection, не является действительным хэштегом).
  • Он не имеет каких-либо «специальных символов» (т. Е. Любых символов, которые не являются алфавитом, подчеркиванием ( _) или числом).

Вы можете предположить, что ввод содержит только символы ASCII. (Было бы несправедливо, если бы мы сделали Unicode тоже.)

#rules

Применяются основные правила .

#Примеры

Truthy:

#
#e
#_ABC 
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

Falsy:

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

10
Действительно #ли действительный хэштег?
Адам

4
Является #öäüдействительным?
чрки

7
#не является действительным хэштегом для любой системы, Facebook или Twitter, он также нарушает установленные правила, и я не уверен, что #_ABC снова действует на них, но я не уверен в этом.
Мартин Баркер

3
Я предполагаю, что an alphabetозначает ASCII прописными или строчными буквами? то есть abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?
Rɪᴋᴇʀ

7
# Не является хэштегом. Это хеш За ним следует строка, которую социальные сети называют хэштегом. Это тег, который начинается с хэша.
i-CONICA

Ответы:


19

Сетчатка , 12 байт

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

Принты 1для хэштегов и 0прочее.

Попробуйте онлайн! (Первая строка включает набор тестов, разделенных переводом строки.)

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

По умолчанию Retina подсчитывает количество совпадений данного регулярного выражения, поэтому это дает 1действительные хеш-теги и т 0. Д.


В Perl (?!\d)есть (?=\D)... но я не знаю, как ты написал Retina. Можно ли использовать (?\D)без =и сохранить байт? (Если нет, стоит ли редактировать язык так, чтобы это было выполнимо?)
msh210

2
@ msh210 (?!\d)отличается от (?=\D)того, что последний требует некоторого символа после текущей позиции, в то время как первый удовлетворяется концом строки. Вне зависимости от этого, настройка аромата регулярных выражений в настоящее время невозможна (так как я просто передаю регулярные выражения в движок регулярных выражений .NET), но внесение таких изменений находится на дорожной карте где-то (очень далеко) вниз по линии.
Мартин Эндер

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 Второй ответ использует механизм Мартина да. Он сказал, что я мог бы использовать это, но я не хотел, чтобы это было моим главным ответом, поскольку я сам не придумал это! Я добавил это для сравнения. Retina по-прежнему легко побеждает 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=, кстати.
Линн

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. Для значений truey / 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 байта

Сохранено 6 9 байт благодаря @MartinEnder .

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

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


У меня есть основания полагать, что это не сработает для входных данных, например, hello#worldпоскольку у вас нет начальных и конечных якорных строк. Я не знаю Mathematica, хотя я не уверен.
Value Ink

Хорошо, я могу жить с этим. Имейте свои +1
Value Ink

3

Дьялог АПЛ , 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 - ложь, а все остальные значения правдивы.

Спасибо @LeakyNun за сохранение байтов!


@LeakyNun Мне пришлось удалить +0после n[1:], но, к сожалению, по-прежнему не работает: / дал false "#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 Sheets, 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
Я ненавижу быть источником плохих новостей, но разве это не неудачно для «#» , который, по мнению ОП, правдив? Разве это также не потерпит неудачу, если хэштег содержит какие-либо символы подчеркивания, которые являются ложными isalpha?
TheBikingViking

@TheBikingViking извините, я постараюсь исправить это сейчас
Dignissimus - Спам

2
@TheBikingViking Это не то, что означает неконкурентоспособность. Неконкурентоспособность не является оправданием для неверного представления. Правильная процедура - удалить ответ, исправить его, а затем восстановить его.
Мего

1

Пайк, 19 байт

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

Попробуй это здесь!

Быстрое исправление на сегодня


1
@kenorb перезагрузил его, пинг меня, если возникнут какие-либо проблемы
Blue

#123по-прежнему ничего не возвращает, не должен возвращать 0?
Кенорб

1
Ничто не является логическим ложным
Blue

1

Рубин, 16 + 3 1 ( nфлаг) = 19 17 байт

Используется 0как правдивый и nilкак ложный.

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

Запустите это как ruby -ne 'p~/^#(?!\d)\w*$/'. Спасибо @manatwork за исправление ошибки bash при запуске программы.


1
Сделайте себе одолжение и всегда заключайте код в одинарные кавычки. В противном случае оболочка попытается (или, что еще хуже, успешно выполнит) все виды расширений. (Относительно текущей проблемы с !, см. Event Designators в man bash.)
manatwork

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.
Лайкони

2
Это как AlphaNum, orelse!! ( orelse what?)
кошка

Можно было бы считать, что o explodeконец тоже довольно угрожающий ...
Лайкони

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/…
Волков Олег Викторович

Будь #то хэштег в Твиттере или Фейсбуке, не имеет отношения к этой проблеме. Спецификация очень ясно #показывает тот факт, что для этой задачи следует рассматривать хэштег. И хотя я не проверил все ответы, все, что я проверил , принимают #как хэштег, так что я не уверен, на какие топовые ответы вы ссылаетесь.
Мартин Эндер

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

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

К сожалению, это на самом деле дает NPE для "#". Секунду.
Carcigenicate

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.