VEVO User Account Checker

21

A menudo vemos videos musicales en Youtube. Muchos canales de Youtube que alojan videos musicales están "impulsados ​​por VEVO". Esos pueden identificarse fácilmente incrustando VEVO en sus miniaturas de video y agregando VEVO al nombre de su canal.

Ahora escriba algún código para probar si una cadena dada por el usuario es una cuenta de usuario VEVO o no.

Requisitos para cadenas de cuenta de usuario VEVO válidas:

  • Solo debe contener mayúsculas, minúsculas y caracteres de dígitos. (sin espacios en blanco o puntuación)

  • No debe exceder los 80 caracteres de longitud.

  • Debe tener una subcadena "VEVO" al final de la cadena

Casos de prueba:

Entradas válidas:

AdeleVEVO
ConnieTalbotVEVO
SHMVEVO
justimberlakeVEVO
DJMartinJensenVEVO
test123VEVO

Entradas inválidas:

syam kapuk
jypentertainment
Noche de Brujas
testVEVO123

Por supuesto, debido a que esto es , estoy buscando el código más corto usando cualquier lenguaje de programación.

Bagas Sanjaya
fuente
44
Buena primera pregunta! +1
LiefdeWen
12
casos de prueba: VEVOyūņīčōdēVEVO
dzaima
8
otros casos de prueba sugeridos: test123VeVoy uno con más de 80 caracteres
Arnauld
66
Debería esperar mucho más antes de aceptar una mejor respuesta; ¡la pregunta solo ha estado abierta durante una hora y hay muchos más idiomas en los que la gente podría responder!
Luke Stevens
55
"caracteres en mayúsculas, minúsculas y dígitos" requiere definir (supongo (como creo que ya lo han hecho) que quiere decir A-Za-z0-9; pero podría significar cualquier cosa que pueda estar en mayúsculas o minúsculas, por ejemplo y dígitos en otros alfabetos, por ejemplo (9).
Jonathan Allan

Respuestas:

9

Python 2 , 45 bytes

-3 bytes gracias a Rod. -2 bytes gracias a los ovs.

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

Pruébalo en línea!

Una solución regex resulta ser más larga.

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

Japt v2.0a0, 20 16 bytes

Devoluciones 1válidas o 0inválidas. [\l\d]también funcionaría en lugar de[^\W_] para el mismo recuento de bytes.

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

Intentalo | Verifique todos los casos de prueba

Explicación : ècuenta el número de coincidencias del RegEx en la entrada. En Japt, la \wclase RegEx no incluye guión bajo.

Lanudo
fuente
Buena esa. Lo mejor que podría hacer sin regex es;¥oB+mc)¯80 ©"VEVO"¥Ut4n
ETHproductions
@ETHproductions, buen truco con B+mc:) Por cierto, si Japt2 tuviera una clase de personaje [A-Za-z0-9], ¡podríamos vencer a Retina aquí! Incluso podría valer la pena anular \w& \W.
Shaggy
Heh, creo que estaba planeando hacer eso originalmente ... Debería volver a trabajar en Japt en general: P
ETHproductions
4

JavaScript (ES6), 27 36 34 31 bytes

Guardado 2 bytes gracias a @Neil y 3 bytes gracias a @Shaggy

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

Casos de prueba

Arnauld
fuente
2
¿No \wcoincide con _s también?
Neil
Creo que ((?!_)\w)ahorra 2 bytes.
Neil
1
¿ [^\W_]Funcionaría para un ahorro de 3 bytes ?
Shaggy
@Shaggy Heck. Por alguna razón, estaba pensando que esas clases de caracteres no funcionaban dentro de los conjuntos de caracteres. ¡Gracias!
Arnauld
¿JS no tiene alguna forma de saltarse la lambda? ¿Me gusta /^[^\W_]{0,76}VEVO$/.testo algo?
totalmente humano
4

PHP , 51 bytes

