#Hashtag_or_not


25

Dans ce défi de golf de code, vous vérifierez les hashtags!

#What_your_code_should_do

L'entrée est une chaîne. Sortez une valeur véridique si c'est un hashtag valide, et une valeur falsifiée sinon.

Nous définissons une chaîne comme un hashtag valide si ...

  • Cela commence par un hachage ( #).
  • Il n'a pas de numéro juste après le hashtag (par exemple, #2016USElectionn'est pas un hashtag valide).
  • Il n'a pas de "caractères spéciaux" (c'est-à-dire aucun caractère qui n'est pas un alphabet, un trait de soulignement ( _) ou un nombre).

Vous pouvez supposer que l'entrée ne contient que des caractères ASCII. (Ce serait injuste si nous utilisions également Unicode.)

#Règles

Les règles de base du s'appliquent.

#Exemples

Vérité:

#
#e
#_ABC 
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

Faux:

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

10
Est-ce #vraiment un hashtag valide?
Adám

4
Est #öäüvalide?
chrki

7
#n'est pas un hashtag valide par aucun système, Facebook ou Twitter, il enfreint également les règles définies, je ne suis pas sûr que #_ABC soit à nouveau valide sur eux, mais je n'en suis pas certain.
Martin Barker

3
Je suppose que an alphabetsignifie ascii majuscule ou minuscule? c'est à dire abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?
Rɪᴋᴇʀ

7
Un # n'est pas un hashtag. C'est un hachage. Il, suivi d'une chaîne, est ce que les réseaux sociaux appellent un hashtag. C'est une balise, qui commence par un hachage.
i-CONICA

Réponses:


19

Rétine , 12 octets

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

Imprime 1pour les hashtags et 0autres.

Essayez-le en ligne! (La première ligne active une suite de tests séparés par un saut de ligne.)

Pas grand chose à expliquer ici, cela est tout à fait une application littérale de la définition: ^et ne $sont que des ancres assurant que les couvertures de correspondre à la chaîne complète, #vérifie que la chaîne commence par un #, (?!\d)assure que le caractère suivant n'est pas un chiffre (sans avancer la position du moteur d'expression régulière), \w*vérifie que nous pouvons atteindre la fin de la chaîne avec zéro ou plusieurs lettres, chiffres ou traits de soulignement.

Par défaut, Retina compte le nombre de correspondances de l'expression régulière donnée, c'est pourquoi cela donne 1des balises de hachage valides et 0autres.


En Perl, (?!\d)c'est (?=\D)... mais je ne sais pas comment tu as écrit Retina. Est-il possible que vous puissiez utiliser (?\D)sans =et enregistrer un octet? (Sinon, vaut-il la peine d'éditer la langue pour que ce soit faisable?)
msh210

2
@ msh210 (?!\d)est différent du fait (?=\D)que ce dernier nécessite un certain caractère après la position actuelle tandis que le premier est satisfait de la fin de la chaîne. Indépendamment de cela, l'ajustement de la saveur des expressions régulières n'est actuellement pas possible (car je ne fais que transmettre les expressions régulières au moteur de regex de .NET), mais apporter de tels changements est sur la feuille de route quelque part (très loin) sur toute la ligne.
Martin Ender

1
Cela dit, je ne pense pas que je vais rendre l' =option facultative. L'intégralité de la (?...)syntaxe a été choisie pour l'extensibilité, en ce sens que le caractère après le ?n'est jamais optionnel et détermine de quel type de groupe il s'agit, et je ne pense pas vouloir abandonner cette extensibilité.
Martin Ender

(re votre premier commentaire) Duh, bien sûr, j'aurais dû le noter. Mais cela n'a rien à voir avec cette réponse. (votre deuxième) Oui, c'est logique. Il y a après tout aussi (?{et (??et (?<(à la fois pour capturer des groupes et pour regarder derrière) et (?-et (?1et bien sûr la base (?:. Et peut-être en ai-je manqué.
msh210

6

Perl, 22 octets

21 octets code +1 pour -p

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

Imprime 1 s'il s'agit d'un hashtag valide, sinon une chaîne vide.

Usage

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

Enregistré 2 octets merci pour Martin Ender (et 4 autres en utilisant sa méthode de recherche )


Perl, 18 octets

17 octets code +1 pour -p

En utilisant le lookaround de Martin, cela peut être beaucoup plus court!

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

Vous avez copié celui de Martin et l'avez édité, non?

@MatthewRoh La deuxième réponse utilise le mécanisme de Martin oui. Il a dit que je pouvais l'utiliser, mais je ne voulais pas que ce soit ma réponse principale car je ne l'ai pas inventé moi-même! Je l'ai ajouté pour comparaison. La rétine bat toujours Perl facilement dans ce type de défi!
Dom Hastings

6

JavaScript (ES6), 25 octets

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 octets

La fonction f()prend la chaîne comme argument et se int *btransforme en 1 ou 0 pour indiquer la vérité / la fausse.

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

