Pemeriksa Akun Pengguna VEVO

21

Kami sering melihat video musik di Youtube. Banyak saluran Youtube yang meng-host video musik "didukung oleh VEVO". Itu dapat dengan mudah diidentifikasi dengan menyematkan VEVO di thumbnail video mereka dan menambahkan VEVO ke nama saluran mereka.

Sekarang tulis beberapa kode untuk menguji apakah string yang diberikan oleh pengguna adalah akun pengguna VEVO atau tidak.

Persyaratan untuk string akun pengguna VEVO yang valid:

  • Harus hanya berisi karakter huruf besar, huruf kecil, dan digit. (tidak ada spasi atau tanda baca)

  • Panjangnya tidak boleh lebih dari 80 karakter.

  • Harus memiliki "VEVO" substring di akhir string

Kasus uji:

Input yang valid:

AdeleVEVO
ConnieTalbotVEVO
SHMVEVO
justimberlakeVEVO
DJMartinJensenVEVO
test123VEVO

Input tidak valid:

syam kapuk
jypentertainment
Noche de Brujas
testVEVO123

Tentu saja, karena ini adalah , saya mencari kode terpendek menggunakan bahasa pemrograman apa pun.

Bagas Sanjaya
sumber
4
Pertanyaan pertama yang bagus! +1
LiefdeWen
12
test-cases: VEVOandūņīčōdēVEVO
dzaima
8
kasus uji yang disarankan lainnya: test123VeVodan satu dengan lebih dari 80 karakter
Arnauld
6
Anda harus menunggu lebih lama sebelum menerima jawaban terbaik; pertanyaannya baru satu jam dan ada banyak bahasa yang bisa dijawab orang!
Luke Stevens
5
"huruf besar, huruf kecil, dan karakter digit" memerlukan pendefinisian (saya akan berasumsi (seperti, saya percaya, semua sudah melakukan) bahwa yang Anda maksud adalah A-Za-z0-9; tetapi itu bisa berarti apa saja yang mungkin menggunakan huruf besar atau kecil, untuk contoh dan dan digit dalam huruf lain, misalnya (9)
Jonathan Allan

Jawaban:

9

Python 2 , 45 byte

-3 byte terima kasih kepada Rod. -2 bytes terima kasih kepada ovs.

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

Cobalah online!

Solusi regex ternyata lebih lama.

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

Japt v2.0a0, 20 16 byte

Pengembalian 1untuk yang valid atau 0tidak valid. [\l\d]juga akan bekerja di tempat [^\W_]untuk jumlah byte yang sama.

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

Cobalah | Periksa semua test case

Penjelasan : èmenghitung jumlah kecocokan RegEx dalam input. Di Japt, \wkelas RegEx tidak termasuk garis bawah.

Shaggy
sumber
Bagus Yang terbaik yang bisa saya lakukan tanpa regex adalah;¥oB+mc)¯80 ©"VEVO"¥Ut4n
ETHproduk
@ ETHproductions, trik bagus dengan B+mc:) Omong-omong, jika Japt2 memiliki kelas karakter untuk [A-Za-z0-9], kita bisa mengalahkan Retina di sini! Bahkan mungkin layak diganti \w& \W.
Shaggy
Heh, saya pikir saya sebenarnya berencana untuk melakukan itu awalnya ... Saya harus kembali bekerja pada Japt secara umum: P
ETHproduksi
4

JavaScript (ES6), 27 36 34 31 byte

Disimpan 2 byte berkat @Neil dan 3 byte berkat @Shaggy

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

Uji kasus

Arnauld
sumber
2
Tidak \wcocok _dengan juga?
Neil
Saya pikir ((?!_)\w)menghemat 2 byte.
Neil
1
Akan [^\W_]bekerja untuk penghematan 3 byte ?
Shaggy
@Shaggy Heck. Untuk beberapa alasan, saya berpikir kelas karakter seperti itu tidak berfungsi dalam set karakter. Terima kasih!
Arnauld
Apakah JS tidak punya cara untuk melewatkan lambda? Suka /^[^\W_]{0,76}VEVO$/.testatau apalah?
totallyhuman
4

PHP , 51 byte

-10 byte berkat @Ismael Miguel untuk menggunakan <?=bukan <?php echo! dan menghapus tag penutup

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

Cobalah online!

