Benim adım resmi mi


25

Giriş

ToonAlfrink'in dediği gibi : "Ben burada yeni başlayanların deneyebileceği kadar kolay soru olmadığını düşünüyorum!". Yani görev çok basit. Bir dize verilen, adının resmi olup olmadığını bir truthy veya sahte değeri çıktı.

Bir ad, tek bir unvan-durum sözcüğü ise "resmi" dir:

  • Eğer ilk harfi (resmi değil: büyük harfle adnan)
  • Diğer harfler ise değil (resmi değil: harfle AdNaN)
  • Adı ise gelmez olmayan herhangi alfabetik karakterler içeren (resmi değil: Adnan123, Adnan!)
  • Adı sadece bir kelimeden oluşuyorsa (resmi değil: Adn an, Adn An)
  • Adı daha bir karakter daha varsa (resmi değil: A)

kurallar

  • Bir işlev veya program sağlayabilirsiniz
  • Bu , bu yüzden en az sayıda bayt olan gönderim kazanıyor!
  • Not: İşleri kolaylaştırmak için, Mary-Ann gibi isimler resmi değil , bu mücadelede .
  • Adında baştaki boşluk olmadığını varsayalım.
  • 32-126Adlarda yalnızca yazdırılabilir ASCII karakterlerinin ( ) kullanıldığını varsayalım.

Test durumları

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

Liderler Sıralaması


5
Yani benim adım resmi değil mi? O zaman değiştirsen iyi olur.
ETHProductions

12
@ETHproductions Bu mantığı kullanıyorsak, Lolololololololololololresmi bir isim :)
Adnan

1
Bu soruya gerçekten cevap vermiyor. Hangisi: "adın vurgulu harfler içermediğini varsayabilirsin" veya "vurgulu harflerle yazılmış isimler" vermeli Falsemi?
Lynn

1
Biraz sıradışı bir Kanadalı kazası olarak, tanıdığım bir profesör "resmi" kriterlerinizden memnun olmaz: Robert Smith? . Adının aslında bu soru işareti var . Ayrıca, Sahaiʔa .
Idonotexist

1
@FarhanAnam Evet
Adnan

Yanıtlar:


6

Pyth, 16 13 12 bayt

@Thomas Kwa'ya bana başlık adı hakkında hatırlattığı için teşekkür ederiz.

&qzr@GrzZ3tz

Test Takımı .

&              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

Retina, 13 bayt

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

Çevrimiçi deneyin | Test paketi (Çıktı 0, beklenen hiçbir dizenin eşleşmediği anlamına gelir.)

Retina'ya yalnızca tek bir kod satırı sağlandığı zaman, ifadenin giriş dizgisi ile eşleştiği 1sayıyı çıkarır , dolayısıyla eğer eşleşirse çıktı (truthy) ve bu nedenle resmi bir isim ve 0eğer değilse sahte olur.

Yıkmak

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

8
Harfler için karakter sınıflarına ihtiyacımız var gibi görünüyor. ;)
Martin Ender

10

TeaScript, 12 bayt

xO`A-Z][a-z`

Oİşlev kötüye .

Bunu çevrimiçi deneyin

Test odası

açıklama

OFonksiyonu bu yapar:

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

Ardından, O işlevi regex'in eşleşip eşleşmediğini kontrol eder x.


Alternatif olarak, rakip olmayan bir TeaScript 3 7 baytta cevap verir :

xO/\A\a

Ahahaha, iyi olan. Bir noktada Japt tercümanı üzerinde çalışırken, bu numarayı isChareklediğiniz işlevle kullandım . Ancak, bilmeyenler için daha ayrıntılı olarak açıklamak isteyebilirsiniz.
ETHProductions,

Ooooooh, yeni regex özelliklerini beğendim!
ETHProductions,

7

JavaScript (ES6), 26

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

Gönderen: 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>


Kahretsin, beni yendin. Ayrıca sürümümü 5 byte olarak aştınız.
SuperJedi224

1
Bir bayt daha az: n=>n.match`^[A-Z][a-z]+$`
user81655

@ user81655 bir truthy değeri olarak bir dizi çok zorla IMHO
edc65

@ edc65 Yine de geçerlidir.
SuperJedi224

1
Yalnızca 4 bayt için ES5 uyumluluğunu elde edersiniz: /./.test.bind(/^[A-Z][a-z]+$/)
CR Drost

7

Python, 59 58 bayt

