Dwa pierwsze imiona

14

Osoba ma dwa imiona, jeśli ich nazwisko jest również imieniem zwyczajnym. Twoim zadaniem jest określenie, które pełne nazwiska na liście to dwa imiona.

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

Każda nazwa występująca w kolumnie imienia jest potencjalnie imieniem. Jeśli liczba wystąpień nazwy w kolumnie imienia jest większa niż liczba wystąpień w kolumnie imienia, to na pewno jest to imię.

Na powyższej liście Johnpojawia się dwa razy w imionach i raz w nazwiskach, więc jest to zdecydowanie imię. Ryanpojawia się raz w pierwszym i raz w ostatnim, więc jest to (prawdopodobnie) imię.

Dlatego Tom Johnzdecydowanie ma dwa imiona i Luke Ryanprawdopodobnie tak.

Biorąc pod uwagę powyższą listę, kod powinien wyświetlać następujące informacje:

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

Wejście

Jak wspomniano powyżej, twój kod pobierze listę pełnych nazw (ze standardowego wejścia, po jednym w wierszu) oddzielonych spacjami. Nazwy mogą zawierać łączniki lub apostrofy, ale nigdy nie otrzymasz imienia lub nazwiska, które zawiera spacje (tj. Nie Liam De Rosa, ale Liam De-Rosalub Liam De'Rosasą fair game. Innymi słowy, nazwy będą pasować [-'A-Za-z]+.

Każde pełne imię i nazwisko będzie unikalne (tj. John SmithNie pojawi się dwukrotnie).

Wynik

Wydrukuj pełne nazwy nazwisk (raz w wierszu), a następnie jedno z nich has two first nameslub definitely has two first namesjeśli spełniają one powyższe kryteria. Nazwiska należy wydrukować tylko raz.

Imiona, które nie są dwoma imionami, nie muszą być drukowane.

Musisz zachować wielkość liter i znaki specjalne nazwy.

Przykłady

Wejście

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

Wynik

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

Wejście

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

Wynik

[no output]

Wejście

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

Wynik

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

Notatki i punktacja

Powodzenia!

Łoś
źródło
Czy Johnsonliczy się John, czy jest inaczej?
NoOneIsHere
2
Johnsonbyłoby inaczej niż John. Nazwy muszą dokładnie pasować.
Łoś
1
Jak wybieramy pomiędzy definitely has two first namesi has two first names? Zawsze może być jednym z nich?
Rod
Wyświetlaj tylko definitelywtedy, gdy nazwa pojawia się więcej razy w kolumnie imienia niż w kolumnie imienia. Ten przypadek zastępuje, więc wyświetla się tylko definitely has two first names. Sprawdź przykłady.
Łoś
2
Jak elastyczny jest format wejściowy? Czy może to być tablica ciągów, po jednej na osobę? Lub tablica 2D ciągów?
Luis Mendo,

Odpowiedzi:

6

Java (OpenJDK 8) , 238 222 221 220 212 bajtów

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

Wypróbuj online!

Roberto Graham
źródło
Nice! You can collapse your initializations to k=j=q=0. Also, it won't save you any bytes but you could replace the latter x+=y?1:0 with if(y)x++. If you like to optimize readability after length like I do, that's probably the way to go.
Jakob
6

Python 2, 141 137 132 130 bytes

-2 bytes thanks to @JonathanFrech

n=map(str.split,input())
for f,l in n:
 c=cmp(*[x.count(l)for x in zip(*n)])
 if~c:print f,l,'definitely '*c+'has two first names'

Try it online!

ovs
źródło
I think -c<1 can be ~c, as c does not appear to ever get positive.
Jonathan Frech
3

AWK, 127 123 bytes

{a[$1]++
b[L[++X]=$2]++
N[X]=$0}END{for(;++i<=X;)if(A=a[L[i]])print N[i],(b[L[i]]<A?"definitely ":"")"has two first names"}

Saving 1 byte by not using the built-in NR value.

Try it online!

Robert Benson
źródło
3

Perl 5, 120 118 + 2 (-al) = 120 bytes

$f{$F[0]}++;$l{$k{$_}=$F[1]}++}{map{print$_.' definitely'x($f{$t}>$l{$t})." has two first names"if$f{$t=$k{$_}}}keys%k

Try it online!

Xcali
źródło
3

Ruby, 105 129 bytes

+24 bytes because I missed part of the spec

->a{a.map{|e|l=e[r=/\S+$/];i=a.count{|n|n[/\S+/]==l};e+"#{' definitely'if i>a.count{|n|n[r]==l}} has two first names"if i>0}-[p]}

Try it online!

Value Ink
źródło
3

Python 2, 140 127 122 131 bytes

N=map(str.split,input())
F,L=zip(*N)
for f,l in N:
 if l in F:print f,l,'definitely '*(F.count(l)>L.count(l))+'has two first names'

Try it online!

TFeld
źródło
@ShreevatsaR, Ah, I misread. Thanks :)
TFeld
2

05AB1E, 144 bytes (Work in progress)

|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,}ë\\}}´
David Smith
źródło
4
No it works, I am just working on reducing the number of bytes
David Smith
2

05AB1E, 53 51 bytes

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

Try it online!

Explanation

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

Or 51 49 bytes, assuming standard I/O Rules (input and output as arrays)

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

Try it online!

kalsowerus
źródło
1

PHP, 172 bytes

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

takes names as separate command line arguments.

Run with -nr or try it online.

Titus
źródło
0

Python 3, 187 bytes

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

R, 207 bytes

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}

Try it online!

NofP
źródło
0

JavaScript (ES6), 149 bytes

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)

I/O includes trailing newline. Largely inspired by @RobertoGraham's answer.

Neil
źródło
0

Haskell, 144 140 139 bytes

g.map words.lines
g s=id=<<[n++' ':f++[c|c<-" definitely",t 0>t 1]++" has two first names\n"|[n,f]<-s,let t i=filter(==f)$map(!!i)s,[]<t 0]

Try it online!

Laikoni
źródło
0

PowerShell, 176 bytes

$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++}
brendan62269
źródło