Czy moje imię jest oficjalne?

25

Wprowadzenie

Jak mówi ToonAlfrink : „ Uważam, że nie ma tutaj wystarczająco łatwych pytań, które mogliby podjąć początkujący!”. Zadanie jest więc bardzo proste. Biorąc pod uwagę ciąg, wypisz wartość prawdy lub fałszu, niezależnie od tego, czy nazwa jest oficjalna, czy nie.

Nazwa jest „oficjalna”, jeśli jest to pojedyncze słowo w tytule, to znaczy:

  • Jeżeli pierwsza litera jest (nie oficjalne: adnan)
  • Jeśli inne litery są nie aktywowane (nie oficjalne: AdNaN)
  • Jeśli nazwa nie zawiera żadnych znaków spoza alfabetu (nie oficjalne: Adnan123, Adnan!)
  • Jeśli nazwa składa się z jednego słowa (nie oficjalne: Adn an, Adn An)
  • Jeśli nazwa zawiera więcej niż jeden znak (nie oficjalne: A)

Zasady

  • Możesz podać funkcję lub program
  • To jest , więc wygrywanie z najmniejszą ilością bajtów wygrywa!
  • Uwaga: Aby uprościć rzeczy, imiona takie jak Mary-Ann są w tym wyzwaniu nieoficjalne.
  • Załóżmy, że w nazwie nie ma wiodących białych znaków.
  • Załóżmy, że 32-126w nazwach używane są tylko drukowalne znaki ASCII ( )

Przypadki testowe

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

Tabela liderów

Adnan
źródło
5
Więc moje imię nie jest oficjalne? Lepiej to zmienię.
ETHproductions
12
@ETHproductions Jeśli używamy tej logiki, Lolololololololololololto jest to oficjalna nazwa :)
Adnan
1
To tak naprawdę nie odpowiada na pytanie. Co to jest: „możesz założyć, że nazwa nie zawiera liter akcentowanych” lub „imiona z literami akcentowanymi powinny dać False”?
Lynn
1
Jako nieco niecodzienna kanadyjska dygresja profesor, którego znam, nie byłby zadowolony z twoich „oficjalnych” kryteriów: Robert Smith? . Jego imię faktycznie ma ten znak zapytania . Również Sahaiʔa .
Nie będę istniał Idonotexist
1
@FarhanAnam Tak
Adnan

Odpowiedzi:

6

Pyth, 16 13 12 bajtów

Dzięki @Thomas Kwa za przypomnienie mi o titlecase.

&qzr@GrzZ3tz

Pakiet testowy .

&              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
źródło
21

Siatkówka, 13 bajtów

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

Wypróbuj online | Zestaw testowy (Dane wyjściowe 0oznaczają brak pasujących ciągów, co jest oczekiwane).

Gdy Retina jest dostarczana tylko z jednym wierszem kodu, wyświetla liczbę razy, gdy wyrażenie pasowało do ciągu wejściowego, więc wyświetli 1(prawda), jeśli pasuje, a zatem jest oficjalną nazwą i 0(fałsz), jeśli nie jest.

Awaria

^       The beginning of the string
[A-Z]   One uppercase letter
[a-z]+  One or more lowercase letters
$       The end of the string
NinjaBearMonkey
źródło
8
Wygląda na to, że potrzebujemy klas znaków dla liter. ;)
Martin Ender
10

TeaScript, 12 bajtów

xO`A-Z][a-z`

Nadużywa Ofunkcji.

Wypróbuj to online

Pakiet testowy

Wyjaśnienie

OFunkcja sprawia, że w ten sposób:

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

Następnie funkcja O sprawdza, czy wyrażenie regularne pasuje x.


Alternatywnie, niekonkurencyjna odpowiedź na TeaScript 3 o 7 bajtach :

xO/\A\a
Downgoat
źródło
Ahahaha, niezły. W pewnym momencie, gdy pracowałem nad interpretatorem Japt, użyłem tej sztuczki z isChardodaną funkcją. Ale możesz wyjaśnić bardziej szczegółowo tym, którzy nie wiedzą.
ETHprodukcje
Ooooooh, lubię nowe funkcje wyrażeń regularnych!
ETHproductions
7

