私の名前は公式ですか?


25

前書き

ToonAlfrinkが言うように:「私はここで初心者が試みることができる十分な簡単な質問がないと思います!」。そのため、タスクは非常に簡単です。文字列が与えられた場合、名前が公式であるかどうかにかかわらず、真実または偽の値を出力します。

単一のタイトルケースの単語である場合、名前は「公式」です。

  • 場合は最初の文字は(公式ではない:大文字ですadnan
  • 他の文字はしている場合ではない(公式ではない:大文字AdNaN
  • 名前にアルファベット以外の文字が含まれていない場合(非公式:Adnan123Adnan!
  • 名前が1語のみで構成されている場合(公式ではありません: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

12
@ETHproductionsこのロジックを使用している場合Lololololololololololol、正式な名前です:)
Adnan

1
それは本当に質問に答えません。それは、「名前にアクセント文字が含まれていないことを前提とするかもしれません」、または「アクセント文字を含む名前は結果として生じるはずFalseです」ですか?
リン

1
少し風変わりなカナダの余談として、私が知っている教授はあなたの「公式」基準に満足していないだろう:ロバート・スミス?。彼の名前には実際に疑問符が付いています。また、Sahaiʔa
Iwillnotexist Idonotexist

1
@FarhanAnamはい
アドナン

回答:


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行のコードのみが提供される場合、式が入力文字列に一致した回数を出力するため、一致する場合は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
文字に文字クラスが必要なようです。;)
マーティン・エンダー

10

TeaScript、12バイト

xO`A-Z][a-z`

虐待する O機能をます。

これをオンラインで試す

テストスイート

説明

Oこの関数は、このなります:

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

次に、O関数は、正規表現がに一致するかどうかをチェックしますx


あるいは、7バイトで競合しないTeaScript 3の回答:

xO/\A\a

あははは、いいね。Japtインタープリターの作業中のある時点で、isChar追加した関数でこのトリックを使用しました。しかし、知らない人のためにもっと詳しく説明したいかもしれません。
ETHproductions

ああ、新しい正規表現機能が気に入っています!
ETHproductions

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
1バイト少ない:n=>n.match`^[A-Z][a-z]+$`
user81655

@ user81655真理値としての配列が強すぎる
IMHO

@ 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()文字列の先頭でのみ一致するため、必要ありません。
マナトワーク

1
@manatworkいいね!別のバイトを削りました:) Python2を使用して閉じ括弧で別のバイトを保存できました
ウェインワーナー

1
@WayneWerner:それが、Pythonバージョンを提供すべき理由です:) Python 2とPython 3は、少なくともcodegolfに関しては、異なる言語の一種だと思います。
movatica

:あなたの代わりに、プログラム全体の匿名ラムダを使用する場合は、45のバイトを取得lambda s:re.match('[A-Z][a-z]+$',s) import re
movatica

1
@movaticaああ、あら!
MilkyWay90


4

Python、50 45 43 41バイト

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

True正式名であるかFalseそうでないかを返します。


codegolf状態のルール。これを考慮する必要はなくf=、2バイトを節約します。また、で(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);
}




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バイト

nullで終わる文字列へのポインタを受け取り、ecx0または1をeaxfastcall慣例に従って)返す関数。

コードのHexdump:

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番目のビットが反転します(xor32)。これにより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;

0 alの入力は、入力名の次のバイトのxorマスク(またはその欠如)としても機能します。

正常に終了すると、ゼロバイトが検出され、その後はゼロのままになりますxor

    xor al, [ecx];
    jz yes;

入力名が空でないことを前提としています。名前についての合理的な仮定だと思います(任意の文字列ではありません)!


2

grep、16バイト

これはパターンです:

[A-Z][a-z]+

and スイッチを使用する-E-x、一致する入力行の数が出力されます。したがって、1行を指定すると、1または0が得られます。これがこの場所の仕組みです。-cgrep

パターンは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

1
Hairboat's Revengeを見つけました。:P
ドアノブ

(おそらくそうであるように)私が間違っている場合は、私を止めてくださいgrep -Exc
ニール

@ニール-あなたが間違っているなら私は知らない。私は本当にわからない-編集履歴を見てください。
mikeserv

2

Mathematica 10.1、46バイト

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

標準の正規表現ソリューションよりも1バイト少ないバイトを使用します。3つのチェックを行います。LetterQ@#文字列が完全に文字で構成されていることを確認し、1文字の文字列をStringLength@#>1無効にします。#==ToCamelCase@#ただし、あまり意味がありません。ToCamelCaseは、入力文字列AndOutputsItLikeThisを取得するドキュメント化されていない関数です。単語が1つしかないため、最初の文字が大文字になるので、文字列がそれに等しいかどうかを確認します。


であるToCamelCase10.3に新しいですか?10.2では機能しないようです。
マーフィー

@ murphy、10.1で動作します。何で手に入れToCamelCase["foo bar baz"]ますか?
LegionMammal978

OK、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]+$ ]]

これを実際に使用するには、それを唯一の行としてファイルを作成し、ファイルを実行可能にします。既知のバイナリタイプとして認識されない実行可能ファイルは、(/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
これはで罰金を働きbashkshそしてzsh、標準的なPOSIXで作業する機会がありませんshまたは互換性dashとをyash。混乱を避けるために、回答のタイトルを変更することをお勧めします。
マナトワーク

3
使用するprintf代わりに、echoファイルを作成するために、あなたは25バイトを取得します。
サムホセバル

良い点、あなたの両方; 両方が適用されます。
アーロンデイヴィス

2

C#4、89バイト

コードゴルフでの私の最初の試み。ここに来る:

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

Dot Net Fiddleで実際の動作をご覧ください。


あなたがC#6を使用している場合、あなたはそれが少し短くすることができますbool o(string i)=>System.Text.RegularExpressions.Regex.IsMatch(i,"^[A-Z][a-z]+$");
ProgramFOX

2

Java、28バイト

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

正規表現を使用して、文字列が大文字とそれに続く少なくとも1つの小文字で構成されていることを確認します。

ベンジャミン・アーカートのおかげで-1バイト


セミコロンをドロップできます
ベンジャミンアーカート

@BenjaminUrquhartそうそう、ありがとう
HyperNeutrino

1

k4、39バイト

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

最初のcharは上位、他のcharはすべて下位、1より大きいカウントです。

例えば:

  {((*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

オンラインで試す

真剣に正規表現はまだサポートされていないため、できることは次のとおりです。

 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

Ungolfed(実際の関数名を使用):

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

実際には、整数の代わりにブール値を使用して(大丈夫!)、それらのかさばっif … then 0 else たものをに置き換えることで、約10%節約でき… ||ます。またmatch、範囲の代わりにブール演算子を使用することにより、たとえばn.[0]>'@'&n.[0]<'['&e(l-1)
Gilles 'SO- stop being evil'

1

SpecBAS-39バイト

SpecBASは、 MATCHコマンドます。出力はfalseの場合は0、trueの場合は1です。

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

1

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

おそらくループを使用せずに、小文字のチェックを短くする方法に関するアドバイスが必要です。私は言語を学び始めたばかりで、これを練習として使用しました、とにかく私の結果を共有すると思いました。





弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.