Sihirli e-posta dönüşümü! Veya: NSA'nın meta verilerinizi e-posta adresinizden almasına yardımcı olun


17

Bir e-posta adresi, bu e-posta adresine uygulanan bir dönüşümün sonucu ve ikinci bir e-posta adresi verildiğinde, aynı e-posta adresinin çıktısını ikinci e-posta adresine uygulayın.

E-posta adreslerinin tümü aşağıdaki yapıya sahip olacaktır:

Alfasayısal karakterler ve en fazla bir .(yerel kısım) @içeren bir pozitif uzunluk dizesi, ardından bir sembol, ardından alfasayısal sumboller (alan adı) ve ardından bir .sembol ve son pozitif uzunluk dizesi içeren bir pozitif uzunluk dizesi gelir. alfasayısal karakterler (TLD) içerir.

İzin verilen dört dönüşüm vardır:

  • Kimlik (değişiklik yok). ( a.b@c.d -> a.b@c.d)
  • Sadece yerel kısmı döndürme (önceki her şey @) değiştirilmemiş ( a.b@c.d -> a.b).
  • Yerel parçanın döndürülmesi, .eğer varsa, her yarının ilk sembolü büyük harfle yazılır. ( a.b@c.d -> A B).
  • Yalnızca alan adını ( @ve son arasındaki her şeyi) döndürmek .değiştirilmedi. ( a.b@c.d -> c).

Birden fazla dönüşüm mümkün olduğunda, olasılıklardan herhangi birinin çıktısını verebilirsiniz. Başlangıç ve sonunda çıktı Boşluk meselesi değil, ancak ne Ayrılırsak ortasında (yani yok a.betmek A Bsize Ayrılırsak Ortada [ve başlangıç ve sonunda çıktı herhangi bir sayıda] sadece bir boşluk olmalıdır, ancak a., daha sonra Aher iki taraftaki herhangi bir sayıda boşluk kabul edilebilir).

Örnekler ( 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

Genel kurallar ve boşluklar geçerlidir.


Son test davası "at" a dönmemeli mi? Bunun yerine neden "domuz" döndüğünü anlamıyorum.
Outgolfer Erik

3
@EriktheOutgolfer çünkü 4. dönüşüm yalnızca etki alanını ( @son ile son arasındaki kısım .) döndürmektir . Yerel kısım ve alan adı her ikisi de olduğundan chicken, 2. veya 4. dönüşüm olup olmadığı belirsiz
LangeHaare

Bunu yanlış yorumladım.
Outgolfer Erik

İlgili girişin tüm durumlarda boşlukla biçimlendirilmesini gerektirebilir miyiz (örneğin, çıktının A[arka boşlukla] olduğu testte ikinci girişin Jones[ön boşlukla] olduğu)?
Jonathan Allan

Neden anlamıyorum .jones@x.1, Jones, a.@3.zolduğunu Aeğer - jonesvasıta eşleştirme kısmı birinci dönem ve @ sembolü arasındaki bir parçası olduğuna eşleştirilir. Ancak bu boş bir dize ile sonuçlanır çünkü ailk dönemden önce ve sonra değil.
Jerry Jeremiah

Yanıtlar:


4

Java 8, 254 240 236 bayt

(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;}

@LukeStevens sayesinde -4 bayt .

Açıklama:

Burada deneyin.

(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
Sen kullanarak 4 bayt hallediyor (p.charAt(0)+"").toUpperCase()yerine Character.toUpperCase(p.charAt(0)).
Luke Stevens

@LukeStevens Teşekkürler! (char)(p.charAt(0)&~32)İlk başta vardı , ama 1in Thehandtest davası nedeniyle bu işe yaramadı . Ama String olarak üstlenmek gerçekten daha kısa Character.toUpperCase, bu yüzden teşekkürler!
Kevin Cruijssen

3

Haskell , 208 bayt

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]

Çevrimiçi deneyin!

Bu üzücü ı yeniden keşfeder 59 bayt geçirmek zorunda olan split( s).

Çözüm, bir dönüşüm listesi oluşturur ve beklenen sonuca götüren ilki döndürür.


Siteye Hoşgeldiniz! Haskell'i tanımıyorum, ancak satırsonu ve boşluk gibi boşluk karakterlerinden herhangi birini kaldırmak mümkün müdür?
coinheringaahing Caird

Güzel ilk cevap! Haskell'de golf için ipuçları koleksiyonumuzla ilgilenebilirsiniz , özellikle bu ve bu biraz bayt tasarruf etmelidir.
Laikoni

Ayrıca Haskell'in golf ve genel tartışması için bir sohbet odası olan Of Monads and Men'de bize katılmaktan çekinmeyin .
Laikoni

3

Jöle , 40 bayt

Rüçhan sayesinde Erik Outgolfer kullanarak başarısızlığını fark için Œt(başlık durum) ve dolayısıyla Œu1¦€KüzerindeŒtK

-1 byte sayesinde Erik Outgolfer (yeniden düzenlenmesi ⁵⁸ç⁹¤Ŀiçin çµ⁵⁸Ŀ)


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

Tam bir programı alma exampleEmail, exampleOutput, realEmailve sonucu baskı.

Çevrimiçi deneyin!

Nasıl?

Dört dönüşümü de (artı bir öncü) gerçekleştirir, ilk e-postadaki örneği veren ilk dönüşümü bulur, ardından ikinci e-postaya uygular:

            - 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

Notlar:

  1. Girdi örneğinin Çıktı kesinlikle çıktı ile aynı olduğunu varsayar.

  2. "Öncü" (bağlantı 3'ün sonucu), eşleşmesi için test edilir exampleOutput, ancak exampleOutputkendisi karakter listelerinin bir listesi olmadığı sürece eşleşmez . Bu nedenle, girdiler bu şekilde yorumlanma olasılığını önlemek için muhtemelen alıntılanmalıdır (burada Python biçimlendirmesi kullanılabilir).




2

JavaScript (ES6), 145 bayt

Curry sözdizimi ile çağırın, ör. 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 bayt

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


Çevrimiçi deneyin!



1

CJam, 42

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

Çevrimiçi deneyin

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

PHP <7.1, 180 bayt

7.1 altında sürümleri değiştirmek gerekir [,$p,$q,$r]=$argvTo list(,$p,$q,$r)=$argv4 bayt ekleyerek.


1

GNU sed , 105 + 1 (r bayrağı) = 106 bayt

İlk üç skomut sırasıyla kimlik , yerel bölüm ve etki alanı dönüşümlerini kontrol eder. Bir dönüşüm eşleşirse, ikinci e-posta adresine uygulanır sve giriş biçimi eksikliğinden dolayı aşağıdaki komutlar başarısız olur.

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

Çevrimiçi deneyin!

Yerel kısım bölünmüş dönüşüm (son skomutu) bu nedenle uygulaması doğrudan giderek, sonunda yerleştirdi ve (diğerleri o zaman başarısız beri) eşleştiği varsayılır, bayt cinsinden, kontrol etmek çoğu pahalıdır.


1

Jöle , 43 bayt

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

Çevrimiçi deneyin!


Misiniz ŒtKyerine çalışmak Œu1¦€K3 kaydetmek için?
Jonathan Allan

... ve neye ihtiyaç var Œl?
Jonathan Allan

^ ah 1in.thehandbunun işe yaramayacağını görüyorum ŒtK.
Jonathan Allan

@JonathanAllan Evet, bu yüzden bunu kullanmadım ve ovs'un (şimdi silindi) cevabının geçersiz ( str.title) olmasının nedeni de bu .
Outgolfer Erik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.