Два имени


14

У человека есть два имени, если его фамилия также является общим именем. Вам необходимо определить, какие полные имена в списке являются двумя именами.

John Smith
John Doe
Luke Ryan
Ryan Johnson
Jenna Jackson
Tom John

Любое имя, встречающееся в столбце имени, может быть первым именем. Если число вхождений имени в столбце имени больше, чем количество вхождений в столбце фамилии, это определенно имя.

В приведенном выше списке Johnдважды появляется в именах и один раз в фамилиях, так что это определенно имя. Ryanпоявляется один раз в первом и один раз в последнем, так что это (вероятно) имя.

Поэтому, Tom Johnбезусловно, имеет два имени и, Luke Ryanвероятно, имеет.

Учитывая приведенный выше список, ваш код должен вывести следующее:

Luke Ryan has two first names
Tom John definitely has two first names

вход

Как упоминалось выше, ваш код будет принимать список полных имен (из стандартного ввода, по одному на строку), разделенных пробелами. Имена могут включать в себя дефис или апостроф, но вы никогда не будет дано имя или фамилию , которое включает пробелы (т.е. нет Liam De Rosa, но Liam De-Rosaи Liam De'Rosaчестная игра. Другими словами, имена будут совпадать [-'A-Za-z]+.

Каждое полное имя будет уникальным (то есть John Smithне появится дважды).

Выход

Напечатайте полные имена (один раз в строке), а затем либо, has two first namesлибо definitely has two first namesесли они соответствуют критериям, указанным выше. Имена должны быть напечатаны только один раз.

Имена, которые не являются двумя именами, не должны быть напечатаны.

Вы должны сохранить регистр и специальные символы имени.

Примеры

вход

Madison Harris
Riley Hudson
Addison Hills
Riley Phillips
Scott Hill
Levi Murphy
Hudson Wright
Nathan Baker
Harper Brooks
Chloe Morris
Aubrey Miller
Hudson Lopez
Samuel Owen
Wyatt Victoria
Brooklyn Cox
Nathan Murphy
Ryan Scott

Выход

Riley Hudson definitely has two first names
Ryan Scott has two first names

вход

Owen Parker
Daniel Hall
Cameron Hall
Sofia Watson
Mia Murphy
Ryan Jones
Emily Ramirez

Выход

[no output]

вход

Olivia Robinson
Jacob van-Dyke
Jacob Ella
Brayden De'Rosa
Levi Brook
Brook Bella
Ella Hill
Ella Anderson
Brook-Anne van-Dyke

Выход

Jacob Ella definitely has two first names
Levi Brook has two first names

Примечания и оценка

Удачи!


Имеет ли Johnsonсчитаться John, или он отличается?
NoOneIsHere

2
Johnsonбудет отличаться John. Имена должны точно совпадать.
Лось

1
Как мы выбираем между definitely has two first namesа has two first names? Это всегда может быть одним из тех?
Род

Отображается только в том definitelyслучае, если имя встречается в столбце имени больше раз, чем в столбце фамилии. Этот случай переопределяет, поэтому только отображение definitely has two first names. Проверьте примеры.
Лось

2
Насколько гибок формат ввода? Может ли это быть массив строк, по одному на человека? Или 2D массив строк?
Луис Мендо

Ответы:


6

Java (OpenJDK 8) , 238 222 221 220 212 байт

l->{for(String n:l){int k=0,j=0,q=0;for(String b=n.split(" ")[1];k<l.length;j+=l[k++].matches(b+" .*")?1:0)q+=l[k].endsWith(" "+b)?1:0;if(j>0)System.out.println(n+(j>q?" definitely":"")+" has two first names");}}

Попробуйте онлайн!


Ницца! Вы можете свернуть ваши инициализации в k=j=q=0. Кроме того, это не спасет вас ни одного байта, но вы можете заменить последний x+=y?1:0на if(y)x++. Если вам нравится оптимизировать читаемость после длины, как я, это, вероятно, путь.
Якоб







2

05AB1E, 144 байта (работа в процессе)

|vy#Dθˆн})©gF®®NèQO¯®NèQO-D®¯NèQO¯¯NèQO-D.À>0›s>0›&i0›s0›&i®Nè" "¯Nè" defínítely has two fírst names"J,ë®Nè" "¯Nè" has two fírst names"J,}ë\\}}´

4
Нет, это работает, я просто работаю над уменьшением количества байтов
Дэвид Смит

2

05AB1E , 53 51 байт

|UXv“€°‚•€ÛŒî“D„´Î ì)yð«ìõ¸ìXð¡øεy#θQO}`.S>sèˆ}¯õK»

Попробуйте онлайн!

объяснение

|                                                       # Take inputs as array
 UX                                                     # Store in X and push X to stack
   v                                          }         # For each name, do
    “€°‚•€ÛŒî“D                                         #   Push "has two first names" twice
               „´Î ì                                    #   Prepend "definitely " to one of those
                    )yð«ì                               #   Wrap both strings in an array and prepend (name + " ") to each
                         õ¸ì                            #   Prepend " " to array
                            Xð¡øεy#θQO}`                #   Get occurences in input first and last names
                                        .S>             #   0 for not first name, 1 for first name and 2 for definitely first name
                                           sèˆ          #   Get string at that index and push to global array
                                               ¯õK»     # Output global array, 1 string per line

Или 51 49 байтов, при условии стандартных правил ввода / вывода (ввод и вывод в виде массивов)

UXv“€°‚•€ÛŒî“D„´Î ì)yð«ìõ¸ìXð¡øεy#θQO}`.S>sèˆ}¯õK

Попробуйте онлайн!


1

PHP, 172 байта

for(;$s=$argv[++$i];$f[$a]++,$l[$n[]=$b]++)[$a,$b]=explode(" ",$s);for(;$b=$n[+$k++];)$f[$b]<$l[$b]||print$argv[$k].($f[$b]>$l[$b]?" definetly":"")." has two first names
";

принимает имена в качестве отдельных аргументов командной строки.

Запустите -nrили попробуйте онлайн .


0

Python 3, 187 байт

n={}
c=[]
while 1:
 try:a,b=input().split();n[a]=n.get(a,0)+1;n[b]=n.get(b,0)-1;c+=[[a,b]]
 except:[print(a,b,'definitely has two first names'[(n[b]>0)*11:])for a,b in c if n[b]>=0];break

0

R 207 байт

n=readLines("stdin")
s='definitively has two first names\n'
x=matrix(t(unlist(sapply(n,strsplit,' '))),2)
j=1
for(i in n){a=apply(x[2,j]==x,1,sum)
b=a[2]>=a[1]
if(a[1])cat(paste(i,substr(s,14*b,34)))
j=j+1}

Попробуйте онлайн!


0

JavaScript (ES6), 149 байт

s=>s.replace(/(.*) (.*)\n/g,(_,t,u)=>g(`
${u} `)>1?t+` ${u}${v>g(` ${u}
`)?` definitely`:``} has two first names
`:``,g=u=>v=`
${s}`.split(u).length)

Ввод / вывод включает завершающий перевод строки. Во многом вдохновлен ответом @ RobertoGraham.



0

PowerShell, 176 байт

$n=$args
$s=" has two first names"
$f=$n|%{$_.Split()[0]}
$l=$n|%{$_.Split()[1]}
$i=0
$l|%{switch(($f-match$_).count){{$_-eq1}{$n[$i]+$s}{$_-gt1}{$n[$i]+" definitely"+$s}}$i++}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.