Terima kasih atas jawaban lain jadi saya tidak perlu menulis regex!

NK1406
sumber
1
Alih-alih <?php echo, Anda bisa melakukannya <?=preg_match("/^[^\W_]{0,76}VEVO$/",fgets(STDIN));.
Ismael Miguel
Sama-sama. Anda dapat meninggalkan tag PHP penutup. Mengutip dokumentasi: "Jika file adalah kode PHP murni, lebih baik untuk menghilangkan tag penutup PHP di akhir file." ( php.net/manual/en/language.basic-syntax.phptags.php ). Ini akan menghemat 2 byte lebih banyak. Selain itu, alih-alih [^\W_], gunakan saja \w, yang sama dengan [a-zA-Z_].
Ismael Miguel
1
Terima kasih juga, saya punya beberapa jawaban untuk memperbarui sekarang!
NK1406
Sama-sama. Satu saran: membaca dokumentasi dan membiasakan diri dengannya akan banyak membantu.
Ismael Miguel
3

C (gcc) , 83 byte

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

Cobalah online!

scottinet
sumber
Saya tidak melihat returnpernyataan, bagaimana ini kembali c? Perilaku tidak terdefinisi?
MD XF
@MDXF Ini memang perilaku yang tidak terdefinisi dan penyalahgunaan bagaimana gcc menggunakan register yang sama untuk penugasan variabel dan mengembalikan nilai (lihat kiat untuk bermain golf di C ). Ini tidak portabel dan tidak harus bekerja dengan kompiler lain (misalnya tidak bekerja dengan dentang)
scottinet
itu sangat mengesankan. Bagaimana Anda mengetahui itu?
MD XF
kadang-kadang f ("VO" juga benar, ketika sebelumnya "VI" disimpan; atau mungkin kesalahan
14m2
3

Dyalog APL , 47 byte

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

Cobalah online!

Solusi regex murni adalah 32 byte , tetapi juga jauh lebih membosankan daripada pendekatan ini.

{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
sumber
Daripada menggunakan ⍣¯1untuk memeriksa VEVOdan membutuhkan penjaga dfn, Anda dapat melakukannya 'VEVO'≡¯4↑⍵. Memindahkan hal-hal sedikit membuat saya{('VEVO'≡¯4↑⍵)∧∧/⍵∊⎕D,⎕A,(819⌶)⎕A}
Kritixi Lithos
@Cowsquack ya, saya mungkin sudah lupa tentang .. Namun ada cara lain yang lebih baik untuk melakukan tantangan ini (yaitu jawaban Eriks) dan saya menyukai ide ini: p
dzaima
3

Grime , 13 byte

e`n{-76"VEVO"

Cobalah online!

Tidak ada yang mewah di sini. Cocokkan einput ntire dengan pola: paling banyak 76 nkarakter alfa umerik, diikuti oleh string VEVO. Mencetak 1untuk pertandingan dan 0tanpa pertandingan. Saya ingat bahwa kutipan terakhir dapat dihapus di akhir baris, tetapi ternyata itu hanya menyebabkan kesalahan parse.

Zgarb
sumber
3

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

Cobalah online!

a=>a.Where(x=>char.IsLetterOrDigit(x)).Count()==a.Length&a.Length<81&a.EndsWith("VEVO")
LiefdeWen
sumber
Bukankah ini akan gagal jika input berisi karakter non-alfanumerik?
Shaggy
@ Shaggy Anda benar, akan memperbaikinya nanti.
LiefdeWen
Saya telah memeriksa dengan TIO dan menemukan bahwa input "ConnieTalbotVEVO" (yang seharusnya merupakan input yang valid) secara salah dinyatakan sebagai input yang tidak valid.
Bagas Sanjaya
@BagasSanjaya Itu karena saya meletakkan tab setelah itu dalam kasus uji, mengeluarkan tab dan itu akan sama dengan kasus uji di atas dan akan bekerja.
LiefdeWen
73 + 18: a=>a.All(x=>char.IsLetterOrDigit(x)&x<123)&a.Length<81&a.EndsWith("VEVO")hanya surat ASCII atau 67 + 18: a=>a.All(x=>char.IsLetterOrDigit(x))&a.Length<81&a.EndsWith("VEVO")dengan dukungan unicode
dg3
2

> <> , 147 125 byte

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

Cobalah online!

> <> , 147 byte

Cobalah online!

Ini mencetak 1 jika string input valid dan tidak ada untuk input yang tidak valid.

Sunting 1: Mengubah pemeriksaan alfanumerik untuk menggunakan rentang daripada membandingkan setiap karakter. (hemat 22 byte)

Pelican teal
sumber
Saya tidak punya waktu sekarang untuk bermain golf ini, tapi saya cukup yakin Anda bisa kehilangan byte dengan melakukan perbandingan kode karakter. Inti dari itu adalah untuk menolak hal-hal yang kurang dari '0' dan lebih besar dari 'z' dan kemudian menolak hal-hal antara '9' dan 'A' serta antara 'Z' dan 'a'.
cole
@cole: - Saya tidak ada di PC saya untuk mengubah ini kemarin setelah posting tetapi Anda benar, perbandingan tidak terpotong sedikit. Saya yakin jika Anda memindai kode, Anda mungkin dapat menurunkan beberapa byte tambahan.
Teal pelican
2

Bash, 53 26 30 byte

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

Keluar kode 0 untuk hasil VALID dan 1 untuk hasil INVALID.

Masih bekerja pada 80 karakter atau kurang.

-27 byte dari menghapus output, terima kasih kepada @KeyWeeUsr

+4 byte, regex tetap (sama seperti orang lain)

Cobalah online!

Mungkin
sumber
Anda bisa saja echo 1benar, atau hanya pergi tanpa gema. Tidak perlu mengulang apa pun karena Anda masih memiliki kode keluar yang benar-benar Anda periksa &&dan gunakan||
KeyWeeUsr
Oke, tidak yakin apa jenis output (jika ada) yang diperlukan. Pertanyaan itu tidak benar-benar dikatakan.
Mungkin
Gagasan 'kebenaran' dijelaskan di sini codegolf.meta.stackexchange.com/q/2190/16658 dan umumnya tersirat secara universal kecuali dinyatakan sebaliknya
Sirene
Ini tidak menghasilkan apa pun di TIO. Juga, RegEx Anda memungkinkan garis bawah, yang seharusnya tidak. Dan Anda tidak memeriksa panjang. Kami membutuhkan solusi agar berfungsi penuh di sini, pekerjaan yang sedang berjalan tidak boleh diposting. Saya sarankan menghapusnya sampai Anda dapat memperbaiki masalah. (Pada catatan yang terkait, mengapa orang memilih solusi yang jelas tidak berhasil?)
Shaggy
@Shaggy Outputnya adalah melalui kode keluar.
manusiawi
2

> <> , 101 89 83 81 94 byte

Sunting: Beralih ke memeriksa untuk karakter non-alfanumerik daripada alfanumerik. Beralih kembali karena saya lupa memeriksa antara Z dan a. Terima kasih @ Emigna. Robek byte yang hilang itu

Sunting 2: Juga, saya benar-benar bisa menyingkirkan itu}}}}. Terima kasih Teal pelican untuk itu dan menemukan masalah dengan TIO

Sunting 3: diganti ~~~ dengan ap

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

Saya tidak tahu mengapa ini tidak bekerja pada TIO, tetapi berfungsi dengan baik di sini .Masalahnya adalah bahwa perintah {} di TIO tidak berfungsi untuk daftar kosong. Coba Di Sini

Bagaimana itu bekerja

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

Untuk konsistensi, mengganti; di baris terakhir dengan instruksi yang tidak valid membuat setiap output menjadi kesalahan.

Jo King
sumber
Saya percaya kesalahan TIO Anda mungkin bagaimana cara kerjanya dengan memesan pada tumpukan split yang berakhir. TIO LINK DI SINI Memiliki kekacauan di TIO Anda dapat mengubahnya ke ini.
Teal pelican
Terima kasih @Tealpelican. Memperbaiki itu dan membunuh beberapa byte lagi
Jo King
Anda melewatkan pemeriksaan untuk karakter antara "Z" dan "a".
Emigna
@Emigna Ups, terima kasih! Tetap!
Jo King
2

C ++, 129 105 102 byte

Berkat jawaban lain yang menunjukkan kepada saya bahwa saya dapat menghitung jumlah karakter
-2 byte, berkat 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
sumber
Di mana tautan TIO pada jawaban Anda? Saya ingin menguji kode Anda ...
Bagas Sanjaya
Maafkan saya jika ini adalah kurangnya pengetahuan tentang C ++. Bisakah Anda memindahkan menghapus variabel r, dan hanya memiliki regex di dalam panggilan itu std::regex_match?
Zacharý
Ada ruang yang tidak dibutuhkan setelah koma
Zacharý
Anda dapat menghapus koma spasi setelah koma.
Zacharý
1

Java (OpenJDK 8) , 37 36 byte

Jawaban yang cukup sederhana menggunakan beberapa regex yang indah.
Sangat mungkin jawaban Java terpendek yang pernah saya lakukan.
-1 byte, terima kasih kepada Neil pada jawaban Javascript

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

Cobalah online!

Luke Stevens
sumber
1

Haskell , 75 byte

-2 byte terima kasih ke user28667.

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

Cobalah online!

benar-benar manusiawi
sumber
1
-2 byte jika Anda menggunakan drop(length s-4)dan mengekstraklength s
user28667
1

Deorst , 22 byte

'^[^\W_]{0,76}VEVO$'gm

Cobalah online!

Cukup gunakan regex yang ditemukan oleh Shaggy

caird coinheringaahing
sumber
1

V , 17 byte

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

Cobalah online!

Hexdump:

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

Regex terkompresi untuk kemenangan!

ø                   " 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
sumber
1

Ruby -n, 22 + 1 = 23 byte

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

Keluaran 0jika benar, niljika salah

Cobalah online!

Menggunakan regex membosankan yang sama seperti orang lain.

GB
sumber
1

Swift 4 , 113 byte

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

Cobalah online!

Zeke Snider
sumber
1

AWK , 23 byte

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

Cobalah online!

Output nama akun jika valid, dan tidak menghasilkan apa-apa jika tidak valid

Noskcaj
sumber
1

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

-6 byte berkat ETHproductions

Menambahkan 4 byte. Tidak melihat garis bawah tidak diizinkan.

Ini golf pertama saya, jadi inilah harapan saya melakukannya dengan benar.

Mengembalikan 1 jika valid, 0 jika tidak.

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

Cobalah online!

Geoffrey H.
sumber
1
Selamat datang di PPCG! Anda dapat menghapus spasi asing untuk turun ke 25 (+1) byte:print/^\w{1,76}VEVO$/?1:0
ETHproduksi
+0mengubah bool cocok menjadi angka, bukan ?1:0, menghemat 2 byte. Memanggil dengan -plecetakan $_untuk Anda. Jadi: perl -ple '$_=/^[^\W_]{0,76}VEVO$/+0'. 25 byte. Jika Anda senang mendapatkan kosong pada baris yang tidak cocok, $_=/^[^\W_]{0,76}VEVO$/adalah 23 byte.
Phil H
0

Google Sheets, 33 Bytes

Fungsi lembar kerja anonim yang mengambil input dari jangkauan A1dan keluaran ke sel panggilan

=RegexMatch(A1,"^[^\W_]{0,76}VEVO
Taylor Scott
sumber
Di mana braket penutup?
Bagas Sanjaya
@BagasSanjaya, itulah salah satu hal luar biasa tentang Google Sheets, yang secara otomatis melengkapi string dan grup yang tidak tertutup. Jadi ketika ini disisipkan ke dalam sel dan Anda mengklik sel atau menekan enter GS mengubahnya menjadi =RegexMatch(A1,"^[^\W_]{0,76}VEVO")tanpa umpan balik kepada pengguna dan dijalankan
Taylor Scott
-1

Clojure , 146 byte

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

Cobalah online!

Ini akan jauh lebih pendek menggunakan regex, tapi saya pikir melakukannya secara manual akan lebih menarik.

(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
sumber
Adakah tautan TIO untuk pengujian?
Bagas Sanjaya
@BagasSanjaya saya bisa menambahkannya sedikit. Sepertinya menambahkan tautan TIO adalah standar sekarang. Itu opsional, terakhir kali saya sering menggunakan situs ini, tetapi sekarang semua orang menambahkannya.
Carcigenicate
@BagasSanjaya saya menambahkan tautan. Sayangnya TIO sepertinya rusak. Tidak dapat menemukan ends-with?fungsinya, meskipun itu adalah bagian dari pustaka standar.
Carcigenicate