Vérificateur de compte utilisateur VEVO

21

Nous voyons souvent des clips vidéo sur Youtube. De nombreuses chaînes Youtube qui hébergent des clips vidéo sont "propulsées par VEVO". Ceux-ci peuvent être facilement identifiés en intégrant VEVO à leurs vignettes vidéo et en ajoutant VEVO à leur nom de chaîne.

Maintenant, écrivez du code pour tester si une chaîne donnée par l'utilisateur est un compte utilisateur VEVO ou non.

Conditions requises pour les chaînes de compte d'utilisateur VEVO valides:

  • Ne doit contenir que des majuscules, des minuscules et des chiffres. (sans espace ni ponctuation)

  • Ne doit pas dépasser 80 caractères.

  • Doit avoir une sous-chaîne "VEVO" à la fin de la chaîne

Cas de test:

Entrées valides:

AdeleVEVO
ConnieTalbotVEVO
SHMVEVO
justimberlakeVEVO
DJMartinJensenVEVO
test123VEVO

Entrées non valides:

syam kapuk
jypentertainment
Noche de Brujas
testVEVO123

Bien sûr, comme il s'agit de , je recherche le code le plus court en utilisant n'importe quel langage de programmation.

Bagas Sanjaya
la source
4
Belle première question! +1
LiefdeWen
12
cas de test: VEVOetūņīčōdēVEVO
dzaima
8
autres scénarios de test suggérés: test123VeVoet un avec plus de 80 caractères
Arnauld
6
Vous devriez attendre beaucoup plus longtemps avant d'accepter une meilleure réponse; la question n'est posée que depuis une heure et il y a beaucoup plus de langues auxquelles les gens pourraient répondre!
Luke Stevens
5
"les majuscules, les minuscules et les caractères numériques" nécessitent de définir (je suppose (comme, je crois, tous l'ont déjà fait) que vous voulez dire A-Za-z0-9; mais cela pourrait signifier tout ce qui peut être en majuscules ou en minuscules, par exemple exemple et et chiffres dans d'autres alphabets, par exemple (9)
Jonathan Allan

Réponses:

9

Python 2 , 45 octets

-3 octets grâce à Rod. -2 octets grâce aux ovs.

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

Essayez-le en ligne!

Une solution regex s'avère plus longue.

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

Japt v2.0a0, 20 16 octets

Renvoie 1pour valide ou 0pour invalide. [\l\d]fonctionnerait également à la place du [^\W_]même nombre d'octets.

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

Essayez-le | Vérifier tous les cas de test

Explication : ècompte le nombre de correspondances du RegEx dans l'entrée. Dans Japt, la \wclasse RegEx n'inclut pas de soulignement.

Hirsute
la source
Joli. Le mieux que je puisse faire sans regex est;¥oB+mc)¯80 ©"VEVO"¥Ut4n
ETHproductions
@ETHproductions, bonne astuce avec B+mc:) Au fait, si Japt2 avait une classe de personnage [A-Za-z0-9], nous pourrions battre Retina ici! Pourrait même être une valeur impérieuses \wet \W.
Shaggy
Hé, je pense que je prévoyais de faire ça à l'origine ... Je devrais retourner travailler sur Japt en général: P
ETHproductions
4

JavaScript (ES6), 27 36 34 31 octets

Enregistré 2 octets grâce à @Neil et 3 octets grâce à @Shaggy

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

Cas de test

Arnauld
la source
2
Ne \wcorrespond pas _aussi bien à s?
Neil
Je pense que ((?!_)\w)sauve 2 octets.
Neil
1
Fonctionnerait [^\W_]pour une économie de 3 octets ?
Shaggy
@Shaggy Heck. Pour une raison quelconque, je pensais que ces classes de personnages ne fonctionnaient pas dans les jeux de caractères. Merci!
Arnauld
JS n'a-t-il aucun moyen de sauter la lambda? Comme /^[^\W_]{0,76}VEVO$/.testou quelque chose?
2017 à 18h02 totalement humain
4

