Ist mein Name offiziell?

25

Einführung

Wie ToonAlfrink sagt : "Ich denke, dass es hier nicht genug einfache Fragen gibt, die Anfänger versuchen können!". Die Aufgabe ist also sehr einfach. Geben Sie bei einer gegebenen Zeichenfolge einen wahrheitsgemäßen oder falschen Wert aus, unabhängig davon, ob der Name offiziell ist oder nicht.

Ein Name ist "offiziell", wenn es sich um ein einzelnes Wort in Groß- und Kleinschreibung handelt, dh:

  • Wenn der erste Buchstabe groß geschrieben (nicht offiziell: adnan)
  • Wenn die anderen Buchstaben sind nicht aktiviert (nicht offiziell: AdNaN)
  • Wenn der Name nicht enthält keine nicht-alphabetischen Zeichen (nicht offiziell: Adnan123, Adnan!)
  • Wenn der Name nur ein Wort besteht (nicht offiziell: Adn an, Adn An)
  • Wenn der Name hat mehr als ein Zeichen (nicht offiziell: A)

Regeln

  • Sie können eine Funktion oder ein Programm bereitstellen
  • Das ist , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!
  • Hinweis: Um die Sache zu vereinfachen, sind Namen wie Mary-Ann bei dieser Herausforderung nicht offiziell.
  • Angenommen, der Name enthält keine führenden Leerzeichen.
  • Angenommen, 32-126in den Namen werden nur die druckbaren ASCII-Zeichen ( ) verwendet

Testfälle

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

Bestenliste

Adnan
quelle
5
Also ist mein Name nicht offiziell? Dann ändere ich es besser.
ETHproductions
12
@ETHproductions Wenn wir diese Logik verwenden, Lolololololololololololist ein offizieller Name :)
Adnan
1
Das beantwortet die Frage nicht wirklich. Was ist es: "Sie können davon ausgehen, dass der Name keine Buchstaben mit Akzent enthält" oder "Namen mit Akzent sollten ergeben False"?
Lynn
1
Als ein wenig ungewöhnlicher kanadischer Exkurs wäre ein Professor, von dem ich weiß, mit Ihren "offiziellen" Kriterien nicht zufrieden: Robert Smith? . Sein Name hat tatsächlich dieses Fragezeichen . Auch Sahaiʔa .
Ich werde nicht existieren Idonotexist
1
@ FarhanAnam Ja
Adnan

Antworten:

6

Pyth, 16 13 12 Bytes

Vielen Dank an @Thomas Kwa, der mich an den Titel erinnert hat.

&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
Maltysen
quelle
21

Retina, 13 Bytes

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

Versuchen Sie es online | Testsuite (Die Ausgabe 0bedeutet, dass keine der Zeichenfolgen übereinstimmt, was erwartet wird.)

Wenn Retina nur mit einer einzigen Codezeile versehen ist, gibt es die 1Häufigkeit aus, mit der der Ausdruck mit der Eingabezeichenfolge übereinstimmt, sodass er (wahr) ausgegeben wird, wenn er übereinstimmt und daher ein offizieller Name ist, und 0(falsch), wenn er nicht übereinstimmt.

Nervenzusammenbruch

^       The beginning of the string
[A-Z]   One uppercase letter
[a-z]+  One or more lowercase letters
$       The end of the string
NinjaBearMonkey
quelle
8
Es sieht so aus, als ob wir Zeichenklassen für Buchstaben benötigen. ;)
Martin Ender
10

TeaScript, 12 Bytes

xO`A-Z][a-z`

Missbraucht die OFunktion.

Versuchen Sie dies online

Test Suite

Erläuterung

Die OFunktion macht dies:

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

Dann prüft die O-Funktion, ob der reguläre Ausdruck übereinstimmt x.


Alternativ kann eine nicht konkurrierende TeaScript 3-Antwort mit 7 Bytes erfolgen :

xO/\A\a
Downgoat
quelle
Ahahaha, schön. Irgendwann, als ich am Japt-Interpreter arbeitete, habe ich diesen Trick mit der isCharFunktion verwendet, die Sie hinzugefügt haben. Aber vielleicht möchten Sie es denjenigen, die nicht Bescheid wissen, genauer erklären.
ETHproductions
Ooooooh, ich mag die neuen Regex-Funktionen!
ETHproductions
7

