मध्य नाम के लिए कौन अल्पविराम रखता है?


18

आपकी चुनौती इनपुट की तरह एक नाम (स्ट्रिंग) लेना है

Albert Einstein

और उत्पादन:

Einstein, Albert

स्यूडोकोड:

set in to input
set arr to in split by " "
set last to the last element of arr
remove the last element of arr
set out to arr joined with " "
prepend ", " to out
prepend last to out
output out

अधिक परीक्षण के मामले:

John Fitzgerald Kennedy => Kennedy, John Fitzgerald
Abraham Lincoln => Lincoln, Abraham

नियम

  • इनपुट हमेशा रेगेक्स से मेल खाएगा ^([A-Z][a-z]+ )+([A-Z][a-z]+)$
  • आपको अजीब नामों को संभालने की ज़रूरत नहीं है , भले ही आउटपुट तकनीकी रूप से गलत हो, यहाँ ठीक है।
  • ट्रेलिंग व्हाट्सएप / न्यूलाइन ठीक है।
  • कोई सवाल? नीचे टिप्पणी करें!

अनुगामी रिक्त स्थान की अनुमति है?
मूल्य इंक

मैं शिकार के रूप में बंद कर दिया गया क्योंकि समाधान काफी siply जगह ले सकता है leके साथ ,है और आप इस सवाल है
Downgoat

2
@Downgoat चुनौती दो शब्दों को निर्दिष्ट करती है, जबकि इसके समाधान के लिए मनमाने ढंग से कई शब्दों के लिए काम करना पड़ता है। जहाँ तक मेरा बता सकते हैं, TIO लिंक के साथ जवाब में से, केवल गंभीरता से समाधान इस सवाल का प्रतिस्थापन के लिए सही जवाब देता है leके साथ ,
ngenisis

7
@Downgoat कि एक है -4। कम से कम उस एक को इस के एक ठग के रूप में बंद करें।
स्टीफन

1
रिक्त स्थान ठीक हैं?
टॉम कारपेंटर

जवाबों:


10

05AB1E , 7 बाइट्स

कोड:

',ì#Áðý

05AB1E एन्कोडिंग का उपयोग करता है । इसे ऑनलाइन आज़माएं!

स्पष्टीकरण:

',ì         # Prepend the input to ","
   #        # Split on spaces
    Á       # Rotate every element one position to the right (wrapping)
     ðý     # Join the array by spaces

1
प्रारंभ में लगा! मुझे पता था कि इसे लिस्टफॉर्म में करने का एक तरीका होना चाहिए।
एमिगा


8

रेटिना , 19 17 16 बाइट्स

संपादित करें: 3 बाइट को बचाने के लिए रिकर के लिए धन्यवाद

(.+) (.+)
$2, $1

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


1
पकड़, (.+)दोनों के लिए भी काम करता है।
R

मुझे समझ में नहीं आ रहा है कि आप \wपहली जगह का उपयोग क्यों कर रहे थे
Theonlygusti

1
@Theonlygusti मैं मैथेमेटिका में मेल खाने वाले पैटर्न से अधिक परिचित हूं, जो लालची के बजाय आलसी मिलान का उपयोग करता है।
नवजात शिशु

7

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

;”,Ḳṙ-K

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

मैं जेली को बहुत अच्छी तरह से नहीं जानता, लेकिन अन्य उत्तरों को पढ़कर ऐसा लगा कि उन्होंने एक इष्टतम एल्गोरिथ्म का उपयोग नहीं किया है ... इसलिए यहां यह है:

व्याख्या

;”,Ḳṙ-K
;”,        Append a comma to the end of the string
   Ḳ       Split on spaces
    ṙ-     Rotate the array by -1 (1 time towards the right)
      K    Join with spaces

7

विम, 10 बाइट्स / कीस्ट्रोक्स

v$F dA, <esc>p

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


अच्छा लगा, लेकिन मैंने इसे काम करने के लिए संघर्ष किया, <esc>आपके कोड में नहीं दिखा। उन अन्य लोगों के लिए जो प्रयास करना चाहते हैं: यह मानता है कि नाम संपादक में लिखा गया है और आप वर्तमान में सामान्य मोड में फ़ाइल की शुरुआत में हैं।
सिगवालमाड

7

वी / विम, 9 बाइट्स

$bD0Pa, 

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

एक बाइट को धन्यवाद दिया

ध्यान दें कि एक अनुगामी स्थान वर्ण है। एक अनुगामी स्थान छोड़ता है, जिसे नियमों के अनुसार अनुमति दी जाती है।

स्पष्टीकरण:

$       " move the cursor to the end of the line
 b      " move the cursor to the beginning of the current word
  D     " delete to the end of the line
   0    " move the cursor to the start of the line
    P   " paste in front of the cursor.
     a  " append (enter insert mode with the cursor one character forward)
      , " Literal text, ", "

अच्छा है! जरूरत से बचने के लिए अंत में इन्सर्ट मोड डालते हुए अच्छी सोच <esc>। आप $bDइसके बजाए एक बाइट बचा सकते हैं $diw। :)
DJMcMayhem

धन्यवाद। $bDहालांकि एक-चरित्र नामों को संभालना नहीं है, मैंने ओपी से पूछा है कि क्या इसकी अनुमति है।
केविन

ऐसा लगता है कि यह अपडेट हो रहा है।
केविन




5

सी, 45 बाइट्स

संपादित करें: मैंने अभी इनपुट के लिए संभवतः दो शब्दों से अधिक होने की आवश्यकता पर ध्यान दिया। मैं इसे इस रूप में बताता हूँ कि यह केवल दो शब्दों के लिए काम करता है।

संपादित करें: हटा दिया गया \n। यदि आवश्यक समझें तो 2 बाइट्स जोड़ें।

main(a,b)int**b;{printf("%s, %s",b[2],b[1]);}

साथ संकलन gcc name.c, जीसीसी 6.3.1। चेतावनियों को नजरअंदाज करें। उपयोग:

$./a.out Albert Einstein
Einstein, Albert

भाषा का दुरुपयोग:

  • अंतर्निहित वापसी प्रकार intके mainऔर कुछ भी नहीं लौटे।
  • की अवैध घोषणा printf। जीसीसी इसे वैसे भी शामिल करेगा।
  • गलत प्रकार का b। के साथ कोई फर्क नहीं पड़ता%s

main(a,b)int**b;इसके बजाय उपयोग करने के सुझावों के लिए @ Khaled.K को धन्यवाद main(int a, int **b)


अच्छा पहला गोल्फ, वेबसाइट पर आपका स्वागत है, main(a,**b){printf("%s, %s",b[2],b[1]);}40 बाइट्स भी हैं
खालिद.के

धन्यवाद :) मैंने वास्तव में प्रकारों को पूरी तरह से छोड़ने के बारे में सोचा था, लेकिन किसी कारण से यह संकलन नहीं होगा।
सिगवालमाड

1
यह काम करता हैmain(a,b)int**b;{printf("%s, %s\n",b[2],b[1]);}
खालिद। के


4

sed, 19 + 1 for -E = 20 बाइट्स

s/(.*) (.*)/\2, \1/

समूहन कोष्ठक से बचने के लिए -r (GNU) या -E (BSD, हाल के GNUs) का उपयोग करना चाहिए।

यदि कमांड-लाइन पर लिखा है, तो शेल द्वारा कई टोकन के रूप में पार्स किए जाने से बचने के लिए उद्धरणों में संलग्न होना चाहिए:

sed -E 's/(.*) (.*)/\2, \1/'

4

सी, 68 बाइट्स

आशा है कि किसी अन्य पोस्ट को जोड़ना गलत नहीं है, लेकिन यहां मेरे पहले पोस्ट किए गए सी समाधान की तुलना में थोड़ा अलग समाधान है। यह किसी भी संख्या के नामों को स्वीकार करता है।

main(a,b)int**b;{for(printf("%s,",b[--a]);--a;printf(" %s",*++b));}

gcc name.c(GCC 6.3.1) के साथ संकलित करें और चेतावनी को अनदेखा करें। उपयोग:

$./a.out John Fitzgerald Kennedy
Kennedy, John Fitzgerald

सुझावों के लिए @ Khaled.K को धन्यवाद main(a,b)int**b;

@Alkano के लिए पाश पर टिप के लिए धन्यवाद।


1
आप 2 बाइट्स प्राप्त कर सकते हैं, जबकि इसके बजाय का उपयोग करके main(a,b)int**b;{for(printf("%s,",b[--a]);++b,--a;printf(" %s",*b));}
अल्कानो

यह पागल लगता है, लेकिन आप ऐसा कर सकते हैं main(a,b)int**b;{a&&printf("%s,"b[a-1])&&main(a-1,b);}
खालिद .के

बहुत अच्छी ट्रिक्स :) मैंने कभी भी मुख्य रूप से कॉल करने के बारे में नहीं सोचा। लेकिन यह काफी काम नहीं करता है। यह आउटपुट था "कैनेडी, फिट्जगेराल्ड, जॉन। / a.out," एक आंशिक समाधान होगा main(a,b)int**b;{--a&&printf("%s, ",b[a])&&main(a,b);}। यह 2 बाइट्स छोटा है, और यह सुनिश्चित करता है कि आप प्रोग्राम का नाम प्रिंट नहीं करते हैं, लेकिन यह अभी भी प्रत्येक नाम के बीच अल्पविराम का उपयोग करता है।
सिगवालमाड

