Objektif
Tulis program atau fungsi yang memeriksa apakah nama variabel valid dan output 1 atau True
jika valid, 0,5 jika valid tetapi dimulai dengan garis bawah (_), dan 0 atau False
jika tidak valid.
Aturan
- Nama variabel dalam kebanyakan bahasa valid jika dimulai dengan garis bawah atau huruf (az, AZ, _) dan karakter lainnya adalah garis bawah, huruf, atau angka. (az, AZ, 0-9, _)
- Output 1 atau
True
jika nama variabel valid dan 0 atauFalse
jika tidak valid. - Namun, itu bukan praktik yang baik untuk memulai variabel dengan garis bawah, jadi kembalikan 0,5 jika dimulai dengan garis bawah dan namanya valid.
Uji Kasus
Memasukkan
abcdefghijklmnop
Keluaran
1
Memasukkan
_test_
Keluaran
0.5
(dimulai dengan garis bawah)
Memasukkan
123abc
Keluaran
0
(dimulai dengan angka)
Memasukkan
A_b1C_23
Keluaran
1
Memasukkan
_!
Keluaran
0
(bukan 0,5 karena tidak valid)
Memasukkan
magical pony1
Keluaran
0
(tidak ada ruang)
Celah standar berlaku.
Ini kode-golf , jadi kode terpendek menang.
Bonus: -10% jika program / fungsi Anda menghasilkan 0
string kosong ( ""
).
__init__
; juga, tidak, kelas tidak perlu sebuah__init__
tetapi biasanya memiliki satuJawaban:
JavaScript (ES6), 37 - 10% = 33,3 byte
Disimpan 4 byte berkat @ edc65
Disimpan 5,6 byte berkat @Mateon
sumber
05AB1E ,
25242019 byteKode:
Penjelasan:
Singkatnya, rumus untuk string
s
dalam pseudocode adalah:Cobalah online!
Menggunakan pengodean CP-1252 .
sumber
PHP (50 - 10% = 45)
Terima kasih kepada Schism untuk -2 :)
Bukan untuk bersaing dengan jawaban golflang, tapi saya pikir saya akan mencobanya.
Yang perlu diperhatikan adalah bahwa dalam PHP, tanpa
/u
pengubah,\w
hanya memilih huruf ASCII. Dalam beberapa bahasa lain / rasa Regex, pola ini tidak akan berfungsi.Sunting : Saya melihat banyak orang menggunakan \ w dan \ d dalam jawaban mereka, ketika mereka menggunakan bahasa yang menyertakan huruf dan angka selain ASCII. Itu BUKAN teka-teki. Mereka salah. (Belum dapat melakukan downvote / komentar, maaf perlu mengatakannya dengan cara ini.)
sumber
[a-z].../i
.\d
persis sama dengan[0-9]
.\w
persis sama dengan[A-Za-z0-9_]
developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…Retina,
30 - 10% = 2728 - 10% = 25,229 - 10% = 26,1 byteKedua versi memenuhi syarat untuk bonus, karena mereka menangani input kosong dengan benar (keluaran
0
)Saya harus memperbaiki bug yang disebabkan oleh salah satu fitur .NET regex, yang menganggap beberapa (baca sebanyak) karakter Unicode sebagai karakter "kata". Untungnya, ini hanya menghabiskan satu byte di kedua versi. Itu hanya datang untuk menambahkan pengubah untuk membuat perilaku pencocokan regex sesuai dengan standar ECMAScript. Lebih lanjut tentang itu di sini .
Versi
28byte baru28, dibuat oleh @ MartinBüttner. Terima kasih!Penjelasan
Pertama, kami memeriksa apakah input dimulai dengan garis bawah. Jika ya, input diduplikasi, dengan baris baru di antaranya. Misalnya:
_test_
->_test_\n_test_
, di mana\n
baris baru. Kemudian kita mencoba untuk mencocokkan apa pun, yang tidak dimulai dengan angka, namun diikuti oleh sejumlah "kata" karakter (a-z
,A-Z
, angka, dan garis bawah) pada setiap baris . Perhatikan bahwa jika input dimulai dengan garis bawah dan diganti menjadi dua baris, ini akan cocok dengan kedua baris. Lalu kami memeriksa apakah kami memiliki 2 pertandingan, dan menggantinya dengan0.5
. Baris kosong atau tidak valid akan selalu menghasilkan 0 kecocokan, dan nama variabel yang valid selalu menghasilkan 1 kecocokan.3031 byte versi saya sendiriPenjelasan
Pertama-tama, kami memeriksa apakah masukan dimulai dengan digit atau berisi karakter non-kata (apa pun selain
a-z
,A-Z
, angka dan garis bawah). Jika ya, itu dibuang, karena itu tidak valid. Kemudian kami memeriksa apakah itu dimulai dengan garis bawah. Jika ya, diganti dengan0.5
. Kemudian kita periksa jika dimulai dengan karakter non-digit (pada titik ini karakter pertama adalah baik0
,a-z
atauA-Z
. Hanyaa-z
danA-Z
non-digit, jelas). Jika ya, diganti dengan a1
. Kemudian kami memeriksa string kosong dan menggantinya dengan0
.Cobalah online!
Cobalah online! Versi lama
sumber
^\D.*
tahap itu bisa dimulai dengan 0? Itu aneh._
dan diganti dengan0.5
. Kemudian dimulai dengan 0.Ψ
.\w
cocok dengan karakter non-ASCII, yang seharusnya tidak dilakukan (saya sudah mencoba memberikannyaƜƝƞƟƠ
danᎳᎴᎵᎶᎷᎸᎹ
sebagai input). Saya akan membahas ini nanti. Solusi yang mungkin tampaknya diganti\w
dengan[a-zA-Z\d_]
.MATL , 27 byte
Ini berfungsi dalam versi bahasa saat ini (15.0.0) .
Input adalah string dengan tanda kutip tunggal.
Cobalah online!
Penjelasan
sumber
Pyke , 21 byte
(tidak bersaing, menambahkan pengurangan string, berbagai konstanta string)
Penjelasan:
sumber
Python 3, 36 byte
Panjang kode 40 byte dan memenuhi syarat untuk bonus -10% .
Perhatikan bahwa ini hanya akan berfungsi dengan benar untuk halaman kode yang tidak memiliki huruf / digit non-ASCII.
sumber
Pyth, 27 byte
Test Suite
sumber
Gogh , 29 byte
Jalankan menggunakan:
Penjelasan
sumber
Perl, 21 byte
Skor termasuk +1 byte untuk
-p
sakelar. Cobalah di Ideone .sumber
-$_||$_=...
untuk menjelaskan jawaban kosong? (Menggunakan-
karena+
adalah no-in perl)Pyth, 19 byte
Cobalah dengan Pyth Compiler .
Perhatikan bahwa ini hanya akan berfungsi dengan benar untuk halaman kode yang tidak memiliki huruf / digit non-ASCII.
Bagaimana itu bekerja
sumber
Faktor , 84 * 0,9 = 76,5
Berjalan di listener (repl), mendefinisikan kutipan (fungsi anonim) yang mengambil string dan output {0 | 1/2 | 1}.
Mendefinisikannya sebagai sebuah kata berarti 97 karakter:
Bagaimana cara kerjanya:
R/ [_a-zA-Z]\w*/ R/ _.*/
mendefinisikan dua ekspresi reguler.bi-curry@
menerapkan sebagian kutipan[ matches? 1 0 ? ]
untuk setiap regex, meninggalkan dua kutipan kari pada stack.bi
menerapkan setiap kutipan pada string argumen.Masing-masing dari itu (kutipan kari) meninggalkan 1 atau 0, tergantung apakah cocok. Yang pertama cocok dengan nama yang terbentuk dengan baik, yang kedua pada nama dimulai dengan garis bawah.
0 = 1 2 ? /
Nilai terakhir diganti dengan 1 jika 0, atau 2 jika 1. Kemudian yang pertama (1 atau 0, valid atau tidak) dibagi dengan yang kedua (2 atau 1, dimulai dengan garis bawah atau tidak) .Ini loooong! Setiap petunjuk untuk menyusut sedikit lebih dihargai ...
Dan saya benci regexps!
PS.
semua tes lulus;)
sumber
Dyalog APL , 19 byte - 10% = 17.1
{
...⍵
...}
fungsi anonim di mana argumen yang benar diwakili oleh⍵
⊃⍵
karakter pertama (memberi spasi jika kosong)'_'=
1 jika sama dengan 'underbar, 0 sebaliknya1+
dievaluasi menjadi 2 jika underbar awal, 1 sebaliknya⎕NC⍵
kelas nama ; -1 jika nama tidak valid, 0 jika tidak terdefinisi (tetapi nama yang valid), 2-9 jika didefinisikan (dan dengan demikian valid)sumber
Mathematica, 93 byte
Jujur saya tidak yakin apakah ini bisa bermain golf lebih lanjut.
sumber
Perl, 34 + 1 = 35 byte
Menggunakan
-p
bendera.Penjelasan
sumber
[_a-zA-Z]
->[^\W\d]
jika perl bekerja sama dengan JavaScript, saya pikir Anda juga harus melakukannya\w*
\w+
.a
Python, 84 -10% = 76 byte
sumber
JavaScript ES7, 37 byte
Cobalah online
Bagaimana itu bekerja:
Port of @ Dennis's Perl menjawab
sumber
Ruby, 44 byte
sumber
/^([a-z_]).../i
bukannya/^(_|\d)?.../
Ruby, 57 - 10% = 51,3 byte
Pendekatan yang cukup naif
sumber
->(s){s=~/^$|^\d|\W/?0:s=~/^_/?0.5:1}
Lua, 82 - 10% = 73,8
Kasus uji:
sumber
Lua, 68 * .9 = 61.2 byte
Membawa argumen di baris perintah
sumber