Mon nom est-il officiel?

25

introduction

Comme le dit ToonAlfrink : "Je pense qu'il n'y a pas assez de questions faciles ici que les débutants peuvent essayer!". La tâche est donc très simple. Étant donné une chaîne, affichez une valeur véridique ou fausse, que le nom soit officiel ou non.

Un nom est "officiel" s'il s'agit d'un seul mot majuscule, c'est-à-dire:

  • Si la première lettre est en majuscule (non officielle: adnan)
  • Si les autres lettres sont pas capitalisées (non officielle: AdNaN)
  • Si le nom ne contient pas de caractères non alphabétiques (non officielle: Adnan123, Adnan!)
  • Si le nom se compose d'un seul mot (non officiel: Adn an, Adn An)
  • Si le nom a plus d'un caractère (non officiel: A)

Règles

  • Vous pouvez fournir une fonction ou un programme
  • C'est du , donc la soumission avec le moins d'octets gagne!
  • Remarque: Pour simplifier les choses, des noms comme Mary-Ann ne sont pas officiels dans ce défi .
  • Supposons qu'il n'y ait pas d'espaces blancs principaux dans le nom.
  • Supposons que seuls les caractères ASCII imprimables ( 32-126) sont utilisés dans les noms

Cas de test

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

Classement

Adnan
la source
5
Donc mon nom n'est pas officiel? Je ferais mieux de le changer alors.
ETHproductions
12
@ETHproductions Si nous utilisons cette logique, Lolololololololololololest un nom officiel :)
Adnan
1
Cela ne répond pas vraiment à la question. Qu'est-ce que c'est: "vous pouvez supposer que le nom ne contient pas de lettres accentuées" ou "les noms avec des lettres accentuées devraient donner False"?
Lynn
1
En tant que digression canadienne légèrement décalée, un professeur que je connais ne serait pas satisfait de vos critères "officiels": Robert Smith? . Son nom a effectivement ce point d'interrogation . Aussi, Sahaiʔa .
Iwillnotexist Idonotexist
1
@FarhanAnam Oui
Adnan

Réponses:

6

Pyth, 16 13 12 octets

Merci à @Thomas Kwa de m'avoir rappelé Titlecase.

&qzr@GrzZ3tz

Suite de tests .

&              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
la source
21

Rétine, 13 octets

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

Essayez-le en ligne | Suite de tests (La sortie 0signifie qu'aucune des chaînes ne correspond, ce qui est attendu.)

Lorsque Retina n'est fourni qu'avec une seule ligne de code, il renvoie le nombre de fois où l'expression correspond à la chaîne d'entrée, donc il sortira 1(véridique) s'il correspond et est donc un nom officiel et 0(faux) si ce n'est pas le cas.

Panne

^       The beginning of the string
[A-Z]   One uppercase letter
[a-z]+  One or more lowercase letters
$       The end of the string
NinjaBearMonkey
la source
8
On dirait que nous avons besoin de classes de caractères pour les lettres. ;)
Martin Ender
10

TeaScript, 12 octets

xO`A-Z][a-z`

Abuse la Ofonction.

Essayez ceci en ligne

Suite de tests

Explication

La Ofonction fait ceci:

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

Ensuite, la fonction O vérifie si l'expression régulière correspond x.


Alternativement, une réponse TeaScript 3 non concurrente à 7 octets :

xO/\A\a
Downgoat
la source
Ahahaha, chouette. À un moment donné, alors que je travaillais sur l'interpréteur Japt, j'ai utilisé cette astuce avec la isCharfonction que vous avez ajoutée. Mais vous voudrez peut-être expliquer plus en détail pour ceux qui ne sont pas au courant.
ETHproductions
Ooooooh, j'aime les nouvelles fonctionnalités regex!
ETHproductions
7

JavaScript (ES6), 26

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

Par: 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
la source
Bon sang, tu m'as battu. Vous avez également surclassé ma version de 5 octets.
SuperJedi224
1
Un octet de moins:n=>n.match`^[A-Z][a-z]+$`
user81655
@ user81655 un tableau en tant que valeur véridique est trop forcé IMHO
edc65
@ edc65 Il est cependant valide.
SuperJedi224
1
Pour seulement 4 octets de plus, vous obtenez la conformité ES5:/./.test.bind(/^[A-Z][a-z]+$/)
CR Drost
7

Python, 59 58 octets

Je suis sûr qu'il n'y a pas de véritable moyen de battre la version Retina, car il s'agit essentiellement de cela dans Python. Mais je pense que c'est ma première soumission;)

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

C'est une valeur véridique très étrange :

