Verificador de conta de usuário VEVO


21

Muitas vezes, vemos vídeos de música no Youtube. Muitos canais do YouTube que hospedam vídeos de música são "alimentados por VEVO". Eles podem ser facilmente identificados, incorporando o VEVO nas miniaturas de vídeo e anexando o VEVO ao nome do canal.

Agora, escreva algum código para testar se uma string fornecida pelo usuário é uma conta de usuário VEVO ou não.

Requisitos para cadeias de conta de usuário válidas do VEVO:

  • Deve conter apenas caracteres maiúsculos, minúsculos e dígitos. (sem espaço em branco ou pontuação)

  • Não deve exceder 80 caracteres.

  • Deve ter substring "VEVO" no final da string

Casos de teste:

Entradas válidas:

AdeleVEVO
ConnieTalbotVEVO
SHMVEVO
justimberlakeVEVO
DJMartinJensenVEVO
test123VEVO

Entradas inválidas:

syam kapuk
jypentertainment
Noche de Brujas
testVEVO123

Obviamente, como se trata de , estou procurando o código mais curto usando qualquer linguagem de programação.


4
Boa primeira pergunta! +1
LiefdeWen

12
casos de teste: VEVOeūņīčōdēVEVO
dzaima

8
outros casos de teste sugeridos: test123VeVoe um com mais de 80 caracteres
Arnauld

6
Você deve esperar muito mais antes de aceitar a melhor resposta; a pergunta está em andamento há uma hora e há muito mais idiomas em que as pessoas podem responder!
Luke Stevens

5
"caracteres maiúsculos, minúsculos e dígitos" requer definição (eu suponho (como acredito que todos já o fizeram) que você quer dizer A-Za-z0-9; mas pode significar qualquer coisa que possa estar em maiúscula ou minúscula, por exemplo e e algarismos em outros alfabetos, por exemplo (9).
Jonathan Allan

Respostas:


9

Python 2 , 45 bytes

-3 bytes graças a Rod. -2 bytes graças a ovs.

lambda s:len(s)<81*s.isalnum()<'VEVO'==s[-4:]

Experimente online!

Uma solução regex acaba sendo mais longa.

lambda s:re.match('^[^\W_]{0,76}VEVO$',s)
import re

6

Japt v2.0a0, 20 16 bytes

Retorna 1para válido ou 0inválido. [\l\d]também funcionaria no lugar da [^\W_]mesma contagem de bytes.

è/^\w{0,76}VEVO$

Experimente | Verifique todos os casos de teste

Explicação : èconta o número de correspondências do RegEx na entrada. No Japt, a \wclasse RegEx não inclui sublinhado.


Agradável. O melhor que eu poderia fazer sem regex é;¥oB+mc)¯80 ©"VEVO"¥Ut4n
ETHproductions

@ETHproductions, belo truque com B+mc:) Aliás, se Japt2 tivesse uma classe de personagem [A-Za-z0-9], poderíamos vencer a Retina aqui! Pode até valer a pena substituir \w& \W.
Shaggy

Heh, acho que estava planejando fazer isso originalmente ... Devo voltar a trabalhar no Japt em geral: P
ETHproductions

4

JavaScript (ES6), 27 36 34 31 bytes

Economizou 2 bytes graças a @Neil e 3 bytes graças a @Shaggy

s=>/^[^\W_]{0,76}VEVO$/.test(s)

Casos de teste


2
Também não \wcorresponde a _s?
Neil

Eu acho que ((?!_)\w)economiza 2 bytes.
Neil

1
Iria [^\W_]trabalhar para uma economia de 3 byte ?
Shaggy

@Shaggy Heck. Por alguma razão, eu estava pensando que essas classes de caracteres não estavam funcionando dentro de conjuntos de caracteres. Obrigado!
Arnauld

JS não tem como ignorar o lambda? Gosta /^[^\W_]{0,76}VEVO$/.testou algo assim?
totallyhuman

4

PHP , 51 bytes

-10 bytes graças a @Ismael Miguel por usar em <?=vez de <?php echo! e removendo a tag de fechamento

<?=preg_match("/^[^\W_]{0,76}VEVO$/",fgets(STDIN));

Experimente online!

Obrigado pelas outras respostas, para não precisar escrever o regex!


1
Em vez de <?php echo, você pode fazer <?=preg_match("/^[^\W_]{0,76}VEVO$/",fgets(STDIN));.
Ismael Miguel

