Là tên của tôi chính thức?


25

Giới thiệu

Như ToonAlfrink nói : "Tôi nghĩ rằng không có đủ câu hỏi dễ dàng ở đây mà người mới bắt đầu có thể thử!". Vì vậy, nhiệm vụ rất đơn giản. Đưa ra một chuỗi, xuất ra một giá trị trung thực hoặc giả cho dù tên đó là chính thức hay không.

Tên là "chính thức" nếu đó là một từ trường hợp tiêu đề duy nhất, đó là:

  • Nếu chữ cái đầu tiên được viết hoa (không chính thức adnan:)
  • Nếu các chữ cái khác không được viết hoa (không chính thức AdNaN:)
  • Nếu tên không chứa bất kỳ ký tự không chữ nào (không chính thức : Adnan123, Adnan!)
  • Nếu tên chỉ bao gồm một từ (không chính thức : Adn an, Adn An)
  • Nếu tên có nhiều hơn một ký tự (không chính thức A:)

Quy tắc

  • Bạn có thể cung cấp một chức năng hoặc một chương trình
  • Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!
  • Lưu ý: Để đơn giản hóa mọi thứ, những cái tên như Mary-Ann nằm trong thử thách này không phải là chính thức.
  • Giả sử rằng không có khoảng trắng hàng đầu trong tên.
  • Giả sử rằng chỉ các ký tự ASCII có thể in ( 32-126) được sử dụng trong các tên

Các trường hợp thử nghiệm

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

Bảng xếp hạng


5
Vậy tên tôi không chính thức? Tôi nên thay đổi nó sau đó.
Sản xuất ETH

12
@ETHproductions Nếu chúng tôi sử dụng logic này, Lololololololololololollà tên chính thức :)
Adnan

1
Điều đó không thực sự trả lời câu hỏi. Đó là: "bạn có thể cho rằng tên không chứa các chữ cái có dấu" hoặc "tên có chữ cái có dấu sẽ mang lại False"?
Lynn

1
Là một người lạc quan ở Canada, một giáo sư mà tôi biết sẽ không hài lòng với tiêu chí "chính thức" của bạn: Robert Smith? . Tên của anh ấy thực sự có dấu chấm hỏi đó . Ngoài ra, Sahaiʔa .
Idillotexist Idillotexist

1
@FarhanAnam Có
Adnan

Câu trả lời:


6

Bình thường, 16 13 12 byte

Cảm ơn @Thomas Kwa đã nhắc nhở tôi về Titlecase.

&qzr@GrzZ3tz

Phòng thử nghiệm .

&              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

Võng mạc, 13 byte

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

Dùng thử trực tuyến | Bộ kiểm tra (Đầu ra0 có nghĩa là không có chuỗi nào phù hợp, dự kiến.)

Khi Retina chỉ được cung cấp một dòng mã, nó sẽ xuất ra số lần biểu thức khớp với chuỗi đầu vào, do đó, nó sẽ xuất ra 1(trung thực) nếu nó khớp và do đó là tên chính thức và 0(giả) nếu không phải là tên chính thức .

Phá vỡ

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

8
Có vẻ như chúng ta cần các lớp ký tự cho các chữ cái. ;)
Martin Ender

10

TeaScript, 12 byte

xO`A-Z][a-z`

Lạm dụng Ochức năng.

Hãy thử trực tuyến

Phòng thử nghiệm

Giải trình

Các Ochức năng làm cho điều này:

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

Sau đó, hàm O kiểm tra xem regex có khớp không x.


Ngoài ra, một câu trả lời TeaScript 3 không cạnh tranh ở 7 byte :

xO/\A\a

Ahahaha, một trong những tốt đẹp. Tại một số thời điểm khi tôi đang làm việc với trình thông dịch Japt, tôi đã sử dụng thủ thuật này với isCharchức năng bạn đã thêm. Nhưng bạn có thể muốn giải thích chi tiết hơn cho những người không biết.
Sản phẩm ETH

Ooooooh, tôi thích các tính năng regex mới!
Sản phẩm ETH

7

JavaScript (ES6), 26

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

Bởi: 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>


Chết tiệt, bạn đánh tôi với nó. Bạn cũng vượt xa phiên bản của tôi 5 byte.
SuperJedi224

1
Ít hơn một byte:n=>n.match`^[A-Z][a-z]+$`
user81655