3

गणितज्ञ, 45 बाइट्स

#/.{a__,s=" ",b__}/;{b}~FreeQ~s->{b,",",s,a}&

नेगीसिस के जवाब पर कुछ बाइट्स बचाएएक स्ट्रिंग के बजाय वर्णों की एक सूची के रूप में इनपुट लेकर । शुद्ध फ़ंक्शन जो पैटर्न-प्रतिस्थापन नियम का उपयोग करता है।

गणितज्ञ, 49 बाइट्स

#~Join~{","," "}~RotateLeft~Last@Position[#," "]&

एक अन्य शुद्ध कार्य इनपुट के रूप में वर्णों की सूची ले रहा है और वर्णों की सूची लौटा रहा है। यह एक ","और " "इनपुट करता है और फिर अंतिम स्थान पर होने तक वर्णों की सूची को घुमाता है। (इस प्रकार उपरोक्त प्रथम कार्य के विपरीत आउटपुट में अनुगामी स्थान होता है।)


#/.{a__,s=" ",b:Except@s..}->{b,",",s,a}&है 4कम बाइट्स, लेकिन मुझे पता चला है कि Exceptस्ट्रिंग पैटर्न के लिए अनावश्यक है, बचत मुझे 12बाइट्स।
नवजात शिशु

आह, क्या यह स्वचालित रूप xसे आपके उत्तर में सबसे लंबा चुनता है ?
ग्रेग मार्टिन

हां, स्ट्रिंग पैटर्न मिलान लालची है लेकिन नियमित पैटर्न मिलान आलसी है।
नवजात शिशु

अच्छा <लहरें सफेद झंडा>
ग्रेग मार्टिन

3

सी #, 76 72 बाइट्स

s=>System.Text.RegularExpressions.Regex.Replace(s,"(.+) (.+)","$2, $1");

@ केविनक्रूजसेन की मदद से 4 बाइट्स बचाए

76 बाइट्स के लिए सब्सट्रिंग का उपयोग करने वाला पुराना संस्करण:

s=>s.Substring(s.LastIndexOf(' ')+1)+", "+s.Substring(0,s.LastIndexOf(' '));

1
बहुत बुरा System.Text.RegularExpressions.Regexतो लानत है C # में .. s=>new System.Text.RegularExpressions.Regex("(.+) (.+)").Replace(s,"$2, $1");बस एक बाइट ज्यादा है।
केविन क्रूज़सेन

1
पर यह सच है @KevinCruijssen लेकिन मैं स्थिर विधि का उपयोग कर सकते हैं Regex4 बाइट को बचाने के लिए
TheLethalCoder



2

05AB1E , 9 बाइट्स

#`',«.Áðý

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

व्याख्या