-10 bytes gracias a @Ismael Miguel por usar en <?=lugar de <?php echo! y quitando la etiqueta de cierre

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

Pruébalo en línea!

¡Gracias por las otras respuestas, así que no tuve que escribir la expresión regular!

NK1406
fuente
1
En lugar de <?php echo, puedes hacerlo <?=preg_match("/^[^\W_]{0,76}VEVO$/",fgets(STDIN));.
Ismael Miguel
De nada. Puede omitir la etiqueta PHP de cierre. Citando la documentación: "Si un archivo es código PHP puro, es preferible omitir la etiqueta de cierre de PHP al final del archivo". ( php.net/manual/en/language.basic-syntax.phptags.php ). Esto debería ahorrarte 2 bytes más. Además, en lugar de [^\W_], simplemente use \w, que es lo mismo que [a-zA-Z_].
Ismael Miguel
1
Gracias también, ¡tengo algunas respuestas para actualizar ahora!
NK1406
De nada. Un consejo: leer la documentación y familiarizarse con ella ayudará mucho.
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);}

Pruébalo en línea!

scottinet
fuente
No veo ninguna returndeclaración, ¿cómo vuelve esto c? Comportamiento indefinido?
MD XF
@MDXF Este es un comportamiento indefinido y un abuso de cómo gcc usa los mismos registros para la asignación variable y los valores de retorno (ver consejos para jugar golf en C ). Esto no es portátil y no necesariamente funciona con otros compiladores (por ejemplo, no funciona con clang)
scottinet
Eso es muy impresionante. ¿Cómo lo descubriste?
MD XF
a veces f ("VO" también es cierto, cuando antes se almacena "VI"; o tal vez falla
l4m2
3

Dyalog APL , 47 bytes

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

Pruébalo en línea!

Una solución regex pura tiene 32 bytes , pero también es mucho más aburrida que este enfoque.

{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
dzaima
fuente
En lugar de usar ⍣¯1para verificar VEVOy necesitar el dfn guard, puedes hacerlo 'VEVO'≡¯4↑⍵. Mover las cosas un poco me {('VEVO'≡¯4↑⍵)∧∧/⍵∊⎕D,⎕A,(819⌶)⎕A}
atrapa
@Cowsquack, sí, podría haberme olvidado . Sin embargo, hay otras formas mejores de hacer este desafío (es decir, la respuesta de Eriks) y me gusta esta idea: p
dzaima
3

Grime , 13 bytes

e`n{-76"VEVO"

Pruébalo en línea!

Nada lujoso aquí. eHaga coincidir la entrada ntire con el patrón: como máximo 76 ncaracteres alfanuméricos, seguidos de la cadena VEVO. Imprime 1por partido y 0sin partido. Recordé que la última cita podría eliminarse al final de la línea, pero aparentemente solo causa un error de análisis.

Zgarb
fuente
3

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

Pruébalo en línea!

a=>a.Where(x=>char.IsLetterOrDigit(x)).Count()==a.Length&a.Length<81&a.EndsWith("VEVO")
LiefdeWen
fuente
¿No fallaría esto si la entrada contiene caracteres no alfanuméricos?
Shaggy
@ Shaggy Tienes razón, lo arreglaré un poco más tarde.
LiefdeWen
Verifiqué con TIO y descubrí que la entrada "ConnieTalbotVEVO" (que debería ser una entrada válida) se declaró falsamente como una entrada no válida.
Bagas Sanjaya
@BagasSanjaya Es porque puse pestañas después en el caso de prueba, saqué las pestañas y será lo mismo que el caso de prueba anterior y funcionará.
LiefdeWen
73 + 18: a=>a.All(x=>char.IsLetterOrDigit(x)&x<123)&a.Length<81&a.EndsWith("VEVO")solo letras ASCII o 67 + 18: a=>a.All(x=>char.IsLetterOrDigit(x))&a.Length<81&a.EndsWith("VEVO")con soporte Unicode
dg3
2

> <> , 147125 bytes

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

Pruébalo en línea!

> <> , 147 bytes

Pruébalo en línea!

Esto imprime 1 si la cadena de entrada es válida y nada para una entrada no válida.

Edición 1: Cambió las comprobaciones alfanuméricas para usar rangos en lugar de comparar con cada personaje. (ahorro de 22 bytes)

Pelícano verde azulado
fuente
No tengo tiempo en este momento para jugar golf, pero estoy bastante seguro de que puede perder bytes haciendo comparaciones con los códigos de caracteres. La esencia de esto sería rechazar cosas menores que '0' y mayores que 'z' y luego rechazar cosas entre '9' y 'A', así como entre 'Z' y 'a'.
cole
@cole: - No estaba en mi PC para cambiar esto ayer después de la publicación, pero tienes razón, las comparaciones se cortaron un poco. Estoy seguro de que si escanea el código, puede eliminar algunos bytes adicionales.
Teal pelican
2

Bash, 53 26 30 bytes

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

Código de salida 0 para resultados VÁLIDOS y 1 para resultados NO VÁLIDOS.

Aún trabajando en 80 caracteres o menos.

-27 bytes desde la eliminación de la salida, gracias a @KeyWeeUsr

+4 bytes, expresión regular fija (igual que todos los demás)

Pruébalo en línea!

Probablemente
fuente
Puede simplemente echo 1por cierto, o simplemente ir sin ningún eco. No hay necesidad de repetir nada, ya que aún termina con un código de salida con el que realmente verifica &&y||
KeyWeeUsr
De acuerdo, no estaba seguro de qué tipo de salida (si la hubiera) se requería. La pregunta realmente no dijo.
Probablemente el
La idea de "verdad" se explica aquí codegolf.meta.stackexchange.com/q/2190/16658 y generalmente está implícitamente universal a menos que se especifique lo contrario
Sirenas
Esto no genera nada en TIO. Además, su RegEx permite guiones bajos, que no debería. Y no estás comprobando la longitud. Requerimos que las soluciones sean completamente funcionales aquí, los trabajos en progreso no deben publicarse. Recomiendo eliminarlo hasta que pueda solucionar los problemas. (En una nota relacionada, ¿por qué las personas votan por soluciones que claramente no funcionan?)
Shaggy
@Shaggy La salida es a través del código de salida.
totalmente humano
2

> <> , 101 89 83 81 94 bytes

Editar: se cambió a la comprobación de caracteres no alfanuméricos en lugar de caracteres alfanuméricos.Cambié de nuevo porque olvidé comprobar entre Z y a. Gracias @Emigna. Aunque rasgue esos bytes perdidos

Edición 2: Además, puedo deshacerme de esos}}}}. Gracias a Teal pelican por eso y por encontrar el problema con TIO

Edición 3: reemplazó un ~~~ con ap

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

No sé por qué esto no funcionará en TIO, pero funciona bien aquí . El problema era que los comandos {} en TIO no funcionan para una lista vacía. Pruébalo aquí

Cómo 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 consistencia, reemplazando el; en la última línea con una instrucción no válida, cada salida es un error.

Jo King
fuente
Creo que su error de TIO podría ser cómo funciona al ordenar en la división final de la pila. TIO LINK AQUÍ Tener un lío en TIO puede cambiarlo a esto.
Teal pelican
Gracias @Tealpelican. Solucioné eso y maté algunos bytes más
Jo King,
Te estás perdiendo la marca de los caracteres entre "Z" y "a".
Emigna
@Emigna Oops, gracias! ¡Fijo!
Jo King
2

C ++, 129 105 102 bytes

Gracias a otras respuestas que me mostraron que puedo contar el número de caracteres
-2 bytes gracias 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

HatsuPointerKun
fuente
¿Dónde está el enlace TIO en tu respuesta? Me gustaría probar su código ...
Bagas Sanjaya
Perdóname si esto es una falta de conocimiento de C ++. ¿Puedes mover eliminar la variable ry solo tener la expresión regular dentro de la llamada a std::regex_match?
Zacharý
Hay un espacio innecesario después de la coma
Zacharý
Puede eliminar la coma el espacio después de la coma.
Zacharý
1

Java (OpenJDK 8) , 37 36 bytes

Respuesta bastante simple usando una hermosa expresión regular.
Posiblemente la respuesta Java más corta que haya hecho.
-1 bytes gracias a Neil en la respuesta Javascript

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

Pruébalo en línea!

Luke Stevens
fuente
1

Haskell , 75 bytes

-2 bytes gracias al usuario28667.

import Data.Char
f s|l<-length s=all isAlphaNum s&&l<81&&drop(l-4)s=="VEVO"

Pruébalo en línea!

totalmente humano
fuente
1
-2 bytes si usa drop(length s-4)y extraelength s
user28667
1

V , 17 bytes

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

Pruébalo en línea!

Hexdump:

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

Regexes comprimidos para la victoria!

ø                   " 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
DJMcMayhem
fuente
1

Ruby -n, 22 + 1 = 23 bytes

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

Salida 0si es verdad,nil si es falso

Pruébalo en línea!

Usando la misma expresión regular aburrida como todos los demás.

GB
fuente
1

Swift 4 , 113 bytes

import Foundation;var f={(s:String)->Bool in s.range(of:"^[^\\W_]{0,76}VEVO$",options:.regularExpression) != nil}

Pruébalo en línea!

Zeke Snider
fuente
1

AWK , 23 bytes

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

Pruébalo en línea!

Muestra el nombre de la cuenta si es válido y no muestra nada si no es válido

Noskcaj
fuente
1

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

-6 bytes gracias a ETHproductions

Se agregaron 4 bytes. No vi que el subrayado no estaba permitido.

Este es mi primer golf, así que espero que lo haya hecho bien.

Devuelve 1 si es válido, 0 si no.

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

Pruébalo en línea!

Geoffrey H.
fuente
1
Bienvenido a PPCG! Puede eliminar espacios en blanco extraños para reducir a 25 (+1) bytes:print/^\w{1,76}VEVO$/?1:0
ETHproductions
+0convierte match bool en número, en lugar de ?1:0guardar 2 bytes. Llamando con -plehuellas $_para ti. Por lo tanto: perl -ple '$_=/^[^\W_]{0,76}VEVO$/+0'. 25 bytes. Si está contento de obtener espacios en blanco en líneas que no coinciden, $_=/^[^\W_]{0,76}VEVO$/es de 23 bytes.
Phil H
0

Hojas de cálculo de Google, 33 bytes

Función de hoja de trabajo anónima que toma entrada del rango A1y salidas a la celda que llama

=RegexMatch(A1,"^[^\W_]{0,76}VEVO
Taylor Scott
fuente
¿Dónde está el corchete de cierre?
Bagas Sanjaya
@BagasSanjaya es una de las cosas maravillosas de Google Sheets, autocompleta cadenas y grupos no cerrados. Entonces, cuando esto se pega en una celda y hace clic fuera de la celda o presiona enter GS lo convierte =RegexMatch(A1,"^[^\W_]{0,76}VEVO")sin ningún comentario al usuario y ejecuta
Taylor Scott el
-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"))))

Pruébalo en línea!

Esto sería mucho más corto usando una expresión regular, pero pensé que hacerlo manualmente sería más interesante.

(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")))
Carcigenicate
fuente
¿Algún enlace TIO para probar?
Bagas Sanjaya
@BagasSanjaya Puedo agregar uno de a poco. Parece que agregar enlaces TIO son estándar ahora. Eran opcionales la última vez que usé el sitio con frecuencia, pero ahora todos los están agregando.
Carcigenicate
@BagasSanjaya Agregué un enlace. Lamentablemente, TIO parece roto. No puede encontrar la ends-with?función, aunque sea parte de la biblioteca estándar.
Carcigenicate