Kontroler konta użytkownika VEVO

21

Często oglądamy teledyski na Youtube. Wiele kanałów YouTube, na których znajdują się teledyski, jest „obsługiwanych przez VEVO”. Można je łatwo zidentyfikować, osadzając VEVO w miniaturach filmów i dodając VEVO do nazwy kanału.

Teraz napisz kod, aby sprawdzić, czy ciąg podany przez użytkownika jest kontem użytkownika VEVO, czy nie.

Wymagania dotyczące prawidłowych ciągów kont użytkowników VEVO:

  • Może zawierać tylko wielkie i małe litery oraz cyfry. (bez białych znaków i interpunkcji)

  • Nie może przekraczać 80 znaków.

  • Musi mieć podciąg „VEVO” na końcu łańcucha

Przypadki testowe:

Prawidłowe dane wejściowe:

AdeleVEVO
ConnieTalbotVEVO
SHMVEVO
justimberlakeVEVO
DJMartinJensenVEVO
test123VEVO

Nieprawidłowe dane wejściowe:

syam kapuk
jypentertainment
Noche de Brujas
testVEVO123

Oczywiście, ponieważ jest to , szukam najkrótszego kodu w dowolnym języku programowania.

Bagas Sanjaya
źródło
4
Ładne pierwsze pytanie! +1
LiefdeWen
12
przypadki testowe: VEVOorazūņīčōdēVEVO
dzaima,
8
inne sugerowane przypadki testowe: test123VeVoi jeden z ponad 80 znakami
Arnauld
6
Powinieneś poczekać dużo dłużej, zanim zaakceptujesz najlepszą odpowiedź; pytanie pojawiło się dopiero od godziny i jest o wiele więcej języków, na które ludzie mogą odpowiedzieć!
Luke Stevens,
5
„wielkie litery, małe litery i cyfry” wymagają zdefiniowania (zakładam (jak sądzę, jak wszyscy już to zrobiły), że masz na myśli A-Za-z0-9; ale może to oznaczać wszystko, co może być pisane dużymi lub małymi literami, ponieważ przykład i cyfry w innych alfabetach, na przykład (9)
Jonathan Allan

Odpowiedzi:

9

Python 2 , 45 bajtów

-3 bajty dzięki Rod. -2 bajty dzięki ovs.

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

Wypróbuj online!

Rozwiązanie wyrażenia regularnego okazuje się być dłuższe.

lambda s:re.match('^[^\W_]{0,76}VEVO$',s)
import re
całkowicie ludzki
źródło
6

Japt v2.0a0, 20 16 bajtów

Zwraca 1za ważne lub 0za nieprawidłowe. [\l\d]działałby również zamiast [^\W_]tej samej liczby bajtów.

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

Wypróbuj | Sprawdź wszystkie przypadki testowe

Objaśnienie : èzlicza liczbę dopasowań RegEx na wejściu. W Japt \wklasa RegEx nie zawiera podkreślenia.

Kudłaty
źródło
Niezłe. Najlepsze, co mogę zrobić bez wyrażenia regularnego, to;¥oB+mc)¯80 ©"VEVO"¥Ut4n
ETHproductions
@ETHproductions, fajna sztuczka z B+mc:) Przy okazji, gdyby Japt2 miał klasę postaci [A-Za-z0-9], moglibyśmy pokonać Retinę tutaj! Może nawet warto nadpisać \w& \W.
Kudłaty
Heh, myślę, że tak naprawdę planowałem to zrobić pierwotnie ... powinienem wrócić do pracy nad Japtem w ogóle: P
ETHproductions
4

JavaScript (ES6), 27 36 34 31 bajtów

Zaoszczędzono 2 bajty dzięki @Neil i 3 bajty dzięki @Shaggy

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

Przypadki testowe

Arnauld
źródło
2
Nie \wpasuje też do _s?
Neil,
Myślę, że ((?!_)\w)oszczędza 2 bajty.
Neil,
1
Czy [^\W_]zadziałałoby na oszczędności 3 bajtów ?
Kudłaty
@Shaggy Heck. Z jakiegoś powodu myślałem, że takie klasy postaci nie działają w zestawach znaków. Dzięki!
Arnauld,
Czy JS nie ma możliwości pominięcia lambda? Lubisz /^[^\W_]{0,76}VEVO$/.testczy coś?
całkowicie ludzki,
4

PHP , 51 bajtów

-10 bajtów dzięki @Ismael Miguel za użycie <?=zamiast <?php echo! i usunięcie tagu zamykającego

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

Wypróbuj online!

Dzięki za inne odpowiedzi, więc nie musiałem pisać wyrażenia regularnego!

