Transformation magique des e-mails! Ou: aidez la NSA à extraire vos métadonnées de votre adresse e-mail


17

Étant donné une adresse e-mail, le résultat d'une transformation appliquée à cette adresse e-mail et une deuxième adresse e-mail, retournez la sortie de la même transformation appliquée à la deuxième adresse e-mail.

Les adresses e-mail auront toutes la structure suivante:

Une chaîne de longueur positive contenant des caractères alphanumériques et au plus un .(la partie locale), suivie d'un @symbole, suivie d'une chaîne de longueur positive contenant des symboles alphanumériques (le domaine), suivie d'un .symbole et d'une chaîne finale de longueur positive contenant des caractères alphanumériques (le TLD).

Il existe quatre transformations autorisées:

  • Identité (pas de changement). ( a.b@c.d -> a.b@c.d)
  • Renvoyer uniquement la partie locale (tout ce qui précède @) non modifié ( a.b@c.d -> a.b).
  • Retour de la partie locale divisée sur le .cas échéant, avec le premier symbole de chaque moitié en majuscule. (a.b@c.d -> A B ).
  • Retour juste le domaine (tout entre le @et le final .) non modifié. ( a.b@c.d -> c).

Lorsque plusieurs transformations sont possibles, vous pouvez fournir la sortie de l'une des possibilités. Au début Whitespace et à la fin de la production de peu d' importance, mais au milieu ne ( par exemple , si vous divisez a.bà A Bil devrait y avoir un seul espace au milieu [et un nombre au début et à la fin de la production], mais si vous divisez a., alors Aavec n'importe quel nombre d'espaces de chaque côté sont tous acceptables).

Exemples ( 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

Les règles et les failles habituelles s'appliquent.


Le dernier cas de test ne devrait-il pas retourner "cheval"? Je ne vois pas pourquoi il peut retourner "cochon" à la place.
Erik the Outgolfer

3
@EriktheOutgolfer car la 4ème transformation consiste à renvoyer uniquement le domaine (la partie entre @et finale .). Étant donné que la partie locale et le domaine sont tous les deux chicken, il est ambigu que ce soit la 2e ou la 4e transformation
LangeHaare

Oh, j'ai mal interprété cela.
Erik the Outgolfer du

Pouvons-nous exiger que l' entrée pertinente soit formatée avec l'espace dans tous les cas (par exemple dans le test où la sortie est A[avec un espace de fin] que la deuxième entrée soit Jones[avec un espace de début])?
Jonathan Allan

Je ne comprends pas pourquoi .jones@x.1, Jones, a.@3.zest A- si jonesest adaptée cela signifie que la partie correspondante est la partie entre la première période et le symbole @. Mais cela entraînerait une chaîne vide car le aest avant la première période et non après.
Jerry Jeremiah

Réponses:


4

Java 8, 254 240 236 octets

(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 octets grâce à @LukeStevens .

Explication:

Essayez-le ici.

(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
Vous pouvez supprimer 4 octets en utilisant (p.charAt(0)+"").toUpperCase()au lieu de Character.toUpperCase(p.charAt(0)).
Luke Stevens

@LukeStevens Merci! J'ai eu (char)(p.charAt(0)&~32)au début, mais cela n'a pas fonctionné en raison du 1in Thehandcas de test. Mais le mettre en majuscule comme String est en effet plus court que Character.toUpperCase, alors merci!
Kevin Cruijssen

3

Haskell , 208 octets

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]

Essayez-le en ligne!

C'est triste d'avoir dû dépenser 59 octets pour réinventer split( s).

La solution crée une liste de transformations et renvoie la première qui mène au résultat attendu.


Bienvenue sur le site! Je ne connais pas Haskell, mais est-il possible de supprimer l'un des caractères d'espacement, tels que les sauts de ligne et les espaces?
caird coinheringaahing

Belle première réponse! Vous pourriez être intéressé par notre collection de conseils pour le golf à Haskell , en particulier cela et cela devrait économiser quelques octets.
Laikoni

N'hésitez pas à nous rejoindre dans Of Monads and Men , une salle de chat pour le golf et une discussion générale sur Haskell.
Laikoni

3

Gelée , 40 octets

Préemption grâce à Erik l'Outgolfer pour avoir remarqué l'échec de l'utilisation Œt(case-titre) et donc Œu1¦€KplusŒtK

-1 octet grâce à Erik l'Outgolfer (réarrangement de ⁵⁸ç⁹¤Ŀto çµ⁵⁸Ŀ)


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

Un programme complet prenant exampleEmail, exampleOutput, realEmailet d' imprimer le résultat.

Essayez-le en ligne!

Comment?

Effectue les quatre transformations (plus une précurseur), trouve la première qui donne l'exemple du premier e-mail, puis l'applique au deuxième e-mail:

            - 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

Remarques:

  1. Suppose que l'exemple d'entrée est strictement identique à la sortie.

  2. Le "précurseur" (le résultat du lien 3) est testé pour faire correspondre le exampleOutput, mais il ne correspondra que si le exampleOutputlui-même est une liste de listes de caractères. En tant que tel, les entrées doivent probablement être citées (le formatage Python peut être utilisé ici) pour éviter la possibilité de l'interpréter comme tel.




2

JavaScript (ES6), 145 octets

Invoquer avec la syntaxe de curry, par exemple 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 octets

(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]]]])&


Essayez-le en ligne!



1

CJam, 42

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

Essayez-le en ligne

Explication:

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 octets

<?$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])))));

Essayez-le en ligne!

PHP <7,1, 180 octets

Les versions sous 7.1 devraient changer le [,$p,$q,$r]=$argven list(,$p,$q,$r)=$argv, en ajoutant 4 octets.


1

GNU sed , 105 + 1 (drapeau r) = 106 octets

Les trois premières scommandes vérifient respectivement les transformations d' identité , de partie locale et de domaine . Si une transformation correspond, elle est appliquée à la deuxième adresse e-mail et les scommandes suivantes échoueront en raison d'un manque de format d'entrée.

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

Essayez-le en ligne!

La transformation de fractionnement de partie locale (dernière scommande) est la plus coûteuse à vérifier, en termes d'octets, donc je l'ai placée à la fin et j'ai supposé qu'elle correspond (puisque les autres ont échoué à ce moment-là), en allant directement à son application.


1

Gelée , 43 octets

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

Essayez-le en ligne!


Fonctionnerait ŒtKà la place de Œu1¦€Ksauver 3?
Jonathan Allan

... et de quoi a-t-on besoin Œl?
Jonathan Allan

^ ah je vois que ça 1in.thehandne marcherait pas ŒtK.
Jonathan Allan

@JonathanAllan Yep, c'est la raison pour laquelle je n'ai pas utilisé cela, et aussi la raison pour laquelle la réponse (maintenant supprimée) d'ovs n'était pas valide ( str.title).
Erik the Outgolfer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.