(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

(Et cela nécessite ""autour de chaînes avec des espaces, s'il est passé via le shell)

Wayne Werner
la source
1
^n'est pas nécessaire car re.match()ne correspond qu'au début de la chaîne.
manatwork
1
@manatwork nice! Un autre octet rasé :) Je pourrais enregistrer un autre octet avec la paren de fermeture, en utilisant Python2
Wayne Werner
1
@WayneWerner: c'est pourquoi vous devriez donner la version Python :) Je pense que Python 2 et Python 3 sont en quelque sorte des langages différents, au moins pour codegolf.
movatica
Si vous utilisez un lambda anonyme au lieu d'un programme entier, vous obtenez 45 octets:lambda s:re.match('[A-Z][a-z]+$',s) import re
movatica
1
@movatica Oh, oups!
MilkyWay90
4

Java, 53 octets

boolean b(String a){return a.matches("[A-Z][a-z]+");}
SuperJedi224
la source
Vous pouvez utiliser un lambda:s->s.matches("[A-Z][a-z]+")
Benjamin Urquhart
4

Python, 50 45 43 41 octets

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

Renvoie Trues'il s'agit d'un nom officiel ou Falses'il ne l'est pas.

Zenadix
la source
Les règles de l'état du codegolf, dont vous n'avez pas besoin de prendre f=en compte, en économisant deux octets. En outre, (len(s)>1)enregistre 5 octets de plus s[1:].islower(). :)
movatica
3

BotEngine , 203 180 29x6 = 174

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

Je devrais vraiment ajouter des fonctions intégrées pour identifier les lettres majuscules et minuscules. Ce serait beaucoup plus concis que de vérifier chaque lettre individuellement.

Traduction approximative:

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
la source
3

C, 129 122 121 121 111 octets

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

Essayez-le en ligne

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
la source
3

VB6, 48 octets

Function f(i):f=i Like"[A-Z][a-z]+":End Function
Brosse à dents
la source
2

MATL , 18 octets

La version actuelle ( 4.0.0 ) de la langue est utilisée.

Cela applique la même expression régulière que la réponse de NinjaBearMonkey :

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

La sortie est la chaîne (qui est véridique ) si c'est un nom officiel, et rien (qui est faux ) si ce n'est pas le cas.

Exemples

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

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

Haskell, 61 octets

f(h:t@(_:_))=elem h['A'..'Z']&&all(`elem`['a'..'z'])t
f _=1<0
Lynn
la source
Plusieurs de plus . Vous pouvez également utiliser cette technique pour que l'autre test soit plus efficace, mais c'est le même nombre d'octets.
dfeuer
2

Gema, 17 personnages

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

Exemple d'exécution:

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
homme au travail
la source
2

Code machine IA-32, 19 octets

Une fonction qui reçoit le pointeur vers une chaîne se terminant par null ecxet renvoie 0 ou 1 dans eax(selon la fastcallconvention).

Hexdump du code:

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

En langage assembleur:

    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;

Le premier octet du nom d'entrée a son 5ème bit inversé ( xoravec 32) pour le convertir de la casse majuscule en petite casse. Cela charge 32 dans eax, en utilisant 3 octets de code:

    push 32;
    pop eax;

Pour vérifier si l'octet est une petite lettre:

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

Sinon, ce code échoue. Pour retourner 0 dans ce cas, il met 0 alavant de faire le saut conditionnel:

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

