जादू ईमेल परिवर्तन! या: एनएसए को अपने ईमेल पते से अपना मेटाडेटा निकालने में मदद करें


17

एक ईमेल पते को देखते हुए, उस ईमेल पते पर लागू रूपांतरण का परिणाम, और दूसरा ईमेल पता, दूसरे ईमेल पते पर लागू किए गए उसी परिवर्तन का आउटपुट लौटाता है।

ईमेल पते में निम्नलिखित संरचना होगी:

अल्फ़ान्यूमेरिक वर्ण और अधिकतम एक .(स्थानीय भाग) @युक्त सकारात्मक लंबाई की एक स्ट्रिंग, जिसके बाद एक प्रतीक होता है, उसके बाद पॉज़िटिव लंबाई की एक स्ट्रिंग होती है जिसमें अल्फ़ान्यूमेरिक सुम्बोल (डोमेन) होता है, जिसके बाद एक .प्रतीक होता है, और पॉज़िटिव लंबाई का एक अंतिम स्ट्रिंग होता है। अल्फ़ान्यूमेरिक वर्ण (TLD) युक्त।

चार अनुमत परिवर्तन हैं:

  • पहचान (कोई परिवर्तन नहीं)। ( 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तो मध्य में सिर्फ एक स्थान होना चाहिए [और आउटपुट के आरंभ और अंत में कोई संख्या], लेकिन यदि आप विभाजित होते हैं 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

सामान्य नियम और खामियां लागू होती हैं।


अंतिम परीक्षण मामला "घोड़ा" नहीं लौटाना चाहिए? मैं यह नहीं देखता कि इसके बजाय "सुअर" क्यों लौट सकता है।
आउटगॉल्फ

3
@EriktheOutgolfer क्योंकि 4 वां परिवर्तन सिर्फ डोमेन (बीच @और अंतिम भाग .) को वापस करना है। चूँकि स्थानीय भाग और डोमेन दोनों हैं chicken, यह अस्पष्ट है कि यह दूसरा या चौथा परिवर्तन है
LangeHaare

ओह, मैंने गलत व्याख्या की।
आउटगोल्फ

क्या हमें इस बात की आवश्यकता है कि संबंधित इनपुट को सभी मामलों में स्थान के साथ स्वरूपित किया गया है (उदाहरण के लिए परीक्षण में जहां आउटपुट A[अनुगामी स्थान के साथ] है कि दूसरा इनपुट Jones[एक अग्रणी स्थान के साथ] है?
जोनाथन एलन

मुझे समझ नहीं आता क्यों .jones@x.1, Jones, a.@3.zहै A- अगर jonesमिलान किया जाता है कि साधन मिलान हिस्सा पहली अवधि और @ प्रतीक के बीच हिस्सा है। लेकिन यह एक खाली स्ट्रिंग में परिणाम होगा क्योंकि aपहली अवधि से पहले है और बाद में नहीं।
जेरी यिर्मयाह

जवाबों:


4

जावा 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;}

-4 बाइट्स @LukeStevens की बदौलत

स्पष्टीकरण:

इसे यहाँ आज़माएँ।

(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, इसलिए धन्यवाद!
केविन क्रूज़सेन

3

हास्केल , 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]

इसे ऑनलाइन आज़माएं!

यह दुखद है कि मुझे रीइनवेंटिंग split( s) पर 59 बाइट्स खर्च करने पड़े ।

समाधान परिवर्तनों की एक सूची बनाता है और पहले एक को लौटाता है जो अपेक्षित परिणाम की ओर ले जाता है।


साइट पर आपका स्वागत है! मैं हास्केल को नहीं जानता, लेकिन क्या व्हॉट्सएप के किसी भी चरित्र को निकालना संभव है, जैसे कि नईलाइन और स्पेस?
caird coinheringaahing

अच्छा पहला जवाब! आप हास्केल में गोल्फ के लिए युक्तियों के हमारे संग्रह में रुचि ले सकते हैं , विशेष रूप से यह और यह कुछ बाइट्स को बचाना चाहिए।
लैकोनी

हमें मोनाड्स और मेन के साथ जुड़ने के लिए स्वतंत्र महसूस करें , गोल्फिंग के लिए एक चैट रूम और हास्केल की सामान्य चर्चा।
लैकोनी

3

जेली , 40 बाइट्स

अग्रकय करने के लिए धन्यवाद एरिक Outgolfer का उपयोग कर की विफलता देख के लिए Œtइसलिए (शीर्षक-मामले) और Œu1¦€KअधिकŒtK

-1 बाइट धन्यवाद एरिक Outgolfer (के पुनर्निर्माण ⁵⁸ç⁹¤Ŀके लिए çµ⁵⁸Ŀ)


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

एक पूर्ण कार्यक्रम लेने exampleEmail, exampleOutput, realEmailऔर परिणाम मुद्रण।

इसे ऑनलाइन आज़माएं!

कैसे?

सभी चार ट्रांसफ़ॉर्म करता है (एक पूर्ववर्ती एक), पहले वाले को पहले ईमेल से उदाहरण देता है, फिर उसे दूसरे ईमेल पर लागू करता है:

            - 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. इनपुट उदाहरण मानता है कि आउटपुट समान रूप से समान है।

  2. "अग्रदूत" (लिंक 3 का परिणाम) के मिलान के लिए परीक्षण किया गया है exampleOutput, लेकिन यह तब तक मेल नहीं खाएगा जब तक कि exampleOutputयह पात्रों की सूचियों की सूची न हो । जैसा कि इस तरह की व्याख्या करने की संभावना से बचने के लिए इस तरह के इनपुट को शायद उद्धृत किया जाना चाहिए (पायथन प्रारूपण का उपयोग यहां किया जा सकता है)।



2

पायथन 2 , 135 बाइट्स

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

इसे ऑनलाइन आज़माएं!


स्ट्रिप द्वारा -3 बाइट्स
अंडा

@ धन्यवाद, वैसे भी नियमों ने इसकी जरूरत को दूर करने के लिए बदल दिया
एरिक आउट द आउटफेलर

2

जावास्क्रिप्ट (ईएस 6), 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

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]=$argvलिए 7.1 से कम के संस्करणों को बदलना होगा list(,$p,$q,$r)=$argv