NK1406
źródło
1
Zamiast tego <?php echomożesz zrobić <?=preg_match("/^[^\W_]{0,76}VEVO$/",fgets(STDIN));.
Ismael Miguel
Nie ma za co. Możesz pominąć zamykający tag PHP. Cytując dokumentację: „Jeśli plik jest czystym kodem PHP, lepiej pominąć znacznik zamykający PHP na końcu pliku”. ( php.net/manual/en/language.basic-syntax.phptags.php ). Powinno to zaoszczędzić jeszcze 2 bajty. Zamiast tego [^\W_]po prostu użyj \w, który jest taki sam jak [a-zA-Z_].
Ismael Miguel,
1
Dziękuję też, mam teraz kilka odpowiedzi do aktualizacji!
NK1406
Nie ma za co. Jedna rada: przeczytanie dokumentacji i zapoznanie się z nią bardzo pomoże.
Ismael Miguel
3

C (gcc) , 83 bajty

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

Wypróbuj online!

szkocki
źródło
Nie widzę żadnego returnoświadczenia, jak to się zwraca c? Nieokreślone zachowanie?
MD XF,
@MDXF Jest to rzeczywiście niezdefiniowane zachowanie i nadużycie tego, w jaki sposób gcc używa tych samych rejestrów do przypisywania zmiennych i zwracania wartości (patrz wskazówki dotyczące gry w golfa w C ). To nie jest przenośne i niekoniecznie działa z innymi kompilatorami (na przykład nie działa z clang)
scottinet
to bardzo imponujące. Jak się tego dowiedziałeś?
MD XF,
czasami f („VO” również jest prawdą, gdy wcześniej
zapisano
3

Dyalog APL , 47 bajtów

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

Wypróbuj online!

Czyste wyrażenie regularne ma 32 bajty , ale jest też o wiele bardziej nudne niż to podejście.

{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
źródło
Zamiast ⍣¯1sprawdzać VEVOi potrzebować ochrony dfn, możesz to zrobić 'VEVO'≡¯4↑⍵. Trochę się {('VEVO'≡¯4↑⍵)∧∧/⍵∊⎕D,⎕A,(819⌶)⎕A}
poruszam
@ Cowsquack tak, mogłem zapomnieć o .. Są jednak inne lepsze sposoby na wykonanie tego wyzwania (tj. Odpowiedź Eriksa) i podoba mi się ten pomysł: p
dzaima
3

Brud , 13 bajtów

e`n{-76"VEVO"

Wypróbuj online!

Nic szczególnego tutaj. Dopasuj edane wejściowe do wzorca: maksymalnie 76 nznaków alfanumerycznych, po których następuje ciąg VEVO. Drukuje 1dla dopasowania i 0bez dopasowania. Przypomniałem sobie, że ostatni cytat można usunąć na końcu wiersza, ale najwyraźniej powoduje to tylko błąd analizy.

Zgarb
źródło
3

C # (.NET Core) , 87 + 18 = 105 bajtów

Wypróbuj online!

a=>a.Where(x=>char.IsLetterOrDigit(x)).Count()==a.Length&a.Length<81&a.EndsWith("VEVO")
LiefdeWen
źródło
Czy to nie zawiódłoby, gdyby dane wejściowe zawierały znaki niealfanumeryczne?
Kudłaty
@Shaggy Masz rację, naprawię to trochę później.
LiefdeWen,
Sprawdziłem za pomocą TIO i stwierdziłem, że dane wejściowe „ConnieTalbotVEVO” (które powinny być prawidłowe) zostały fałszywie zadeklarowane jako nieprawidłowe dane wejściowe.
Bagas Sanjaya
@BagasSanjaya To dlatego, że umieszczam tabulatory po nim w przypadku testowym, wyjmuję tabulatory i będzie to to samo co powyżej testowy przypadek i będzie działać.
LiefdeWen,
73 + 18: a=>a.All(x=>char.IsLetterOrDigit(x)&x<123)&a.Length<81&a.EndsWith("VEVO")tylko litery ASCII lub 67 + 18: a=>a.All(x=>char.IsLetterOrDigit(x))&a.Length<81&a.EndsWith("VEVO")z obsługą Unicode
dg3
2

> <> , 147 125 bajtów

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

Wypróbuj online!

> <> , 147 bajtów

Wypróbuj online!

Wypisuje 1, jeśli ciąg wejściowy jest prawidłowy i nic dla niepoprawnego wejścia.

Edycja 1: Zmieniono kontrole alfanumeryczne, aby używać zakresów zamiast porównywania z każdym znakiem. (oszczędność 22 bajtów)

Pelikan turkusowy
źródło
Nie mam teraz czasu na grę w golfa, ale jestem prawie pewien, że możesz stracić bajty, porównując kody znaków. Istotą tego byłoby odrzucenie rzeczy mniejszych niż „0” i większych niż „z”, a następnie odrzucenie rzeczy między „9” a „A”, a także między „Z” a „a”.
cole
@cole: - Nie było mnie na komputerze, żeby zmienić to wczoraj po poście, ale masz rację, porównania trochę ucięły. Jestem pewien, że jeśli przejrzysz kod, możesz usunąć dodatkowe bajty.
Teal pelikan
2

Bash, 53 26 30 bajtów

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

Wyjdź z kodu 0 dla WAŻNYCH wyników i 1 dla NIEPRAWIDŁOWYCH wyników.

Nadal pracuję na 80 lub mniej znaków.

-27 bajtów od usunięcia danych wyjściowych dzięki @KeyWeeUsr

+4 bajty, naprawiono wyrażenia regularne (tak samo jak wszyscy inni)

Wypróbuj online!

Prawdopodobnie
źródło
Możesz po prostu echo 1na prawdę lub po prostu przejść bez echa. Nie ma potrzeby powtarzania czegokolwiek, ponieważ nadal otrzymujesz kod wyjścia, który faktycznie sprawdzasz &&i||
KeyWeeUsr
Okej, nie byłem pewien, jaki rodzaj danych wyjściowych (jeśli w ogóle) był wymagany. Pytanie tak naprawdę nie brzmiało.
Prawdopodobnie
Pojęcie „prawdy” jest wyjaśnione tutaj codegolf.meta.stackexchange.com/q/2190/16658 i ogólnie jest implikowane powszechnie, chyba że określono inaczej
Sirens,
To nie wyświetla niczego w TIO. Ponadto Twój RegEx pozwala na podkreślenia, których nie powinien. I nie sprawdzasz długości. Wymagamy, aby rozwiązania były tutaj w pełni funkcjonalne, prace w toku nie powinny być publikowane. Zalecam usunięcie go, dopóki nie rozwiążesz problemów. (W powiązanej notatce, dlaczego ludzie głosują za rozwiązaniami, które najwyraźniej nie działają?)
Kudłaty
@Shaggy Dane wyjściowe pochodzą z kodu wyjścia.
całkowicie ludzki,
2

> <> , 101 89 83 81 94 bajtów

Edycja: Przełączono na sprawdzanie znaków niealfanumerycznych zamiast alfanumerycznych. Odsunięto, bo zapomniałem sprawdzić między Z i a. Dzięki @Emigna. Zgrywaj te utracone bajty

Edycja 2: Mogę też całkowicie się ich pozbyć}}}}. Dzięki Teal Pelikan za to i znalezienie problemu z TIO

Edycja 3: zastąpiono ~~~ ap

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

Nie wiem, dlaczego to nie zadziała w TIO, ale tutaj działa dobrze . Problem polegał na tym, że polecenia {} w TIO nie działają dla pustej listy. Wypróbuj tutaj

Jak to działa

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

Dla spójności, zastępując; w ostatnim wierszu z niepoprawną instrukcją powoduje, że każde wyjście jest błędem.

Jo King
źródło
Uważam, że Twój błąd TIO może polegać na tym, jak działa z kolejnością podziału końcowego stosu. TIO LINK TUTAJ Mając bałagan w TIO, możesz to zmienić na to.
Pelikan
Dzięki @Tealpelican. Naprawiono to i zabito jeszcze kilka bajtów
Jo King
Brakuje sprawdzenia znaków między „Z” a „a”.
Emigna
@Emigna Ups, dzięki! Naprawiony!
Jo King,
2

C ++, 129 105 102 bajtów

Dzięki innym odpowiedziom, które pokazały mi, że
dzięki Zacharýmu mogę policzyć liczbę znaków -2 bajty

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

TIO LINK

HatsuPointerKun
źródło
Gdzie jest link TIO przy twojej odpowiedzi? Chciałbym przetestować Twój kod ...
Bagas Sanjaya,
Wybacz mi, jeśli to brak znajomości C ++. Czy możesz przenieść usunąć zmienną ri po prostu mieć regex w wywołaniu std::regex_match?
Zacharý
Po przecinku jest niepotrzebne miejsce
Zacharý
Możesz usunąć przecinek spację po przecinku.
Zacharý
1

Java (OpenJDK 8), 37 36 bytes

Pretty simple answer using some lovely regex.
Quite possibly the shortest Java answer I've ever done.
-1 bytes thanks to Neil on the Javascript answer

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

Try it online!

Luke Stevens
źródło
1

Haskell, 75 bytes

-2 bytes thanks to user28667.

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

Try it online!

totallyhuman
źródło
1
-2 bytes if you use drop(length s-4) and extract length s
user28667
1

V, 17 bytes

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

Try it online!

Hexdump:

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

Compressed regexes for the win!

ø                   " 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
źródło
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
źródło
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
źródło
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
źródło
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.
źródło
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
źródło
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
źródło
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