魔法のメール変換!または:NSAが電子メールアドレスからメタデータを抽出するのを支援します


17

電子メールアドレス、その電子メールアドレスに適用された変換の結果、および2番目の電子メールアドレスを指定すると、2番目の電子メールアドレスに適用された同じ変換の出力が返されます。

メールアドレスはすべて次の構造になります。

英数字と最大1文字.(ローカル部分)@を含む正の長さの文字列と、それに続く記号、英数字の集計(ドメイン)を含む正の長さの文字列、それに続く.記号、および正の長さの最終文字列英数字(TLD)を含む。

許可される変換は4つあります。

  • アイデンティティ(変更なし)。(a.b@c.d -> a.b@c.d
  • ローカル部分(の前のすべて@)を変更せずに返します(a.b@c.d -> a.b)。
  • .存在する場合に分割されたローカル部分を返し、各半分の最初のシンボルを大文字にします。(a.b@c.d -> A B)。
  • 変更されていないドメイン(@との間のすべて)のみを返します.。(a.b@c.d -> c)。

複数の変換が可能な場合、任意の可能性の出力を提供できます。出力の開始と終了の空白は重要ではありませんが、真ん中は関係します(つまり、分割a.bする場合A B、真ん中に1つだけのスペースが必要です(および出力の開始と終了の任意の数)が、分割する場合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

通常のルールと抜け穴が適用されます。


最後のテストケースは「horse」を返すべきではありませんか?代わりに「豚」を返すことができる理由がわかりません。
エリックアウトゴルファー

3
@EriktheOutgolfer 4変換がちょうどドメイン(一部の間に返すことであるため@、最終の.)。ローカル部分とドメインが両方chickenであるため、それが2番目の変換であるか4番目の変換であるかはあいまい
です-LangeHaare

ああ、私はそれを誤解しました。
エリックアウトゴルファー

関連する入力は、すべての場合にスペースでフォーマットする必要がありますか(たとえば、出力がA[後続スペース]で、2番目の入力が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;}

@LukeStevensのおかげで-4バイト。

説明:

ここで試してみてください。

(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
(p.charAt(0)+"").toUpperCase()代わりにを使用して、4バイトをノックオフできますCharacter.toUpperCase(p.charAt(0))
ルークスティーブンス

@LukeStevensありがとう!(char)(p.charAt(0)&~32)最初は持っていましたが、1in Thehandテストケースのためにこれはうまくいきませんでした。しかし、文字列としてそれを大文字にすることは、実際にはより短いのでCharacter.toUpperCase、ありがとう!
ケビンCruijssen

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]

オンラインでお試しください!

再発明splits)に59バイトを費やす必要があったのは残念です。

ソリューションは、変換のリストを作成し、期待される結果につながる最初の変換を返します。


サイトへようこそ!Haskellを知りませんが、改行やスペースなどの空白文字を削除することはできますか?
コイナーリンガーアーイング

素敵な最初の答え!あなたは私たちのコレクションに興味があるかもしれませんHaskellでゴルフをするためのヒント特に、これこれは、いくつかのバイトを保存する必要があります。
ライコニ

Of Monads and Menにも気軽に参加してください。ゴルフのためのチャットルームとHaskellの一般的なディスカッションです。
ライコニ

3

ゼリー、40 バイト

(タイトルケース)の使用の失敗に気づいてくれたErik the Outgolferに先制的に感謝します。ŒtŒu1¦€KŒtK

Erik the Outgolferの -1バイト(⁵⁸ç⁹¤Ŀtoの再配置çµ⁵⁸Ŀ


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

フル取っプログラムexampleEmailexampleOutputrealEmailその結果を印刷します。

オンラインでお試しください!

どうやって?

4つの変換すべて(および先行変換)を実行し、最初の電子メールから例を生成する最初の変換を見つけて、2番目の電子メールに適用します。

            - 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. 入力exampleOutputが出力とまったく同じであると仮定します。

  2. "precursor"(リンク3の結果)は、の一致についてテストされますがexampleOutputexampleOutputそれ自体が文字のリストのリストでない限り一致しません。そのため、入力を引用する必要があります(ここでは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)=$argv4バイト追加する必要があります。


1

GNU sed、105 + 1(rフラグ)= 106バイト

最初の3つのsコマンドは、それぞれidentitylocal部分、およびdomain変換を確認します。1つの変換が一致すると、2番目の電子メールアドレスに適用され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¦€K3を保存しますか?
ジョナサンアラン

...そして何が必要ですŒlか?
ジョナサンアラン

^ああ、私はそれ1in.thehandがうまくいかないと思うŒtK
ジョナサンアラン

@JonathanAllanうん、それが私がそれを使わなかった理由であり、またovsの(現在削除された)答えが無効だった理由(str.title)です。
エリックアウトゴルファー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.