我的名字是官方的吗?


25

介绍

正如ToonAlfrink所说:“我认为这里没有足够的简单问题供初学者尝试!” 因此任务非常简单。给定一个字符串,无论名称是否为正式名称,都输出一个true或false值。

如果名称是单个标题大小写的单词,则该名称为“正式”,即:

  • 如果第一个字母大写(不是官方:adnan
  • 如果其他字母大写(不是官方:AdNaN
  • 如果名称中不包含任何非字母字符(不是官方名称:Adnan123,,Adnan!
  • 如果名称仅由一个单词组成(不是官方名称:Adn anAdn An
  • 如果名称包含多个字符(不是官方名称A:)

规则

  • 您可以提供功能或程序
  • 这是,因此以最少的字节提交为准!
  • 注意:为简化起见,在此挑战中,像Mary-Ann这样的名字不是官方的。
  • 假设名称中没有前导空格。
  • 假设名称中仅使用可打印的ASCII字符(32-126

测试用例

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

排行榜


5
所以我的名字不是官方的吗?那我最好改变一下。
ETHproductions 2015年

12
@ETHproductions如果我们使用此逻辑,请Lololololololololololol使用官方名称:)
Adnan

1
这并不能真正回答问题。这是什么意思:“您可能会认为该名称不包含带重音符号的字母”,还是“带重音字母的名称应产生False”?
林恩

1
作为加拿大人稍微有些偏离题外话,我知道一位教授会对您的“官方”标准不满意:罗伯特·史密斯(Robert Smith)?。他的名字确实有那个问号。另外,Sahaiʔa
Iwillnotexist Idonotexist 2015年

1
@FarhanAnam是
Adnan

Answers:


6

Pyth,16 13 12字节

感谢@Thomas Kwa提醒我有关标题的问题。

&qzr@GrzZ3tz

测试套件

&              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

视网膜,13字节

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

在线试用 | 测试套件(输出0意味着没有匹配的字符串,这是预期的。)

当Retina仅提供一行代码时,它将输出表达式与输入字符串匹配的次数,因此1如果匹配,它将输出(真实),因此是正式名称,如果不匹配,则输出(虚假)0

分解

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

8
看起来我们需要字母的字符类。;)
Martin Ender 2015年

10

TeaScript,12个字节

xO`A-Z][a-z`

滥用O功能。

在线尝试

测试套件

说明

O函数使得:

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

然后,O函数检查正则表达式是否匹配x


或者,不竞争的TeaScript 3答案为7个字节

xO/\A\a

啊哈哈哈,真好。在我从事Japt解释器的工作时,有时会将此技巧与isChar您添加的功能一起使用。但是您可能想为不知道的人更详细地解释。
ETHproductions 2015年

噢,我喜欢新的正则表达式功能!
ETHproductions 2015年

7

JavaScript(ES6),26

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

创建人: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>


该死,你击败了我。您还使我的版本超出了5个字节。
SuperJedi224

1
少一个字节:n=>n.match`^[A-Z][a-z]+$`
user81655

@ user81655作为真实值的数组太强制了恕我直言
edc65

@ edc65虽然有效。
SuperJedi224

1
仅需4个字节,您便可以符合ES5:/./.test.bind(/^[A-Z][a-z]+$/)
CR Drost

7

Python,59 58字节

我敢肯定没有真正的方法可以击败Retina版本,因为这基本上就是Python中的版本。但是我认为这是我的第一次提交;)

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

这是一个非常奇怪的真实值:

(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

""如果通过外壳传递,则确实需要在其中带有空格的字符串周围)


1
^不需要,因为re.match()仅匹配字符串的开头。
manatwork 2015年

1
@manatwork不错!剃掉了另一个字节:)我可以使用Python2用结束括号保存另一个字节
Wayne Werner

1
@WayneWerner:这就是为什么要提供Python版本的原因:)我认为Python 2和Python 3是不同的语言,至少对于codegolf而言。
movatica

如果使用匿名lambda而不是整个程序,lambda s:re.match('[A-Z][a-z]+$',s) import re
则将

1
@movatica哦,糟糕!
MilkyWay90


4

Python,50 45 43 41字节

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

返回True是否为正式名称False


Codegolf的规则状态,您无需考虑这f=一点,节省了两个字节。此外,还(len(s)>1)保存5个字节s[1:].islower()。:)
movatica

3

BotEngine203 180 29x6 = 174

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

我应该真正添加内置函数来识别大写和小写字母。这比分别检查每个字母要简洁得多。

粗略翻译:

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字节

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

在线试用

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

3

VB6,48个字节

Function f(i):f=i Like"[A-Z][a-z]+":End Function

2

MATL,18字节

使用该语言的当前版本(4.0.0)。

这使用与NinjaBearMonkey的答案相同的正则表达式:

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

输出是字符串(这是truthy),如果它是一个正式的名称,并没有什么(这是falsy),如果它不是。