JavaScript (ES6), 26

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

Przez: 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
źródło
Cholera, pobiłeś mnie do tego. Wyprzedziłeś też moją wersję o 5 bajtów.
SuperJedi224,
1
Jeden bajt mniej:n=>n.match`^[A-Z][a-z]+$`
user81655,
@ user81655 tablica jako prawdziwa wartość jest zbyt wymuszona IMHO
edc65
@ edc65 Jest to jednak poprawne.
SuperJedi224,
1
Za jedyne 4 bajty więcej uzyskasz zgodność z ES5:/./.test.bind(/^[A-Z][a-z]+$/)
CR Drost
7

Python, 59 58 bajtów

Jestem pewien, że nie ma prawdziwego sposobu na pokonanie wersji Retina, ponieważ jest to w zasadzie tylko ta wersja Pythona. Ale myślę, że to moje pierwsze zgłoszenie;)

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

Jest to bardzo dziwna prawdziwa wartość:

(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

(I to wymaga ""wokół ciągów ze spacjami, jeśli przechodzi przez powłokę)

Wayne Werner
źródło
1
^nie jest potrzebne, ponieważ re.match()pasuje tylko na początku łańcucha.
manatwork
1
@manatwork nice! Kolejny bajt się ogolił :) Mógłbym zapisać kolejny bajt z zamykającym paren, używając Python2
Wayne Werner
1
@WayneWerner: dlatego powinieneś podać wersję Python :) Myślę, że Python 2 i Python 3 są rodzajem różnych języków, przynajmniej dla codegolf.
movatica
Jeśli użyjesz anonimowej lambdy zamiast całego programu, otrzymasz 45 bajtów:lambda s:re.match('[A-Z][a-z]+$',s) import re
movatica
1
@movatica Oh, ups!
MilkyWay90
4

Java, 53 bajty

boolean b(String a){return a.matches("[A-Z][a-z]+");}
SuperJedi224
źródło
Możesz użyć lambda:s->s.matches("[A-Z][a-z]+")
Benjamin Urquhart
4

Python, 50 45 43 41 bajtów

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

Zwraca, Truejeśli jest to oficjalna nazwa lub Falsejeśli nie jest.

Zenadix
źródło
Reguły kodu codegolf, że nie trzeba brać f=pod uwagę, oszczędzając dwa bajty. Ponadto (len(s)>1)oszczędza 5 bajtów s[1:].islower(). :)
movatica
3

BotEngine , 203 180 29x6 = 174

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

Powinienem naprawdę dodać wbudowane identyfikatory wielkich i małych liter. Byłoby to o wiele bardziej zwięzłe niż sprawdzanie każdej litery osobno.

Tłumaczenie z grubsza:

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
źródło
3

C, 129 122 121 111 bajtów

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

Wypróbuj 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
źródło
3

VB6, 48 bajtów

Function f(i):f=i Like"[A-Z][a-z]+":End Function
Szczoteczka do zębów
źródło
2

MATL , 18 bajtów

Używana jest aktualna wersja ( 4.0.0 ) języka.

Dotyczy to tego samego wyrażenia regularnego, co odpowiedź NinjaBearMonkey :

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

Dane wyjściowe to ciąg znaków (co jest zgodne z prawdą ), jeśli jest to oficjalna nazwa, i nic (co jest fałszem ), jeśli nie jest.

Przykłady

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

>> matl
 > j'^[A-Z][a-z]+$'XX
 > 
> ASCII
>> 
Luis Mendo
źródło
2

Haskell, 61 bajtów

f(h:t@(_:_))=elem h['A'..'Z']&&all(`elem`['a'..'z'])t
f _=1<0
Lynn
źródło
Kilka więcej w dół . Możesz również użyć tej techniki, aby drugi test był bardziej wydajny, ale jest to ta sama liczba bajtów.
dfeuer
2