JavaScript (ES6), 26

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

Von: 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>

edc65
quelle
Verdammt, du hast mich geschlagen. Sie haben auch meine Version um 5 Bytes übertroffen.
SuperJedi224
1
Ein Byte weniger:n=>n.match`^[A-Z][a-z]+$`
user81655
@ user81655 Ein Array als Wahrheitswert ist zu stark gezwungen. IMHO
edc65 24.12.15
@ edc65 Ist aber gültig.
SuperJedi224,
1
Für nur 4 Bytes mehr erhalten Sie die ES5-Konformität:/./.test.bind(/^[A-Z][a-z]+$/)
CR Drost
7

Python, 59-58 Bytes

Ich bin mir sicher, dass es keinen wirklichen Weg gibt, die Retina-Version zu schlagen, da dies im Grunde genommen genau das in Python ist. Aber ich denke das ist meine erste Vorlage;)

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

Es ist ein sehr seltsamer Wahrheitswert:

(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

(Und es erfordert ""um Zeichenfolgen mit Leerzeichen, wenn über die Shell übergeben)

Wayne Werner
quelle
1
^wird nicht benötigt, da re.match()nur Übereinstimmungen am Anfang der Zeichenfolge vorhanden sind.
Manatwork
1
@manatwork schön! Noch ein Byte rasiert :) Ich konnte mit Python2
Wayne Werner
1
@WayneWerner: deswegen solltest du die Python-Version geben :) Ich denke, Python 2 und Python 3 sind eine Art von verschiedenen Sprachen, zumindest für Codegolf.
Movatica
Wenn Sie ein anonymes Lambda anstelle eines ganzen Programms verwenden, erhalten Sie 45 Bytes:lambda s:re.match('[A-Z][a-z]+$',s) import re
movatica
1
@movatica Oh, hoppla!
MilkyWay90
4

Java, 53 Bytes

boolean b(String a){return a.matches("[A-Z][a-z]+");}
SuperJedi224
quelle
Sie können ein Lambda verwenden:s->s.matches("[A-Z][a-z]+")
Benjamin Urquhart
4

Python, 50 45 43 41 Bytes

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

Gibt zurück, Trueob es ein offizieller Name ist oder Falsenicht.

Zenadix
quelle
Codegolf-Regeln geben an, dass Sie das nicht f=berücksichtigen müssen und sparen zwei Bytes. Außerdem (len(s)>1)spart 5 Byte über s[1:].islower(). :)
Movatica
3

BotEngine , 203 180 29 x 6 = 174

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

Ich sollte wirklich Builtins hinzufügen, um Groß- und Kleinbuchstaben zu identifizieren. Das wäre viel prägnanter, als jeden Brief einzeln zu prüfen.

Grobe Übersetzung:

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
SuperJedi224
quelle
3

C, 129 122 121 111 Bytes

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

Probieren Sie es 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);
}
James
quelle
3

VB6, 48 Bytes

Function f(i):f=i Like"[A-Z][a-z]+":End Function
Zahnbürste
quelle
2

MATL , 18 Bytes

Die aktuelle Version ( 4.0.0 ) der Sprache wird verwendet.

Dies gilt für den gleichen regulären Ausdruck wie für die Antwort von NinjaBearMonkey :

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

Die Ausgabe ist die Zeichenfolge (die wahr ist ), wenn es ein offizieller Name ist, und nichts (was falsch ist ), wenn es nicht ist.

Beispiele

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

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

Haskell, 61 Bytes

f(h:t@(_:_))=elem h['A'..'Z']&&all(`elem`['a'..'z'])t
f _=1<0
Lynn
quelle
Noch ein paar mehr . Sie könnten diese Technik auch für den anderen Test verwenden, um effizienter zu sein, aber es ist dieselbe Anzahl von Bytes.
dfeuer
2

Gema, 17 Zeichen

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

Probelauf:

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
Mann bei der Arbeit
quelle
2

Ruby, 28 Bytes

p (gets=~/^[A-Z][a-z]+$/)!=p