@ user81655 một mảng làm giá trị trung thực quá bắt buộc IMHO
edc65

@ edc65 Mặc dù vậy là hợp lệ.
SuperJedi224

1
Chỉ với 4 byte nữa, bạn có được tuân thủ ES5:/./.test.bind(/^[A-Z][a-z]+$/)
CR Drost

7

Con trăn, 59 58 byte

Tôi chắc chắn không có cách nào thực sự để đánh bại phiên bản Retina, vì về cơ bản đây chỉ là trong Python. Nhưng tôi nghĩ rằng đây là lần gửi đầu tiên của tôi;)

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

Đó là một giá trị trung thực rất kỳ quặc :

(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

(Và nó yêu cầu ""xung quanh các chuỗi có khoảng trắng trong đó, nếu được truyền qua shell)


1
^không cần thiết vì re.match()chỉ khớp ở đầu chuỗi.
manatwork

1
@manatwork đẹp! Một byte khác được cạo :) Tôi có thể lưu một byte khác với paren đóng, sử dụng Python2
Wayne Werner

1
@WayneWerner: đó là lý do tại sao bạn nên cung cấp phiên bản Python :) Tôi nghĩ Python 2 và Python 3 là loại ngôn ngữ khác nhau, ít nhất là đối với codegolf.
Movatica

Nếu bạn sử dụng lambda ẩn danh thay vì toàn bộ chương trình, bạn sẽ nhận được 45 byte:lambda s:re.match('[A-Z][a-z]+$',s) import re
Movatica

1
@movatica ơi, rất tiếc!
MilkyWay90


4

Python, 50 45 43 41 byte

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

Trả về Truenếu đó là tên chính thức hoặc Falsenếu không.


Các quy tắc của trạng thái codegolf, mà bạn không cần phải tính đến f=, tiết kiệm hai byte. Ngoài ra, (len(s)>1)tiết kiệm hơn 5 byte s[1:].islower(). :)
Movatica

3

BotEngine , 203 180 29x6 = 174

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

Tôi thực sự nên thêm nội dung để xác định chữ hoa và chữ thường. Điều đó sẽ ngắn gọn hơn nhiều so với việc kiểm tra từng chữ cái riêng lẻ.

Bản dịch thô:

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);}

Dùng thử trực tuyến

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

Phiên bản hiện tại ( 4.0.0 ) của ngôn ngữ được sử dụng.

Điều này áp dụng cùng một biểu thức chính quy như câu trả lời của NinjaBearMonkey :

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

Đầu ra là chuỗi ( là sự thật ) nếu đó là tên chính thức và không có gì (đó là giả ) nếu không phải là nó.

Ví dụ

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

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


2

Gema, 17 ký tự

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

Chạy mẫu:

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

Mã máy IA-32, 19 byte

Hàm nhận con trỏ tới chuỗi kết thúc null ecxvà trả về 0 hoặc 1 in eax(theofastcall quy ước).

Mã thập phân của mã:

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

Trong ngôn ngữ lắp ráp:

    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 đầu tiên của tên đầu vào có bit thứ 5 được lật ( xorvới 32) để chuyển đổi nó từ trường hợp viết hoa sang trường hợp nhỏ. Điều này tải 32 vào eax, sử dụng 3 byte mã:

    push 32;
    pop eax;

Để kiểm tra xem byte có phải là một chữ cái nhỏ hay không:

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

Nếu không, mã này rơi qua. Để trả về 0 trong trường hợp này, nó đặt 0 vào altrước khi thực hiện bước nhảy có điều kiện:

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

Số 0 trong alcũng đóng vai trò là mặt nạ xor (hoặc không có nó) cho các byte sau của tên đầu vào.

Một lối thoát thành công là khi nó gặp một byte số 0, giữ nguyên số 0 sau xor:

    xor al, [ecx];
    jz yes;

Nó giả định rằng tên đầu vào không trống. Tôi đoán đó là một giả định hợp lý về một cái tên (không phải là một chuỗi tùy ý)!


2

grep, 16 byte

Đây là mô hình:

[A-Z][a-z]+

Nếu bạn sử dụng -E-x-cchuyển đổigrep sẽ in một số dòng đầu vào phù hợp. Vì vậy, nếu bạn cung cấp cho nó một dòng, bạn nhận được 1 hoặc 0. Tôi nghĩ đó là cách nơi này hoạt động.