Gema, 17 znaków

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

Przykładowy przebieg:

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
człowiek w pracy
źródło
2

Kod maszynowy IA-32, 19 bajtów

Funkcja, która odbiera wskaźnik do łańcucha zakończonego znakiem null ecxi zwraca 0 lub 1 w eax(zgodnie zfastcall konwencją).

Hexdump kodu:

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

W języku asemblera:

    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;

Pierwszy bajt nazwy wejściowej ma swój 5. bit odwrócony (za xorpomocą 32), aby przekonwertować go z dużej na małą. To ładuje 32 eax, używając 3 bajtów kodu:

    push 32;
    pop eax;

Aby sprawdzić, czy bajt jest małą literą:

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

Jeśli nie, ten kod przechodzi. Aby zwrócić 0 w tym przypadku, wstawia 0 alprzed wykonaniem skoku warunkowego:

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

Wartość 0 w alsłuży również jako maska ​​xor (lub jej brak) dla następujących bajtów nazwy wejściowej.

Pomyślne wyjście następuje, gdy napotka on bajt zerowy, który pozostaje zerowy po xor:

    xor al, [ecx];
    jz yes;

Zakłada się, że nazwa wejściowa nie jest pusta. Wydaje mi się, że jest to rozsądne założenie dotyczące nazwy (a nie dowolnego ciągu)!

anatolig
źródło
2

grep, 16 bajtów

Oto wzór:

[A-Z][a-z]+

Jeśli używasz -Ei -xi -cprzełącznikigrep wypisze liczbę pasujących linii wejściowych. Więc jeśli podasz jedną linię, otrzymasz 1 lub 0. Myślę, że tak to działa.

Wzór ma 11 znaków, cała linia poleceń to 23. Widziałem, jak ludzie używają sedskryptów bez polecenia, więc nie wiem, co jest. Ale odczytuje stdin, więc możesz po prostu pisać. Oto echo:

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

1
0
0
mikeserv
źródło
@Doorknob - wydaje mi się wystarczająco sprawiedliwy. Dziękuję bardzo. który kapelusz zgadłeś?
mikeserv
1
Zrozumiałem zemstę Hairboat. : P
Klamka
Zatrzymaj mnie, jeśli (co jest całkiem prawdopodobne) się mylę, ale możesz użyć, grep -Excaby nie trzeba było liczyć tylu bajtów dla przełączników.
Neil,
@Neil - nie wiem, jeśli się mylisz. naprawdę nie mam pojęcia - spójrz na historię edycji.
mikeserv,
2

Mathematica 10.1, 46 bajtów

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

Wykorzystuje jeden bajt mniej niż standardowe rozwiązanie wyrażenia regularnego. Wykonuje trzy kontrole. LetterQ@#zapewnia, że ​​ciąg jest w całości złożony z liter i StringLength@#>1unieważnia ciągi jednoliterowe. #==ToCamelCase@#ma jednak mniej sensu. ToCamelCaseto nieudokumentowana funkcja, którą znalazłem, która pobiera ciąg wejściowy AndOutputsItLikeThis. Ponieważ jest tylko jedno słowo, pierwsza litera będzie pisana wielką literą, więc sprawdzamy, czy ciąg znaków jest taki sam.

LegionMammal978
źródło
Jest ToCamelCasenowy w 10.3? Nie wydaje się działać w 10.2.
murphy,
@murphy, działa dla mnie w 10.1. Co Ci się ToCamelCase["foo bar baz"]?
LegionMammal978,
Ok, mogę potwierdzić, że działa w 10.1. Jednak w wersjach 8.0, 9.0, 10.0 i 10.2 funkcja nie jest zdefiniowana (zwraca się Twój przypadek testowy ToCamelCase[foo bar baz]). Dziwne! Może ktoś może sprawdzić 10.3?
murphy,
2

bash / zsh / ksh, 25 bajtów

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

Aby faktycznie tego użyć, utwórz plik z jedyną linią i spraw, aby plik był wykonywalny; pliki wykonywalne nierozpoznane jako znany typ binarny są traktowane jak skrypty powłoki (w /bin/shszczególności).