Si la chaîne a toujours au moins un caractère (c'est-à-dire jamais une chaîne vide), un octet peut être rasé pour 79 octets:

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

5

Python 3, 41 octets

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

Cela devrait être tout à fait correct. Étant donné que les objets d'allumettes sont véridiques et Nonesont falsey, je pense que laisser tomber le bool()est correct.
Lynn

Oui, j'y ai pensé, merci de le clarifier!
Gábor Fekete

Cela génère également une valeur véridique pour «#fix me Gábor». BTW, je vois que les règles sont également ignorées par d'autres, mais nous avons utilisé cela pour considérer un extrait de code, qui n'est généralement pas accepté comme réponse, sauf si la question le permet explicitement.
manatwork

Merci, je l'ai réécrit pour gérer le cas que vous avez écrit et en ai fait une fonction lambda.
Gábor Fekete

2
Et alors re.compile('#(?!\d)\w*$').match? Il est acceptable de laisser tomber le f=BTW.
Lynn

4

Brachylog , 55 octets

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

Cela n'utilise aucune expression régulière.

Explication

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 octets

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

L' #être Truem'a tué ici, j'ai dû énumérer la chaîne pour éviter une erreur d'index sur l'entrée à un seul caractère.


1
+1. Agréable! J'ai complètement oublié la isalpha()méthode sur ma réponse py3: D "#" étant vrai, m'a également détruit.
Yytsi

4

PowerShell v2 +, 25 octets

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

En utilisant l'expression régulière de Martin , vient d'être enveloppé dans l' -matchopérateur de PowerShell couplé à l'entrée $args. Pour les valeurs véridiques / falsey, cela retournera la chaîne elle-même sur une correspondance (une valeur véridique) ou rien sur une non-correspondance (une valeur falsey). En effet, lorsqu'un opérateur de comparaison est appliqué à un tableau, il renvoie tout ce qui satisfait cet opérateur.

Quelques exemples (enveloppés dans une [bool]distribution pour rendre la sortie plus claire):

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 octets

6 9 octets enregistrés grâce à @MartinEnder .

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

Une fonction. Prend une chaîne en entrée et retourne Trueou Falseen sortie. Assez simple, correspond juste contre l'expression régulière /#(?!\d)\w*/.


J'ai des raisons de croire que cela ne fonctionnera pas pour les entrées, hello#worldcar vous n'avez pas les ancres de chaîne de début et de fin. Je ne connais pas Mathematica, donc je ne suis pas sûr.
Value Ink

Très bien, je peux vivre avec ça. Ayez votre +1
Value Ink du

3

Dyalog APL , 22 20 octets

Sans RegEx:

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

-2 grâce à ngn


1
Oh wow. Il y a encore des gens qui connaissent APL. Cela fait 37 ans que je l'utilise!
Auspex

@Auspex APL est bel et bien vivant, mais peu de fonctionnalités ont été ajoutées au cours de ces années.
Adám

3

Python 2, 79 octets

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

Première tentative de golf. Version non golfée:

def f(x):
    if x == '#':
        return True
    else:
        return x[0]=='#' and x[1:].replace('_','').isalnum() and not x[1].isdigit()

Belle réponse, et bienvenue sur le site!
DJMcMayhem

3

Octave, 37 56 54 43 octets

Merci à @LuisMendo d'avoir supprimé 8 octets!

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

Pas très golfique, mais très intégré.
Modifier: le code d'origine acceptait les chaînes sans «#» en tête. Je suppose que j'aurais dû m'en tenir à l'expression régulière.

Suite de tests sur ideone .


3

Python3 - 156 128 octets

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)

Une solution qui n'utilise pas regex. 0 est falsey et toutes les autres valeurs sont véridiques.

Merci à @LeakyNun pour avoir économisé des octets!


@LeakyNun J'ai dû supprimer la +0suite n[1:], mais malheureusement, cela n'a toujours pas fonctionné: / A donné false à "#d".
Yytsi