Le 0 dans alsert également de masque xor (ou d'absence) pour les octets suivants du nom d'entrée.

Une sortie réussie se produit lorsqu'elle rencontre un octet zéro, qui reste nul après xor:

    xor al, [ecx];
    jz yes;

Il suppose que le nom d'entrée n'est pas vide. Je suppose que c'est une hypothèse raisonnable sur un nom (pas une chaîne arbitraire)!

anatolyg
la source
2

grep, 16 octets

Voici le schéma:

[A-Z][a-z]+

Si vous utilisez les commutateurs -Eet -xet imprimera un nombre de lignes d'entrée correspondantes. Donc, si vous lui donnez une ligne, vous obtenez un 1 ou un 0. Je pense que c'est ainsi que fonctionne cet endroit.-cgrep

Le modèle est de 11 caractères, toute la ligne de commande est de 23. J'ai vu des gens utiliser des sedscripts sans la commande, donc je ne sais pas quoi. Mais, il lit stdin, et vous pouvez donc simplement taper dessus. Voici echo:

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

1
0
0
mikeserv
la source
@ Doorknob - me semble assez juste. Merci beaucoup. quel chapeau avez-vous deviné?
mikeserv
1
J'ai compris la vengeance de Hairboat. : P
Poignée de porte
Arrêtez-moi si (comme c'est très probable) je me trompe, mais vous pouvez l'utiliser grep -Excafin que vous n'ayez pas besoin de compter autant d'octets pour les commutateurs.
Neil
@Neil - je ne sais pas si vous vous trompez. je n'ai vraiment aucune idée - jetez un œil à l'historique des modifications.
mikeserv
2

Mathematica 10.1, 46 octets

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

Utilise un octet de moins que la solution d'expression régulière standard. Il fait trois vérifications. LetterQ@#garantit que la chaîne est entièrement composée de lettres et StringLength@#>1invalide les chaînes d'une seule lettre. #==ToCamelCase@#est cependant moins logique. ToCamelCaseest une fonction non documentée que j'ai trouvée qui prend une chaîne d'entrée AndOutputsItLikeThis. Puisqu'il n'y a qu'un seul mot, il mettra en majuscule la première lettre, donc nous vérifions si la chaîne est égale à cela.

LegionMammal978
la source
Est ToCamelCasenouveau dans 10.3? Ne semble pas fonctionner dans 10.2.
murphy
@murphy, cela fonctionne pour moi dans 10.1. Avec quoi obtenez-vous ToCamelCase["foo bar baz"]?
LegionMammal978
Ok, je peux confirmer que cela fonctionne en 10.1. Cependant, dans 8.0, 9.0, 10.0 et 10.2, la fonction n'est pas définie (votre scénario de test revient ToCamelCase[foo bar baz]). Étrange! Peut-être que quelqu'un peut vérifier 10,3?
murphy
2

bash / zsh / ksh, 25 octets

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

Pour réellement l'utiliser, créez un fichier avec lui comme seule ligne et rendez le fichier exécutable; les fichiers exécutables non reconnus comme un type binaire connu sont traités comme des scripts shell (pour /bin/shspécifiquement).

$ 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
la source
2
Cela fonctionne bien dans bash, kshet zsh, mais n'a aucune chance de fonctionner dans POSIX standard shou compatible dashet yash. Pour éviter toute confusion, je suggère de modifier le titre de la réponse.
manatwork
3
Utilisez printfau lieu de echopour créer le fichier et vous obtiendrez 25 octets.
sam hocevar
Bons points, vous deux; tous deux appliqués.
Aaron Davies
2

C # 4, 89 octets

Ma première tentative au Code Golf. Ça vient:

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

Voyez-le en action sur Dot Net Fiddle .

Farhan Anam
la source
Si vous utilisez C # 6, vous pouvez le raccourcir un peu:bool o(string i)=>System.Text.RegularExpressions.Regex.IsMatch(i,"^[A-Z][a-z]+$");
ProgramFOX
2

Java, 28 octets

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

Utilise l'expression régulière pour s'assurer que la chaîne se compose d'un caractère majuscule suivi d'au moins un caractère minuscule.

-1 octets grâce à Benjamin Urquhart

HyperNeutrino
la source
Vous pouvez déposer le point
Benjamin Urquhart
@BenjaminUrquhart oh oui, merci
HyperNeutrino
1

k4, 39 octets

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

Le premier caractère est supérieur, tous les autres sont inférieurs, comptent plus d'un.

Par exemple:

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

Sérieusement, 16 octets

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

Vidage hexadécimal:

a3342c6e983d296c313c29972d592626

Essayez-le en ligne

Sérieusement n'a pas encore de support regex, donc le mieux que nous pouvons faire est:

 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
la source
1

OCaml, 231 216 197 166 octets

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

Exemple d'utilisation:

# 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

Non golfé (avec de vrais noms de fonction):

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
la source
Vous pourriez en fait économiser environ 10% en utilisant des booléens au lieu d'entiers (bleh!) Et en remplaçant ceux volumineux if … then 0 else par … ||. Et d'ailleurs en utilisant des opérateurs booléens au lieu de matchet des gammes, par exemplen.[0]>'@'&n.[0]<'['&e(l-1)
Gilles 'SO- arrête d'être méchant'
1

SpecBAS - 39 octets

SpecBAS gère les expressions régulières via la MATCHcommande. La sortie est 0 pour faux et 1 si vrai.

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

Swift 2, 116 octets

Regex est tellement verbeux dans Swift que cela est beaucoup plus court

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}

Cela renverra 0ou -1(en cas d'absence de saisie) pour les noms non officiels, et un nombre> 0 (qui est égal à la longueur de la chaîne - 1) si le nom est officiel

Non golfé

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
la source
1

C #, 188 octets

Les expressions régulières auraient été le bon moyen de résoudre ce problème, mais voici une tentative sans cela.

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

Écriture normale

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

J'adorerais avoir des conseils sur la façon de raccourcir la vérification des minuscules, peut-être sans la boucle. J'ai juste commencé à apprendre la langue et je l'ai utilisé comme pratique, j'ai pensé partager mon résultat de toute façon.

OIE
la source
1

PowerShell , 29 octets

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

Essayez-le en ligne!

Est-ce que le même regex trompe tout le monde utilise. Doit utiliser case-sensitive matchpour le faire correctement au prix d'un octet.

Veskah
la source
1

Perl 6 , 17 octets

{/^<:Lu><:Ll>+$/}

Renvoie un Matchobjet s'il s'agit d'un nom officiel ou Nilautre.

Essayez-le en ligne!

bb94
la source
Vous n'avez pas besoin dem
Jo King