#           # split input on spaces
 `          # push each name separately to stack
  ',«       # concatenate a comma to the last name
     .Á     # rotate stack right
       ðý   # join stack by spaces

हाँ, मुझे संभवतः स्पेस कमांड से जुड़ना चाहिए: p
अदनान

@ अदनान: यह देखकर अच्छा लगेगा कि इसका इस्तेमाल कितनी बार होता है :)
एमिग्ना


2

PHP, 45 बाइट्स

<?=preg_filter("#(.*) (.+)#","$2, $1",$argn);

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


1
\pL+इसके बजाय क्यों .+?
केविन क्रूज़सेन

@ केविनक्रूजसेन आप सही हैं रेगेक्स का पहला भाग लालची है, इसलिए इसका उपयोग करने के लिए कोई फर्क नहीं पड़ता है .या\pL
जॉर्ग ह्यूल्सरमैन

2

MATLAB / ऑक्टेव , 37 बाइट्स

@(a)regexprep(a,'(.+) (.+)','$2, $1')

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

@Ngenisis के रेटिना उत्तर के आधार पर, हम ऑक्टेव और MATLAB दोनों में रेगेक्स गेम भी खेल सकते हैं, जो मेरे पिछले उत्तर के मुकाबले काफी कम है।


पुराना उत्तर:

मैं इस जवाब को यहाँ छोड़ने जा रहा हूँ और साथ ही यह विचार कर रहा हूँ कि यह एक साधारण रेगेक्स की तुलना में इसे करने का एक और अनूठा तरीका है।

ऑक्टेव , 49 47 बाइट्स

@(a)[a((b=find(a==32)(end))+1:end) ', ' a(1:b)]

पुराने यह ऑनलाइन की कोशिश करो!

आउटपुट उत्पन्न करने के लिए एक अनाम फ़ंक्शन।

मूल रूप से कोड पहली बार स्ट्रिंग में अंतिम स्थान का उपयोग करता है b=find(a==32)(end) । तब यह स्ट्रिंग (अंतरिक्ष के बाद) के अंतिम भाग का उपयोग करता है a(b+1:end), जहां bअंतिम स्थान खोजने का आउटपुट होता है। यह स्ट्रिंग की शुरुआत भी साथ लेता है a(1:b-1), और दोनों को एक साथ समेटता है', ' बीच में समेटता है।

मैं पहले से ही कुछ बाइट्स बनाम विशिष्ट सहेज लिया है find(a==32,1,'last') । निश्चित रूप से बचाने के लिए बहुत कुछ नहीं है।


2

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

ḲµṪ;⁾, ;K

समझाया गया, ईशः

ḲµṪ;⁾, ;K
Ḳ           # Split the input by spaces
 µ          # Separate the link into two chains. Essentially calls the right half with the split string monadically.
  Ṫ         # The last element, (The last name), modifying the array.
   ;        # Concatenated with...
    ⁾,      # The string literal; ", "
       ;    # Concatenated with...
        K   # The rest of the array, joined at spaces.

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

सभी परीक्षण मामलों पर प्रयास करें।


2

पायथन 3, 52 बाइट्स

lambda s:s.split()[-1]+", "+" ".join(s.split()[:-1])

बहुत सरल, गोल्फ की मदद का उपयोग कर सकता है। बस आखिरी शब्द सामने रखते हैं और उन्हें "," के साथ जोड़ते हैं।

परीक्षण का मामला:

>>> f=lambda s:s.split()[-1]+", "+" ".join(s.split()[:-1])
>>> f("Monty Python")
'Python, Monty'
>>> f("Albus Percival Wulfric Brian Dumbledore")
'Dumbledore, Albus Percival Wulfric Brian'


2

जावा, 110 62 बाइट्स

String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}

गैर स्थैतिक विधि।

-48 बाइट्स केविन क्रूज़सेन को धन्यवाद


String c(String s){int i=s.lastIndexOf(' ');return s.substring(i+1)+", "+s.substring(0,i);}छोटा है ( 91 बाइट्स )।
केविन क्रूज़सेन

और String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}इससे भी कम ( 62 बाइट्स ) है।
केविन क्रूज़सेन

@ केविनक्रूजसेन ओह गीज़ नाइस। धन्यवाद! मुझे रेगेक्स का बेहतर इस्तेमाल करना सीखना चाहिए: पी
हाइपरन्यूट्रीनो

2

PHP , 62 59 बाइट्स

-3 बाइट्स, धन्यवाद जॉर्ग

$a=explode(' ',$argn);echo array_pop($a).', '.join(' ',$a);

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

पुराना घोल, 63 बाइट्स

काम नहीं करता है अगर व्यक्ति के 3 दोहराए जाने वाले नाम हैं।

<?=($a=strrchr($argv[1]," ")).", ".str_replace($a,'',$argv[1]);

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


आप के $argnबजाय का उपयोग कर सकते हैं$argv[1]
Jörg Hülsermann

2

एक्सेल, 174 170 168 बाइट्स

सहेजे गए 2 बाइट्स Wernisch के लिए धन्यवाद

=MID(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+1,LEN(A1))&", "&LEFT(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))

यह फैंसी या चतुर नहीं है। यह काफी बुनियादी तरीका है। ऐसा लगता है कि सरणी सूत्रों के साथ एक छोटा रास्ता होना चाहिए, लेकिन मुझे वह नहीं मिल रहा है जो काम करता है।


समाधान केवल उन मामलों के लिए काम करता है जहां तीन नाम हैं। उदाहरण के लिए "अल्बर्ट आइंस्टीन" को संभालता नहीं है।
वार्निश

@Wernisch धन्यवाद! यह अब काम करना चाहिए।
इंजीनियर टोस्ट

प्रश्न के अनुसार अनुगामी व्हाट्सएप की अनुमति है। सोचें कि आप -1LEFT फ़ंक्शन में बाहर जाकर 2 बाइट्स बचा सकते हैं ।
वेर्निस्क



1

गामा, 23 वर्ण

* =@append{s; *}
\Z=,$s

यहाँ केवल उल्लेखनीय बात यह है कि कैसे चुनौती ने गीमा पैटर्न की कमजोरी को गैर-लालच में मारा।

नमूना रन:

bash-4.4$ echo -n 'John Fitzgerald Kennedy' | gema '* =@append{s; *};\Z=,$s'
Kennedy, John Fitzgerald
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.