Transformasi email ajaib! Atau: bantu NSA mengekstrak metadata Anda dari alamat email Anda


17

Diberikan alamat email, hasil transformasi yang diterapkan ke alamat email itu, dan alamat email kedua, kembalikan output dari transformasi yang sama yang diterapkan ke alamat email kedua.

Semua alamat email memiliki struktur sebagai berikut:

Untaian panjang positif berisi karakter alfanumerik dan paling banyak satu .(bagian lokal), diikuti oleh @simbol, diikuti oleh untaian panjang positif yang berisi sumban alfanumerik (domain), diikuti oleh .simbol, dan string akhir panjang positif mengandung karakter alfanumerik (TLD).

Ada empat transformasi yang diizinkan:

  • Identitas (tidak ada perubahan). ( a.b@c.d -> a.b@c.d)
  • Mengembalikan hanya bagian lokal (semuanya sebelum @) yang tidak dimodifikasi ( a.b@c.d -> a.b).
  • Mengembalikan perpecahan bagian lokal pada .if hadir, dengan simbol pertama dari setiap setengah dikapitalisasi. ( a.b@c.d -> A B).
  • Mengembalikan domain saja (semuanya antara @dan final .) tidak dimodifikasi. ( a.b@c.d -> c).

Ketika lebih dari satu transformasi dimungkinkan, Anda dapat memberikan output dari salah satu kemungkinan. Spasi pada awal dan akhir output tidak masalah, tetapi di tengah tidak (yaitu jika Anda membagi a.bke A Bharus ada hanya satu ruang di tengah [dan angka apa pun di awal dan akhir output], tetapi jika Anda membagi a., maka Adengan sejumlah ruang di kedua sisi semuanya dapat diterima).

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

Aturan dan celah biasa berlaku.


Bukankah seharusnya test case terakhir mengembalikan "kuda"? Saya tidak mengerti mengapa ia bisa mengembalikan "babi".
Erik the Outgolfer

3
@EriktheOutgolfer karena transformasi ke-4 hanya mengembalikan domain (bagian antara @dan final .). Karena bagian dan domain keduanya sama-sama chickenambigu, apakah ini transformasi ke-2 atau ke-4
LangeHaare

Oh, saya salah menafsirkan itu.
Erik the Outgolfer

Bolehkah kita meminta agar input yang relevan diformat dengan spasi dalam semua kasus (mis. Dalam tes di mana outputnya A[dengan spasi tambahan] bahwa input kedua menjadi Jones[dengan spasi terdepan])?
Jonathan Allan

Saya tidak mengerti mengapa .jones@x.1, Jones, a.@3.zini A- jika jonescocok itu berarti bagian yang cocok adalah bagian antara periode pertama dan simbol @. Tapi itu akan menghasilkan string kosong karena asebelum periode pertama dan bukan setelah.
Jerry Jeremiah

Jawaban:


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 terima kasih kepada @LukeStevens .

Penjelasan:

Coba di sini.

(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
Anda dapat mematikan 4 byte dengan menggunakan (p.charAt(0)+"").toUpperCase()alih-alih Character.toUpperCase(p.charAt(0)).
Luke Stevens

@LukeStevens Terima kasih! (char)(p.charAt(0)&~32)Awalnya saya punya , tetapi ini tidak berhasil karena 1in Thehandtest case. Tapi menjadikannya sebagai string memang lebih pendek dari itu Character.toUpperCase, jadi terima kasih!
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]

Cobalah online!

Sangat menyedihkan saya harus menghabiskan 59 byte pada reinventing split( s).

Solusi ini membuat daftar transformasi dan mengembalikan yang pertama yang mengarah ke hasil yang diharapkan.


Selamat datang di situs ini! Saya tidak tahu Haskell, tetapi apakah mungkin untuk menghapus karakter spasi putih, seperti baris baru dan spasi?
caird coinheringaahing

Jawaban pertama yang bagus! Anda mungkin tertarik dengan koleksi kiat bermain golf di Haskell kami , terutama ini dan ini akan menghemat beberapa byte.
Laikoni

Juga merasa bebas untuk bergabung dengan kami di Of Monads and Men , ruang obrolan untuk bermain golf dan diskusi umum tentang Haskell.
Laikoni

3

Jelly , 40 byte

Pre-emptive berkat Erik yang Outgolfer untuk memperhatikan kegagalan menggunakan Œt(judul-kasus) dan karenanya Œu1¦€KlebihŒtK

-1 byte terima kasih kepada Erik the Outgolfer (pengaturan ulang ⁵⁸ç⁹¤Ŀuntuk çµ⁵⁸Ŀ)


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

Sebuah program taking penuh exampleEmail, exampleOutput, realEmaildan mencetak hasilnya.

Cobalah online!

Bagaimana?

Lakukan keempat transformasi (ditambah satu prekursor), temukan yang pertama yang menghasilkan contoh dari email pertama, lalu terapkan ke email kedua:

            - 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

Catatan:

  1. Mengasumsikan input exampleOutput benar-benar sama dengan outputnya.

  2. "Prekursor" (hasil tautan 3) diuji untuk mencocokkannya exampleOutput, tetapi tidak akan cocok kecuali jika exampleOutputitu sendiri adalah daftar daftar karakter. Karena itu inputnya mungkin harus dikutip (format Python dapat digunakan di sini) untuk menghindari kemungkinan menafsirkannya seperti itu.




2

JavaScript (ES6), 145 byte

Aktifkan dengan sintaks currying, mis 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 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]]]])&


Cobalah online!



1

CJam, 42

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

Cobalah online

Penjelasan:

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

Cobalah online!

PHP <7.1, 180 byte

Versi di bawah 7.1 perlu mengubah [,$p,$q,$r]=$argvto list(,$p,$q,$r)=$argv, menambahkan 4 byte.


1

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

Tiga sperintah pertama masing-masing memeriksa identitas , bagian lokal dan transformasi domain . Jika satu transformasi cocok, maka diterapkan ke alamat email kedua dan sperintah berikut akan gagal karena kurangnya format input.

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

Cobalah online!

Itu Bagian perpecahan lokal transformasi (terakhir sperintah) adalah yang paling mahal untuk memeriksa, dalam hal byte, karena itu saya ditempatkan di akhir dan diasumsikan cocok (karena yang lain gagal pada saat itu), akan langsung ke aplikasinya.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.