Chuyển đổi email ma thuật! Hoặc: giúp NSA trích xuất siêu dữ liệu của bạn từ địa chỉ email của bạn


17

Cho một địa chỉ email, kết quả của một chuyển đổi được áp dụng cho địa chỉ email đó và một địa chỉ email thứ hai, trả về đầu ra của cùng một chuyển đổi được áp dụng cho địa chỉ email thứ hai.

Các địa chỉ email sẽ có cấu trúc như sau:

Một chuỗi có độ dài dương chứa các ký tự chữ và số và nhiều nhất là một .(phần cục bộ), theo sau là một @ký hiệu, theo sau là một chuỗi có độ dài dương chứa các ký tự chữ và số (miền), theo sau là .ký hiệu và chuỗi cuối cùng có độ dài dương chứa các ký tự chữ và số (TLD).

Có bốn phép biến đổi được phép:

  • Danh tính (không thay đổi). ( a.b@c.d -> a.b@c.d)
  • Trả lại chỉ là phần cục bộ (mọi thứ trước khi @) không thay đổi ( a.b@c.d -> a.b).
  • Trả lại phần địa phương tách ra .nếu có, với biểu tượng đầu tiên của mỗi nửa được viết hoa. ( a.b@c.d -> A B).
  • Trả lại chỉ tên miền (tất cả mọi thứ giữa @và cuối cùng .) không thay đổi. ( a.b@c.d -> c).

Khi có nhiều hơn một chuyển đổi, bạn có thể đưa ra đầu ra của bất kỳ khả năng nào. Khoảng trắng ở đầu và cuối của đầu ra không quan trọng, nhưng ở giữa không (ví dụ: nếu bạn chia a.bcho A Bnên có chỉ là một không gian ở giữa [và bất kỳ số lúc bắt đầu và kết thúc của đầu ra], nhưng nếu bạn chia a., sau đó Avới bất kỳ số lượng không gian ở hai bên đều được chấp nhận).

