#Hashtag_or_not

25

¡En este desafío de código de golf, verificará los hashtags!

#What_your_code_should_do

La entrada es una cadena. Genere un valor verdadero si es un hashtag válido, y un valor falso de lo contrario.

Definimos una cadena como un Hashtag válido si ...

  • Comienza con un hash ( #).
  • No tiene un número justo después del hashtag (por ejemplo, #2016USElectionno es un hashtag válido).
  • No tiene ningún "carácter especial" (es decir, ningún carácter que no sea un alfabeto, un guión bajo ( _) o un número).

Puede suponer que la entrada solo contiene caracteres ASCII. (Sería injusto si también hiciéramos Unicode).

#Reglas

Se aplican reglas básicas de .

#Ejemplos

Verdad:

#
#e
#_ABC 
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

Falsy

Hello, World!
#12thBday
#not-valid
#alsoNotValid!
#!not_a_hash
Laikoni
fuente
10
¿Es #realmente un hashtag válido?
Adám
44
Es #öäüvalido?
chrki
77
#no es un hashtag válido por ningún sistema, Facebook o Twitter, también rompe las reglas establecidas, no estoy seguro de que #_ABC sea válido nuevamente en ellos, pero no estoy seguro de eso.
Martin Barker
3
Supongo que an alphabetsignifica ascii mayúscula o minúscula? es decir abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?
Rɪᴋᴇʀ
77
Un # no es un hashtag. Es un hachís. A continuación, una cadena es lo que las redes sociales denominan hashtag. Es una etiqueta, que comienza con un hash.
i-CONICA

Respuestas:

19

Retina , 12 bytes

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

Imprime 1para hashtags y 0otros.

Pruébalo en línea! (La primera línea habilita un conjunto de pruebas separado por salto de línea).

No hay mucho que explicar aquí, esta es una implementación bastante literal de la definición: ^y $son solo anclas que aseguran que la coincidencia cubra toda la cadena, #verifica que la cadena comience con un #, (?!\d)asegura que el siguiente carácter no sea un dígito (sin avanzar la posición del motor regex), \w*verifica que podamos llegar al final de la cadena con cero o más letras, dígitos o guiones bajos.

De forma predeterminada, Retina cuenta el número de coincidencias de la expresión regular dada, razón por la cual esto proporciona 1etiquetas hash válidas y de 0otro modo.

Martin Ender
fuente
En Perl, (?!\d)es (?=\D)... pero no sé cómo has escrito Retina. ¿Es posible que pueda usar (?\D)sin =guardar un byte? (Si no, ¿vale la pena editar el idioma para que sea factible?)
msh210
2
@ msh210 (?!\d)es diferente de (?=\D)que este último requiere algún carácter después de la posición actual, mientras que el primero está satisfecho con el final de la cadena. Independientemente de eso, actualmente no es posible ajustar el sabor de expresiones regulares (ya que solo estoy entregando la expresión regular al motor de expresiones regulares de .NET), pero hacer tales cambios está en la hoja de ruta en algún lugar (muy lejos) en el futuro.
Martin Ender
1
Dicho esto, no creo que haga el =opcional. La (?...)sintaxis completa se eligió para la extensibilidad, ya que el carácter después del ?nunca es opcional y determina qué tipo de grupo es este, y no creo que quiera renunciar a esa extensibilidad.
Martin Ender
(re su primer comentario) Duh, por supuesto, debería haberlo notado. Pero es irrelevante para esta respuesta. (re su segundo) Sí, tiene sentido. Después de todo, existe también (?{y (??y (?<(tanto para capturar grupos como para mirar hacia atrás) (?-y (?1y, por supuesto, lo básico (?:. Y tal vez algunos que he echado de menos.
msh210
6

Perl, 22 bytes

21 bytes código +1 para -p

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

Imprime 1 si es un hashtag válido, de lo contrario, se vacía la cadena.

Uso

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

Ahorró 2 bytes gracias por Martin Ender (y otros 4 usando su método de búsqueda )


Perl, 18 bytes

Código de 17 bytes +1 para -p

¡Usar el lookaround de Martin puede ser mucho más corto!

$_=/^#(?!\d)\w*$/
Dom Hastings
fuente
Copiaste el de Martin y lo editaste, ¿verdad?
@MatthewRoh La segunda respuesta usa el mecanismo de Martin, sí. Él dijo que podía usarlo, ¡pero no quería que fuera mi respuesta principal ya que no se me ocurrió! Lo he añadido para comparar. ¡Retina aún vence a Perl fácilmente en este tipo de desafío!
Dom Hastings
6

JavaScript (ES6), 25 bytes

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
fuente
5

C, 80 bytes

La función f()toma la cadena como argumento y la modifica int *ba 1 o 0 para indicar verdadero / falso.

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

Si la cadena siempre tiene al menos un carácter (es decir, nunca una cadena vacía), se puede eliminar un byte de 79 bytes:

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

Python 3, 41 bytes

import re
re.compile('#(?!\d)\w*$').match
Gábor Fekete
fuente
Esto debería estar absolutamente bien. Como los objetos de coincidencia son verdaderos y Nonefalsey, creo que dejarlos bool()está bien.
Lynn
Sí, pensé en eso, ¡gracias por aclararlo!
Gábor Fekete
Esto genera un valor verdadero para "#fix me Gábor" también. Por cierto, veo que las reglas también están siendo ignoradas por otros, pero esto solíamos considerar un fragmento, que generalmente no se acepta como respuesta a menos que la pregunta lo permita explícitamente.
manatwork
Gracias, lo reescribí para manejar el caso que escribiste y lo convertí en una función lambda.
Gábor Fekete
2
¿Qué tal re.compile('#(?!\d)\w*$').match? Es aceptable dejar caer f=, por cierto.
Lynn
4

Brachylog , 55 bytes

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

Esto no usa expresiones regulares.

Explicación

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

Al #ser Trueasesinado aquí, tuve que enumerar la cadena para evitar un error de índice en la entrada de un solo carácter.

atlasólogo
fuente
1
+1. ¡Agradable! Olvidé por completo el isalpha()método en mi respuesta py3: D "#" siendo cierto, también me destruyó.
Yytsi
4

PowerShell v2 +, 25 bytes

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

Usando la expresión regular de Martin , acaba de terminar en el -matchoperador de PowerShell junto con la entrada $args. Para valores de verdad / falsey, esto devolverá la cadena en sí misma en una coincidencia (un valor de verdad) o nada en una no coincidencia (un valor de falsey). Esto se debe a que cuando un operador de comparación se aplica contra una matriz, devuelve cualquier cosa que satisfaga a ese operador.

Un par de ejemplos (envueltos en un [bool]molde para aclarar la salida):

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

Mathematica, 52 46 43 bytes

Guardado 6 9 bytes debido a @MartinEnder .

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

Función. Toma una cadena como entrada y devuelve Trueo Falsecomo salida. Bastante simple, solo coincide con la expresión regular /#(?!\d)\w*/.

LegionMammal978
fuente
Tengo razones para creer que esto no funcionará para entradas como hello#worldya que no tiene los anclajes de cadena de inicio y final. Sin embargo, no conozco Mathematica, así que no estoy seguro.
Value Ink
Muy bien, puedo vivir con eso. Tenga su +1
Value Ink
3

Dyalog APL , 22 20 bytes

Sin RegEx:

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

-2 gracias a ngn

Adán
fuente
1
Oh wow. Todavía hay personas que conocen APL. ¡Han pasado 37 años desde que lo usé!
Auspex
@Auspex APL está bien y vivo, pero se han agregado muy pocas características en esos años.
Adám
3

Python 2, 79 bytes

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

Primer intento de golf. Versión sin golf:

def f(x):
    if x == '#':
        return True
    else:
        return x[0]=='#' and x[1:].replace('_','').isalnum() and not x[1].isdigit()
Agujero de vaca
fuente
Buena respuesta, y bienvenido al sitio!
DJMcMayhem
3

Octava, 37 56 54 43 bytes

¡Gracias a @LuisMendo por eliminar 8 bytes!

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

No muy golfístico, pero muy empotrado.
Editar: el código original acepta cadenas sin un '#' inicial. Supongo que debería haberme quedado con regex.

Conjunto de pruebas en ideone .

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

Una solución que no usa expresiones regulares. 0 es falsey y cualquier otro valor es verdadero.

¡Gracias a @LeakyNun por guardar bytes!

Yytsi
fuente
@LeakyNun Tuve que eliminar el +0after n[1:], pero lamentablemente, aún no funcionó: / Di falso a "#d".
Yytsi
@LeakyNun todavía no funciona :( Nuevamente, tuve que eliminar +0pero falla en "#d". Sin embargo, lo probé en Python3. No estoy seguro de si funcionará en Python2
Yytsi
@LeakyNun Simplemente falso.
Yytsi
@LeakyNun Lanza IndexOutOfRangepara "#" y Falsepara "#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)por 128 bytes. Prueba de que funciona
Leaky Nun
2

Lua, 59 55 54 bytes

Código

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

Cómo funciona:

  1. Compruebe si el resto de los caracteres pueden ser un identificador valua de Lua (los identificadores en Lua siguen las mismas reglas que los hashtags).
  2. Comprueba si el primer personaje es a #.

Toma información de la línea de comando. Imprime truesi la cadena es un hashtag válido, de lo contrario, imprime nil.

xaxa
fuente
2

Hojas de cálculo de Google, 30 bytes

Una función de hoja de trabajo anónima que toma la entrada de la celda A1la compara con la expresión RE2 y envía el resultado a la celda que llama.

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

Sed 19 + 2 = 21 bytes

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

Esto filtra todos los no hashtags y genera hashtags válidos.

Corre como sed -rn "/^#$|^#[a-z]\w*$/Ip". Salga con Ctrl+ D(enviar EOF).

alguien con pc
fuente
1

GNU grep, 15 + 2 = 17 bytes

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

Prueba:

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

Salida:

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

(Código cambiado) Lectura humana

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

Dignissimus - Spammy
fuente
Buena respuesta, y bienvenido al sitio! Las funciones también están permitidas, por lo que podría acortar esto un poco conlambda x:all(True==[x[0]=="#",x[1].isalpha(),x[2:].isalpha()])
DJMcMayhem
No hay problema, me alegro de poder ayudar!
DJMcMayhem
1
Odio ser el portador de malas noticias, pero ¿no falla esto para '#' , que el OP dice que es verdad? ¿No fallará también si el hashtag contiene guiones bajos, que son falsos debajo isalpha?
TheBikingViking
@TheBikingViking lo siento, intentaré arreglar esto ahora
Dignissimus - Spammy
2
@TheBikingViking Eso no es lo que significa no competir. No competir no es una excusa para un envío no válido. El procedimiento correcto es eliminar la respuesta, corregirla y luego recuperarla.
Mego
1

Pyke, 19 bytes

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

Pruébalo aquí!

Solución rápida para esta noche

Azul
fuente
1
@kenorb lo reinició, ping si hay más problemas
Azul
#123devuelve todavía nada, no debería devolver 0?
kenorb
1
Nada es un falso booleano
Azul
1

Ruby, 16 + 3 1 ( nbandera) = 19 17 bytes

Usos 0como verdadero y nilfalso.

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

Ejecútalo como ruby -ne 'p~/^#(?!\d)\w*$/'. Gracias a @manatwork por corregir el error bash al ejecutar el programa.

Tinta de valor
fuente
1
Hazte un favor y siempre encierra el código entre comillas simples. De lo contrario, el shell intentará (o peor aún, realizará con éxito) todo tipo de expansiones. (Con respecto al problema actual con !, vea Designadores de eventos en man bash.)
manatwork
1

Ml estándar , 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;

Pruébalo en línea! Solución funcional sin usar regex. Declara una función anónima que está vinculada al identificador de resultado implícito it.

> val it = fn : string -> bool    
- it "#valid_hash";
> val it = true : bool
Laikoni
fuente
44
isAlphaNum$orelseeso es bastante amenazante ...
gato
@cat esto podría ser lo único positivo que se puede decir sobre operadores booleanos detallados como orelsey andalso.
Laikoni
2
Es como AlphaNum, orelse!! ( orelse what?)
gato
Uno podría considerar que o explodeal final también es bastante amenazante ...
Laikoni
1
SML parece bastante aterrador, no creo que pueda manejar eso todo el día: c
cat
1

Excel VBA, 54 bytes

Función de ventana inmediata anónima de VBE que toma la entrada de la celda [A1], verifica si el valor de la celda coincide con el Likepatrón, y Booleanmuestra la ventana inmediata de VBE

?Not[Left(A1,2)]Like"[#]#"And[A1]Like"[#][_a-zA-z0-9]*
Taylor Scott
fuente
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) donde input es a stringy output es a bool.

Pruébalo en línea!

aloisdg dice Reinstate Monica
fuente
0

Lua, 39 bytes

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

Copia simple de la descripción del partido. Salidas falsasnil si no es un hashtag, de lo contrario, devuelve un hashtag verdadero.

Se puede acortar un byte más findsi se genera una lista de dos valores (lo cual es cierto) que no infringe las reglas.

Oleg V. Volkov
fuente
Creo que esto no coincidirá con un #solo.
Martin Ender
@ MartinEnder, por supuesto. No debería Ninguna de las mejores respuestas hace eso tampoco. También codegolf.stackexchange.com/questions/85619/hashtag-or-not/…
Oleg V. Volkov el
Si #es un hashtag en Twitter o Facebook es irrelevante para este desafío. La especificación es muy clara sobre el hecho de que #debe considerarse un hashtag a los efectos de este desafío. Y aunque no lo he comprobado todas las respuestas, todo lo que hice cheque no acepto #como un hashtag, así que no estoy seguro de qué respuestas arriba que usted se refiere.
Martin Ender
0

Clojure, 130 135 132 bytes

  • +5 bytes para lidiar con un NPE que sucedió cuando la cadena constaba solo de un hashtag.

  • -2 bytes usando 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))))

Sin 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))))
Carcigenicate
fuente
Vaya, esto realmente da un NPE para "#". Dame un segundo.
Carcigenicate