$ 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
źródło
2
Działa to dobrze w bash, ksha zsh, ale nie ma szans na pracę w standardzie POSIX shlub kompatybilny dashi yash. Aby uniknąć nieporozumień, sugeruję zmienić tytuł odpowiedzi.
manatwork
3
Użyj printfzamiast, echoaby utworzyć plik, a otrzymasz 25 bajtów.
sam hocevar
Dobre punkty, oboje; oba zastosowane.
Aaron Davies
2

C # 4, 89 bajtów

Moja pierwsza próba w Code Golf. Oto nadchodzi:

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

Zobacz to w akcji na Dot Net Fiddle .

Farhan Anam
źródło
Jeśli używasz C # 6, możesz go nieco skrócić:bool o(string i)=>System.Text.RegularExpressions.Regex.IsMatch(i,"^[A-Z][a-z]+$");
ProgramFOX
2

Java, 28 bajtów

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

Używa wyrażenia regularnego, aby upewnić się, że łańcuch składa się z wielkich liter, po których następuje co najmniej jeden mały znak.

-1 bajty dzięki Benjaminowi Urquhartowi

HyperNeutrino
źródło
Możesz upuścić średnik
Benjamina Urquharta
@BenjaminUrquhart o racja, dzięki
HyperNeutrino
1

k4, 39 bajtów

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

Pierwszy znak jest wyższy, wszystkie pozostałe są niższe, liczą się więcej niż jeden.

Na przykład:

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

Poważnie, 16 bajtów

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

Hex Dump:

a3342c6e983d296c313c29972d592626

Wypróbuj online

Poważnie nie ma jeszcze obsługi wyrażeń regularnych, więc najlepsze, co możemy zrobić, to:

 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
kwintopia
źródło
1

Ocaml, 231 216 197 166 bajtów

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

Przykładowe użycie:

# 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

Niegolfowane (z prawdziwymi nazwami funkcji):

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
źródło
Można faktycznie zaoszczędzić około 10% za pomocą wartości logicznych zamiast liczb całkowitych (bleh!) I zastępując te nieporęczne if … then 0 else przez … ||. I w tym przypadku, używając operatorów boolowskich zamiast matchi zakresów, np.n.[0]>'@'&n.[0]<'['&e(l-1)
SO Gillesa - przestań być zły ”
1

SpecBAS - 39 bajtów

SpecBAS obsługuje wyrażenia regularne za pomocą MATCHpolecenia. Wyjście wynosi 0 dla fałszu i 1, jeśli prawda.

1 input n$:  ?MATCH("^[A-Z][a-z]+$",n$)
Brian
źródło
1

Swift 2, 116 bajtów

Regex jest tak gadatliwy w Swift, że robienie tego jest znacznie krótsze

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}

Zwróci to 0lub -1(w przypadku braku danych wejściowych) dla nieoficjalnych nazwisk i numeru> 0 (która jest równa długości łańcucha - 1), jeśli nazwa jest oficjalna

Nie golfił

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
źródło
1

C #, 188 bajtów

Wyrażenia regularne byłyby właściwym sposobem na rozwiązanie tego problemu, ale oto próba bez niego.

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

Pismo ręczne

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

Z przyjemnością poradzę, jak skrócić małe litery, być może bez pętli. Właśnie zacząłem uczyć się języka i wykorzystałem to jako praktykę, pomyślałem, że i tak podzielę się swoim wynikiem.

Gęś
źródło
1

PowerShell , 29 bajtów

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

Wypróbuj online!

Czy ta sama sztuczka regularna, której wszyscy inni używają. Musi używać funkcji cwrażliwych matchna ase, aby poprawnie to zrobić kosztem bajtu.

Veskah
źródło
1

Perl 6 , 17 bajtów

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

Zwraca Matchobiekt, jeśli jest to oficjalna nazwa i Nilinaczej.

Wypróbuj online!

bb94
źródło
Nie potrzebujeszm
Jo King