Apakah nama saya resmi?


25

pengantar

Seperti yang dikatakan ToonAlfrink : "Saya pikir tidak ada cukup pertanyaan mudah di sini yang bisa dicoba oleh pemula!". Jadi tugasnya sangat sederhana. Diberikan string, menampilkan nilai yang benar atau salah apakah nama itu resmi atau tidak.

Sebuah nama adalah "resmi" jika itu adalah kata dalam satu judul kasus, yaitu:

  • Jika pertama surat dikapitalisasi (tidak resmi: adnan)
  • Jika surat-surat lain tidak dikapitalisasi (tidak resmi: AdNaN)
  • Jika nama tidak mengandung karakter non-abjad (tidak resmi: Adnan123, Adnan!)
  • Jika nama terdiri dari hanya satu kata (tidak resmi: Adn an, Adn An)
  • Jika nama memiliki lebih dari satu karakter (tidak resmi: A)

Aturan

  • Anda dapat menyediakan fungsi atau program
  • Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!
  • Catatan: Untuk menyederhanakan banyak hal, nama-nama seperti Mary-Ann dalam tantangan ini tidak resmi.
  • Asumsikan bahwa tidak ada spasi spasi putih dalam nama.
  • Asumsikan bahwa hanya karakter ASCII yang dapat dicetak ( 32-126) yang digunakan dalam namanya

Uji kasus

Input: Adnan
Output: True

Input: adnan
Output: False

Input: AdnaN
Output: False

Input: Adnan123
Output: False

Input: Adnan Adnan
Output: False

Input: A
Output: False

Input: Mary-Ann
Output: False

Papan peringkat


5
Jadi namaku tidak resmi? Saya lebih baik mengubahnya.
ETHproductions

12
@ ETHproductions Jika kita menggunakan logika ini, Lolololololololololololadalah nama resmi :)
Adnan

1
Itu tidak benar-benar menjawab pertanyaan. Yang mana itu: "Anda dapat menganggap nama tidak mengandung huruf beraksen", atau "nama dengan huruf beraksen harus menghasilkan False"?
Lynn

1
Sebagai penyimpangan Kanada yang sedikit offbeat, seorang profesor yang saya tahu tidak akan senang dengan kriteria "resmi" Anda: Robert Smith? . Namanya sebenarnya memiliki tanda tanya itu . Juga, Sahaiʔa .
Iwillnotexist Idonotexist

1
@ FarhanAnam Ya
Adnan

Jawaban:


6

Pyth, 16 13 12 byte

Terima kasih kepada @Thomas Kwa untuk mengingatkan saya tentang titlecase.

&qzr@GrzZ3tz

Test Suite .

&              Boolean and operator
 qz            Equality test on input
  r    3       Titlecase operator
   @G          Setwise intersection with the alphabet
    rzZ        Input to lowercase
 tz            All but the first character of the input

21

Retina, 13 byte

^[A-Z][a-z]+$

Cobalah online | Test suite (Output 0berarti tidak ada string yang cocok, yang diharapkan)

Ketika Retina hanya disediakan dengan satu baris kode, itu menghasilkan berapa kali ekspresi cocok dengan string input, sehingga akan menghasilkan 1(kebenaran) jika cocok dan karenanya adalah nama resmi dan 0(falsy) jika tidak.

Kerusakan

^       The beginning of the string
[A-Z]   One uppercase letter
[a-z]+  One or more lowercase letters
$       The end of the string

8
Sepertinya kita perlu kelas karakter untuk huruf. ;)
Martin Ender

10

TeaScript, 12 byte

xO`A-Z][a-z`

Menyalahgunakan Ofungsi.

Coba ini secara online

Test Suite

Penjelasan

The Ofungsi membuat ini:

x O   `A-Z][a-z`
x.O(/^[A-Z][a-z]+$/)

Kemudian, fungsi O memeriksa apakah regex cocok x.


Atau, jawaban TeaScript 3 yang tidak bersaing pada 7 byte :

xO/\A\a

Ahahaha, bagus. Pada suatu titik ketika saya sedang mengerjakan penerjemah Japt, saya menggunakan trik ini dengan isCharfungsi yang Anda tambahkan. Tetapi Anda mungkin ingin menjelaskan secara lebih rinci bagi mereka yang tidak tahu.
Produk ETH

Ooooooh, saya suka fitur regex baru!
Produk ETH