Mẫu có 11 ký tự, toàn bộ dòng lệnh là 23. Tôi đã thấy mọi người sử dụng sedcác tập lệnh mà không có lệnh nên tôi không biết đó là gì. Nhưng, nó đọc stdin, và vì vậy bạn chỉ cần gõ vào nó. Đây là echo:

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

1
0
0

@Doorknob - có vẻ đủ công bằng với tôi. cảm ơn rất nhiều. bạn đoán chiếc mũ nào
mikeerv

1
Tôi đã tìm ra sự trả thù của Hairboat. : P
Doorknob

Dừng tôi lại nếu (hoàn toàn có thể xảy ra) Tôi sai nhưng bạn có thể sử dụng grep -Excvì vậy bạn không cần phải tính nhiều byte cho các công tắc.
Neil

@Neil - tôi không biết nếu bạn sai. tôi thực sự không có ý tưởng - hãy nhìn vào lịch sử chỉnh sửa.
mikeerv

2

Toán học 10.1, 46 byte

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

Uses one less byte than the standard regex solution. It does three checks. LetterQ@# ensures that the string is entirely composed of letters, and StringLength@#>1 invalidates single-letter strings. #==ToCamelCase@# makes less sense, however. ToCamelCase is an undocumented function I found that takes an input string AndOutputsItLikeThis. Since there is only one word, it will capitalize the first letter, so we check if the string is equal to that.


Is ToCamelCase new in 10.3? Doesn't seem to work in 10.2.
murphy

@murphy, it works for me in 10.1. What do you get with ToCamelCase["foo bar baz"]?
LegionMammal978

Ok, I can confirm that it works in 10.1. However, in 8.0, 9.0, 10.0 and 10.2 the function is not defined (your test case returns ToCamelCase[foo bar baz]). Strange! Maybe someone can check 10.3?
murphy

2

bash/zsh/ksh, 25 bytes

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

To actually use this, make a file with it as the only line and make the file executable; executable files not recognized as a known binary type are treated as shell scripts (for /bin/sh specifically).

$ 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
This works fine in bash, ksh and zsh, but has no chance to work in standard POSIX sh or the compatible dash and yash. To avoid confusion, I suggest to change the answer's title.
manatwork

3
Use printf instead of echo to create the file and you’ll get 25 bytes.
sam hocevar

Good points, both of you; both applied.
Aaron Davies

2

C# 4, 89 bytes

My first attempt at Code Golf. Here it comes:

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

See it in action at Dot Net Fiddle.


If you use C# 6, you can make it a bit shorter: bool o(string i)=>System.Text.RegularExpressions.Regex.IsMatch(i,"^[A-Z][a-z]+$");
ProgramFOX

2

Java, 28 bytes

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

Uses regex to make sure the string consists of an uppercase character followed by at least one lowercase character.

-1 bytes thanks to Benjamin Urquhart


You can drop the semicolon
Benjamin Urquhart

@BenjaminUrquhart oh right, thanks
HyperNeutrino

1

k4, 39 bytes

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

First char is upper, all others are lower, count greater than one.

E.g.:

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

1

Seriously, 16 bytes

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

Hex Dump:

a3342c6e983d296c313c29972d592626

Try It Online

Seriously does not have regex support yet, so the best we can do is:

 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 bytes

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;;

Example usage:

# 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

Ungolfed (with real function names):

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;;

You could actually save about 10% by using booleans instead of integers (bleh!) and replacing those bulky if … then 0 else by … ||. And for that matter by using boolean operators instead of match and ranges, e.g. n.[0]>'@'&n.[0]<'['&e(l-1)
Gilles 'SO- stop being evil'

1

SpecBAS - 39 bytes

SpecBAS handles regular expressions through the MATCH command. Output is 0 for false and 1 if true.

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

1

Swift 2, 116 bytes

Regex is so verbose in Swift that doing this is much shorter

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}

This will return 0 or -1 (in the case of no input) for non-official names, and a number > 0 (which is equal to the length of the string - 1) if the name is official

Ungolfed

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 bytes

Regular expressions would have been the right way to tackle this, but here's an attempt without it.

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;}

Longhand

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;
}

Would love advice on how to make the lowercase check shorter, perhaps without the loop. I just started learning the language, and used this as practice, figured I'd share my result anyway.



1

PowerShell, 29 bytes

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

Try it online!

Does the same regex trick everyone else is using. Has to use case-sensitive match to properly do it at the cost of a byte.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.