-2 Bytes (dank Handarbeit)

Kakaobohne
quelle
Werfen Sie einen Blick auf Fábio Perez ' pTipps unter Tipps zum Golfen in Ruby .
Manatwork
Einfacher und kürzer: p !!gets[/^[A-Z][a-z]+$/]
daniero
2

IA-32 Maschinencode, 19 Bytes

Eine Funktion, die den Zeiger auf eine nullterminierende Zeichenfolge in empfängt ecxund 0 oder 1 in eax(gemäß der fastcallKonvention) zurückgibt .

Hexdump des Codes:

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

In Assemblersprache:

    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;

Das fünfte Bit des ersten Bytes des Eingabenamens wird umgedreht ( xormit 32), um es von Groß- und Kleinschreibung in Kleinschreibung umzuwandeln. Dies lädt 32 eaxmit 3 Byte Code:

    push 32;
    pop eax;

So überprüfen Sie, ob das Byte ein kleiner Buchstabe ist:

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

Wenn nicht, fällt dieser Code durch. Um in diesem Fall 0 zurückzugeben, wird 0 eingegeben, albevor der bedingte Sprung ausgeführt wird:

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

Die 0 in aldient auch als XOR-Maske (oder Abwesenheit davon) für die folgenden Bytes des Eingabenamens.

Ein erfolgreicher Exit ist, wenn er auf ein Null-Byte stößt, das nach dem xorfolgenden Wert Null bleibt :

    xor al, [ecx];
    jz yes;

Es wird davon ausgegangen, dass der Eingabename nicht leer ist. Ich denke, es ist eine vernünftige Annahme über einen Namen (keine willkürliche Zeichenfolge)!

anatolyg
quelle
2

grep16 Bytes

Das ist das Muster:

[A-Z][a-z]+

Wenn Sie die Schalter -Eund -xund verwenden, werden die übereinstimmenden Eingabezeilen gezählt. Wenn Sie also eine Zeile eingeben, erhalten Sie eine 1 oder eine 0. Ich denke, so funktioniert dieser Ort.-cgrep

Das Muster ist 11 Zeichen, die gesamte Befehlszeile ist 23. Ich habe gesehen, dass Leute sedSkripte ohne den Befehl verwenden, also weiß ich nicht, was was ist. Aber es liest stdin, und so können Sie es einfach eingeben. Hier ist echo:

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

1
0
0
mikeserv
quelle
@Doorknob - scheint mir fair genug. vielen Dank. Welchen Hut hast du erraten?
mikeserv
1
Ich fand Hairboat's Revenge heraus. : P
Türklinke
Stoppen Sie mich, wenn ich mich irre (wie es wahrscheinlich ist), aber Sie können es verwenden, grep -Excdamit Sie nicht so viele Bytes für die Schalter zählen müssen.
Neil
@Neil - Ich weiß nicht, ob Sie sich irren. Ich habe wirklich keine Ahnung - werfen Sie einen Blick auf die Bearbeitungshistorie.
mikeserv
2

Mathematica 10.1, 46 Bytes

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

Verwendet ein Byte weniger als die Standard-Regex-Lösung. Es werden drei Prüfungen durchgeführt. LetterQ@#Stellt sicher, dass die Zeichenfolge vollständig aus Buchstaben besteht, und macht Zeichenfolgen mit nur einem Buchstaben StringLength@#>1ungültig. #==ToCamelCase@#macht aber weniger sinn. ToCamelCaseist eine undokumentierte Funktion, die ich gefunden habe und die eine Eingabezeichenfolge AndOutputsItLikeThis annimmt. Da es nur ein Wort gibt, wird der erste Buchstabe in Großbuchstaben geschrieben. Wir prüfen daher, ob die Zeichenfolge mit dieser übereinstimmt.

LegionMammal978
quelle
Ist ToCamelCaseneu in 10.3? Scheint in 10.2 nicht zu funktionieren.
Murphy
@murphy, es funktioniert bei mir in 10.1. Was hast du davon ToCamelCase["foo bar baz"]?
LegionMammal978
Ok, ich kann bestätigen, dass es in 10.1 funktioniert. In 8.0, 9.0, 10.0 und 10.2 ist die Funktion jedoch nicht definiert (Ihr Testfall wird zurückgegeben ToCamelCase[foo bar baz]). Seltsam! Vielleicht kann jemand 10.3 überprüfen?
Murphy
2