7

JavaScript (ES6), 26

n=>/^[A-Z][a-z]+$/.test(n)

Oleh: Edcsixtyfive

f=n=>/^[A-Z][a-z]+$/.test(n)

console.log=x=>O.textContent+=x+'\n'

;['Adnan','adnan','AdnaN','Adnan123','Adnan Adnan','A','Mary-Ann']
.forEach(t=>console.log(t+' '+f(t)))
<pre id=O></pre>


Sial, Anda mengalahkan saya untuk itu. Anda juga mengungguli versi saya dengan 5 byte.
SuperJedi224

1
Satu byte lebih sedikit:n=>n.match`^[A-Z][a-z]+$`
user81655

@ user81655 sebuah array sebagai nilai sebenarnya IMHO terlalu dipaksakan
edc65

@ edc65 Tapi ini berlaku.
SuperJedi224

1
Hanya dengan 4 byte lebih banyak, Anda mendapatkan kepatuhan ES5:/./.test.bind(/^[A-Z][a-z]+$/)
CR Drost

7

Python, 59 58 byte

Saya yakin tidak ada cara nyata untuk mengalahkan versi Retina, karena ini pada dasarnya hanya itu di dalam Python. Tapi saya pikir ini adalah pengiriman pertama saya;)

import re,sys;print(re.match('[A-Z][a-z]+$',sys.argv[1]))

Ini adalah nilai kebenaran yang sangat aneh :

(test2)wayne@arglefraster ~/programming/inactive/golf/67554
⚘ python golf.py AdNan                                                                                                 $? 148  %# 3  10:06:36
None
(test2)wayne@arglefraster ~/programming/inactive/golf/67554
⚘ python golf.py Adnan                                                                                                         %# 3  10:06:40
<_sre.SRE_Match object at 0x7feefea7f440>
(test2)wayne@arglefraster ~/programming/inactive/golf/67554
⚘ python golf.py "Adnan Banana"                                                                                                %# 3  10:06:47
None

(Dan itu membutuhkan ""sekitar string dengan spasi di dalamnya, jika dilewatkan melalui shell)


1
^tidak diperlukan karena re.match()hanya cocok pada awal string.
manatwork

1
@manatwork bagus! Byte lain dicukur :) Saya bisa menyimpan byte lain dengan paren penutup, menggunakan Python2
Wayne Werner

1
@WayneWerner: itu sebabnya Anda harus memberikan versi Python :) Saya pikir Python 2 dan Python 3 adalah jenis bahasa yang berbeda, setidaknya untuk codegolf.
movatica

Jika Anda menggunakan lambda anonim alih-alih keseluruhan program, Anda mendapatkan 45 byte:lambda s:re.match('[A-Z][a-z]+$',s) import re
movatica

1
@movatica Oh, wah!
MilkyWay90


4

Python, 50 45 43 41 byte

lambda s:s.isalpha()*s.istitle()*len(s)>1

Mengembalikan Truejika itu nama resmi atau Falsejika tidak.


Aturan codegolf menyatakan bahwa Anda tidak perlu f=memperhitungkannya, menghemat dua byte. Juga, (len(s)>1)menghemat 5 byte lebih s[1:].islower(). :)
movatica

3

BotEngine , 203 180 29x6 = 174

v ABCDEFGHIJKLMNOPQRSTUVWXYZ
>ISSSSSSSSSSSSSSSSSSSSSSSSSSF
v <<<<<<<<<<<<<<<<<<<<<<<<<<
 Tabcdefghijklmnopqrstuvwxyz
> SSSSSSSSSSSSSSSSSSSSSSSSSSF
^E<<<<<<<<<<<<<<<<<<<<<<<<<<

Saya benar-benar harus menambahkan builtin untuk mengidentifikasi huruf besar dan kecil. Itu akan jauh lebih ringkas daripada memeriksa setiap huruf secara individual.

Terjemahan kasar:

for a of input enqueue a
if ABCDEFGHIJKLMNOPQRSTUVWXYZ contains first
 remove first
 while abcdefghijklmnopqrstuvwxyz contains first
  remove first
 if empty
  yield TRUE exit
 else
  yield FALSE exit
else
 yield FALSE exit

3

C, 129 122 121 111 byte

main(c,b,d){b=d=0;while((c=getchar())>13)b|=b|=!b&&c>90|c<65?1:2&&d++&&c<97|c>122?4:2;printf("%d\n",b<3&&d>1);}