PHP , 51 octets

-10 octets grâce à @Ismael Miguel pour avoir utilisé <?=au lieu de <?php echo! et supprimer la balise de fermeture

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

Essayez-le en ligne!

Merci pour les autres réponses, donc je n'ai pas eu à écrire l'expression régulière!

NK1406
la source
1
Au lieu de cela <?php echo, vous pouvez le faire <?=preg_match("/^[^\W_]{0,76}VEVO$/",fgets(STDIN));.
Ismael Miguel
Je vous en prie. Vous pouvez laisser de côté la balise PHP de fermeture. Citant la documentation: "Si un fichier est du code PHP pur, il est préférable d'omettre la balise de fermeture PHP à la fin du fichier." ( php.net/manual/en/language.basic-syntax.phptags.php ). Cela devrait vous faire économiser 2 octets supplémentaires. Aussi, au lieu de [^\W_], utilisez simplement \w, qui est le même que [a-zA-Z_].
Ismael Miguel
1
Merci aussi, j'ai quelques réponses à mettre à jour maintenant!
NK1406
Je vous en prie. Un conseil: lire la documentation et vous familiariser avec elle vous sera très utile.
Ismael Miguel
3

C (gcc) , 83 octets

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

Essayez-le en ligne!

scottinet
la source
Je ne vois aucune returndéclaration, comment ça se passe c? Comportement indéfini?
MD XF
@MDXF Il s'agit en effet d'un comportement indéfini et d'un abus de la façon dont gcc utilise les mêmes registres pour l'affectation des variables et les valeurs de retour (voir les conseils pour jouer au golf en C ). Ce n'est pas portable et ne fonctionne pas nécessairement avec d'autres compilateurs (par exemple, il ne fonctionne pas avec clang)
scottinet
c'est très impressionnant. Comment avez-vous découvert cela?
MD XF
parfois f ("VO" est également vrai, alors qu'avant est "VI" stocké; ou peut-être faute
l4m2
3

Dyalog APL , 47 octets

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

Essayez-le en ligne!

Une solution regex pure est de 32 octets , mais est également beaucoup plus ennuyeuse que cette approche.

{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
la source
Au lieu d'utiliser ⍣¯1pour vérifier VEVOet avoir besoin du protecteur dfn, vous pouvez le faire 'VEVO'≡¯4↑⍵. Faire bouger les choses me fait un peu{('VEVO'≡¯4↑⍵)∧∧/⍵∊⎕D,⎕A,(819⌶)⎕A}
Kritixi Lithos
@Cowsquack ouais, j'aurais peut-être oublié .. Il existe cependant de meilleures façons de relever ce défi (c'est-à-dire la réponse d'Eriks) et j'aime cette idée: p
dzaima
3

Grime , 13 octets

e`n{-76"VEVO"

Essayez-le en ligne!

Rien d'extraordinaire ici. eFaites correspondre l' entrée ntire avec le modèle: au plus 76 ncaractères alphanumériques, suivis de la chaîne VEVO. Imprime 1pour correspondance et 0pour aucune correspondance. Je me suis souvenu que la dernière citation pouvait être supprimée à la fin de la ligne, mais apparemment, cela provoque juste une erreur d'analyse.

Zgarb
la source
3

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

Essayez-le en ligne!

a=>a.Where(x=>char.IsLetterOrDigit(x)).Count()==a.Length&a.Length<81&a.EndsWith("VEVO")
LiefdeWen
la source
Cela n'échouerait-il pas si l'entrée contient des caractères non alphanumériques?
Shaggy
@Shaggy Vous avez raison, corrigerez un peu plus tard.
LiefdeWen
J'ai vérifié auprès de TIO et j'ai constaté que l'entrée "ConnieTalbotVEVO" (qui devrait être une entrée valide) a été faussement déclarée comme entrée non valide.
Bagas Sanjaya
@BagasSanjaya C'est parce que je mets des onglets après dans le cas de test, je les retire et ce sera le même que le cas de test ci-dessus et ça marchera.
LiefdeWen
73 + 18: a=>a.All(x=>char.IsLetterOrDigit(x)&x<123)&a.Length<81&a.EndsWith("VEVO")uniquement les lettres ASCII ou 67 + 18: a=>a.All(x=>char.IsLetterOrDigit(x))&a.Length<81&a.EndsWith("VEVO")avec prise en charge Unicode
dg3
2

> <> , 147 125 octets

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

Essayez-le en ligne!

> <> , 147 octets

Essayez-le en ligne!

Cela affiche 1 si la chaîne d'entrée est valide et rien pour une entrée non valide.

Édition 1: modification des vérifications alphanumériques pour utiliser des plages plutôt que de comparer avec chaque personnage. (économie de 22 octets)

Pélican bleu canard
la source
Je n'ai pas le temps pour le moment de jouer au golf, mais je suis sûr que vous pouvez perdre des octets en comparant les codes de caractères. L'essentiel serait de rejeter les choses inférieures à «0» et supérieures à «z», puis de rejeter les choses entre «9» et «A» ainsi qu'entre «Z» et «a».
cole
@cole: - Je n'étais pas sur mon PC pour changer cela hier après le post mais vous avez raison, les comparaisons sont un peu coupées. Je suis sûr que si vous parcourez le code, vous pourrez peut-être supprimer des octets supplémentaires.
Pélican bleu canard
2

Bash, 53 26 30 octets

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

Quittez le code 0 pour les résultats VALIDES et 1 pour les résultats INVALIDES.

Travaille toujours sur 80 caractères ou moins.

-27 octets de suppression de sortie, grâce à @KeyWeeUsr

+4 octets, regex fixe (comme tout le monde)

Essayez-le en ligne!

Probablement
la source
Vous pouvez juste echo 1pour vrai, ou simplement aller sans aucun écho. Il n'est pas nécessaire de faire écho à quoi que ce soit car vous vous retrouvez toujours avec un code de sortie que vous vérifiez réellement avec &&et||
KeyWeeUsr
D'accord, je ne savais pas quel type de sortie (le cas échéant) était requis. La question ne disait pas vraiment.
Probablement
L'idée de «véridique» est expliquée ici codegolf.meta.stackexchange.com/q/2190/16658 et est généralement impliquée universellement sauf indication contraire
Sirens
Cela ne produit rien sur TIO. De plus, votre RegEx autorise les soulignés, ce qu'il ne devrait pas faire. Et vous ne vérifiez pas la longueur. Nous avons besoin que les solutions soient pleinement fonctionnelles ici, les travaux en cours ne devraient pas être affichés. Je vous recommande de le supprimer jusqu'à ce que vous puissiez résoudre les problèmes. (Sur une note connexe, pourquoi les gens votent-ils pour des solutions qui ne fonctionnent clairement pas?)
Shaggy
@Shaggy La sortie se fait via le code de sortie.
2017
2

> <> , 101 89 83 81 94 octets

Modifier: basculé vers la vérification des caractères non alphanumériques plutôt que des caractères alphanumériques. Je suis revenu car j'ai oublié de vérifier entre Z et a. Merci @Emigna. Rip ces octets perdus si

Edit 2: En outre, je peux tout simplement me débarrasser de ces}}}}. Merci Pélican sarcelle pour cela et trouver le problème avec TIO

Edit 3: remplacé un ~~~ par ap

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

Je ne sais pas pourquoi cela ne fonctionnera pas sur TIO, mais cela fonctionne bien ici . Le problème était que les commandes {} dans TIO ne fonctionnent pas pour une liste vide.Essayez-le ici

Comment ça marche

!\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

Par souci de cohérence, remplacer le; dans la dernière ligne avec une instruction invalide fait chaque sortie est une erreur.

Jo King
la source
Je crois que votre erreur TIO pourrait être la façon dont cela fonctionne avec la commande sur la division de pile finale. TIO LINK ICI Ayant un désordre dans TIO, vous pouvez le changer en ceci.
Pélican bleu canard
Merci @Tealpelican. Corrigé cela et tué quelques octets de plus
Jo King
Il manque la vérification des caractères entre "Z" et "a".
Emigna
@Emigna Oups, merci! Fixé!
Jo King du
2

C ++, 129 105 102 octets

Merci à d'autres réponses qui m'ont montré que je peux compter le nombre de caractères
-2 octets grâce à 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
la source
Où est le lien TIO à votre réponse? J'aimerais tester votre code ...
Bagas Sanjaya
Pardonnez-moi si c'est un manque de connaissance du C ++. Pouvez-vous déplacer supprimer la variable ret avoir juste l'expression régulière à l'intérieur de l'appel à std::regex_match?
Zacharý
Il y a un espace inutile après la virgule
Zacharý
Vous pouvez supprimer la virgule l'espace après la virgule.
Zacharý
1

Java (OpenJDK 8) , 37 36 octets

Réponse assez simple en utilisant une belle expression régulière.
Probablement la réponse Java la plus courte que j'aie jamais faite.
-1 octets grâce à Neil sur la réponse Javascript

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

Essayez-le en ligne!

Luke Stevens
la source
1

Haskell , 75 octets

-2 octets grâce à user28667.

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

Essayez-le en ligne!

totalement humain
la source
1
-2 octets si vous utilisez drop(length s-4)et extrayezlength s
user28667
1

V , 17 octets

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

Essayez-le en ligne!

Hexdump:

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

Des regex compressés pour la victoire!

ø                   " 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
la source
1

Ruby -n, 22+1 = 23 bytes

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

Output 0 if true, nil if false

Try it online!

Using the same boring regex as everybody else.

G B
la source
1

Swift 4, 113 bytes

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

Try it online!

Zeke Snider
la source
1

AWK, 23 bytes

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

Try it online!

Outputs the account name if valid, and outputs nothing if it isn't valid

Noskcaj
la source
1

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

-6 bytes thanks to ETHproductions

Added 4 bytes. Didn't see that underscore wasn't allowed.

This is my first golf, so here's hoping I did it right.

Returns 1 if valid, 0 if not.

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

Try it online!

Geoffrey H.
la source
1
Welcome to PPCG! You can remove extraneous whitespace to get down to 25 (+1) bytes: print/^\w{1,76}VEVO$/?1:0
ETHproductions
+0 converts match bool into number, rather than ?1:0, saves 2 bytes. Calling with -ple prints $_ for you. So: perl -ple '$_=/^[^\W_]{0,76}VEVO$/+0'. 25 bytes. If you are happy to get blanks on non-matching lines, $_=/^[^\W_]{0,76}VEVO$/ is 23 bytes.
Phil H
0

Google Sheets, 33 Bytes

Anonymous worksheet function that takes input from range A1 and outputs to the calling cell

=RegexMatch(A1,"^[^\W_]{0,76}VEVO
Taylor Scott
la source
Where's the closing bracket?
Bagas Sanjaya
@BagasSanjaya that's one of the wonderful things about Google Sheets, it autocompletes unclosed strings and groups. So when this is pasted into a cell and you either click off the cell or press enter GS converts this to =RegexMatch(A1,"^[^\W_]{0,76}VEVO") without any feedback to the user and executes
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"))))

Try it online!

This would be much shorter using a regex, but I figured doing it manually would be more interesting.

(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
la source
Any TIO link for testing?
Bagas Sanjaya
@BagasSanjaya I can add one in a bit. It seems like adding TIO links are standard now. They were optional last time I used the site frequently, but now everyone's adding them.
Carcigenicate
@BagasSanjaya I added a link. Unfortunately TIO seems broken. It can't find the ends-with? function, even though that's part of the standard library.
Carcigenicate