Чи моє ім’я офіційне?


25

Вступ

Як каже ToonAlfrink : "Мені здається, що тут недостатньо легких питань, на які можуть спробувати початківці!". Тож завдання дуже просте. Враховуючи рядок, виведіть правдиве або хибне значення, чи є ім'я офіційним чи ні.

Ім'я є "офіційним", якщо це єдине слово-заголовок, тобто:

  • Якщо перша літера з великої літери (не офіційна adnan:)
  • Якщо інші літери не використовуються з великої літери (не офіційні AdNaN:)
  • Якщо ім'я НЕ містить будь - або не-буквені символи (неофіційний: Adnan123, Adnan!)
  • Якщо ім'я складається з одного слова (неофіційно: Adn an, Adn An)
  • Якщо ім'я має більше одного символу (не офіційне A:)

Правила

  • Ви можете надати функцію або програму
  • Це , тому подання з найменшою кількістю байтів виграє!
  • Примітка. Для спрощення речей такі імена, як Мері-Енн, не є офіційними.
  • Припустимо, що в назві немає провідних пробілів.
  • Припустимо, що 32-126в іменах використовуються лише друковані символи ASCII ( )

Тестові справи

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 (truthy), якщо він відповідає, і тому є офіційною назвою та 0(false), якщо це не так.

Зламатися

^       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.


Крім того, не конкуруючий відповідь TeaScript 3 у 7 байтах :

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
На один байт менше:n=>n.match`^[A-Z][a-z]+$`
user81655

@ user81655 масив як триєдке значення занадто вимушений IMHO
edc65

@ edc65 Це дійсно, хоча.
SuperJedi224

1
Лише на 4 байти більше ви отримуєте відповідність ES5:/./.test.bind(/^[A-Z][a-z]+$/)
CR Drost

7

Пітон, 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
Wayne Werner

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

Пітон, 50 45 43 41 байт

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

Повертається, Trueякщо це офіційна назва чи Falseні.


Правила стану кодового гольфу, які вам не потрібно f=враховувати, зберігаючи два байти. Також (len(s)>1)економить 5 байт s[1:].islower(). :)
movatica

3

BotEngine , 203 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

MATL , 18 байт

Використовується поточна версія ( 4.0.0 ) мови.

Це застосовує той самий регулярний вираз, що і відповідь NinjaBearMonkey :

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

Висновок - це рядок (який є правдоподібним ), якщо це офіційна назва, і нічого (що хибне ), якщо це не так.

Приклади

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

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


2

Гема, 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 байт

Функція, яка отримує вказівник на рядок, що закінчується нулем, ecxі повертає 0 або 1 дюйм eax(згідно з fastcallумовами).

Шестнадцятковий код:

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;

Перший байт імені вводу має п'ятий біт, перевернутий ( xorз 32), щоб перетворити його з великого регістру в малий регістр. Це завантажує 32 дюймиeax , використовуючи 3 байти коду:

    push 32;
    pop eax;

Щоб перевірити, чи байт є малою літерою:

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

Якщо ні, цей код пропадає. Щоб повернути 0 у цьому випадку, він ставить 0al перш ніж робити умовний стрибок:

    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]+

Якщо ви використовуєте -Eі -xі -cперемикачіgrep буде надруковано кількість відповідних рядків введення. Тож якщо ви дасте йому один рядок, ви отримаєте 1 або 0. Я думаю, що так працює це місце.

Шаблон становить 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. : P
Дверна ручка

Зупиніть мене, якщо (як це цілком ймовірно) я помиляюся, але ви можете використовувати, grep -Excтому вам не потрібно рахувати стільки байтів для комутаторів.
Ніл

@Neil - я не знаю, якщо ви помиляєтесь. я справді не маю уявлення - подивіться на історію редагування.
mikeserv

2

Mathematica 10,1, 46 байт

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

Використовується на один байт менше, ніж у стандартному розчині. Це робить три перевірки. LetterQ@#гарантує, що рядок повністю складається з літер, і StringLength@#>1визнає недійсними однобуквенні рядки. #==ToCamelCase@#однак має менше сенсу. ToCamelCaseце недокументована функція, яку я виявив, що приймає рядок введення AndOutputsItLikeThis. Оскільки є лише одне слово, воно буде з великої літери першою літерою, тому ми перевіряємо, чи рядок дорівнює цьому.


Є чи ToCamelCaseновий 10.3? Здається, не працює в 10.2.
морфі

@murphy, це працює для мене в 10.1. Що ви отримуєте ToCamelCase["foo bar baz"]?
LegionMammal978

Гаразд, я можу підтвердити, що він працює в 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
Це прекрасно працює в bash, kshі zsh, але не має жодних шансів на роботу в стандарті POSIX shабо сумісний dashі yash. Щоб уникнути плутанини, пропоную змінити назву відповіді.
манатурка

3
Використовуйте printfзамість цього, echoщоб створити файл, і ви отримаєте 25 байт.
sam hocevar

Гарні бали, ви обоє; обидва застосовані.
Аарон Девіс

2

C # 4, 89 байт

Моя перша спроба Code Golf. Ось воно:

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 байт завдяки Бенджаміну Уркхарту


Можна скинути крапку з комою
Бенджамін Уркхарт

@BenjaminUrquhart о так, дякую
HyperNeutrino

1

k4, 39 байт

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

Перший знак верхній, всі інші нижні, більше одного.

Наприклад:

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

Безголівки (з реальними назвами функцій):

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

Ви можете реально заощадити близько 10%, використовуючи булеві замість цілих чисел (BLEH!) І замінюючи ці громіздкі if … then 0 else шляхом … ||. І з цього приводу, використовуючи булеві оператори замість matchта діапазони, наприкладn.[0]>'@'&n.[0]<'['&e(l-1)
Жил "SO- перестань бути злим"

1

SpecBAS - 39 байт

SpecBAS обробляє регулярні вирази через MATCHкоманду. Вихідні дані 0 для помилкових та 1, якщо істинних.

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

1

Швидкий 2, 116 байт

Regex настільки багатослівний у 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;
}

Дуже радимо, як зробити нижню букву короткою, можливо, без циклу. Я щойно почав вивчати мову і використовував це як практику, зрозумів, що все одно поділюсь своїм результатом.



1

PowerShell , 29 байт

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

Спробуйте в Інтернеті!

Чи той самий регекс-трюк, який використовують усі інші. Доводиться використовувати cсенсорний, matchщоб правильно це зробити за рахунок байта.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.