Dos nombres

14

Una persona tiene dos nombres si su apellido también es un nombre común. Tiene la tarea de determinar qué nombres completos en una lista son dos nombres.

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

Cualquier nombre que aparezca en la columna de nombre es potencialmente un nombre de pila. Si el número de ocurrencias del nombre en la columna de nombre es mayor que el número de ocurrencias en la columna de apellido, definitivamente es un nombre.

En la lista anterior, Johnaparece dos veces en los nombres y una vez en los apellidos, por lo que definitivamente es un nombre. Ryanaparece una vez en el primero y una vez en el último, por lo que es (probablemente) un primer nombre.

Por lo tanto, Tom Johndefinitivamente tiene dos nombres y Luke Ryanprobablemente los tiene.

Dada la lista anterior, su código debería generar lo siguiente:

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

Entrada

Como se mencionó anteriormente, su código incluirá una lista de nombres completos (de entrada estándar, uno por línea) separados por espacios. Los nombres pueden incluir guiones o apóstrofes, pero nunca se le dará un nombre o apellido que incluya espacios (es decir Liam De Rosa, no , pero Liam De-Rosao Liam De'Rosason juegos justos. En otras palabras, los nombres coincidirán [-'A-Za-z]+.

Cada nombre completo será único (es decir John Smith, no aparecerá dos veces).

Salida

Imprima los nombres completos (una vez por línea) seguidos de uno has two first nameso definitely has two first namessi cumplen con los criterios anteriores. Los nombres solo deben imprimirse una vez.

Los nombres que no son dos nombres no necesitan imprimirse.

Debe conservar el caso y los caracteres especiales del nombre.

Ejemplos

Entrada

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

Salida

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

Entrada

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

Salida

[no output]

Entrada

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

Salida

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

Notas y puntaje

  • Este es el código de golf. La puntuación más baja (bytes) gana.
  • se aplican las lagunas estándar .

¡Buena suerte!

Alce
fuente
¿ JohnsonCuenta como Johno es diferente?
NoOneIsHere
2
Johnsonsería diferente a John. Los nombres deben coincidir exactamente.
Alce
1
¿Cómo elegimos entre definitely has two first namesy has two first names? ¿Puede ser siempre uno de esos?
Rod
Solo se muestra definitelysi el nombre aparece más veces en la columna de nombre que en la columna de apellido. Este caso se anula, por lo que solo se muestra definitely has two first names. Mira los ejemplos.
Alce
2
¿Qué tan flexible es el formato de entrada? ¿Puede ser una serie de cadenas, una por persona? ¿O una matriz 2D de cadenas?
Luis Mendo

Respuestas:

6

Java (OpenJDK 8) , 238 222 221 220 212 bytes

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

Pruébalo en línea!

Roberto Graham
fuente
¡Agradable! Puede contraer sus inicializaciones a k=j=q=0. Además, no le guardará ningún byte, pero podría reemplazar el último x+=y?1:0con if(y)x++. Si desea optimizar la legibilidad después de la longitud como lo hago yo, ese es probablemente el camino a seguir.
Jakob
6

Python 2 , 141 137 132 130 bytes

-2 bytes gracias a @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'

Pruébalo en línea!

ovs
fuente
Creo que -c<1puede serlo ~c, ya cque no parece ser nunca positivo.
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"}

Guardar 1 byte al no usar el NRvalor incorporado .

Pruébalo en línea!

Robert Benson
fuente
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

Pruébalo en línea!

Xcali
fuente
3

Ruby , 105 129 bytes

+24 bytes porque me perdí parte de la especificación

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

Pruébalo en línea!

Tinta de valor
fuente
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'

Pruébalo en línea!

TFeld
fuente
@ShreevatsaR, Ah, leí mal. Gracias :)
TFeld
2

05AB1E, 144 bytes (Trabajo en progreso)

|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
fuente
44
No, funciona, solo estoy trabajando para reducir el número de bytes
David Smith
2

05AB1E , 53 51 bytes

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

Pruébalo en línea!

Explicación

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

O 51 49 bytes, suponiendo reglas de E / S estándar (entrada y salida como matrices)

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

Pruébalo en línea!

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

toma nombres como argumentos de línea de comando separados.

Ejecutar -nro probarlo en línea .

Titus
fuente
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
fuente
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}

Pruébalo en línea!

NofP
fuente
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)

La E / S incluye la nueva línea final. En gran parte inspirado por la respuesta de @ RobertoGraham.

Neil
fuente
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]

Pruébalo en línea!

Laikoni
fuente
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
fuente