Transformação mágica de email! Ou: ajude a NSA a extrair seus metadados do seu endereço de email


17

Dado um endereço de email, o resultado de uma transformação aplicada a esse endereço de email e um segundo endereço de email, retornam a saída da mesma transformação aplicada ao segundo endereço de email.

Todos os endereços de email terão a seguinte estrutura:

Uma sequência de comprimento positivo contendo caracteres alfanuméricos e no máximo um .(a parte local), seguida por um @símbolo, seguida por uma sequência de comprimento positivo contendo símbolos alfanuméricos (o domínio), seguida por um .símbolo e uma sequência final de comprimento positivo contendo caracteres alfanuméricos (o TLD).

Existem quatro transformações permitidas:

  • Identidade (sem alteração). ( a.b@c.d -> a.b@c.d)
  • Retornando apenas a parte local (tudo antes da @) não modificada ( a.b@c.d -> a.b).
  • Retornando a parte local, divida no .se presente, com o primeiro símbolo de cada metade em maiúscula. ( a.b@c.d -> A B)
  • Retornando apenas o domínio (tudo entre o @e o final .) sem modificação. ( a.b@c.d -> c)

Quando mais de uma transformação é possível, você pode fornecer a saída de qualquer uma das possibilidades. Espaço em branco no início e no final da saída não importa, mas no meio importa (por exemplo, se você dividir a.bpara A B, deve haver apenas um espaço no meio [e qualquer número no início e no final da saída], mas se você dividir a., Atodos os espaços de ambos os lados serão aceitáveis).

Exemplos ( input | output):

john.doe@gmail.com, John Doe, phillip.maini@gmail.com         | Phillip Maini
John.Doe@gmail.com, John Doe, Phillip.Maini@gmail.com         | Phillip Maini
foo.bar@hotmail.com, foo.bar, gee.whizz@outlook.com           | gee.whizz
foo.bar@hotmail.com, foo.bar, gEe.Whizz@outlook.com           | gEe.Whizz
rodney.dangerfield@comedy.net, comedy, michael.scott@office.0 | office
.jones@x.1, Jones, a.@3.z                                     | A
.jones@x.1, .jones@x.1, a.@3.z                                | a.@3.z
.jones@x.1, .jones, a.@3.z                                    | a.
.jones@x.1, x, a.@3.z                                         | 3
.@b.c, .@b.c, 1@2.3                                           | 1@2.3
john.jones@f.f, John Jones, 1in.thehand@2inthe.bush           | 1in Thehand
chicken.soup@q.z, Chicken Soup, fab@ulou.s                    | Fab
lange@haare.0, lange, fat.so@fat.net                          | fat.so
Lange@haare.0, Lange, fat.so@fat.net                          | {fat.so, Fat So} # either acceptable
chicken@chicken.chicken, chicken, horse@pig.farm              | {horse, pig} # either acceptable

Aplicam-se regras e brechas usuais.


O último caso de teste não deve retornar "cavalo"? Não vejo por que ele pode retornar "porco".
Erik the Outgolfer

3
@EriktheOutgolfer porque a quarta transformação é retornar apenas o domínio (a parte entre @e final .). Desde a parte local e domínio estão tanto chicken, é ambígua se é o 2º ou 4º transformação
LangeHaare

Ah, eu interpretei isso errado.
Erik the Outgolfer

Podemos exigir que a entrada relevante seja formatada com o espaço em todos os casos (por exemplo, no teste em que a saída é A[com um espaço à direita] que a segunda entrada seja Jones[com um espaço à esquerda])?
Jonathan Allan

Não entendo por que .jones@x.1, Jones, a.@3.zé A- se jonesfor correspondido, significa que a parte correspondente é a parte entre o primeiro período e o símbolo @. Mas isso resultaria em uma sequência vazia, porque aé antes do primeiro período e não depois.
Jerry Jeremiah

Respostas:


4

Java 8, 254 240 236 bytes

(a,b,c)->{String A[]=a.split("@"),C[]=c.split("@"),x="";for(String p:C[0].split("\\."))x+=(p.charAt(0)+"").toUpperCase()+p.substring(1)+" ";return a.equals(b)?c:A[0].equals(b)?C[0]:A[1].split("\\.")[0].equals(b)?C[1].split("\\.")[0]:x;}

-4 bytes graças a @LukeStevens .

Explicação:

Experimente aqui.

