#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

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.


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*$/

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>


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

5

Python 3, 41 bajtów

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

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

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.


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

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*/.


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


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

Ł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 .


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!


@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.


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


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


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

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)


Ł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


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.


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

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]*



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ł.


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

Ups, to faktycznie daje NPE dla „#”. Daj mi sekundę.
Carcigenicate

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.