@LeakyNun ne fonctionne toujours pas :( Encore une fois, a dû supprimer +0mais échoue sur "#d". Je l'ai testé sur Python3 cependant. Je ne sais pas si cela fonctionnera sur Python2
Yytsi

@LeakyNun Tout simplement faux.
Yytsi

@LeakyNun Lance IndexOutOfRangepour "#" et Falsepour "#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)pour 128 octets. Preuve que cela fonctionne
Leaky Nun

2

Lua, 59 55 54 octets

Code

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

Comment ça marche:

  1. Vérifiez si les autres caractères peuvent être un identifiant valud Lua (les identifiants dans Lua suivent les mêmes règles que les hashtags.)
  2. Vérifiez si le premier caractère est un #.

Prend des entrées de la ligne de commande. Imprime truesi la chaîne est un hashtag valide, sinon, elle s'imprime nil.


2

Google Sheets, 30 octets

Une fonction de feuille de calcul anonyme qui prend l'entrée de la cellule A1la compare à l'expression RE2 et renvoie le résultat à la cellule appelante.

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


1

Sed 19 + 2 = 21 octets

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

Cela filtre tous les non-hashtags et génère des hashtags valides.

Exécuter en tant que sed -rn "/^#$|^#[a-z]\w*$/Ip". Quittez avec Ctrl+ D(envoyez EOF).


1

Grep GNU, 15 + 2 = 17 octets

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

Tester:

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

Sortie:

#
#e
#_ABC
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

1

Python 3, 97 octets 70 octets 56 octets

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

(Code modifié) Lisible par l'homme

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


Belle réponse, et bienvenue sur le site! Les fonctions sont également autorisées, vous pouvez donc raccourcir un peu cela aveclambda x:all(True==[x[0]=="#",x[1].isalpha(),x[2:].isalpha()])
DJMcMayhem

Pas de problème, content d'avoir pu aider!
DJMcMayhem

1
Je déteste être le porteur de mauvaises nouvelles, mais cela ne manque-t-il pas pour '#' , que le PO dit vrai? N'échouera-t-il pas également si le hashtag contient des traits de soulignement, lesquels sont faux en dessous isalpha?
TheBikingViking

@TheBikingViking désolé, je vais essayer de résoudre ce problème maintenant
Dignissimus - Spammy

2
@TheBikingViking Ce n'est pas ce que signifie la non-compétition. La non-concurrence n'est pas une excuse pour une soumission invalide. La procédure correcte consiste à supprimer la réponse, à la corriger, puis à la supprimer.
Mego

1

Pyke, 19 octets

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

Essayez-le ici!

Solution rapide pour ce soir


1
@kenorb l'a redémarré, envoyez-moi un ping si vous rencontrez d'autres problèmes
Blue

#123ne renvoie toujours rien, ne devrait pas retourner 0?
kenorb

1
Rien n'est un faux booléen
Blue

1

Ruby, 16 + 3 1 ( ndrapeau) = 19 17 octets

Utilise 0comme véridique et nilcomme fausse.

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

Exécutez-le en tant que ruby -ne 'p~/^#(?!\d)\w*$/'. Merci à @manatwork d'avoir corrigé l'erreur bash lors de l'exécution du programme.


1
Faites-vous plaisir et mettez toujours le code entre guillemets simples. Sinon, le shell tentera (ou pire encore, effectuera avec succès) toutes sortes d'extensions. (Concernant le problème actuel avec !, voir Event Designators dans man bash.)
manatwork

1

Standard ML , 121 118 107 octets

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

Essayez-le en ligne! Solution fonctionnelle sans utiliser d'expression régulière. Déclare une fonction anonyme qui est liée à l'identificateur de résultat implicite it.

> val it = fn : string -> bool    
- it "#valid_hash";
> val it = true : bool

4
isAlphaNum$orelsec'est plutôt menaçant ...
cat

@cat, cela pourrait être la seule chose positive que l'on puisse dire à propos des opérateurs booléens verbeux comme orelseet andalso.
Laikoni

2
C'est comme AlphaNum, orelse!! ( orelse what?)
cat

On pourrait aussi considérer que o explodela fin est assez menaçante ...
Laikoni

1
SML semble assez effrayant, je ne pense pas que je pourrais gérer ça toute la journée: c
cat

1

Excel VBA, 54 octets

Fonction de fenêtre immédiate VBE anonyme qui prend les entrées de la cellule [A1], vérifie si la valeur de la cellule correspond au Likemodèle et Booleanaffiche la fenêtre immédiate VBE

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



0

Lua, 39 octets

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

Copypasta simple de la description du match. Génère un faux nilsi ce n'est pas un hashtag, renvoie un vrai hashtag dans le cas contraire.

Peut être raccourci pour un octet de plus en utilisant findsi la sortie de la liste de deux valeurs (ce qui est vrai) ne viole pas les règles.


Je pense que cela ne correspondra pas à un #seul.
Martin Ender

@MartinEnder, bien sûr. Ça ne devrait pas. Aucune des meilleures réponses ne le fait non plus. Aussi codegolf.stackexchange.com/questions/85619/hashtag-or-not/…
Oleg V. Volkov

Que ce #soit un hashtag sur Twitter ou Facebook n'est pas pertinent pour ce défi. La spécification est très claire sur le fait qu'elle #doit être considérée comme un hashtag aux fins de ce défi. Et alors que je n'ai pas vérifié toutes les réponses, tout ce que j'ai vérifié ne l' accepte #comme un hashtag, donc je ne suis pas sûr de réponses haut , vous faites référence.
Martin Ender

0

Clojure, 130 135 132 octets

  • +5 octets pour gérer un NPE qui s'est produit lorsque la chaîne n'était constituée que d'un hashtag.

  • -2 octets en utilisant 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))))

Non golfé:

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

Oups, cela donne en fait un NPE pour "#". Donne moi une seconde.
Carcigenicate

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.