De nada. Você pode deixar de fora a tag PHP de fechamento. Citando a documentação: "Se um arquivo é puro código PHP, é preferível omitir a tag de fechamento do PHP no final do arquivo." ( php.net/manual/en/language.basic-syntax.phptags.php ). Isso deve economizar mais 2 bytes. Além disso, em vez de [^\W_], basta usar \w, que é o mesmo que [a-zA-Z_].
Ismael Miguel

1
Obrigado também, tenho algumas respostas para atualizar agora!
NK1406

De nada. Um conselho: ler a documentação e familiarizar-se com ela ajudará muito.
Ismael Miguel


3

C (gcc) , 83 bytes

c,i;f(char*s){for(c=i=0;s[i];c+=!isalnum(s[i++]));c=i<81*!c*!strcmp("VEVO",s+i-4);}

Experimente online!


Não vejo nenhuma returndeclaração, como isso retorna c? Comportamento indefinido?
MD XF

@MDXF Esse é realmente um comportamento indefinido e um abuso de como o gcc usa os mesmos registros para atribuição de variáveis ​​e valores de retorno (consulte as dicas para jogar golfe em C ). Este não é portátil e não necessariamente trabalhar com outros compiladores (por exemplo, ele não funciona com clang)
scottinet

isso é muito impressionante. Como você descobriu isso?
MD XF