Cobalah secara Online

main(c,b,d)
{
    b=d=0;
    while((c=getchar())>13)
    {
        // Twiddle bits, 1<<0 for first character and 1<<3 for subsequent
        b|=!b&&c>90|c<65?1:2; // check first character is valid
        b|=d++&&c<97|c>122?4:2; // check later characters are valid
    }
    // If all OK b == 2, if either of above are wrong, b >= 3 due to 
    // extra bits. Also, d should be > 1 for name length to be valid.
    printf("%d\n",b<3&&d>1);
}


2

MATL , 18 byte

Versi bahasa saat ini ( 4.0.0 ) digunakan.

Ini berlaku persamaan reguler yang sama dengan jawaban NinjaBearMonkey :

j'^[A-Z][a-z]+$'XX

Outputnya adalah string (yang benar ) jika itu nama resmi, dan tidak ada (yang salah ) jika tidak.

Contohnya

>> matl
 > j'^[A-Z][a-z]+$'XX
 > 
> December
December
>> 

>> matl
 > j'^[A-Z][a-z]+$'XX
 > 
> ASCII
>> 


2

Gema, 17 karakter

\B<K1><J>\E=1
*=0

Contoh dijalankan:

bash-4.3$ echo -n 'Adnan' | gema '\B<K1><J>\E=1;*=0'
1

bash-4.3$ echo -n 'adnan' | gema '\B<K1><J>\E=1;*=0'
0

bash-4.3$ echo -n 'Adnan123' | gema '\B<K1><J>\E=1;*=0'
0


2

Kode mesin IA-32, 19 byte

Fungsi yang menerima pointer ke string null-terminating ecxdan mengembalikan 0 atau 1 in eax(sesuai dengan fastcallkonvensi).

Hexdump kode:

6a 20 58 32 01 74 0a 41 2c 61 3c 1a b0 00 72 f3 c3 40 c3

Dalam bahasa assembly:

    push 32;
    pop eax;

myloop:
    xor al, [ecx];
    jz yes;
    inc ecx;
    sub al, 'a';
    cmp al, 26;
    mov al, 0;
    jb myloop;
    ret;

yes:
    inc eax;
    ret;

Byte pertama dari nama input memiliki bit ke-5 terbalik ( xordengan 32) untuk mengubahnya dari huruf kapital menjadi huruf kecil. Ini memuat 32 ke dalam eax, menggunakan 3 byte kode:

    push 32;
    pop eax;

Untuk memeriksa apakah byte adalah huruf kecil:

    sub al, 'a';
    cmp al, 26;
    jb myloop;

Jika tidak, kode ini akan gagal. Untuk mengembalikan 0 dalam kasus ini, ia menempatkan 0 alsebelum melakukan lompatan bersyarat:

    sub al, 'a';
    cmp al, 26;
    mov al, 0;
    jb myloop;

0 in aljuga berfungsi sebagai xor-mask (atau tidak ada) untuk byte berikut dari nama input.

Keluar yang berhasil adalah ketika bertemu dengan nol byte, yang tetap nol setelah xor:

    xor al, [ecx];
    jz yes;

Diasumsikan bahwa nama input tidak kosong. Saya kira itu asumsi yang masuk akal tentang sebuah nama (bukan string yang arbitrer)!


2

grep, 16 byte

Inilah polanya:

[A-Z][a-z]+

Jika Anda menggunakan -Edan -xdan -cswitch grepakan mencetak hitungan garis input yang cocok. Jadi, jika Anda memberikannya satu baris, Anda mendapat 1 atau 0. Saya pikir itulah cara tempat ini bekerja.

Polanya adalah 11 karakter, seluruh baris perintah adalah 23. Saya telah melihat orang menggunakan sedskrip tanpa perintah jadi saya tidak tahu apa itu apa. Tapi, itu berbunyi stdin, dan kamu bisa mengetiknya saja. Inilah echo:

for a in Adnan adnan Ad\ nan
do  echo "$a" | grep -cxE \[A-Z]\[a-z]+
done

1
0
0

@ Doorknob - sepertinya cukup adil bagi saya. Terima kasih banyak. topi yang menurutmu?
mikeserv

1
Saya menemukan Revenge Hairboat. : P
Doorknob