1

GNU sed , 105 + 1 (r फ्लैग) = 106 बाइट्स

क्रमशः पहचान , स्थानीय भाग और डोमेन परिवर्तन के sलिए पहले तीन आदेशों की जाँच करें । यदि एक परिवर्तन मेल खाता है, तो इसे दूसरे ईमेल पते पर लागू किया जाता है और इनपुट प्रारूप की कमी के कारण निम्न आदेश विफल हो जाएंगे।s

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

इसे ऑनलाइन आज़माएं!

स्थानीय हिस्सा विभाजन परिवर्तन (पिछले sआदेश) बाइट्स के मामले में, जांच करने के लिए सबसे महंगी है, इसलिए मैं अंत में यह रखा जाता है और माना जाता है कि यह मेल खाता है (के बाद से अन्य लोगों को उस समय तक विफल रहा है), अपने आवेदन तक जाया जा सकता।


1

जेली , 43 बाइट्स

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

इसे ऑनलाइन आज़माएं!


3 को बचाने के ŒtKस्थान पर काम करेगा Œu1¦€K?
जोनाथन एलन

... और इसकी क्या जरूरत है Œl?
जोनाथन एलन

^ आह मुझे लगता है कि 1in.thehandसाथ काम नहीं करेगा ŒtK
जोनाथन एलन

@JonathanAllan हां, यही कारण है कि मैंने इसका उपयोग नहीं किया, और यह भी कारण है कि ओव्स (अब हटाए गए) उत्तर अमान्य था ( str.title)।
आउटगॉल्फ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.