Bash / Zsh / Ksh, 25 Bytes

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

Um dies tatsächlich zu verwenden, erstellen Sie eine Datei mit dieser als einziger Zeile und machen Sie die Datei ausführbar. ausführbare Dateien, die nicht als bekannter Binärtyp erkannt wurden, werden ( /bin/shinsbesondere) als Shell-Skripte behandelt .

$ 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
$ 
Aaron Davies
quelle
2
Dies funktioniert gut in bash, kshund zsh, hat aber keine Chance auf Arbeit in Standard - POSIX shoder kompatibel dashund yash. Um Verwirrung zu vermeiden, schlage ich vor, den Titel der Antwort zu ändern.
Manatwork
3
Verwenden Sie printfanstelle von echo, um die Datei zu erstellen, und Sie erhalten 25 Bytes.
Sam Hocevar
Gute Punkte, ihr beide; beides galt.
Aaron Davies
2

C # 4, 89 Bytes

Mein erster Versuch bei Code Golf. Hier kommt es:

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

Sehen Sie es in Aktion bei Dot Net Fiddle .

Farhan Anam
quelle
Wenn Sie C # 6 verwenden, können Sie es etwas kürzer machen: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]+")

Verwendet Regex, um sicherzustellen, dass die Zeichenfolge aus einem Großbuchstaben und mindestens einem Kleinbuchstaben besteht.

-1 Bytes dank Benjamin Urquhart

HyperNeutrino
quelle
Sie können das Semikolon
Benjamin Urquhart
@ BenjaminUrquhart oh, richtig, danke
HyperNeutrino
1

k4, 39 Bytes

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

Das erste Zeichen ist höher, alle anderen sind niedriger und zählen mehr als eins.

Z.B:

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

Im Ernst, 16 Bytes

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

Hex Dump:

a3342c6e983d296c313c29972d592626

Probieren Sie es online

Im Ernst, es gibt noch keine Unterstützung für Regex. Das Beste, was wir tun können, ist:

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

Anwendungsbeispiel:

# 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 (mit echten Funktionsnamen):

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;;
Moshe Katz
quelle
Sie könnten tatsächlich 10% einsparen, indem Sie Boolesche Werte anstelle von ganzen Zahlen (bleh!) Verwenden und diese sperrigen if … then 0 else durch ersetzen … ||. Und was das betrifft von Booleschen Operatoren statt matchund Bereiche, zBn.[0]>'@'&n.[0]<'['&e(l-1)
Gilles ‚SO- Anschlag Sein Übel‘
1

SpecBAS - 39 Bytes

SpecBAS behandelt reguläre Ausdrücke über den MATCHBefehl. Die Ausgabe ist 0 für false und 1 für true.

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

Swift 2, 116 Bytes

Regex ist in Swift so ausführlich, dass dies viel kürzer ist

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}

Dies gibt 0oder -1(falls keine Eingabe erfolgt) für nicht offizielle Namen und eine Nummer zurück> 0 (die der Länge der Zeichenfolge entspricht - 1) zurück, wenn der Name offiziell ist

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
}
Jojodmo
quelle
1

C #, 188 Bytes

Reguläre Ausdrücke wären der richtige Weg gewesen, dies in Angriff zu nehmen, aber hier ist ein Versuch ohne sie.

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

Langschrift

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

Würde gerne Ratschläge dazu erhalten, wie der Kleinbuchstaben-Check kürzer gemacht werden kann, vielleicht ohne die Schleife. Ich habe gerade angefangen, die Sprache zu lernen, und habe dies als Übung verwendet. Ich dachte, ich würde trotzdem mein Ergebnis teilen.

Gans
quelle
1

PowerShell , 29 Byte

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

Probieren Sie es online!

Hat derselbe Regex-Trick, den alle anderen verwenden. Muss case-sensitive verwenden match, um es auf Kosten eines Bytes richtig zu machen.

Veskah
quelle