Retina versiyonunu yenmenin gerçek bir yolu olmadığından eminim, çünkü bu aslında Python'da olduğu gibi. Ama bunun benim ilk gönderim olduğunu düşünüyorum;)

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

Bu çok garip bir gerçek değer:

(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

( ""Kabuk içinden geçirilirse, içinde boşluk bulunan dizgilerin etrafında olması gerekir )


1
^re.match()Sadece dizenin başlangıcında eşleştiği için gerekli değildir .
Manatwork

1
@ manatwork güzel! Başka bir bayt traş oldu :) Python2
Wayne Werner

1
@WayneWerner: Bu yüzden Python sürümünü vermelisin :) Bence Python 2 ve Python 3 en azından codegolf için farklı diller.
movatica

Programın tamamı yerine adsız bir lambda kullanırsanız, 45 bayt alırsınız:lambda s:re.match('[A-Z][a-z]+$',s) import re
movatica

1
@movatica Oh, boğmaca!
MilkyWay90


4

Python, 50 45 43 41 bayt

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

İade Trueresmi bir isim ise veya Falseeğer o değil.


Codegolf'un kuralları, dikkate almanıza gerek olmadığını ve f=iki byte tasarruf sağladığını gösterir . Ayrıca, (len(s)>1)5 bayttan fazla tasarruf sağlar s[1:].islower(). :)
movatica

3

BotEngine , 203 180 29x6 = 174

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

Gerçekten büyük ve küçük harfleri tanımlamak için yerleşik eklemeliyim. Bu, her bir harfi tek tek kontrol etmekten çok daha kısa bir özlem olurdu.

Kaba çeviri:

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 bayt

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

Çevrimiçi Deneyin

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 karakter

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

Örnek çalışma:

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 makine kodu, 19 bayt

İşaretçiyi boş bırakan bir dizgeye alan ecxve 0 veya 1 inç döndüren eax( fastcallsözleşmeye göre ) bir işlev .

Kodun Hexdump:

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

Assembly dilinde:

    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;

Girilen adın ilk baytı, büyük harflerden küçük harflere dönüştürmek için 5. biti çevirir ( xorile 32). Bu eax, 3 baytlık kod kullanarak 32'ye yüklenir :

    push 32;
    pop eax;

Baytın küçük bir harf olup olmadığını kontrol etmek için:

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

Değilse, bu kod girilir. Bu durumda 0 değerini döndürmek aliçin koşullu atlama yapmadan önce 0 değerini girer:

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

Ayrıca 0 al, giriş adının aşağıdaki baytları için bir xor maskesi (veya yokluğu) görevi görür.

Başarılı bir çıkış, sıfır baytla karşılaştığında, aşağıdakilerden sonra sıfır kalır xor:

    xor al, [ecx];
    jz yes;

Giriş adının boş olmadığını varsayar. Bir isim hakkında makul bir varsayım olduğunu düşünüyorum (keyfi bir dize değil)!


2

grep, 16 bayt

Bu şudur:

[A-Z][a-z]+

Ve kullanırsanız -Eve -xve -canahtarları grepeşleşen giriş satırlarının sayısını yazdıracaktır. Öyleyse bir satır verirseniz 1 veya 0 alırsınız. Bence burası böyle işler.

Desen 11 karakter, tüm komut satırı 23'tür. İnsanların komutsuz sedkomut dosyaları kullandığını gördüm , bu yüzden ne olduğunu bilmiyorum. Ancak, stdin okur ve böylece sadece yazabilirsiniz. İşte echo:

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

1
0
0

@Doorknob - bana yeterince adil görünüyor. çok teşekkürler. hangi şapkayı tahmin ettin
mikeserv

1
Hairboat'ın İntikamını anladım. : P
Doorknob

(Oldukça muhtemel olduğu gibi) beni durdurun. Yanlışyım ancak kullanabilirsiniz, grep -Excböylece anahtarlar için çok fazla bayt saymanıza gerek kalmaz.
Neil

@Neil - Yanlışysanız bilmiyorum. Gerçekten hiçbir fikrim yok - düzenleme geçmişine bir göz atın.
mikeserv

2

Mathematica 10.1, 46 bayt

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

Standart regex çözümünden bir daha az bayt kullanır. Üç kontrol yapar. LetterQ@#dize tamamen harflerden oluşmasını sağlar ve StringLength@#>1tek harfli dizeleri geçersiz kılar. #==ToCamelCase@#Ancak, daha az mantıklı. ToCamelCasebelgesiz bir işlev AndOutputsItLikeThis bir giriş dizesi alır buldum. Yalnızca bir kelime olduğundan, ilk harfi büyük harf kullanacaktır, bu yüzden dizgenin buna eşit olup olmadığını kontrol ederiz.