Ví dụ ( 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

Quy tắc thông thường và sơ hở áp dụng.


Không nên là trường hợp thử nghiệm cuối cùng trả lại "con ngựa"? Tôi không thấy lý do tại sao nó có thể trả lại "lợn" thay thế.
Erik the Outgolfer

3
@EriktheOutgolfer vì chuyển đổi thứ 4 là chỉ trả về tên miền (phần giữa @và cuối cùng .). Vì cả phần cục bộ và miền đều là cả hai chicken, nên không rõ liệu đó là phần chuyển đổi thứ 2 hay thứ 4
LangeHaare

Ồ, tôi đã giải thích sai điều đó.
Erik the Outgolfer

Chúng tôi có thể yêu cầu đầu vào có liên quan được định dạng với không gian trong mọi trường hợp không (ví dụ: trong thử nghiệm trong đó đầu ra là A[với khoảng trắng ở cuối] rằng đầu vào thứ hai là Jones[với khoảng trắng ở đầu])?
Jonathan Allan

Tôi không hiểu tại sao .jones@x.1, Jones, a.@3.zA- nếu joneslà lần xuất hiện đó có nghĩa phần khớp là phần giữa giai đoạn đầu tiên và biểu tượng @. Nhưng điều đó sẽ dẫn đến một chuỗi trống bởi vì đó alà trước thời kỳ đầu tiên và không phải sau đó.
Jerry Jeremiah

Câu trả lời:


4

Java 8, 254 240 236 byte

(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 byte nhờ @LukeStevens .

Giải trình:

Hãy thử nó ở đây.

(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
Bạn có thể loại bỏ 4 byte bằng cách sử dụng (p.charAt(0)+"").toUpperCase()thay vì Character.toUpperCase(p.charAt(0)).
Luke Stevens

@LukeStevens Cảm ơn! Tôi đã có (char)(p.charAt(0)&~32)lúc đầu, nhưng điều này đã không làm việc do 1in Thehandtrường hợp thử nghiệm. Nhưng vượt qua nó như String thực sự ngắn hơn Character.toUpperCase, cảm ơn!
Kevin Cruijssen

3

Haskell , 208 byte

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]

Hãy thử trực tuyến!

Thật buồn khi tôi đã phải chi 59 byte cho việc phát minh lại split( s).

Giải pháp tạo ra một danh sách các phép biến đổi và trả về kết quả đầu tiên dẫn đến kết quả mong đợi.


Chào mừng đến với trang web! Tôi không biết Haskell, nhưng có thể xóa bất kỳ ký tự khoảng trắng nào, chẳng hạn như dòng mới và dấu cách không?
caird coinheringaahing

Câu trả lời đầu tiên tốt đẹp! Bạn có thể quan tâm đến bộ sưu tập các mẹo chơi golf của chúng tôi trong Haskell , đặc biệt là điều nàyđiều này sẽ tiết kiệm một số byte.
Laikoni

Cũng cảm thấy thoải mái khi tham gia cùng chúng tôi trong Of Monads and Men , một phòng trò chuyện để chơi gôn và thảo luận chung về Haskell.
Laikoni

3

Thạch , 40 byte

Cảm ơn trước Erik the Outgolfer vì đã nhận thấy sự thất bại của việc sử dụng Œt(trường hợp tiêu đề) và do đó Œu1¦€Kkết thúcŒtK

-1 byte nhờ Erik the Outgolfer (sắp xếp lại ⁵⁸ç⁹¤Ŀthành çµ⁵⁸Ŀ)


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

Một chương trình lấy đầy đủ exampleEmail, exampleOutput, realEmailvà in kết quả.

Hãy thử trực tuyến!

Làm sao?

Thực hiện tất cả bốn biến đổi (cộng với một tiền thân), tìm ra biến đổi đầu tiên mang lại ví dụ từ email đầu tiên, sau đó áp dụng nó cho email thứ hai:

            - 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

Ghi chú:

  1. Giả sử ví dụ đầu vàoOutput hoàn toàn giống với đầu ra.

  2. "Tiền thân" (kết quả của liên kết 3) được kiểm tra để khớp với exampleOutput, nhưng nó sẽ không khớp trừ khi exampleOutputchính nó là một danh sách các danh sách các ký tự. Vì vậy, các đầu vào có lẽ nên được trích dẫn (định dạng Python có thể được sử dụng ở đây) để tránh khả năng diễn giải nó như vậy.




2

JavaScript (ES6), 145 byte

Gọi cú pháp currying, vd 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

Toán học, 217 byte

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


Hãy thử trực tuyến!



1

CJam, 42

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

Dùng thử trực tuyến

Giải trình:

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 byte

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

Hãy thử trực tuyến!

PHP <7.1, 180 byte

Các phiên bản dưới 7.1 sẽ cần thay đổi [,$p,$q,$r]=$argvthành list(,$p,$q,$r)=$argv, thêm 4 byte.


1

GNU sed , 105 + 1 (cờ r) = 106 byte

Ba slệnh đầu tiên kiểm tra nhận dạng , phần cục bộ và biến đổi miền tương ứng. Nếu một biến đổi khớp, thì nó được áp dụng cho địa chỉ email thứ hai và các slệnh sau sẽ không thành công do thiếu định dạng đầu vào.

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

Hãy thử trực tuyến!

Phép biến đổi phân chia phần cục bộ ( slệnh cuối cùng ) là tốn kém nhất để kiểm tra, về mặt byte, do đó tôi đã đặt nó ở cuối và giả sử nó khớp (vì các lệnh khác đã thất bại vào thời điểm đó), đi thẳng vào ứng dụng của nó.


1

Thạch , 43 byte

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

Hãy thử trực tuyến!


Sẽ ŒtKlàm việc thay vì Œu1¦€Ktiết kiệm 3?
Jonathan Allan

... Và những gì cần thiết Œl?
Jonathan Allan

^ ah tôi thấy rằng 1in.thehandsẽ không làm việc với ŒtK.
Jonathan Allan

@Jonathan ALLan Yep, đó là lý do tại sao tôi không sử dụng nó và đó cũng là lý do câu trả lời của ovs (hiện đã bị xóa) không hợp lệ ( str.title).
Erik the Outgolfer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.