Магічне перетворення електронної пошти! Або: допоможіть АНБ витягнути ваші метадані зі своєї електронної адреси


17

З огляду на адресу електронної пошти, результат перетворення, застосованого до цієї адреси електронної пошти, та другу адресу електронної пошти, повертають висновок тієї самої трансформації, що застосовується до другої адреси електронної пошти.

Усі адреси електронної пошти матимуть таку структуру:

Рядок позитивної довжини, що містить алфавітно-цифрові символи та щонайбільше один .(локальна частина), далі @символ, за ним рядок позитивної довжини, що містить буквено-цифрові символи (домен), далі .символ, і заключний рядок позитивної довжини містить буквено-цифрові символи (TLD).

Існує чотири дозволені перетворення:

  • Ідентичність (без змін). ( a.b@c.d -> a.b@c.d)
  • Повернення лише локальної частини (все до цього @) немодифікованого ( a.b@c.d -> a.b).
  • Повернення місцевої частини розділиться на .присутність, якщо перший символ кожної половини складається з великої літери. ( a.b@c.d -> A B).
  • Повернення просто домену (все між @кінцевим та остаточним .) немодифіковане. ( a.b@c.d -> c).

Коли можливо більше однієї трансформації, ви можете дати результат будь-якої з можливостей. Пробіл на початку та в кінці виводу не має значення, але в середині має значення (тобто, якщо ви розділите a.bна A Bнього, у середині повинен бути лише один пробіл [і будь-яке число на початку та в кінці виводу], але якщо ви розділите a., то Aбудь-яка кількість пробілів з обох боків є прийнятною).

Приклади ( 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

Застосовуються звичайні правила та лазівки.


Чи не повинен останній тестовий випадок повернути "коня"? Я не бачу, чому вона може повернути "свиню" замість цього.
Ерік Аутгольфер

3
@EriktheOutgolfer, оскільки четверта трансформація полягає у поверненні просто домену (частини між @і остаточною .). Оскільки локальна частина та домен є обома chicken, неоднозначно, чи це 2-а чи 4-а трансформація
LangeHaare

О, я це неправильно трактував.
Ерік Аутгольфер

Чи можемо ми вимагати, щоб відповідний ввід був відформатований з пробілом у всіх випадках (наприклад, у тесті, де вихід A[з пробілом], щоб другий вхід був Jones[з провідним пробілом])?
Джонатан Аллан

Я не розумію , чому .jones@x.1, Jones, a.@3.zце A- якщо jonesпідібрано , що означає узгодження частина є частиною між першим періодом і символом @. Але це призведе до появи порожнього рядка, оскільки aце до першого періоду, а не після.
Джеррі Єремія

Відповіді:


4

Java 8, 254 240 236 байт

(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 байти завдяки @LukeStevens .

Пояснення:

Спробуйте тут.

(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
Ви можете збити 4 байти, використовуючи (p.charAt(0)+"").toUpperCase()замість Character.toUpperCase(p.charAt(0)).
Люк Стівенс

@LukeStevens Дякую! У мене було (char)(p.charAt(0)&~32)спочатку, але це не спрацювало через 1in Thehandтестовий випадок. Але верхнє обмацування його як String справді коротше Character.toUpperCase, тому дякую!
Kevin Cruijssen

3

Haskell , 208 байт

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]

Спробуйте в Інтернеті!

Сумно, що мені довелося витратити 59 байт на винахід split( s).

Рішення створює список перетворень і повертає перше, що призводить до очікуваного результату.


Ласкаво просимо на сайт! Я не знаю Haskell, але чи можна видалити будь-які символи пробілу, такі як нові рядки та пробіли?
caird coinheringaahing

Приємна перша відповідь! Можливо, вам буде цікава наша колекція порад з гольфу в Хаскеллі , особливо це, і це повинно економити кілька байтів.
Лайконі

Також не соромтесь приєднатися до нас у « Monads and Men» , чаті для гольфу та загальній дискусії про Haskell.
Лайконі

3

Желе , 40 байт

Переважна завдяки Еріку Позашляховику за те, що він помітив невдачу використання Œt(заголовок справи) і, отже, Œu1¦€KбільшеŒtK

-1 байт завдяки Еріку Погоні (перестановка⁵⁸ç⁹¤Ŀ на çµ⁵⁸Ŀ)


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

Повна програма прийняття exampleEmail , exampleOutput, realEmailі друк результату.

Спробуйте в Інтернеті!

Як?

Виконує всі чотири перетворення (плюс попередник), знаходить перше, що отримує приклад з першого електронного листа, а потім застосовує його до другого повідомлення електронної пошти:

            - 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

Примітки:

  1. Припустимо, що вхідний прикладВідхід суворо такий же, як і у вихідному.

  2. "Попередник" (результат посилання 3) тестується на відповідність exampleOutput, але він не збігається, якщо exampleOutputсам по собі не є списком списків символів. Як такі, вхідні дані, ймовірно, повинні бути цитовані (формат Python може бути використаний тут), щоб уникнути можливості інтерпретувати його як таке.




2

JavaScript (ES6), 145 байт

Викликати із синтаксисом каррі, напр 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

CJam, 42

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

Спробуйте в Інтернеті

Пояснення:

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 байт

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

Спробуйте в Інтернеті!

PHP <7,1, 180 байт

Версії під 7.1 повинні змінити значення [,$p,$q,$r]=$argvна list(,$p,$q,$r)=$argv, додавши 4 байти.


1

GNU sed , 105 + 1 (r прапор) = 106 байт

Перші три sкоманди для перевірки ідентичності , локальної частини і домена перетворень відповідно. Якщо одна трансформація збігається, вона застосовується до другої адреси електронної пошти, і наступні sкоманди не зможуть через відсутність формату введення.

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

Спробуйте в Інтернеті!

Локальна частина сплати перетворення (остання sкоманда) є найдорожчим , щоб перевірити, в байтах, тому я поклав його в кінці , і припустив , що це відповідає (так як інші не вдалося на той час), переходячи безпосередньо до його застосування.


1

Желе , 43 байти

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

Спробуйте в Інтернеті!


Чи буде ŒtKпрацювати замість того, Œu1¦€Kщоб зберегти 3?
Джонатан Аллан

... і в чому потреба Œl?
Джонатан Аллан

^ ах я бачу, що 1in.thehandце не спрацювало б ŒtK.
Джонатан Аллан

@JonathanAllan Так, це причина, чому я цього не використовував, а також відповідь ovs (тепер видалена) відповідь була недійсною ( str.title).
Ерік Аутгольфер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.