ToCamelCase10,3 yenilikler nelerdir? 10.2'de işe görünmüyor.
murphy

@murphy, 10.1'de benim için çalışıyor. Ne ile aldın ToCamelCase["foo bar baz"]?
LegionMammal978

Tamam, 10.1'de çalıştığını onaylayabilirim. Ancak, 8.0, 9.0, 10.0 ve 10.2'de işlev tanımlanmadı (test durumunuz geri dönüyor ToCamelCase[foo bar baz]). Garip! Belki biri 10.3'u kontrol edebilir?
murphy

2

bash / zsh / ksh, 25 bayt

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

Bunu gerçekten kullanmak için, onunla tek satır olarak bir dosya oluşturun ve dosyayı çalıştırılabilir hale getirin; Bilinen bir ikili tür olarak tanınmayan yürütülebilir dosyalar, kabuk komut dosyaları ( /bin/shözellikle de) olarak değerlendirilir.

$ 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
Bu içinde cezayı çalışır bash, kshve zsh, ancak standart POSIX'deki çalışmaları şansı yok shveya uyumlu dashve yash. Karışıklığı önlemek için, cevabın başlığını değiştirmenizi öneririm.
Manatwork

3
Kullanım printfyerine echodosyası oluşturmak için ve 25 bayt alırsınız.
sam hocevar

İkiniz de iyi puanlar; her ikisi de uygulanır.
Aaron Davies,

2

C # 4, 89 bayt

Code Golf'ta ilk denemem. İşte geliyor:

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

En eylem görmek Dot Net Fiddle .


C # 6 kullanıyorsanız, biraz daha kısa yapabilirsiniz:bool o(string i)=>System.Text.RegularExpressions.Regex.IsMatch(i,"^[A-Z][a-z]+$");
ProgramFOX

2

Java, 28 bayt

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

Dizenin bir büyük harf karakterinden ve ardından en az bir küçük harf karakterinden oluştuğundan emin olmak için regex kullanır.

Benjamin Urquhart sayesinde -1 bayt


Noktalı virgül bırakabilirsiniz
Benjamin Urquhart

@ BenjaminUrquhart oh sağ, teşekkürler
HyperNeutrino

1

k4, 39 bayt

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

İlk karakter yüksek, diğer herkes düşüktür, birden büyük sayılır.

Örneğin:

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

1

Cidden, 16 bayt

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

Hex Dump:

a3342c6e983d296c313c29972d592626

Çevrimiçi Deneyin

Cidden henüz regex desteği yok, bu yüzden yapabileceğimizin en iyisi:

 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 bayt

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

Örnek kullanım:

# 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 (gerçek fonksiyon isimleri ile):

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

Aslında Bağlaçlar ile yerine tamsayılar (bleh!) Ve bu hantal değiştirerek yaklaşık 10% kurtarabilecek if … then 0 else tarafından … ||. Ve bunun için boolean operatörleri kullanarak matchve aralıkları kullanarak , örneğinn.[0]>'@'&n.[0]<'['&e(l-1)
Gilles 'SO-

1

SpecBAS - 39 bayt

SpecBAS, düzenli ifadeleri MATCHkomut aracılığıyla yönetir . Çıktı, false için 0, true ise 1'dir.

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

1

Swift 2, 116 bayt

Regex Swift’de o kadar ayrıntılı ki, bunu yapmak çok daha kısa.

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}

Bu, resmi olmayan isimler için 0veya -1(giriş yapılmaması durumunda) veya isim resmi ise bir sayı > 0(dizenin uzunluğuna eşit olacaktır)

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
}

1

C #, 188 bayt

Düzenli ifadeler, bununla baş etmenin doğru yolu olurdu, ama işte onsuz bir girişim.

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

el yazısı

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

Küçük harf kontrolünün nasıl daha kısa, belki de döngü olmadan yapılmasını öneriyoruz. Ben sadece dili öğrenmeye başladım ve bunu pratik olarak kullandım, sonucumu yine de paylaşacağımı düşündüm.



1

PowerShell , 29 bayt

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

Çevrimiçi deneyin!

Herkesin kullandığı aynı regex hile yapar. Bir bayt pahasına düzgün yapmak için case-duyarlı kullanmak matchzorundadır.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.