Dois Primeiros Nomes


14

Uma pessoa tem dois primeiros nomes se o sobrenome também for um nome comum. Você tem a tarefa de determinar quais nomes completos em uma lista são dois primeiros nomes.

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

Qualquer nome que ocorra na coluna do primeiro nome é potencialmente um primeiro nome. Se o número de ocorrências do nome na coluna do primeiro nome for maior que o número de ocorrências na coluna do sobrenome, é definitivamente um primeiro nome.

Na lista acima, Johnaparece duas vezes nos primeiros nomes e uma vez nos sobrenomes, por isso é definitivamente um primeiro nome. Ryanaparece uma vez no primeiro e uma vez no último, por isso é (provavelmente) um primeiro nome.

Portanto, Tom Johndefinitivamente tem dois primeiros nomes e Luke Ryanprovavelmente possui.

Dada a lista acima, seu código deve gerar o seguinte:

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

Entrada

Como mencionado acima, seu código incluirá uma lista de nomes completos (da entrada padrão, um por linha) separados por espaços. Os nomes podem incluir hífens ou apóstrofes, mas você nunca receberá um nome ou sobrenome que inclua espaços (por exemplo Liam De Rosa, não , mas Liam De-Rosaou Liam De'Rosaseja um jogo justo. Em outras palavras, os nomes corresponderão [-'A-Za-z]+.

Cada nome completo será exclusivo (ou seja John Smith, não aparecerá duas vezes).

Resultado

Imprima os nomes completos dos nomes (uma vez por linha) seguidos por um has two first namesou definitely has two first namesse atenderem aos critérios acima. Os nomes devem ser impressos apenas uma vez.

Os nomes que não são os dois primeiros nomes não precisam ser impressos.

Você deve preservar o caso e os caracteres especiais do nome.

Exemplos

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

Resultado

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

Resultado

[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

Resultado

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

Notas e Pontuação

  • Isso é código de golfe. A pontuação mais baixa (bytes) vence.
  • lacunas padrão se aplicam.

Boa sorte!


Conta Johnsoncomo John, ou é diferente?
NoOneIsHere

2
Johnsonseria diferente de John. Os nomes devem corresponder exatamente.
Moose

1
Como escolhemos entre definitely has two first namese has two first names? Pode ser sempre um desses?
Rod

Somente é exibido definitelyse o nome ocorrer mais vezes na coluna do nome do que na coluna do sobrenome. Este caso substitui, portanto, apenas seja exibido definitely has two first names. Confira os exemplos.
Moose

2
Quão flexível é o formato de entrada? Pode ser uma matriz de strings, uma por pessoa? Ou uma matriz 2D de seqüências de caracteres?
Luis Mendo

Respostas:


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

Experimente online!


Agradável! Você pode recolher suas inicializações para k=j=q=0. Além disso, ele não salvará nenhum bytes, mas você poderá substituí-lo x+=y?1:0por if(y)x++. Se você gosta de otimizar a legibilidade após o comprimento, como eu, provavelmente é o caminho a percorrer.
Jakob


6

Python 2 , 141 137 132 130 130 bytes

-2 bytes graças 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'

Experimente online!


Eu acho que -c<1pode ser ~c, como cnunca parece ser 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"}

Salvando 1 byte, não usando o NRvalor interno.

Experimente online!


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

Experimente online!


3

Ruby , 105 129 bytes

+24 bytes porque perdi parte das especificações

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

Experimente online!


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'

Experimente online!


@ShreevatsaR, Ah, eu li errado. Obrigado :)
TFeld

2

05AB1E, 144 bytes (Trabalho em andamento)

|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
Sem ele funciona, estou apenas trabalhando para reduzir o número de bytes
David Smith

2

05AB1E , 53 51 bytes

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

Experimente online!

Explicação

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

Ou 51 49 bytes, assumindo regras de E / S padrão (entrada e saída como matrizes)

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

Experimente online!


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

leva nomes como argumentos de linha de comando separados.

Corra com -nrou experimente online .


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

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}

Experimente online!


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)

A E / S inclui nova linha à direita. Em grande parte inspirado pela resposta de @ RobertoGraham.


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]

Experimente online!


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++}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.