#Hashtag_or_not


25

In questa sfida di golf del codice, verifichi gli hashtag!

#What_your_code_should_do

L'input è una stringa. Emette un valore di verità se è un hashtag valido e un valore di falsa in caso contrario.

Definiamo una stringa come un hashtag valido se ...

  • Inizia con un hash ( #).
  • Non ha un numero subito dopo l'hashtag (ad es. #2016USElectionNon è un hashtag valido).
  • Non ha "caratteri speciali" (ovvero qualsiasi carattere che non sia un alfabeto, un trattino basso ( _) o un numero).

Si può presumere che l'input contenga solo caratteri ASCII. (Sarebbe ingiusto se facessimo anche Unicode.)

#Regole

Si applicano le regole di base del .

#Examples

Truthy:

#
#e
#_ABC 
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

Falsy:

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

10
È #davvero un hashtag valido?
Adám,

4
È #öäüvalido?
Chrki,

7
#non è un hashtag valido da nessun sistema, Facebook o Twitter, ma infrange anche le regole stabilite, anche se non sono sicuro che #_ABC sia nuovamente valido su di loro, ma non ne sono certo.
Martin Barker,

3
Suppongo an alphabetsignifichi ASCII maiuscola o minuscola? cioè abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?
Rɪᴋᴇʀ

7
Un # non è un hashtag. È un hash. Seguito da una stringa è ciò che le reti di social media chiamano hashtag. È un tag, che inizia con un hash.
i-CONICA,

Risposte:


19

Retina , 12 byte

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

Stampa 1per hashtag e 0altro.

Provalo online! (La prima riga abilita una suite di test separata da avanzamento riga.)

Non c'è molto da spiegare qui, questa è un'implementazione piuttosto letterale della definizione: ^e $sono solo ancore che assicurano che la corrispondenza copra l'intera stringa, #controlla che la stringa inizi con una #, (?!\d)assicura che il carattere successivo non sia una cifra (senza avanzare la posizione del motore regex), \w*controlla che possiamo raggiungere la fine della stringa con zero o più lettere, cifre o caratteri di sottolineatura.

Per impostazione predefinita, Retina conta il numero di corrispondenze della regex data, motivo 1per cui ciò fornisce tag hash validi e in 0altro modo.


In Perl, (?!\d)è (?=\D)... ma non so come hai scritto Retina. È possibile utilizzare (?\D)senza il =e salvare un byte? (In caso contrario, vale la pena modificare la lingua, quindi è fattibile?)
msh210

2
@ msh210 (?!\d)è diverso dal fatto (?=\D)che quest'ultimo richiede un carattere dopo la posizione corrente mentre il primo è soddisfatto della fine della stringa. Indipendentemente da ciò, al momento non è possibile regolare il sapore di regex (dato che sto solo consegnando la regex al motore regex di .NET), ma apportare tali modifiche è sulla roadmap da qualche parte (molto lontano) lungo la linea.
Martin Ender,

1
Detto questo, non credo che renderò =facoltativo. L'intera (?...)sintassi è stata scelta per l'estensibilità, in quanto il carattere dopo ?non è mai facoltativo e determina che tipo di gruppo sia, e non credo di voler rinunciare a tale estensibilità.
Martin Ender,

(re il tuo primo commento) Duh, certo, avrei dovuto annotarlo. Ma è irrilevante per questa risposta. (per il tuo secondo) Sì, ha senso. Dopotutto c'è anche (?{e (??e (?<(sia per catturare i gruppi che per il lookbehind) e (?-e (?1e ovviamente il basic (?:. E forse alcuni mi sono perso.
msh210

6

Perl, 22 byte

21 byte codice +1 per -p

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

Stampa 1 se è un hashtag valido, altrimenti stringa vuota.

uso

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

Salvato 2 byte grazie per Martin Ender (e altri 4 usando il suo metodo lookaround )


Perl, 18 byte

17 byte codice +1 per -p

Usando il lookaround di Martin questo può essere molto più breve!

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

Hai copiato quello di Martin e l'hai modificato, giusto?

@MatthewRoh La seconda risposta usa il meccanismo di Martin sì. Ha detto che potevo usarlo, ma non volevo che fosse la mia risposta principale perché non me ne sono inventato io! L'ho aggiunto per il confronto. Retina batte ancora facilmente Perl in questo tipo di sfida!
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>


5

C, 80 byte

La funzione f()accetta la stringa come argomento e modifica int *bin 1 o 0 per indicare verità / falsa.

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

Se la stringa ha sempre almeno un carattere (ovvero mai una stringa vuota), un byte può essere rasato per 79 byte:

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

5

Python 3, 41 byte

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

Questo dovrebbe andare assolutamente bene. Dato che gli oggetti match sono veritieri ed Noneè falso, penso che lasciar perdere bool()sia ok.
Lynn,

Sì, ci ho pensato, grazie per averlo chiarito!
Gábor Fekete,

Questo genera valore vero anche per "#fix me Gábor". A proposito, vedo che le regole vengono ignorate anche da altri, ma questo abbiamo usato per considerare uno snippet, che di solito non viene accettato come risposta a meno che la domanda non lo consenta esplicitamente.
arte

Grazie, l'ho riscritto per gestire il caso che hai scritto e renderlo una funzione lambda.
Gábor Fekete,

2
Che ne dici re.compile('#(?!\d)\w*$').match? È accettabile rilasciare il f=, BTW.
Lynn,

4

Brachylog , 55 byte

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

Questo non usa regex.

Spiegazione

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 byte

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

L' #essere Trueucciso me qui, ho dovuto elencare la stringa per evitare un errore di indice sull'ingresso singolo carattere.


1
+1. Bello! Ho completamente dimenticato il isalpha()metodo sulla mia risposta py3: D "#" essendo vero, mi ha anche distrutto.
Yytsi,

4

PowerShell v2 +, 25 byte

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

Usando il regex di Martin , appena concluso nell'operatore di PowerShell -matchaccoppiato con l'input $args. Per i valori di verità / falsità, questo restituirà la stringa stessa su una corrispondenza (un valore di verità) o nulla su una non corrispondenza (un valore di falsità). Questo perché quando un operatore di confronto viene applicato a un array, restituisce tutto ciò che soddisfa tale operatore.

Un paio di esempi (racchiusi in un [bool]cast per rendere più chiaro l'output):

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 byte

6 9 byte salvati grazie a @MartinEnder .

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

Funzione. Prende una stringa come input e restituisce Trueo Falsecome output. Abbastanza semplice, corrisponde solo alla regex /#(?!\d)\w*/.


Ho motivo di credere che questo non funzionerà per input come hello#worlddal momento che non hai ancore di inizio e fine stringa. Non conosco Mathematica, quindi non ne sono sicuro.
Value Ink,

Va bene, posso conviverci. Prendi il tuo +1
Value Ink il

3

Dyalog APL , 22 20 byte

Senza RegEx:

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

-2 grazie a ngn


1
Oh wow. Ci sono ancora persone che conoscono APL. Sono passati 37 anni da quando l'ho usato!
Auspex,

@Auspex APL è ben funzionante, ma in quegli anni sono state aggiunte poche funzionalità.
Adám,

3

Python 2, 79 byte

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

Primo tentativo di golf. Versione non golfata:

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

Bella risposta, e benvenuta nel sito!
DJMcMayhem

3

Ottava, 37 56 54 43 byte

Grazie a @LuisMendo per aver rimosso 8 byte!

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

Non molto da golf, ma molto integrato.
Modifica: il codice originale ha accettato le stringhe senza '#' iniziale. Immagino che avrei dovuto rimanere bloccato con regex.

Suite di test su ideone .


3

Python3 - 156 128 byte

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 soluzione che non utilizza regex. 0 è falso e ogni altro valore è vero.

Grazie a @LeakyNun per aver salvato i byte!


@LeakyNun Ho dovuto rimuovere il +0dopo n[1:], ma purtroppo ancora non ha funzionato: / Ho dato false a "#d".
Yytsi,

@LeakyNun continua a non funzionare :( Ancora una volta, ho dovuto rimuovere +0ma non riesce su "#d". L'ho provato su Python3. Non sono sicuro che funzionerà su Python2
Yytsi

@LeakyNun Semplicemente falso.
Yytsi,

@LeakyNun Genera IndexOutOfRange"#" e 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)per 128 byte. Prova che funziona
Leaky Nun,

2

Lua, 59 55 54 byte

Codice

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

Come funziona:

  1. Controlla se il resto dei personaggi può essere un identificatore Lua valido (gli identificatori in Lua seguono le stesse regole degli hashtag.)
  2. Controlla se il primo carattere è a #.

Riceve input dalla riga di comando. Stampa truese la stringa è un hashtag valido, altrimenti stampa nil.


2

Fogli Google, 30 byte

Una funzione anonima del foglio di lavoro che accetta l'input dalla cella A1lo confronta con l'espressione RE2 e invia il risultato alla cella chiamante.

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


1

Sed 19 + 2 = 21 byte

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

Questo filtra tutti i non hashtag e genera hashtag validi.

Esegui come sed -rn "/^#$|^#[a-z]\w*$/Ip". Esci con Ctrl+ D(invia EOF).


1

GNU grep, 15 + 2 = 17 byte

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

Test:

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

Produzione:

#
#e
#_ABC
#thisisanunexpectedlylongstringxoxoxoxo
#USElection2016

1

Python 3, 97 byte 70 byte 56 byte

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

(Codice modificato) Leggibile dall'uomo

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


Bella risposta, e benvenuta nel sito! Le funzioni sono anche consentite, quindi potresti accorciarlo un po 'conlambda x:all(True==[x[0]=="#",x[1].isalpha(),x[2:].isalpha()])
DJMcMayhem

Nessun problema, felice di poterti aiutare!
DJMcMayhem

1
Odio essere il portatore di cattive notizie, ma questo non fallisce per '#' , che l'OP dice che è vero? Non fallirà anche se l'hashtag contiene caratteri di sottolineatura, che sono falsi sotto isalpha?
TheBikingViking,

@TheBikingViking dispiace, cercherò di risolvere questo problema ora
Dignissimus - Spammy

2
@TheBikingViking Non è ciò che significa non competere. Non competere non è una scusa per una presentazione non valida. La procedura corretta è eliminare la risposta, correggerla, quindi ripristinarla.
Mego

1

Pyke, 19 byte

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

Provalo qui!

Soluzione rapida per stasera


1
@kenorb lo ha riavviato, eseguimi il ping se ci sono altri problemi
Blue

#123non restituisce ancora nulla, non dovrebbe restituire 0?
Kenorb,

1
Niente è un falso booleano
Blue

1

Rubino, 16 + 3 1 ( nbandiera) = 19 17 byte

Utilizza 0come verità e nilfalsità.

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

Eseguilo come ruby -ne 'p~/^#(?!\d)\w*$/'. Grazie a @manatwork per aver corretto l'errore bash durante l'esecuzione del programma.


1
Fatevi un favore e racchiudete sempre il codice tra virgolette singole. Altrimenti la shell tenterà (o anche peggio, eseguirà con successo) ogni tipo di espansione. (Per quanto riguarda il problema attuale con !, vedi Designatori di eventi in man bash.)
manatwork

1

ML standard , 121 118 107 byte

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

Provalo online! Soluzione funzionale senza usare regex. Dichiara una funzione anonima che è vincolata all'identificatore del risultato implicito it.

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

4
isAlphaNum$orelseè piuttosto minaccioso ...
cat

@cat questa potrebbe essere l'unica cosa positiva che si possa dire su operatori booleani così prolissi come orelsee andalso.
Laikoni,

2
È come AlphaNum, orelse!! ( orelse what?)
cat

Si potrebbe considerare che anche o explodealla fine sia abbastanza minaccioso ...
Laikoni,

1
SML sembra abbastanza spaventoso, non credo di poterlo gestire tutto il giorno: c
cat

1

Excel VBA, 54 byte

Funzione di finestra immediata VBE anonima che accetta input dalla cella [A1], controlla se il valore della cella corrisponde al Likemodello e restituisce Booleanla finestra immediata VBE

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



0

Lua, 39 byte

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

Copypasta semplice della descrizione della partita. Output falsinil se non hashtag, restituisce in verità hashtag in caso contrario.

Può essere abbreviato per un altro byte usando findse l'output dell'elenco di due valori (che è sincero) non infrange le regole.


Penso che questo non corrisponderà a #da solo.
Martin Ender,

@MartinEnder, ovviamente. Non dovrebbe. Nessuna delle risposte principali lo fa neanche. Anche codegolf.stackexchange.com/questions/85619/hashtag-or-not/…
Oleg V. Volkov,

Che #si tratti di un hashtag su Twitter o Facebook è irrilevante per questa sfida. Le specifiche sono molto chiare sul fatto che #dovrebbe essere considerato un hashtag ai fini di questa sfida. E mentre io non ho controllato tutte le risposte, tutto quello che ho fatto controllare non lo accetto #come un hashtag, quindi non sono sicuro che le risposte in alto ti riferisci.
Martin Ender,

0

Clojure, 130 135 132 byte

  • +5 byte per gestire un NPE che si è verificato quando la stringa consisteva solo di un hashtag.

  • -2 byte 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))))

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

Spiacenti, questo in realtà dà un NPE per "#". Dammi un secondo.
Carcigenicato il

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.