#Hashtag_or_not

25

In dieser Code Golf Challenge verifizierst du Hashtags!

#Was_Ihr_Code_Sollt_tun

Die Eingabe ist eine Zeichenfolge. Geben Sie einen Wahrheitswert aus, wenn es sich um ein gültiges Hashtag handelt, und einen falschen Wert, wenn es sich nicht um ein gültiges Hashtag handelt.

Wir definieren einen String als gültigen Hashtag, wenn ...

  • Es beginnt mit einem Hash ( #).
  • Es gibt keine Nummer direkt nach dem Hashtag (z. B. #2016USElectionkein gültiges Hashtag).
  • Es enthält keine "Sonderzeichen" (dh keine Buchstaben, Unterstriche ( _) oder Zahlen).

Sie können davon ausgehen, dass die Eingabe nur ASCII-Zeichen enthält. (Es wäre unfair, wenn wir auch Unicode machen würden.)

#Regeln

Grundlegende Regeln gelten.

#Beispiele

Wahrheit:

#
#e
#_ABC 
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

Falsch:

Hello, World!
#12thBday
#not-valid
#alsoNotValid!
#!not_a_hash
Laikoni
quelle
10
Ist das #wirklich ein gültiger Hashtag?
Adám
4
Ist #öäügültig?
Chrki
7
#ist kein gültiger Hashtag von irgendeinem System, Facebook oder Twitter. Es verstößt auch gegen die festgelegten Regeln.
Martin Barker
3
Ich nehme an, an alphabetbedeutet Ascii Groß- oder Kleinbuchstaben? dh abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?
18.
7
Ein # ist kein Hashtag. Es ist ein Haschisch. Darauf folgt ein String, den Social Media-Netzwerke als Hashtag bezeichnen. Es ist ein Tag, der mit einem Hash beginnt.
i-CONICA

Antworten:

19

Retina , 12 Bytes

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

Druckt 1für Hashtags und 0andere Zwecke .

Probieren Sie es online! (Die erste Zeile aktiviert eine durch Zeilenvorschub getrennte Testsuite.)

Es gibt hier nicht viel zu erklären, dies ist eine wörtliche Umsetzung der Definition: ^und$ sind nur Anker sicherzustellen , dass die Partie deckt die gesamte Zeichenfolge, #überprüft , dass die Zeichenfolge beginnt mit einem #, (?!\d)sichergestellt , dass das nächste Zeichen ist nicht eine Ziffer (ohne voran die Regex - Engine Position), \w*prüft , dass wir das Ende der Zeichenfolge mit null oder mehr Buchstaben, Ziffern oder Unterstrichen erreichen.

Standardmäßig zählt Retina die Anzahl der Übereinstimmungen mit der angegebenen Regex, weshalb dies gilt 1 für gültige Hash-Tags und 0sonstiges gilt.

Martin Ender
quelle
In Perl (?!\d)ist (?=\D)... aber ich weiß nicht, wie Sie Retina geschrieben haben. Ist es möglich, dass Sie (?\D)ohne das verwenden =und ein Byte speichern könnten ? (Wenn nicht, lohnt es sich, die Sprache zu bearbeiten, damit das machbar ist?)
msh210
2
@ msh210 (?!\d)unterscheidet sich von (?=\D), dass das letztere erfordert einige Zeichen nach der aktuellen Position während erstere mit dem Ende der Zeichenfolge erfüllt ist. Unabhängig davon ist das Anpassen der Regex-Variante derzeit nicht möglich (da ich die Regex nur an die Regex-Engine von .NET weitergebe), aber solche Änderungen stehen auf der Roadmap irgendwo (sehr weit unten) auf dem Programm.
Martin Ender
1
Das heißt, ich glaube nicht, dass ich das =optional machen werde . Die gesamte (?...)Syntax wurde aus Gründen der Erweiterbarkeit gewählt, da das Zeichen nach dem ?niemals optional ist und bestimmt, um welche Art von Gruppe es sich handelt, und ich glaube nicht, dass ich auf diese Erweiterbarkeit verzichten möchte.
Martin Ender
(Wieder dein erster Kommentar) Duh, das hätte ich mir natürlich merken sollen. Für diese Antwort ist es jedoch irrelevant. (Du bist dein zweiter) Ja, macht Sinn. Es gibt schließlich auch (?{und (??und (?<(sowohl für das Erfassen von Gruppen als auch für Lookbehind) und (?-und (?1und natürlich das Grundlegende (?:. Und vielleicht einige, die ich verpasst habe.
msh210
6

Perl, 22 Bytes

21 Byte Code +1 für -p

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

Gibt 1 aus, wenn es sich um ein gültiges Hashtag handelt, andernfalls eine leere Zeichenfolge.

Verwendung

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

2 Bytes gespart danke für Martin Ender (und weitere 4 mit seiner Lookaround-Methode )


Perl, 18 Bytes

17 Byte Code +1 für -p

Mit Martins Lookaround kann dies viel kürzer sein!

$_=/^#(?!\d)\w*$/
Dom Hastings
quelle
Du hast Martins kopiert und bearbeitet, oder?
@MatthewRoh Die zweite Antwort verwendet Martins Mechanismus "Ja". Er hat gesagt, ich könnte es gebrauchen, aber ich wollte nicht, dass es meine Hauptantwort ist, da ich es mir selbst nicht ausgedacht habe! Ich habe es zum Vergleich hinzugefügt. Retina schlägt Perl in dieser Art von Herausforderung immer noch leicht!
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>

George Reith
quelle
5

C 80 Bytes

Die Funktion f()nimmt den String als Argument und ändert ihn int *bentweder auf 1 oder 0, um Wahrhaftigkeit / Falschheit anzuzeigen.

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

Wenn die Zeichenfolge immer mindestens ein Zeichen enthält (dh niemals eine leere Zeichenfolge), kann ein Byte für 79 Byte abgeschnitten werden:

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

Python 3, 41 Bytes

import re
re.compile('#(?!\d)\w*$').match
Gábor Fekete
quelle
Das sollte absolut in Ordnung sein. Da Übereinstimmungsobjekte wahr und Nonefalsch sind, denke ich, dass bool()es in Ordnung ist, sie fallen zu lassen.
Lynn
Ja, ich habe darüber nachgedacht, danke für die Klarstellung!
Gábor Fekete
Dies erzeugt auch für „#fix me Gábor“ einen Wahrheitswert. Übrigens, ich sehe, dass die Regeln auch von anderen ignoriert werden, aber wir haben dies als Ausschnitt betrachtet, der normalerweise nicht als Antwort akzeptiert wird, es sei denn, die Frage erlaubt dies ausdrücklich.
Manatwork
Danke, ich habe es umgeschrieben, um den Fall zu behandeln, den Sie geschrieben haben, und es zu einer Lambda-Funktion gemacht.
Gábor Fekete
2
Wie wäre es re.compile('#(?!\d)\w*$').match? Es ist akzeptabel, die f=BTW fallen zu lassen .
Lynn
4

Brachylog , 55 Bytes

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

Dies verwendet keinen regulären Ausdruck.

Erläuterung

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
Tödlich
quelle
4

Python 3, 103 93 Bytes

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

Das #Wesen Truegetötet mich hier, ich hatte die Zeichenfolge aufzuzählen einen Indexfehler auf der einzelnen Zeicheneingabe zu vermeiden.

Atlasologe
quelle
1
+1. Nett! Ich habe die isalpha()Methode in meiner py3-Antwort komplett vergessen : D "#" ist wahr, hat mich auch zerstört.
Yytsi
4

PowerShell v2 +, 25 Byte

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

Verwenden Sie Martins regulären Ausdruck , und schließen Sie ihn zusammen -matchmit der Eingabe in den PowerShell- Operator ein $args. Bei Wahrheits / Falsch-Werten gibt dies die Zeichenfolge selbst bei einer Übereinstimmung (einem Wahrheits-Wert) oder nichts bei einer Nichtübereinstimmung (einem Falsch-Wert) zurück. Dies liegt daran, dass ein Vergleichsoperator, der auf ein Array angewendet wird, alles zurückgibt diesen Operator erfüllt.

Einige Beispiele (in eine [bool]Besetzung gehüllt , um die Ausgabe klarer zu machen):

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
quelle
3

Mathematica, 52 46 43 Bytes

Gespeicherte 6 9 Bytes aufgrund @MartinEnder .

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

Funktion. Nimmt einen String als Eingabe und gibt Trueoder Falseals Ausgabe zurück. Ziemlich einfach, passt einfach gegen den Regex /#(?!\d)\w*/.

LegionMammal978
quelle
Ich habe Grund zu der Annahme, dass dies für Eingaben wie nicht funktioniert, hello#worldda Sie nicht über die Anfangs- und Endzeichenfolgenanker verfügen. Ich kenne Mathematica allerdings nicht und bin mir nicht sicher.
Value Ink
Alles klar, damit kann ich leben. Erhalten Sie Ihre +1
Werttinte
3

Dyalog APL , 22 20 Bytes

Ohne RegEx:

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

-2 danke an ngn

Adam
quelle
1
Oh wow. Es gibt immer noch Leute, die APL kennen. Es ist 37 Jahre her, dass ich es benutzt habe!
Auspex
@Auspex APL ist gesund und munter, aber in diesen Jahren wurden einige Funktionen hinzugefügt.
Adám
3

Python 2, 79 Bytes

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

Erster Golfversuch. Ungolfed-Version:

def f(x):
    if x == '#':
        return True
    else:
        return x[0]=='#' and x[1:].replace('_','').isalnum() and not x[1].isdigit()
Cowabunghole
quelle
Schöne Antwort und willkommen auf der Seite!
DJMcMayhem
3

Oktave, 37 56 54 43 Bytes

Vielen Dank an @LuisMendo für das Entfernen von 8 Bytes!

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

Nicht sehr golfig, aber sehr eingebaut.
Bearbeiten: Der ursprüngliche Code akzeptiert Zeichenfolgen ohne führendes '#'. Ich denke, ich hätte mich an Regex halten sollen.

Testsuite auf Ideone .

Becherglas
quelle
3

Python3 - 156 128 Bytes

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)

Eine Lösung ohne Regex. 0 ist falsch und jeder andere Wert ist wahr.

Vielen Dank an @LeakyNun für das Speichern von Bytes!

Yytsi
quelle
@LeakyNun Ich musste das +0After entfernen n[1:], aber leider funktionierte es immer noch nicht: / Falsch an "#d".
Yytsi
@LeakyNun funktioniert immer noch nicht :( Wieder musste entfernt werden +0, schlägt jedoch bei "#d" fehl. Ich habe es jedoch auf Python3 getestet. Ich bin nicht sicher, ob es auf Python2 funktionieren wird
Yytsi
@LeakyNun Einfach nur falsch.
Yytsi
@LeakyNun Wirft IndexOutOfRangefür "#" und Falsefür "#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)für 128 Bytes. Beweis, dass es funktioniert
Leaky Nun
2

Lua, 59 55 54 Bytes

Code

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

Wie es funktioniert:

  1. Überprüfen Sie, ob der Rest der Zeichen ein gültiger Lua-Bezeichner sein kann (Bezeichner in Lua folgen denselben Regeln wie Hashtags.)
  2. Überprüfen Sie, ob das erste Zeichen a ist #.

Übernimmt Eingaben von der Kommandozeile. Druckt , truewenn die Zeichenfolge ein gültiger Hashtag ist, andernfalls er druckt nil.

xaxa
quelle
2

Google Sheets, 30 Bytes

Eine anonyme Arbeitsblattfunktion, die Eingaben aus der Zelle entgegennimmt A1, vergleicht sie mit dem RE2-Ausdruck und gibt das Ergebnis an die aufrufende Zelle aus.

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

Sed 19 + 2 = 21 Bytes

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

Dies filtert alle Nicht-Hashtags heraus und gibt gültige Hashtags aus.

Führen Sie so sed -rn "/^#$|^#[a-z]\w*$/Ip". Mit Ctrl+ beenden D(EOF senden).

jemandemmitpc
quelle
1

GNU grep, 15 + 2 = 17 Bytes

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

Prüfung:

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

Ausgabe:

#
#e
#_ABC
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016
Jordan
quelle
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]])

(Code geändert) Menschenlesbar

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

Dignissimus - Spammy
quelle
Schöne Antwort und willkommen auf der Seite! Funktionen sind ebenfalls erlaubt, so dass Sie dies mitlambda x:all(True==[x[0]=="#",x[1].isalpha(),x[2:].isalpha()])
DJMcMayhem
Kein Problem, froh, dass ich helfen konnte!
DJMcMayhem
1
Ich hasse es, der Überbringer von schlechten Nachrichten zu sein, aber scheitert das nicht an einem '#' , das laut OP wahr ist? Schlägt es auch fehl, wenn das Hashtag Unterstriche enthält, unter denen falsch steht isalpha?
TheBikingViking
@TheBikingViking Entschuldigung, ich werde versuchen, dies jetzt zu beheben
Dignissimus - Spammy
2
@TheBikingViking Nicht konkurrieren heißt das. Die Nichtteilnahme ist keine Entschuldigung für eine ungültige Einreichung. Das richtige Verfahren besteht darin, die Antwort zu löschen, zu korrigieren und dann wiederherzustellen.
Mego
1

Pyke, 19 Bytes

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

Probieren Sie es hier aus!

Schnelle Lösung für heute Abend

Blau
quelle
1
@kenorb neu gestartet, ping mir, wenn weitere Probleme
Blue
#123gibt immer noch nichts zurück, sollte nicht 0 zurückgeben?
Kenorb
1
Nichts ist ein boolesches falsch
Blue
1

Rubin, 16 + 3 1 ( nFlagge) = 19 17 Bytes

Verwendet 0als wahr und nilals falsch.

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

Führen Sie es als ruby -ne 'p~/^#(?!\d)\w*$/'. Vielen Dank an @manatwork für die Behebung des Bash-Fehlers beim Ausführen des Programms.

Wert Tinte
quelle
1
Tun Sie sich selbst einen Gefallen und setzen Sie den Code immer in einfache Anführungszeichen. Andernfalls versucht die Shell, alle Arten von Erweiterungen auszuführen (oder noch schlimmer, sie führt sie erfolgreich aus). (Bezüglich des aktuellen Problems mit !siehe Event Designators in man bash.)
manatwork
1

Standard ML , 121 118 107 Bytes

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

Probieren Sie es online! Funktionale Lösung ohne Verwendung von Regex. Deklariert eine anonyme Funktion, die an die implizite Ergebniskennung gebunden ist it.

> val it = fn : string -> bool    
- it "#valid_hash";
> val it = true : bool
Laikoni
quelle
4
isAlphaNum$orelsedas ist ziemlich bedrohlich ...
Katze
@cat das ist vielleicht das einzig Positive, was man über solche wortreichen Booleschen Operatoren wie orelseund sagen kann andalso.
Laikoni
2
Es ist wie AlphaNum, orelse!! ( orelse what?)
Katze
Man könnte o explodedas Ende auch für ziemlich bedrohlich halten ...
Laikoni
1
SML scheint ziemlich beängstigend zu sein, ich glaube nicht, dass ich den ganzen Tag damit
cat
1

Excel VBA, 54 Byte

Anonyme VBE-Direktfensterfunktion, die Eingaben von der Zelle entgegennimmt [A1], prüft, ob der Wert der Zelle mit dem LikeMuster übereinstimmt , und gibt BooleanInformationen zum VBE-Direktfenster aus

?Not[Left(A1,2)]Like"[#]#"And[A1]Like"[#][_a-zA-z0-9]*
Taylor Scott
quelle
0

C #, 92 Bytes

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

C # lambda ( Predicate) wobei input a stringund output a ist bool.

Probieren Sie es online!

aloisdg sagt Reinstate Monica
quelle
0

Lua, 39 Bytes

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

Einfache Copypasta der Übereinstimmungsbeschreibung. Ausgaben falschnil wenn kein Hashtag angegeben ist, andernfalls wird ein echtes Hashtag zurückgegeben.

Kann um ein weiteres Byte gekürzt werden, findwenn durch die Ausgabe einer Liste mit zwei Werten (was wahr ist) keine Regeln verletzt werden.

Oleg V. Volkov
quelle
Ich denke, dass dies nicht #für sich alleine passt.
Martin Ender
@ MartinEnder, natürlich. Das sollte es nicht. Auch das tut keine der Top-Antworten. Auch codegolf.stackexchange.com/questions/85619/hashtag-or-not/…
Oleg V. Volkov
Ob #es sich um einen Hashtag auf Twitter oder Facebook handelt, spielt für diese Herausforderung keine Rolle. Die Spezifikation ist sehr klar darüber, dass #sie für die Zwecke dieser Herausforderung als Hashtag angesehen werden sollte. Und obwohl ich nicht alle Antworten überprüft habe, akzeptiere ich alle Antworten, die ich überprüft habe , #als Hashtag, sodass ich nicht sicher bin, auf welche Top-Antworten Sie sich beziehen.
Martin Ender
0

Clojure, 130 135 132 Bytes

  • +5 Bytes für einen NPE, der auftrat, als die Zeichenfolge nur aus einem Hashtag bestand.

  • -2 Bytes mit 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))))
Karzigenat
quelle
Hoppla, das ergibt tatsächlich eine NPE für "#". Gib mir eine Sekunde.
Carcigenicate