Волшебное преобразование электронной почты! Или: помогите АНБ извлечь ваши метаданные с вашего адреса электронной почты


17

Для данного адреса электронной почты результат преобразования, примененного к этому адресу электронной почты, и второго адреса электронной почты возвращают выходные данные того же преобразования, примененного ко второму адресу электронной почты.

Все адреса электронной почты будут иметь следующую структуру:

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

Существует четыре допустимых преобразования:

  • Идентичность (без изменений). ( a.b@c.d -> a.b@c.d)
  • Возвращает только локальную часть (все до @) unmodified ( a.b@c.d -> a.b).
  • Возврат локальной части, разделенной на .if, если присутствует, с первым символом каждой половины с большой буквы. ( 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

Применяются обычные правила и лазейки.


Разве последний тест не должен возвращать «лошадь»? Я не понимаю, почему он может вернуть «свинью» вместо этого.
Эрик Outgolfer

3
@EriktheOutgolfer, потому что 4-е преобразование - возвращать только домен (часть между @финальным и последним .). Так как локальная часть и домен оба chicken, неоднозначно, является ли это 2-м или 4-м преобразованием
LangeHaare

О, я неверно истолковал это.
Эрик Outgolfer

Можем ли мы требовать, чтобы соответствующий ввод был отформатирован с пробелом во всех случаях (например, в тесте, где вывод 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, так что спасибо!
Кевин Круйссен,

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 Coneheringaahing

Хороший первый ответ! Вас может заинтересовать наша коллекция советов по игре в гольф на Haskell , особенно это, и это должно сэкономить несколько байтов.
Лайкони

Также не стесняйтесь присоединиться к нам в Of Monads and Men , в чате для игры в гольф и общего обсуждения Haskell.
Лайкони

3

Желе , 40 байт

Преимущественный благодаря Эрику Outgolfer для замечать неудачи использования Œt(название случай) и , следовательно , Œu1¦€KболееŒtK

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


ÑṪṣ”.Ḣ
ṣ”@
ÇḢ
Çṣ”.Œ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. Предполагается, что input exampleOutput строго совпадает с выводом.

  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

Mathematica, 217 байтов

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


Попробуйте онлайн!



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]=$argvTo 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).
Эрик Outgolfer
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.