Hentikan saya jika (sangat mungkin) saya salah tetapi Anda dapat menggunakan grep -Excsehingga Anda tidak perlu menghitung banyak byte untuk switch.
Neil

@Neil - saya tidak tahu apakah Anda salah. saya benar-benar tidak tahu - lihatlah sejarah edit.
mikeserv

2

Mathematica 10.1, 46 byte

LetterQ@#&&#==ToCamelCase@#&&StringLength@#>1&

Menggunakan satu byte lebih sedikit daripada solusi regex standar. Itu melakukan tiga pemeriksaan. LetterQ@#memastikan bahwa string seluruhnya terdiri dari huruf, dan StringLength@#>1membatalkan string huruf tunggal. #==ToCamelCase@#namun kurang masuk akal. ToCamelCaseadalah fungsi tidak berdokumen yang saya temukan yang mengambil string input AndOutputsItLikeThis. Karena hanya ada satu kata, itu akan menjadi huruf besar untuk huruf pertama, jadi kami memeriksa apakah stringnya sama dengan itu.


Apakah ToCamelCasebaru dalam 10.3? Tampaknya tidak berfungsi di 10.2.
murphy

@murphy, ini bekerja untuk saya di 10.1. Apa yang Anda dapatkan ToCamelCase["foo bar baz"]?
LegionMammal978

Oke, saya dapat mengonfirmasi bahwa ini berfungsi pada 10.1. Namun, pada 8.0, 9.0, 10.0 dan 10.2 fungsi ini tidak ditentukan (test case Anda kembali ToCamelCase[foo bar baz]). Aneh! Mungkin seseorang bisa memeriksa 10.3?
murphy

2

bash / zsh / ksh, 25 byte

[[ $1 =~ ^[A-Z][a-z]+$ ]]

Untuk benar-benar menggunakan ini, buat file dengan itu sebagai satu-satunya baris dan buat file tersebut dapat dieksekusi; file yang dapat dieksekusi yang tidak dikenali sebagai tipe biner yang dikenal diperlakukan sebagai skrip shell ( /bin/shkhusus).

$ printf '[[ $1 =~ ^[A-Z][a-z]+$ ]]' >f
$ chmod +x f
$ wc -c f
25 f
$ for x in 'Adnan' 'adnan' 'AdnaN' 'Adnan123' 'Adnan Adnan' 'A' 'Mary-Ann'; do f "$x" && echo 1 || echo 0; done
1
0
0
0
0
0
0
$ 

2
Ini berfungsi dengan baik di bash, kshdan zsh, tetapi tidak memiliki kesempatan untuk bekerja di POSIX standar shatau yang kompatibel dashdan yash. Untuk menghindari kebingungan, saya sarankan untuk mengubah judul jawaban.
manatwork

3
Gunakan printfalih-alih echountuk membuat file dan Anda akan mendapatkan 25 byte.
sam hocevar

Poin yang bagus, Anda berdua; keduanya diterapkan.
Aaron Davies

2

C # 4, 89 byte

Upaya pertama saya di Code Golf. Ini dia:

bool o(string i){return System.Text.RegularExpressions.Regex.IsMatch(i,"^[A-Z][a-z]+$");}

Lihat beraksi di Dot Net Fiddle .


Jika Anda menggunakan C # 6, Anda bisa membuatnya sedikit lebih pendek:bool o(string i)=>System.Text.RegularExpressions.Regex.IsMatch(i,"^[A-Z][a-z]+$");
ProgramFOX

2

Java, 28 byte

n->n.matches("[A-Z][a-z]+")

Gunakan regex untuk memastikan string terdiri dari karakter huruf besar diikuti oleh setidaknya satu karakter huruf kecil.

-1 byte, terima kasih kepada Benjamin Urquhart


Anda dapat melepaskan titik koma
Benjamin Urquhart

@BenjaminUrquhart oh benar, terima kasih
HyperNeutrino

1

k4, 39 byte

{((*x)in .Q.A)&(&/(1_,/x)in .Q.a)&1<#x}

Char pertama di atas, yang lainnya lebih rendah, lebih besar dari satu

Misalnya:

  {((*x)in .Q.A)&(&/(1_,/x)in .Q.a)&1<#x}'("Adnan";"adnan";"AdnaN";"Adnan123";"Adnan Adnan";"A";"Mary-Ann")
1000000b

1

Serius, 16 byte

ú4,nÿ=)l1<)ù-Y&&

