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:

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):

[email protected], John Doe, [email protected]         | Phillip Maini
[email protected], John Doe, [email protected]         | Phillip Maini
[email protected], foo.bar, [email protected]           | gee.whizz
[email protected], foo.bar, [email protected]           | gEe.Whizz
[email protected], comedy, [email protected] | office
[email protected], Jones, [email protected]                                     | A
[email protected], [email protected], [email protected]                                | [email protected]
[email protected], .jones, [email protected]                                    | a.
[email protected], x, [email protected]                                         | 3
[email protected], [email protected], [email protected]                                           | [email protected]
[email protected], John Jones, [email protected]           | 1in Thehand
[email protected], Chicken Soup, [email protected]                    | Fab
[email protected], lange, [email protected]                          | fat.so
[email protected], Lange, [email protected]                          | {fat.so, Fat So} # either acceptable
[email protected], chicken, [email protected]              | {horse, pig} # either acceptable

Aturan dan celah biasa berlaku.

LangeHaare
sumber
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 [email protected], Jones, [email protected]ini 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
Kevin Cruijssen
sumber
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.

pengguna75684
sumber
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.

Jonathan Allan
sumber
39 byte
Erik the Outgolfer
2

Python 2 , 135 byte

s,r,x=input()
def f(x):S,D=x.split('@');return x,S,' '.join(map(str.capitalize,S.split('.'))),D.split('.')[0]
print f(x)[f(s).index(r)]

Cobalah online!

Erik the Outgolfer
sumber
-3 byte dengan memindahkan strip
Ov
@ovs terima kasih, anyways aturan berubah untuk menghapus kebutuhan untuk itu
Erik the Outgolfer
2

JavaScript (ES6), 145 byte

Aktifkan dengan sintaks currying, mis f('[email protected]')('Chicken Soup')('[email protected]')

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)

Darrylyeo
sumber
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!

J42161217
sumber
1

Ruby , 117 106 102 byte

->a,b,c{r=[/.*/,/(?<=@)\w*/,/[^@]*/].find{|x|r=c[x];a[x]==b}?r:r.sub(?.," ").gsub(/\b(.)/){$1.upcase}}

Cobalah online!

Pasang kembali Monica - notmaynard
sumber
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
aditsu
sumber
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.

Jo.
sumber
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.

seshoumara
sumber
1

Jeli , 43 byte

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

Cobalah online!

Erik the Outgolfer
sumber
Apakah ŒtKberhasil menggantikan Œu1¦€K3?
Jonathan Allan
... dan untuk apa Œl?
Jonathan Allan
^ ah saya melihat itu 1in.thehand tidak akan berhasil ŒtK.
Jonathan Allan
@ JonathanAllan Yap, itulah alasan mengapa saya tidak menggunakannya, dan juga alasan ovs (sekarang dihapus) jawaban tidak valid ( str.title).
Erik the Outgolfer