#Hashtag_or_not

25

W tym wyzwaniu golfowym zweryfikujesz hashtagi!

#What_your_code_should_do

Dane wejściowe to ciąg znaków. Podaj prawdziwą wartość, jeśli jest to poprawny hashtag, aw przeciwnym razie wartość fałsz.

Zdefiniujemy ciąg jako prawidłowy Hashtag, jeśli ...

  • Zaczyna się od hash ( #).
  • Nie ma numeru zaraz po hasztagu (np #2016USElection Nie jest poprawnym hashtagiem).
  • Nie ma żadnych „znaków specjalnych” (tj. Żadnego znaku, który nie jest alfabetem, podkreśleniem ( _) ani liczbą).

Możesz założyć, że dane wejściowe zawierają tylko znaki ASCII. (Byłoby niesprawiedliwe, gdybyśmy również zrobili Unicode).

#Rules

Obowiązują podstawowe zasady .

# Przykłady

Prawda:

#
#e
#_ABC 
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

Falsy:

Hello, World!
#12thBday
#not-valid
#alsoNotValid!
#!not_a_hash
Laikoni
źródło
10
Czy #naprawdę ważny hashtag?
Adám
4
Jest #öäüważny?
chrki
7
#nie jest poprawnym hashtagiem dla żadnego systemu, Facebooka lub Twittera, łamie również ustalone zasady, również nie jestem pewien, czy #_ABC jest na nich ponownie ważny, ale nie jestem tego pewien.
Martin Barker,
3
Zakładam, że an alphabetoznacza ascii wielkie czy małe litery? tj. abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?
Rɪᴋᴇʀ
7
# Nie jest hashtagiem. To jest skrót. To, po której następuje ciąg, określają sieci społecznościowe jako hashtag. To tag, który zaczyna się od skrótu.
i-CONICA,

Odpowiedzi:

19

Siatkówka , 12 bajtów

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

Drukuje 1na hashtagi i w 0inny sposób.

Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).

Niewiele tu wyjaśnić, to jest całkiem dosłowna realizacja definicji: ^a $to tylko kotwice zapewniające pokrywy mecz cały ciąg, #sprawdza, czy uruchamia ciąg z #, (?!\d)zapewnia, że następny znak nie jest cyfrą (bez postępu pozycja silnika wyrażenia regularnego),\w* sprawdza czy możemy dotrzeć do końca ciągu zerowego lub więcej liter, cyfr lub znaków podkreślenia.

Domyślnie Retina zlicza liczbę dopasowań podanego wyrażenia regularnego, dlatego daje to 1prawidłowe tagi skrótu i 0inne.

Martin Ender
źródło
W Perlu (?!\d)jest (?=\D)... ale nie wiem jak napisałeś Retina. Czy to możliwe, że możesz użyć (?\D)bez =i zapisać bajt? (Jeśli nie, to czy warto edytować język, aby było to wykonalne?)
msh210,
2
@ msh210 (?!\d)różni się od (?=\D)tym, że ten ostatni wymaga jakiś znak po bieżącej pozycji, podczas gdy pierwsza jest zadowolony z końca łańcucha. Niezależnie od tego, dostosowanie smaku wyrażeń regularnych nie jest obecnie możliwe (ponieważ po prostu przekazuję je wyrażeniom silnikowi wyrażeń regularnych .NET), ale wprowadzanie takich zmian znajduje się w mapie drogowej gdzieś (bardzo daleko).
Martin Ender
1
To powiedziawszy, nie sądzę, żebym wybrał =opcję opcjonalną. Cała (?...)składnia została wybrana ze względu na rozszerzalność, ponieważ znak po znaku ?nigdy nie jest opcjonalny i określa, jaki to rodzaj grupy, i nie sądzę, żebym chciał zrezygnować z tej rozszerzalności.
Martin Ender
(ponownie twój pierwszy komentarz) Duh, oczywiście, powinienem to zauważyć. Ale to nie ma znaczenia dla tej odpowiedzi. (jest twój drugi) Tak, ma sens. Jest przecież także (?{i (??i (?<(zarówno do fotografowania grup i dla lookbehind) i (?-i (?1i oczywiście podstawowym (?:. I może trochę tęskniłem.
msh210
6

Perl, 22 bajty

21 bajtów kodu +1 dla -p

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

Wyświetla 1, jeśli jest to poprawny hashtag, w przeciwnym razie pusty ciąg.

Stosowanie

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

Zaoszczędzono 2 bajty dzięki za Martina Endera (i kolejne 4 za pomocą jego metody wyszukiwania )


Perl, 18 bajtów

17 bajtów kod +1 dla -p

Korzystając z wyglądu Martina, może to być znacznie krótsze!

$_=/^#(?!\d)\w*$/
Dom Hastings
źródło
Skopiowałeś egzemplarz Martina i zredagowałeś go, prawda?
@MatthewRoh Druga odpowiedź wykorzystuje mechanizm Martina tak. Powiedział, że mogę go użyć, ale nie chciałem, żeby to była moja główna odpowiedź, ponieważ sam tego nie wymyśliłem! Dodałem go do porównania. Siatkówka wciąż bije Perla z łatwością w tego rodzaju wyzwaniach!
Dom Hastings,
6

JavaScript (ES6), 25 bajtów

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>

George Reith
źródło
5

C, 80 bajtów

Funkcja f()przyjmuje ciąg jako argument i zmienia int *bsię na 1 lub 0, aby wskazać wartość prawda / fałsz.

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

Jeśli ciąg ma zawsze co najmniej jeden znak (tzn. Nigdy nie jest pusty), bajt można zgolić dla 79 bajtów:

f(char*p,int*b){for(*b=(*p==35)&&!isdigit(p[1]);*++p;)*b&=isalnum(*p)||*p==95;}
owacoder
źródło
5

Python 3, 41 bajtów

import re
re.compile('#(?!\d)\w*$').match
Gábor Fekete
źródło
To powinno być absolutnie w porządku. Ponieważ obiekty dopasowania są prawdziwe i Nonemają falsey, myślę, że upuszczenie bool()jest w porządku.
Lynn,
Tak, pomyślałem o tym, dziękuję za wyjaśnienie!
Gábor Fekete
Generuje to również prawdziwą wartość dla „#fix me Gábor”. BTW, widzę, że reguły są również ignorowane przez innych, ale my to rozważaliśmy jako fragment kodu, który zwykle nie jest akceptowany jako odpowiedź, chyba że pytanie wyraźnie na to pozwala.
manatwork
Dzięki, przepisałem go, aby obsłużyć napisaną przez ciebie skrzynkę, i uczyniłem ją funkcją lambda.
Gábor Fekete
2
Jak o re.compile('#(?!\d)\w*$').match? Dopuszczalne jest upuszczenie f=BTW.
Lynn
4

Brachylog , 55 bajtów

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

To nie używa wyrażenia regularnego.

Wyjaśnienie

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
Fatalizować
źródło
4

Python 3, 103 93 bajty

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

#samopoczucieTrue zabiła mnie tutaj, musiałem wymienić łańcuch, aby uniknąć błędu indeksu na wejście pojedynczego znaku.

atlasolog
źródło
1
+1. Miły! Zupełnie zapomniałem isalpha()metody na mojej odpowiedzi py3: D "#" będąc prawdą, również mnie zniszczyło.
Yytsi
4

PowerShell v2 +, 25 bajtów

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

Za pomocą wyrażenia regularnego Martina , po prostu opakowane w -matchoperator PowerShell w połączeniu z danymi wejściowymi $args. W przypadku wartości true / falsey spowoduje to zwrócenie samego łańcucha w dopasowaniu (wartość true) lub brak wartości w przypadku niezgodności (wartość falsey). Jest tak, ponieważ gdy operator porównania zostanie zastosowany do tablicy, zwraca wszystko , co spełnia ten operator.

Kilka przykładów (zapakowanych w [bool]rzut, aby uzyskać wyraźniejszy wynik):

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
AdmBorkBork
źródło
3

Mathematica, 52 46 43 bajty

Zapisano 6 9 bajtów dzięki @MartinEnder .

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

Funkcjonować. Pobiera ciąg jako dane wejściowe i zwraca Truelub Falsedane wyjściowe. Całkiem proste, po prostu pasuje do wyrażenia regularnego /#(?!\d)\w*/.

LegionMammal978
źródło
Mam powody sądzić, że to nie zadziała dla danych wejściowych takich jak, hello#worldponieważ nie masz początku i końca kotwicy ciągów. Nie znam jednak Mathematiki, więc nie jestem pewien.
Wartość tuszu
Wszystko w porządku, mogę z tym żyć. Wyraź swoją +1
Value Ink
3

Dyalog APL , 22 20 bajtów

Bez RegEx:

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

-2 dzięki ngn

Adám
źródło
1
Och, wow. Nadal są ludzie, którzy znają APL. Minęło 37 lat, odkąd go użyłem!
Auspex,
@Auspex APL działa dobrze, ale w tych latach dodano niewiele funkcji.
Adám,
3

Python 2, 79 bajtów

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

Pierwsza próba golfa. Wersja bez golfa:

def f(x):
    if x == '#':
        return True
    else:
        return x[0]=='#' and x[1:].replace('_','').isalnum() and not x[1].isdigit()
Cowabunghole
źródło
Ładna odpowiedź i witamy na stronie!
DJMcMayhem
3

Oktawa, 37 56 54 43 bajty

Dzięki @LuisMendo za usunięcie 8 bajtów!

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

Niezbyt golfowy, ale bardzo zbudowany-inny.
Edycja: oryginalny kod zaakceptował ciągi bez wiodącego „#”. Chyba powinienem był trzymać się wyrażenia regularnego.

Zestaw testowy na ideone .

zlewka
źródło
3

Python3 - 156 128 bajtów

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)

Rozwiązanie, które nie używa wyrażenia regularnego. 0 to falsey, a każda inna wartość jest prawdziwa.

Dzięki @LeakyNun za oszczędność bajtów!

Yytsi
źródło
@LeakyNun Musiałem usunąć +0później n[1:], ale niestety nadal nie działało: / Dałem fałsz „#d”.
Yytsi
@LeakyNun nadal nie działa :( Znowu musiałem usunąć, +0ale kończy się niepowodzeniem na „#d”. Testowałem to jednak na Python3. Nie jestem pewien, czy zadziała na Python2
Yytsi
@LeakyNun Po prostu fałszywe.
Yytsi
@LeakyNun rzuca IndexOutOfRangedla „#” i 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)dla 128 bajtów. Dowód, że to działa
Leaky Nun
2

Lua, 59 55 54 bajtów

Kod

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

Jak to działa:

  1. Sprawdź, czy reszta znaków może być identyfikatorem Valud Lua (identyfikatory w Lua podlegają tym samym zasadom, co hashtagi).
  2. Sprawdź, czy pierwszy znak to #.

Pobiera dane z wiersza poleceń. Drukuje, truejeśli ciąg jest poprawnym hashtagiem, w przeciwnym razie drukuje nil.

xaxa
źródło
2

Arkusze Google, 30 bajtów

Anonimowa funkcja arkusza, która pobiera dane z komórki, A1sprawdza je względem wyrażenia RE2 i przekazuje wynik do komórki wywołującej.

=RegexMatch(A1,"^#([a-z_]\w*)?
Taylor Scott
źródło
1

05AB1E , 18 bajtów

Kod:

¬'#Qs¦A«¬d_sDžjKQP

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

Adnan
źródło
1

Sed 19 + 2 = 21 bajtów

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

To odfiltrowuje wszystkie nie-hashtagi i wyświetla prawidłowe hashtagi.

Uruchom jako sed -rn "/^#$|^#[a-z]\w*$/Ip". Wyjdź z Ctrl+ D(wyślij EOF).

someonewppc
źródło
1

GNU grep, 15 + 2 = 17 bajtów

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

Test:

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

Wydajność:

#
#e
#_ABC
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016
Jordania
źródło
1

Python 3, 97 bajtów 70 bajtów 56 bajtów

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

(Kod zmieniony) Czytelny dla człowieka

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

Dignissimus - Spammy
źródło
Ładna odpowiedź i witamy na stronie! Funkcje są również dozwolone, więc możesz je nieco skrócićlambda x:all(True==[x[0]=="#",x[1].isalpha(),x[2:].isalpha()])
DJMcMayhem
Nie ma problemu, cieszę się, że mogłem pomóc!
DJMcMayhem
1
Nienawidzę być zwiastunem złych wieści, ale czy to nie zawiedzie dla „#” , co według OP jest prawdą? Czy nie zawiedzie również, jeśli hashtag zawiera podkreślenia, które są fałszywe pod isalpha?
TheBikingViking
@TheBikingViking przepraszam, postaram się to teraz naprawić
Dignissimus - Spammy
2
@TheBikingViking To nie jest to, co niekonkurencyjne. Brak współzawodnictwa nie jest usprawiedliwieniem dla nieprawidłowego zgłoszenia. Prawidłowa procedura polega na usunięciu odpowiedzi, naprawieniu jej, a następnie cofnięciu jej usunięcia.
Mego
1

Pyke, 19 bajtów

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

Wypróbuj tutaj!

Szybka poprawka na dzisiejszy wieczór

niebieski
źródło
1
@kenorb uruchomił go ponownie, ping mnie, jeśli jakieś problemy
Blue
#123wciąż zwraca nic, czy nie powinno zwrócić 0?
kenorb
1
Nic nie jest boolowskim fałszem
Blue
1

Rubin, 16 + 3 1 ( nflaga) = 19 17 bajtów

Używa 0jako prawdy i nilfałszu.

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

Uruchom jako ruby -ne 'p~/^#(?!\d)\w*$/'. Dzięki @manatwork za naprawienie błędu bash podczas uruchamiania programu.

Wartość tuszu
źródło
1
Zrób sobie przysługę i zawsze dołączaj kod do pojedynczych cudzysłowów. W przeciwnym razie powłoka spróbuje (lub co gorsza, z powodzeniem wykona) wszelkiego rodzaju rozszerzenia. (Odnośnie aktualnego problemu z !, patrz Designators in Event bash.)
manatwork
1

Standard ML , 121 118 107 bajtów

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

Wypróbuj online! Funkcjonalne rozwiązanie bez użycia wyrażenia regularnego. Deklaruje anonimową funkcję, która jest powiązana z niejawnym identyfikatorem wyniku it.

> val it = fn : string -> bool    
- it "#valid_hash";
> val it = true : bool
Laikoni
źródło
4
isAlphaNum$orelseto raczej groźne ...
kot
@cat to może być jedyna pozytywna rzecz, jaką można powiedzieć o takich pełnych operatorach boolowskich, jak orelsei andalso.
Laikoni
2
To jest jak AlphaNum, orelse!! ( orelse what?)
kot
Można by uznać, że o explodekoniec też jest dość groźny ...
Laikoni
1
SML wydaje się dość przerażający, nie sądzę, żebym mógł sobie z tym poradzić przez cały dzień: c
kot
1

Excel VBA, 54 bajty

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane z komórki [A1], sprawdza, czy wartość komórki jest zgodna z Likewzorcem, i wysyła dane jak Booleando bezpośredniego okna VBE

?Not[Left(A1,2)]Like"[#]#"And[A1]Like"[#][_a-zA-z0-9]*
Taylor Scott
źródło
0

C #, 92 bajty

s=>s[0]=='#'&s.Length>1&&(s[1]<48|s[1]>57)&s.Skip(1).All(x=>char.IsLetterOrDigit(x)|x=='_');

C # lambda ( Predicate) gdzie wejście to stringa wyjście to bool.

Wypróbuj online!

aloisdg mówi Przywróć Monikę
źródło
0

Lua, 39 bajtów

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

Prosta kopia opisu meczu. Powoduje fałsznil jeśli nie hashtag, w przeciwnym razie wyprowadza hashtag.

Można skrócić o jeszcze jeden bajt, używając, findjeśli wypisywanie listy dwóch wartości (co jest prawdą) nie łamie reguł.

Oleg V. Volkov
źródło
Myślę, że to nie będzie pasowało do #samego.
Martin Ender
@MartinEnder, oczywiście. Nie powinno. Żadna z najlepszych odpowiedzi też tego nie robi. Również codegolf.stackexchange.com/questions/85619/hashtag-or-not/…
Oleg V. Volkov
To, czy #jest hashtagiem na Twitterze czy Facebooku, nie ma znaczenia dla tego wyzwania. Specyfikacja jasno określa fakt, że #do celów tego wyzwania należy uznać hashtag. I chociaż nie sprawdziłem wszystkich odpowiedzi, wszystko, co sprawdziłem , akceptuję #jako hashtag, więc nie jestem pewien, które najlepsze odpowiedzi masz na myśli.
Martin Ender
0

Clojure, 130 135 132 bajtów

  • +5 bajtów, aby poradzić sobie z NPE, które miało miejsce, gdy łańcuch składał się tylko z hasztagu.

  • -2 bajty przy użyciu 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))))

Nie golfowany:

(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))))
Carcigenicate
źródło
Ups, to faktycznie daje NPE dla „#”. Daj mi sekundę.
Carcigenicate