(a,b,c)->{                  // Method with three String parameters and String return-type
  String A[]=a.split("@"),  //  Split `a` by "@" into two parts
         C[]=c.split("@"),  //  Split `c` by "@" into two parts
         x="";              //  Temp-String
  for(String p:C[0].split("\\.")) 
                            //  Loop over the first part of `c`, split by dots
    x+=                     //   Append String `x` with:
       (p.charAt(0)+"").toUpperCase()
                            //    The first character as uppercase
       +p.substring(1)      //    + the rest of the String
       +" ";                //    + a space
                            //  End of loop (implicit / single-line body)
  return a.equals(b)?       //  If input `a` and `b` are exactly the same:
    c                       //   Return `c`
   :A[0].equals(b)?         //  Else-if the first part of `a` equals `b`:
    C[0]                    //   Return the first part of `c`
   :A[1].split("\\.)[0].equals(b)?
                            //  Else-if the domain of `a` equals `b`
    C[1].split("\\.)[0]     //   Return the domain of `c`
   :                        //  Else:
    x;                      //   Return String `x`
}                           // End of method

1
Você pode eliminar 4 bytes usando em (p.charAt(0)+"").toUpperCase()vez de Character.toUpperCase(p.charAt(0)).
Luke Stevens

@LukeStevens Thanks! Eu tinha (char)(p.charAt(0)&~32)no começo, mas isso não funcionou devido ao 1in Thehandcaso de teste. Mas colocar maiúsculas em maiúsculas como String é realmente mais curto do que Character.toUpperCase, então, obrigado!
Kevin Cruijssen 31/10

3

Haskell , 208 bytes

import Data.Char
s c""=[]
s c a=w:f t where
 (w,t)=span(/=c)a
 f(_:y)=s c y
 f _=[]
h=head
u""=""
u(x:y)=toUpper x:y
l=h.s '@'
f x y=h[t|t<-[id,l,unwords.filter(/="").map u.s '.'.l,h.s '.'.last.s '@'],t x==y]

Experimente online!

É triste que eu tenha gastado 59 bytes em reinventar split( s).

A solução cria uma lista de transformações e retorna a primeira que leva ao resultado esperado.


Bem vindo ao site! Não conheço Haskell, mas é possível remover algum caractere de espaço em branco, como novas linhas e espaços?
caird coinheringaahing

Ótima primeira resposta! Você pode estar interessado em nossa coleção de dicas para jogar golfe em Haskell , especialmente isso e isso deve economizar alguns bytes.
Laikoni

Também sinta-se à vontade para se juntar a nós na Of Monads and Men , uma sala de bate-papo para golfe e discussões gerais sobre Haskell.
Laikoni

3

Geléia , 40 bytes

De preferência graças a Erik a Outgolfer para reparar a falha de usar Œt(título caso) e, consequentemente, Œu1¦€KsobreŒtK

-1 byte graças a Erik the Outgolfer (rearranjo de ⁵⁸ç⁹¤Ŀto çµ⁵⁸Ŀ)


ÑṪṣ”.Ḣ
ṣ”@
ÇḢ
Çṣ”.Œu1¦€K
⁹ĿðЀ5i
çµ⁵⁸Ŀ

A tomada programa completo exampleEmail, exampleOutput, realEmaile imprimir o resultado.

Experimente online!

Quão?

Executa todas as quatro transformações (mais uma precursora), localiza a primeira que produz o exemplo do primeiro email e aplica-o ao segundo email:

            - Link 1, do nothing: email
            - do nothing but return the input

ÑṪṣ”.Ḣ      - Link 2, the domain: email
Ñ           - call the next link (3) as a monad (split at "@")
 Ṫ          - tail
  ṣ”.       - split at "."
     Ḣ      - head

ṣ”@         - Link 3, split at @: email
ṣ”@         - split at "@"

ÇḢ          - Link 4, local part: email
Ç           - call the last link (3) as a monad (split at "@")
 Ḣ          - head

Çṣ”.Œu1¦€K  - Link 5, name-ified: email
Ç           - call the last link (4) as a monad (get the local part)
 ṣ”.        - split at "."
       ¦€   - for €ach sparsley apply:
      1     - ...to index: 1
    Œu      - ...action: uppercase
         K  - join with space(s)

⁹ĿðЀ5i     - Link 6, index of first correct link: exampleEmail; exampleOutput
   Ѐ5      - map across (implicit range of) 5 (i.e. for each n in [1,2,3,4,5]):
  ð         -   dyadicly (i.e. with n on the right and exampleEmail on the left):
 Ŀ          -     call referenced link as a monad:
⁹           -     ...reference: chain's right argument, n
      i     - first index of exampleOutput in the resulting list

çµ⁵⁸Ŀ       - Main link: exampleEmail; exampleOutput
ç           -   call the last link (6) as a dyad (get the first "correct" link index)
 µ          - monadic chain separation (call that L)
   ⁸        - chain's left argument, L
    Ŀ       - call the link at that reference as a monad with input:
  ⁵         -   program's third input, realEmail

Notas:

  1. Supõe que a entrada exampleOutput seja estritamente a mesma que a saída seria.

  2. O "precursor" (o resultado do link 3) é testado para corresponder a exampleOutput, mas não corresponderá, a menos que exampleOutputseja uma lista de listas de caracteres. Como tal, as entradas provavelmente devem ser citadas (a formatação Python pode ser usada aqui) para evitar a possibilidade de interpretá-la como tal.




2

JavaScript (ES6), 145 bytes

Invoque com sintaxe de curry, por exemplo f('chicken.soup@q.z')('Chicken Soup')('fab@ulou.s')

x=>y=>[x=>x,s=x=>x.split`@`[0],x=>s(x).split`.`.map(w=>w&&w[0].toUpperCase()+w.slice(1)).join` `.trim(),x=>/@(.+)\./.exec(x)[1]].find(f=>f(x)==y)


1

Mathematica, 217 bytes

(L=Capitalize;T@x_:=(M=StringSplit)[x,"@"];P@x_:=#&@@T[x];W@x_:=If[StringContainsQ[P@x,"."],StringRiffle@L@M[P@x,"."],L@P@x];Z@x_:=#&@@M[T[x][[2]],"."];If[#==#2,#3,If[#2==P@#,P@#3,If[#2==W@#,W@#3,If[#2==Z@#,Z@#3]]]])&


Experimente online!



1

CJam, 42

q~@{[_\'@/~'./0=\_'.%{(eu\+}%S*]}:T~@a#\T=

Experimente online

Explicação:

q~        read and evaluate the input (given as 3 quoted strings)
@         bring the first string to the top of the stack
{…}:T     define a function T that calculates the 4 transformations of a string:
  [       begin array
  _\      duplicate the string, and swap with the other copy to bring it in the array
           (1st transformation)
  '@/~    split by '@' and put the 2 pieces on the stack
  './0=   split the 2nd piece by '.' and keep the first part
           (4th transformation)
  \_      swap with the piece before '@' and duplicate it
           (2nd transformation)
  '.%     split by '.', removing the empty pieces
  {…}%    transform the array of pieces
    (eu   take out the first character and capitalize it
    \+    prepend it back to the rest
  S*      join the pieces by space
           (3rd transformation)
  ]       end array
~         execute the function on the first string
@a        bring the 2nd string to the top of the stack, and wrap it in an array
#         find the position of this string in the array of transformations
\T        bring the 3rd string to the top and call function T
=         get the transformation from the array, at the position we found before

1

PHP 7.1, 176 bytes

<?$e=explode;[,$p,$q,$r]=$argv;echo$p==$q?$r:($e('@',$p)[0]==$q?$e('@',$r)[0]:($e('.',$e('@',$p)[1])[0]==$q?$e('.',$e('@',$r)[1])[0]:ucwords(join(' ',$e('.',$e('@',$r)[0])))));

Experimente online!

PHP <7,1, 180 bytes

As versões abaixo de 7.1 precisariam alterar [,$p,$q,$r]=$argvpara list(,$p,$q,$r)=$argv, adicionando 4 bytes.


1

GNU sed , 105 + 1 (sinalizador r) = 106 bytes

Os três primeiros scomandos verificam as transformações de identidade , parte local e domínio, respectivamente. Se uma transformação corresponder, ela será aplicada ao segundo endereço de email e os seguintes scomandos falharão devido à falta do formato de entrada.

s:^(.*),\1,::
s:(.*)@.*,\1,(.*)@.*:\2:
s:.*@(.*)\..*,\1,.*@(.*)\..*:\2:
s:.*,([^.]*)\.?(.*)@.*:\u\1 \u\2:

Experimente online!

A transformação de divisão da parte local (último scomando) é a mais cara de verificar, em termos de bytes, portanto eu a coloquei no final e assumi que ela corresponde (já que as outras falharam nessa época), indo diretamente para a sua aplicação.


1

Gelatina , 43 bytes

ḢŒlṣ”.Œu1¦€K
ṣ”@Wẋ4j”@$ḷ/ÇṪṣ”.Ḣ$$4ƭ€
Çiị⁵Ǥ

Experimente online!


Iria ŒtKtrabalhar no lugar de Œu1¦€Ksalvar 3?
Jonathan Allan

... e qual é a necessidade Œl?
Jonathan Allan

^ ah vejo que 1in.thehandisso não funcionaria ŒtK.
Jonathan Allan

@ JonathanAllan Sim, essa é a razão pela qual eu não a usei, e também a razão pela qual a resposta do ovs (agora excluída) era inválida ( str.title).
Erik the Outgolfer
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.