às vezes f ("VO" também é verdadeiro, quando antes o "VI" é armazenado; ou talvez falha
l4m2

3

Dyalog APL , 47 bytes

{0::0⋄(∧/(1(819⌶)t)∊⎕A,⎕D)∧77>≢t←,∘'VEVO'⍣¯1⊢⍵}

Experimente online!

Uma solução de regex pura tem 32 bytes , mas também é muito mais chata do que essa abordagem.

{0::0⋄(∧/(1(819⌶)t)∊⎕A,⎕D)∧77>≢t←,∘'VEVO'⍣¯1⊢⍵} a dfn with right arg '⍵'
 0::0                                          on error, return 0
                                 ,∘'VEVO'       a train that appends VEVO
                                         ⍣¯1    apply it -1 times
                                               on '⍵'
                                                and error if impossible (which returns 0)
                               t               save on variable 't'
                                               get the length of that
                           77>                  if that's smaller than 77
                          ∧                     and
         (1(819I)t)                              [for each of] 't' uppercased
                   ∊⎕A,⎕D                        is it in the uppercase alphabet concatenated with the digits
       ∧/                                        reduced by and

Em vez de usar ⍣¯1para verificar VEVOe precisar do protetor dfn, você pode fazer 'VEVO'≡¯4↑⍵. Mudar um pouco as coisas me deixa com um pouco de {('VEVO'≡¯4↑⍵)∧∧/⍵∊⎕D,⎕A,(819⌶)⎕A}
dificuldade

@Cowsquack sim, eu poderia ter esquecido .. Há outras maneiras melhores de fazer este desafio embora (ie Eriks resposta) e eu como esta ideia: p
dzaima

3

Grime , 13 bytes

e`n{-76"VEVO"

Experimente online!

Nada extravagante aqui. Combine a eentrada ntire com o padrão: no máximo 76 ncaracteres alfa uméricos, seguidos pela sequência VEVO. Imprime 1para correspondência e 0sem correspondência. Lembrei-me de que a última cotação poderia ser removida no final da linha, mas aparentemente apenas causa um erro de análise.


3

C # (.NET Core) , 87 + 18 = 105 bytes

Experimente online!

a=>a.Where(x=>char.IsLetterOrDigit(x)).Count()==a.Length&a.Length<81&a.EndsWith("VEVO")

Isso não falharia se a entrada contivesse caracteres não alfanuméricos?
Shaggy

@ Shagy Você está certo, vai corrigir um pouco mais tarde.
usar o seguinte código

Verifiquei com o TIO e descobri que a entrada "ConnieTalbotVEVO" (que deveria ser uma entrada válida) foi declarada falsamente como entrada inválida.
precisa saber é o seguinte

@BagasSanjaya É porque eu coloquei abas depois no caso de teste, retirei as abas e será igual ao caso de teste acima e funcionará.
LiefdeWen

73 + 18: a=>a.All(x=>char.IsLetterOrDigit(x)&x<123)&a.Length<81&a.EndsWith("VEVO")somente letras ASCII ou 67 + 18: a=>a.All(x=>char.IsLetterOrDigit(x))&a.Length<81&a.EndsWith("VEVO")com suporte a Unicode
dg3 22/12

2

> <> , 147 125 bytes

!\i:0(?^1[::::::"/9@Z`z"!
;>{(?;{(?v{(?;{(?v{(?;{(?v
 ~l1-?!v >       > !|!: !<
;v    ]/~l99*-0(?!;4["OVEV"{-?;{-?;{-?;{-?;1n

Experimente online!

> <> , 147 bytes

Experimente online!

Isso imprime 1 se a sequência de entrada for válida e nada para uma entrada inválida.

Editar 1: Alteradas as verificações alfanuméricas para usar intervalos em vez de comparar com cada caractere. (economizando 22 bytes)


No momento, não tenho tempo para jogar isso, mas tenho certeza de que você pode perder bytes fazendo comparações com códigos de caracteres. A essência disso seria rejeitar coisas menores que '0' e maiores que 'z' e depois rejeitar coisas entre '9' e 'A', bem como entre 'Z' e 'a'.
cole

@ cole: - Eu não estava no meu PC para mudar isso ontem após o post, mas você está certo, as comparações cortam um pouco. Tenho certeza de que, se você digitalizar o código, poderá deixar alguns bytes extras.
Teal pelican

2

Bash, 53 26 30 bytes

[[ $1 =~ ^[^\W_]{0,76}VEVO$ ]]

Código de saída 0 para resultados VALID e 1 para resultados INVALID.

Ainda trabalhando com 80 caracteres ou menos.

-27 bytes de remoção de saída, graças a @KeyWeeUsr

+4 bytes, regex fixo (igual a todos os outros)

Experimente online!


Você pode apenas echo 1ser verdadeiro, ou apenas ir sem nenhum eco. Não há necessidade de repetir nada, pois você ainda termina com um código de saída com o qual realmente verifica &&e #||
KeyWeeUsr

Ok, não tinha certeza de que tipo de saída (se houver) era necessária. A pergunta realmente não disse.
Provavelmente

A idéia de 'verdade' é explicada aqui codegolf.meta.stackexchange.com/q/2190/16658 e geralmente é implícita universalmente, a menos que seja especificado de outra forma
Sirenes

Isso não produz nada no TIO. Além disso, seu RegEx permite sublinhados, o que não deveria. E você não está verificando o comprimento. Exigimos que as soluções sejam totalmente funcionais aqui, os trabalhos em andamento não devem ser publicados. Eu recomendo excluí-lo até que você possa resolver os problemas. (Em uma nota relacionada, por que as pessoas upvote soluções que claramente não fazer o trabalho?)
Shaggy

@Shaggy A saída é via código de saída.
totallyhuman

2

> <> , 101 89 83 81 94 bytes

Editar: Alterado para a verificação de caracteres não alfanuméricos em vez de alfanuméricos. Voltei porque esqueci de verificar entre Z e a. Obrigado @Emigna. Rasgue esses bytes perdidos

Edit 2: Além disso, eu posso simplesmente me livrar daqueles}}}}. Obrigado Teal pelican por isso e encontrando o problema com o TIO

Editar 3: substituiu um ~~~ por ap

!\i::0(?v:::"/")$":"(*$:"`")$"{"(*+$:"@")$"["(*+?
0/?("S"l/
l/"VEVO"[4pn?$0(6
!\{-?vl?
1/;n0/n

Não sei por que isso não funcionará no TIO, mas funciona bem aqui . O problema era que os comandos {} no TIO não funcionam para uma lista vazia. Experimente aqui

Como funciona

!\i::0(?v:::"/")$":"(*$:"`")$"{"(*+$:"@")$"["(*+?
0/....../
......... Checks each input is alphanumeric
...       If any isn't, print 0 and exit with an error
...

...
0/?("S"l/ Checks if there are more than 80 characters
...       If so, print 0 and exit with an error
...
...

...
...
l/"VEVO"[4pn?$0(6 Check if the input is less than 4 characters
...               If so, print 0 and exit with an error
...

...
...
./"VEVO"[4pn?$0(6 Take the last 4 characters of the input into a new stack (first time I've actually used [)
...               Add "VEVO" to the stack to compare
...

...
0/....../n
........V
!\{-?vl?  Check if the last 4 characters are VEVO
1/;n0/n   Print 1 and exit with an error if so, else print 0 and exit

Por consistência, substituindo o; na última linha com uma instrução inválida, torna todas as saídas um erro.


Acredito que seu erro de TIO pode ser como funciona com a ordenação na divisão de pilha final. TIO LINK AQUI Tendo uma bagunça no TIO, você pode mudar para isso.
Teal pelican

Obrigado @Tealpelican. Corrigido isso e matou mais alguns bytes #
Jo King

Está faltando a verificação de caracteres entre "Z" e "a".
Emigna

@Emigna Opa, obrigado! Fixo!
Jo King

2

C ++, 129 105 102 bytes

Graças a outras respostas que me mostraram que posso contar o número de caracteres
-2 bytes graças a Zacharý

#include<regex>
int v(std::string s){return std::regex_match(s, std::regex("[a-zA-Z0-9]{0,76}VEVO"));}

TIO LINK


Onde está o link do TIO na sua resposta? Eu gostaria de testar seu código ...
Bagas Sanjaya

Perdoe-me se isso é uma falta de conhecimento de C ++. Você pode remover a variável re apenas ter o regex dentro da chamada para std::regex_match?
Zachary

Há um espaço desnecessário após a vírgula
Zachary

Você pode remover a vírgula o espaço após a vírgula.
Zacharý



1

Java (OpenJDK 8) , 37 36 bytes

Resposta bastante simples usando alguns regex adorável.
Possivelmente, a resposta Java mais curta que eu já fiz.
-1 bytes graças a Neil na resposta Javascript

w->w.matches("((?!_)\\w){0,76}VEVO")

Experimente online!





1

V , 17 bytes

ø^¨áüä©û,76}VEVO$

Experimente online!

Hexdump:

00000000: f85e a8e1 fce4 a9fb 2c37 367d 5645 564f  .^......,76}VEVO
00000010: 24                                       $

Regexes compactadas para a vitória!

ø                   " Count the number of matches of
 ^                  "   The beginning of the line
  ¨áüä©             "   A letter or number...
       û,76}        "   From 0 to 76 times...
            VEVO    "   Followed by "VEVO"
                $   "   At the end of the line

1

Ruby -n, 22 + 1 = 23 bytes

p~/^[^\W_]{0,76}VEVO$/

Saída 0se verdadeira, nilse falsa

Experimente online!

Usando o mesmo regex chato que todo mundo.





1

Perl 5 , 35 29 + 1 (-a) = 30 bytes

-6 bytes graças a ETHproductions

Adicionado 4 bytes. Não viu que o sublinhado não era permitido.

Este é o meu primeiro golfe, então espero que eu tenha feito certo.

Retorna 1 se válido, 0 se não.

print/^[^\W_]{0,76}VEVO$/?1:0

Experimente online!


1
Bem-vindo ao PPCG! Você pode remover o espaço em branco print/^\w{1,76}VEVO$/?1:0
externo

+0converte booleano de correspondência em número, em vez de ?1:0economiza 2 bytes. Ligando com -pleimpressões $_para você. Assim: perl -ple '$_=/^[^\W_]{0,76}VEVO$/+0'. 25 bytes. Se você deseja obter espaços em branco em linhas não correspondentes, $_=/^[^\W_]{0,76}VEVO$/é 23 bytes.
Phil H

0

Planilhas Google, 33 bytes

Função de planilha anônima que leva entrada do intervalo A1e saídas para a célula chamadora

=RegexMatch(A1,"^[^\W_]{0,76}VEVO

Onde está o suporte de fechamento?
Bagas Sanjaya

O @BagasSanjaya é uma das coisas maravilhosas do Planilhas Google, pois preenche automaticamente cadeias de caracteres e grupos não fechados. Assim, quando este é colado em uma célula e você clicar fora da célula ou pressione enter GS converte isso =RegexMatch(A1,"^[^\W_]{0,76}VEVO")sem qualquer feedback para o usuário e executa
Taylor Scott

-1

Clojure , 146 bytes

(fn[u](let[c count](and(<(c u)81)(=(c(filter #(let[i(int %)](or(< 47 i 58)(< 64 i 91)(< 96 i 123)))u))(c u))(clojure.string/ends-with? u"VEVO"))))

Experimente online!

Isso seria muito mais curto usando um regex, mas achei que fazê-lo manualmente seria mais interessante.

(defn vevo? [username]
  (and (< (count username) 81)

       ; Filter out the illegal characters, then check if the length is the same as the original string
       (= (count (filter #(let [i (int %)]
                            ; Make sure the char code is in the valid ranges
                            (or (< 47 i 58) (< 64 i 91) (< 96 i 123)))
                         username))
          (count username))

       (clojure.string/ends-with? username "VEVO")))

Algum link TIO para teste?
Bagas Sanjaya

@BagasSanjaya Posso adicionar um daqui a pouco. Parece que adicionar links TIO agora é padrão. Eles eram opcionais da última vez que usei o site com frequência, mas agora todos estão adicionando-os.
Carcigenicate

@BagasSanjaya Adicionei um link. Infelizmente, o TIO parece quebrado. Não consegue encontrar a ends-with?função, mesmo que faça parte da biblioteca padrão.
Carcigenicate
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.