Hex Dump:

a3342c6e983d296c313c29972d592626

Cobalah secara Online

Serius belum memiliki dukungan regex, jadi yang terbaik yang bisa kita lakukan adalah:

 4,n                               Push 4 copies of input
    ÿ=                             Check that it's equal to itself converted to titlecase
      )                            Put the boolean on the bottom
       l1<                         Check that it's longer than 1 character
          )                        Put the boolean on the bottom
           ù                       Convert it to lowercase.
ú           -Y                     Check that removing the lowercase alphabet empties it
              &&                   And all the booleans together

1

Ocaml, 231 216 197 166 byte

let f n=let l=String.length n in if l=1 then 0 else let rec e=function 0->1|i->match n.[i] with('a'..'z')->e(i - 1)|_->0 in match n.[0]with('A'..'Z')->e(l - 1)|_->0;;

Contoh penggunaan:

# f "Adnan";;
- : int = 1

# f "adnan";;
- : int = 0

# f "AdnaN";;
- : int = 0

# f "Adnan123";;
- : int = 0

# f "Adnan Adnan";;
- : int = 0

# f "A";;
- : int = 0

# f "Mary-Ann";;
- : int = 0

Tidak digabungkan (dengan nama fungsi sebenarnya):

let is_name name =
  let len = String.length name
  in if len = 1 then 0 else
  let rec explode_lower = function
    | 0 -> 1
    | i ->
      match name.[i] with
      | ('a'..'z') -> explode_lower (i - 1)
      | _ -> 0
  in match name.[0] with
  | ('A'..'Z') -> explode_lower (len - 1)
  | _ -> 0;;

Anda benar-benar bisa menghemat sekitar 10% dengan menggunakan boolean alih-alih bilangan bulat (bleh!) Dan mengganti yang besar if … then 0 else dengan … ||. Dan dalam hal ini dengan menggunakan operator boolean alih-alih matchdan berkisar, misalnyan.[0]>'@'&n.[0]<'['&e(l-1)
Gilles 'SO-stop being evil'

1

SpecBAS - 39 byte

SpecBAS menangani ekspresi reguler melalui MATCHperintah. Output adalah 0 untuk false dan 1 jika benar.

1 input n$:  ?MATCH("^[A-Z][a-z]+$",n$)

1

Swift 2, 116 byte

Regex begitu verbose di Swift sehingga melakukan ini jauh lebih pendek

func e(s:String)->Int{var c=0;for k in s.utf8{if(c==0 ?k<65||k>90:k<97||k>122){return 0};c++};return s.utf8.count-1}

Ini akan mengembalikan 0atau -1(jika tidak ada input) untuk nama yang tidak resmi, dan angka > 0(yang sama dengan panjang string - 1) jika nama tersebut resmi

Tidak disatukan

func e(s: String) -> Int{
    var c = 0
    for k in s.utf8{
        if(c == 0 ? k < 65 || k > 90 : k < 97 || k > 122){
            return 0
        }
        c++
    }
    return s.utf8.count - 1
}

1

C #, 188 byte

Ekspresi reguler akan menjadi cara yang tepat untuk mengatasi ini, tetapi inilah upaya tanpa itu.

bool O(string s){for(int i=1;i<s.Length;i++){if(char.IsUpper(s[i])){return false;}}if(char.IsUpper(s[0])&&s.All(Char.IsLetter)&&!s.Contains(" ")&& s.Length > 1){return true;}return false;}

Tulisan tangan

static bool O(string s)
{
    for (int i = 1; i < s.Length; i++)
    {
        if (char.IsUpper(s[i]) )
        {
            return false;
        }
    }
    if (char.IsUpper(s[0]) && s.All(Char.IsLetter) && !s.Contains(" ") && s.Length > 1)
    {
        return true;
    }
    return false;
}

Senang saran tentang cara membuat cek huruf kecil lebih pendek, mungkin tanpa loop. Saya baru mulai belajar bahasa, dan menggunakan ini sebagai latihan, berpikir saya akan tetap membagikan hasil saya.



1

PowerShell , 29 byte

"$args"-cmatch'^[A-Z][a-z]+$'

Cobalah online!

Apakah trik regex yang sama digunakan semua orang. Harus menggunakan case-sensitif matchuntuk melakukannya dengan benar dengan biaya satu byte.



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.