例子

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

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


2

Gema,17个字符

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

样品运行:

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

IA-32机器码,19个字节

一个函数,该函数接收in指向以null终止的字符串的指针,ecx并返回0或1 in eax(根据fastcall约定)。

代码的十六进制转储:

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

用汇编语言:

    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;

输入名称的第一个字节的第5位被翻转(xor带有32),以将其从大写字母转换为小写字母。eax使用3个字节的代码将32加载到中:

    push 32;
    pop eax;

要检查字节是否为小写字母:

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

如果没有,此代码将失败。在这种情况下,要返回0,则al在执行条件跳转之前将0放入:

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

al输入名称中的以下字节中的0 in 还用作xor掩码(或不存在)。

成功退出是指遇到零字节,该字节在xor:之后保持零。

    xor al, [ecx];
    jz yes;

假定输入名称不为空。我想这是关于名称的合理假设(而不是任意字符串)!


2

grep,16字节

这是模式:

[A-Z][a-z]+

如果使用-E-x-c开关,grep则将打印匹配的输入行数。因此,如果给它一行,则得到1或0。我认为这就是这个地方的工作方式。

模式是11个字符,整个命令行是23个字符。我已经看到人们在sed不使用命令的情况下使用脚本,所以我不知道这是什么。但是,它读取的是stdin,因此您只需输入即可。这里是echo

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

1
0
0

@Doorknob-对我来说似乎很公平。非常感谢。你猜哪顶帽子?
mikeserv 2015年

1
我想通了海船的复仇。:P
门把手

如果我错了(很可能),请阻止我,但我可以使用,grep -Exc因此您无需为切换计数多个字节。
尼尔

@Neil-如果您错了,我不知道。我真的不知道-看看编辑历史。
mikeserv

2

Mathematica 10.1,46个字节

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

比标准正则表达式解决方案少使用一个字节。它执行三项检查。LetterQ@#确保字符串完全由字母组成,StringLength@#>1并使单字母字符串无效。#==ToCamelCase@#但是意义不大。ToCamelCase是我发现的未记录函数,它采用输入字符串AndOutputsItLikeThis。由于只有一个单词,因此首字母大写,因此我们检查字符串是否等于该单词。


ToCamelCase10.3中的新功能吗?在10.2中似乎不起作用。
墨菲

@murphy,它在10.1中对我有用。你得到ToCamelCase["foo bar baz"]什么?
LegionMammal978

好的,我可以确认它可以在10.1中使用。但是,在8.0、9.0、10.0和10.2中,未定义函数(您的测试用例返回ToCamelCase[foo bar baz])。奇怪!也许有人可以检查10.3?
墨菲

2

bash / zsh / ksh,25个字节

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

要实际使用它,请以它作为唯一的一行,并使其可执行。未识别为已知二进制类型的可执行文件被视为Shell脚本(/bin/sh特别是)。

$ 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
这工作正常bashkshzsh,但一直没有机会在标准POSIX工作sh或兼容的dashyash。为避免混淆,我建议更改答案的标题。
manatwork 2015年

3
使用printf代替echo创建文件,您将获得25个字节。
sam hocevar 2015年

你们两个人都很好。两者都适用。
亚伦·戴维斯


2

Java,28个字节

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

使用正则表达式确保字符串由大写字符和至少一个小写字符组成。

-1个字节,感谢Benjamin Urquhart


您可以在
本杰明·厄克特

@BenjaminUrquhart哦,对了,谢谢
HyperNeutrino

1

k4,39个字节

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

第一个字符较高,其他所有较低,计数大于一个。

例如:

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

1

严重的是16个字节

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

十六进制转储:

a3342c6e983d296c313c29972d592626

在线试用

严重的还没有regex支持,所以我们能做的最好的事情是:

 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字节

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

用法示例:

# 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

取消跟踪(具有真实函数名称):

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

通过使用布尔值而不是整数(bleh!),然后将笨重if … then 0 else 的值替换为,实际上可以节省大约10%的费用… ||。对于此问题,使用布尔运算符代替matchand范围,例如n.[0]>'@'&n.[0]<'['&e(l-1)
Gilles'SO-别成为邪恶

1

SpecBAS-39个字节

SpecBAS通过MATCH命令处理正则表达式。如果为false,则输出为0;如果为true,则输出为1。

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

1

斯威夫特2,116字节

正则表达式在Swift中是如此冗长,以至于这样做的时间要短得多

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}

这将返回0-1(在没有输入的情况下)非官方名称,> 0如果该名称是官方名称,则返回一个数字(等于字符串的长度-1)。

不打高尔夫球

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个字节

正则表达式本来是解决此问题的正确方法,但是如果没有它,这是一种尝试。

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

长手

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

希望就如何使小写检查更短(也许没有循环)提出建议。我刚刚开始学习该语言,并以此作为练习,以为无论如何我都会分享自己的结果。



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.



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.