एक सूची से एक ऑक्सफोर्ड अल्पविराम के साथ एक एकल स्ट्रिंग उत्पन्न करना


24

क्या कुछ चतुर (संक्षिप्त और मुहावरेदार) तार की एक सूची लेने के लिए और प्रत्येक तत्व उद्धृत के साथ सूची से निर्मित एक ठीक से छिद्रित स्ट्रिंग वापस करने के लिए दृष्टिकोण हैं।

यह ग्रूवी के साथ प्रयोग करते समय मेरे लिए आया था , जिसके लिए मेरा बहुत शाब्दिक, लेकिन चित्रण समाधान है

def temp = things.collect({"\'${it}\'"})
switch (things.size()) {
    case 1:
        result = temp[0]
        break
    case 2:
        result = temp.join(" and ")
        break
    default:
        result = temp.take(temp.size()-1).join(", ") + ", and " + temp[-1]
        break
}

है यही कारण है, ['1']उपज चाहिए '1', ['1','2']उपज चाहिए '1 and 2', [देखना मैं वहाँ? क्या किया] और ['1','2','3']उपज चाहिए '1, 2, and 3'

मेरे पास ग्रूवी के लिए कुछ अच्छे उत्तर हैं, लेकिन मैं यह देखना चाहता हूं कि अन्य भाषाएं क्या कर सकती हैं।

विभिन्न भाषाओं में कुछ कॉम्पैक्ट चतुर दृष्टिकोण क्या हैं जो उन भाषाओं की विशेषताओं और मुहावरों का लाभ उठाते हैं?


6
PPCG में आपका स्वागत है। आमतौर पर यहां पोस्ट किए गए सवाल समुदाय के लिए चुनौतियां हैं। जैसे कि उन्हें वस्तुनिष्ठ मानदंड की आवश्यकता है। मेरा मानना ​​है कि कोड-गोल्फ चुनौती होने के कारण यह प्रश्न काफी हद तक ठीक है । क्या आप इसे ऐसे टैग कर सकते हैं? यदि हां, तो मुझे लगता है कि आपको इनपुट और आउटपुट विनिर्देशों को थोड़ा कसना चाहिए।
डिजिटल ट्रॉमा

7
यह वास्तविक वाक्यों के साथ अधिक दिलचस्प होगा :['we invited the stripper','JFK','Stalin']
ThisSuitIsBlackNot

1
क्या हम मान सकते हैं कि स्ट्रिंग्स में पहले से ही कॉमा नहीं हैं?
मार्टिन एंडर

2
चुनौती का शीर्षक होना चाहिए था "एक ऑक्सफोर्ड कॉमा के बारे में ---- कौन देता है ?"
Igby Largeman

3
@OldCurmudgeon मुझे लगता है कि आपका मतलब "अमेरिकनकृत बकवास" है;)
ThisSuitIsBlackNot

जवाबों:


76

सीएसएस, 132 116 115 बाइट्स

a:not(:last-child):nth-child(n+2):after,a:nth-last-child(n+3):after{content:","}a+:last-child:before{content:"and "

सीएसएस को अक्सर गोल्फ में नहीं देखा जाता है क्योंकि यह केवल पाठ को प्रारूपित कर सकता है, लेकिन यह वास्तव में इस चुनौती के लिए काम करता है और मुझे लगा कि ऐसा करना मजेदार होगा। ऊपर स्निपेट का उपयोग करके इसे क्रिया में देखें ("कोड स्निपेट दिखाएं" पर क्लिक करें)।

सूची एक लिंक की गई HTML फ़ाइल में होनी चाहिए जो <a>टैग से घिरे प्रत्येक तत्व के साथ हो और लाइन ब्रेक द्वारा अलग हो। सूची आइटम अपने मूल तत्व में केवल तत्व होने चाहिए, उदाहरण के लिए

<a>one</a>
<a>two</a>
<a>three</a>

व्याख्या

a:not(:last-child):nth-child(n+2)::after,
a:nth-last-child(n+3)::after {
    content: ",";
}

a + :last-child::before {
    content: "and ";
}

आइए ऊपर दिए गए ungolfed संस्करण पर विचार करें। यदि आप परिचित नहीं हैं कि CSS कैसे काम करता है, तो घुंघराले ब्रेस के बाहर सब कुछ एक चयनकर्ता है जो HTML तत्वों के सेट को निर्धारित करता है जिसमें ब्रेसिज़ के अंदर घोषणाएं लागू होती हैं। प्रत्येक चयनकर्ता-घोषणा जोड़ी को एक नियम कहा जाता है । (यह उससे अधिक जटिल है लेकिन इस स्पष्टीकरण के लिए पर्याप्त होगा।) किसी भी स्टाइल को लागू करने से पहले, सूची केवल रिक्त स्थान द्वारा अलग दिखाई देती है।

हम हर शब्द के बाद अल्पविराम जोड़ना चाहते हैं, सिवाय दो-शब्द सूचियों के, जिन्हें कोई अल्पविराम नहीं मिलता है। पहला चयनकर्ता, a:not(:last-child):nth-child(n+2):afterपहले और अंतिम को छोड़कर सभी तत्वों का चयन करता है। :nth-child(n+2)कहने का एक छोटा तरीका है :not(:first-child), और यह मूल रूप से उन तत्वों का चयन करके काम करता है जिनके सूचकांक (1 से शुरू) 2 से अधिक या बराबर है। (हाँ, यह अभी भी मुझे थोड़ा भ्रमित करता है। एमडीएन डॉक्स मदद कर सकता है।)

अब हमें केवल अल्पविराम प्राप्त करने के लिए पहले तत्व का चयन करने की आवश्यकता है यदि कुल तीन या अधिक तत्व हैं। a:nth-last-child(n+3):afterकाम करता है :nth-child, लेकिन पीछे से गिनती करता है , इसलिए यह अंतिम दो को छोड़कर सभी तत्वों का चयन करता है। अल्पविराम दो सेटों का संघ लेता है, और हम प्रत्येक चयनित तत्व के तुरंत बाद जोड़ने के लिए :after छद्म तत्व का उपयोग करते हैं content

दूसरा नियम आसान है। हमें सूची में अंतिम तत्व से पहले "और" जोड़ने की आवश्यकता है, जब तक कि यह एक एकल तत्व न हो। दूसरे शब्दों में, हमें अंतिम तत्व का चयन करने की आवश्यकता है जो किसी अन्य तत्व से पहले है। +है आसन्न भाई चयनकर्ता सीएसएस में।


1
प्रतिभाशाली! मुझे यह पसंद है। : D
COTO

यदि केवल आप उपयोग करेंगे <li>
स्लीवेटमैन

1
<li>आदर्श होगा, लेकिन इससे चयनकर्ताओं को दो अतिरिक्त चरित्र मिलेंगे। मैंने चुना <a>क्योंकि यह एक अक्षर है और इसका अपना स्वरूपण लागू नहीं होता है।
निंजाबियरनॉकी

वाह ... यह बहुत प्रभावशाली है। चतुराई पुरस्कार।

शीर्ष उत्तर के रूप में सीएसएस? अच्छा लगा।
ब्रैंडन

13

हास्केल: 81, 77 74 वर्ण

f[x]=x
f[x,y]=x++" and "++y
f[x,y,z]=x++", "++f[y++",",z]
f(x:y)=x++", "++f y

हास्केल विशेषताएं: पैटर्न मिलान


आप कुछ स्थानों को हटा सकते हैं
रे

1
आप बस निकाल सकते हैंf[x,y,z]
Seequ

और अब, यह बहुत मानक पुनरावृत्ति है। :)
१qu

आप ऑक्सफ़ोर्ड कॉमा और रिक्त स्थान को कॉमा के बाद भूल गए - f["a","b","c"]माना जाता है "a, b, and c"लेकिन यह है"a,b and c"
गर्व हैकर सेप

4
कैसे बदल कर गोल्फ के बारे में y++", and "++zद्वारा f[y++",",z]:)
गर्व haskeller

7

रूबी, 47 बाइट्स

q=" and ";p$*[2]?(a=$*.pop;$**", "+?,+q+a):$**q

व्याख्या

  • इनपुट कमांड लाइन तर्क हैं ($* )।
  • जब $*एक तीसरा तत्व होता है ( $*[2]शून्य नहीं लौटता है), सभी तत्वों को पिछले एक पर ले जाएं और उन्हें अल्पविराम से अलग करें और उपयोग करते हुए अलग करेंArray#* । अंत में एक अतिरिक्त अल्पविराम, स्ट्रिंग " and "और अंतिम कमांड लाइन तर्क जोड़ें।
  • जब $*कोई तीसरा तत्व नहीं है, तो दो, एक, या शून्य तर्क दिए गए थे। तर्क तार के साथ सुरक्षित रूप से जुड़ सकते हैं " and "और सही परिणाम उत्पन्न कर सकते हैं।

6

पायथन 2 (61)

s=input()
d=s.pop()
print", ".join(s)+", and "[8-7*len(s):]+d

मुख्य चाल ", and "एक और दो तत्वों के लिए अंतिम योजक के हिस्से को काट देना है । एक के लिए, यह सब काट दिया जाता है, और दो के लिए, अल्पविराम हटा दिया जाता है। यह बाहर टुकड़ा करने की क्रिया द्वारा किया जाता है [8-7*len(s):](ध्यान दें कि sएक के बाद एक छोटा pop)।

दुर्भाग्य से, dइसे केवल अपनी अभिव्यक्ति के साथ प्रतिस्थापित नहीं किया जा सकता है या popबहुत देर हो जाएगी।


आप पहली बार बदल सकते sके साथ s=input()और, पहली पंक्ति को दूर अगर मैं गलत नहीं हूँ। 2 चरस बचाता है।
tomsmeding

@tomsmeding मुझे समझ नहीं आ रहा है कि आप क्या सुझाव दे रहे हैं। कोड sकई बार संदर्भित कर रहा है।
xnor

रुको, मैं आज सुबह अजीब सामान करता हूं। उसे भूल जाओ। :)
tomsmeding

6

सीएसएस, 62 चरस 112 चार

अन्य प्रविष्टियों से प्रेरित, और भी कम। ध्यान दें कि इसके लिए आवश्यक है कि ए तत्वों को सफेद स्थानों द्वारा अलग न किया जाए:

a+a:before{content:", "}a+a:last-child:before{content:", and "

http://jsfiddle.net/olvlvl/1Ls79ocb/

डेनिस द्वारा बताए अनुसार, "एक और दो" के लिए ठीक करें:

a+a:before{content:", "}a+a:last-child:before{content:", and "}a:first-child+a:last-child:before{content:" and "

http://jsfiddle.net/olvlvl/1Ls79ocb/3/


5

पर्ल (v 5.10+) - 37 35 34 28

@F>2&&s/ /, /g;s/.* \K/and /

के साथ चलाया जा करने के लिए perl -ape, सूची के साथ आपूर्ति की गई जगह अलग हो गई STDIN

विभिन्न इनपुट के लिए आउटपुट:

$ perl -ape '@F>2&&s/ /, /g;s/.* \K/and /'
oxford
oxford
oxford cambridge
oxford and cambridge
oxford cambridge comma
oxford, cambridge, and comma
oxford cambridge comma space
oxford, cambridge, comma, and space

अपने अंतिम प्रतिस्थापन को बदलकर आप इसे 3 बाइट्स तक कम कर सकते हैंs/(\S+)$/and $1/
ThisSuitIsBlackNot

1
@ThisSuitIsBlackNot आप '\ n' (धन्यवाद) छोड़ सकते हैं, लेकिन आप रिक्त स्थान नहीं छोड़ सकते, या "x" का इनपुट बन जाता है "और x"
abligh

उफ़, अधिक इनपुट के साथ परीक्षण करना चाहिए था। वैसे भी, आप $अपने संपादन में लंगर को भूल गए हैं , इसलिए इनपुट foo bar bazबन जाता है foo, and bar, baz। इसके अलावा, आप ऐसा करके किसी एक स्थान को हटा सकते हैंs/( \S+)$/ and$1/
ThisSuitIsBlackNot

मेरे पिछले टिप्पणी अभी भी 35 की उम्र में आप छोड़ देता है, लेकिन आप लिख सकते हैं $#F>1के रूप में @F>2एक और बंद दाढ़ी बनाने के लिए। सूक्ष्म सुधार के लिए सभी सुझावों के लिए क्षमा करें, मुझे वास्तव में यह उत्तर पसंद है :)
ThisSuitIsBlackNot

@ThisSuitIsBlackNot बिल्कुल नहीं - microedits का स्वागत है। मैं सीजेएम के 28 बाइट्स और गोल्फस्क्रिप्ट के 30 बाइट्स के साथ चुपके से प्रतिस्पर्धा कर रहा हूं। हालाँकि मुझे आपकी टिप्पणी का अनुवाद किए बिना 34 तक पहुँच गया था (अंतिम के साथ परीक्षण किया गया था echo -n ... | wc -c)। यदि आप (\S+)33 वर्णों को प्राप्त करने से पहले स्थान को याद करते हैं , लेकिन यदि आप डालते हैं तो आपको दो स्थान test thisमिलेंगे ), इसलिए बिना अधिक मुझे लगता है कि यह गलत है।test and thistest
abligh

4

जावास्क्रिप्ट (63)

l=a.length;l>2&&(a[l-1]='and '+a[l-1]);a.join(l>2?', ':' and ')

मामले:

  • a = [1] => 1
  • a = [1, 2] => 1 and 2
  • a = [1, 2, 3] => 1, 2, and 3

कैविएट: यह लंबाई> 2 के साथ एक सरणी में अंतिम तत्व को संशोधित करेगा।


2
का अच्छा उपयोग&&
क्रिस ब्लूम

4

GNU सेड - -rध्वज के लिए 1 सहित 69 वर्ण

s/ /, /g
s/( [^ ]+)( [^ ]+)$/\1 and\2/
s/^([^,]+),([^,]+)$/\1 and\2/

एक अंतरिक्ष-पृथक सूची लेता है (शेल स्क्रिप्ट के लिए काफी मुहावरेदार)।

उदाहरण

$ sed -r -f oxfordcomma.sed <<< "1"
1
$ sed -r -f oxfordcomma.sed <<< "1 2"
1 and 2
$ sed -r -f oxfordcomma.sed <<< "1 2 3"
1, 2, and 3
$

हाँ, चलो कोड-गोल्फ के साथ चलते हैं ।
अयोम

दूसरा आउटपुट 1 and 2इसके बजाय होना चाहिए1, 2
अनुकूलक

@ ऑप्टिमाइज़र - काफी सही। फिक्स्ड।
डिजिटल ट्रॉमा

3

पायथन 2 - 71, 70 68

s=input()
l=len(s)-1
print', '.join(s[:l])+', and '[l<2:]*(l>0)+s[l]

चरित्र की गिनती दोनों सहित, inputऔर print


3

रूबी, 57 बाइट्स

f=->l{s=l*', ';s.sub(/,(?!.*,)/,(l.size<3?'':?,)+' and')}

मैं स्ट्रिंग के साथ जुड़ रहा हूं ,और फिर मैं स्ट्रिंग में अंतिम कॉमा की जगह ले रहा हूं and(और सूची लंबाई के आधार पर वैकल्पिक कॉमा)।


3

कोबरा - 60

do(l as String[])=l.join(', ',if(l.length<3,'',',')+' and ')

कोबरा का List<of T>.joinकार्य आपको सूची के अंतिम दो तत्वों के लिए एक अलग विभाजक निर्दिष्ट करने देता है, जो कि इसे इतना छोटा बनाता है।


3

पर्ल - 59

sub f{$a=join', ',@_;$#_&&substr$a,(@_>2)-3,@_<3,' and';$a}

सूची को अल्पविराम से जोड़ता है, तो यदि सूची में एक से अधिक तत्व हैं, या तो ' and'अंतिम अल्पविराम (यदि लंबाई> = 3) के बाद जोड़ता है , या अंतिम अल्पविराम को इसके साथ प्रतिस्थापित करता है (यदि लंबाई == 2)।


3

PHP, 192 167 146 136 अक्षर:

$n=' and ';$s=count($a);echo ($s<3)?join($n,$a):join(', ',array_merge(array_slice($a,0,$s-2),Array(join(",$n",array_slice($a,-2,2)))));

Http://www.christopherbloom.com/2011/05/21/join-implode-an-array-of-string-values-with-formatting/ पर वर्षों पहले लिखे एक समारोह के आधार पर


क्या आप उत्तर पाठ में अपना कोड (ऑक्सफोर्ड कॉमा के साथ) डाल सकते हैं?

हाँ क्षमा करें। मैं अपने फोन पर था और यह कोड को ठीक से पेस्ट नहीं करेगा। मैं अपने डेस्कटॉप
क्रिस ब्लूम

@ Chrisbloom7 भले ही जोड़ने के लिए तुच्छ हो, लेकिन जवाब में एक काम करने वाला कोड शामिल होना चाहिए, न कि एक जिसे एक बनाया जा सकता है। यह भी, क्योंकि उद्देश्य कोड को जितना संभव हो उतना छोटा बनाना है, कार्य कोड को पोस्ट नहीं करना आपके स्कोर को गैर मौजूदा बनाता है।
गर्वित हेकेलर

क्षमा याचना। सीजी में पहली बार पोस्टर। मैंने अपना जवाब तय कर दिया है
क्रिस ब्लूम

3

बैच - 151 बाइट्स

@echo off&set f=for %%a in (%~1)do
%f% set/aa+=1
%f% set/ac+=1&if !c!==1 (set o=%%a)else if !c!==!a! (set o=!o!, and %%a)else set o=!o!, %%a
echo !o!

ध्यान दें; आपको स्क्रिप्ट cmdको /vस्विच सेट से कॉल करना होगा on, ऐसा इसलिए है क्योंकि मुझे setLocal enableDelayedExpansionस्क्रिप्ट में लंबा शामिल नहीं करना है । अन्यथा बाइट संख्या में 30 जोड़ें, और स्क्रिप्ट को सामान्य रूप से कॉल करें।

h:\uprof>cmd /von /c test.bat "1 2 3"
1, 2, and 3

h:\uprof>cmd /von /c test.bat "1 2 3 4 5"
1, 2, 3, 4, and 5

3

ग्रूवी, 47 43 57 वर्ण, जावास्क्रिप्ट ES6 56 वर्ण

ग्रूवी:

(a[1]?a[0..-2].join(", ")+(a[2]?",":"")+" and ":"")+a[-1]

के बाद से सरणी पात्रों से भर जाता है, हम जगह ले सकता है a.size>1द्वाराa[1]

जावास्क्रिप्ट, ईएस 6:

a.join(', ').replace(/,([^,]+)$/,`${a[2]?',':''} and$1`)

दोनों ही मामलों में मान लिया गया है कि चर में विचाराधीन सरणी है।


6
संधि से पहले ऑक्सफोर्ड कॉमा कॉमा है
डेनिस

3

पीएचपी, 86 84 चार्ट

$a = ['one', 'two', 'three', 'four', 'five'];

आरंभीकृत सरणी के साथ, हम गिनना शुरू करते हैं:

$L=count($a)-1;$S=', ';$L<2?($S=' and '):($a[$L]='and '.$a[$L]);echo implode($S,$a);

prettified:

$last_index = count($a) - 1;
$separator = ', ';
if ($last_index < 2) {
    $separator = ' and ';
} else {
    $a[$last_index] = 'and '.$a[$last_index];
}
echo implode($separator, $a);

सूची में अंतिम आइटम को संशोधित किया गया है। यह ठीक होना चाहिए क्योंकि PHP में, अरै असाइनमेंट और फंक्शन कॉल कॉपी करते हैं।


3

CJam, 35 30 28 27 बाइट्स

q~)\_"and "L?@+a+_,2=", ">*

यह एक प्रोग्राम है जो STDIN से पढ़ता है और STDOUT को प्रिंट करता है। इसे ऑनलाइन आज़माएं।

यह काम किस प्रकार करता है

q~                                     " Q := eval(input())                               ";
  )                                    " P := Q.pop()                                     ";
   \_"and "L?@+                        " P := (Q ? 'and ' : '') + P                       ";
                a+                     " Q += [P]                                         ";
                  _,2=", ">            " J := ', '[(len(Q) == 2):]                        ";
                           *           " R := J.join(Q)                                   ";
                                       " print R (implicit)                               ";

उदाहरण चलाते हैं

$ cjam <(echo 'q~)\_"and "L?@+a+_,2=", ">*') <<< '["1"]'; echo
1
$ cjam <(echo 'q~)\_"and "L?@+a+_,2=", ">*') <<< '["1""2"]'; echo
1 and 2
$ cjam <(echo 'q~)\_"and "L?@+a+_,2=", ">*') <<< '["1""2""3"]'; echo
1, 2, and 3
$ cjam <(echo 'q~)\_"and "L?@+a+_,2=", ">*') <<< '["1""2""3""4"]'; echo
1, 2, 3, and 4

मैं आपकी पूंछ पर हूँ - नीचे देखें :-)
abligh

3

Google शीट, 67 68 67 92 बाइट्स

=SUBSTITUTE(JOIN(", ",FILTER(A:A,A:A<>"")),",",IF(COUNTA(A:A)>2,",","")&" and",COUNTA(A:A)-1

इनपुट सेल में शुरू होता है A1और हालांकि कई प्रविष्टियाँ मौजूद रहती हैं।
JOINप्रत्येक के बीच अल्पविराम के साथ उन सभी को एक स्ट्रिंग में विलय कर देता है।
FILTERकिसी भी गैर-रिक्तियाँ को निकालता है ताकि आप अंत में अनंत कॉमा के साथ समाप्त न हों।
SUBSTITUTEअंतिम अल्पविराम की जगह लेता है ( COUNTAगैर-रिक्त आदानों की गिनती करके पाया जाता है)।

यह बहुत रोमांचक नहीं है, लेकिन यह एक सेल में उल्लेखनीय है।


यह ऑक्सफोर्ड कॉमा को छोड़ देता है।
अम्ब्रेला

@Umbrella खैर, कि मुझे बेवकूफ था, है ना? +1 बाइट्स
इंजीनियर टोस्ट

आप )-1 बाइट के लिए इस फॉर्मूला के टर्मिनल को छोड़ सकते हैं ; अच्छी तरह से खतरे, कि मैंने अब तक +1 देखा है
टेलर स्कॉट

यह परीक्षण करने के बाद दो नोट - A:A>""इसे में परिवर्तित किया जाना चाहिए A:A<>""और यह केवल 2 वस्तुओं के मामलों में ऑक्सफोर्ड कॉमा को छोड़ने पर लागू नहीं होता है
टेलर स्कॉट

@TaylorScott मुझे लगता है कि मैंने केवल पाठ के साथ परीक्षण किया और इस मुद्दे को याद किया >""। Quickie सुधार मैंने पहले स्पष्ट रूप से परीक्षण नहीं किया था। मुझे वह दिशा पसंद नहीं है जो चली गई ...
इंजीनियर टोस्ट

2

जावास्क्रिप्ट (ईएस 6) 60

इनपुट सरणी में कोई खाली स्ट्रिंग नहीं मानते

f=(a,b=a.pop())=>a[0]?a.join(', ')+(a[1]?',':'')+' and '+b:b

फायरफॉक्स / फायरबग कंसोल में टेस्ट

console.log(f(['We invited the stripper','JFK','Stalin']))

उत्पादन

 We invited the stripper, JFK, and Stalin

How do I run this? I tried it in node --harmony with an array of strings var a = 'abcdefgh'.split('');, but it just sits there with a ... and appears to do nothing. Also +1 for using unique ES6 feature ()=>.
Adrian

@Adrian the function returns a string, without any output. I'll add a test in the answer.
edc65

I think f=(a,b=a.pop())=>a[0]?a.join(', ')+', and '+b:b is also correct and 13 bytes shorter.
Ingo Bürk

1
@IngoBürk that cuts the part that handles the comma having 2 items. Guess what? With 2 items the output is wrong.
edc65

@ edc65 आह, डीओएच। बुरा हो सकता है।
इंगो बुर्क

2

जावास्क्रिप्ट - 60 56 71 67 63

बिल्कुल एक मुहावरेदार दृष्टिकोण नहीं है, लेकिन मुझे इसे लिखने में मज़ा आया और मुझे रेगेक्स पसंद है।

मान लिया जाता है कि सरणी में संग्रहीत है var a:

a.join((a.length>2?',':'')+' ').replace(/([^,\s])$/,"and $1")

केवल इंडेक्स के लिए जाँच करके छोटा किया गया [2]: (बूलियन बलात्कार)

a.join((!!a[2]?',':'')+' ').replace(/([^,\s])$/,'and $1')

जाहिरा तौर पर मैं परीक्षण में चूसता हूं और एकल-प्रवेश परीक्षण को छोड़ देता हूं। यहाँ निश्चित संस्करण है:

a.join((!!a[2]?',':'')+' ').replace(/([^,\s])$/,(!!a[1]?'and ':'')+'$1')

मेरे बूलियनों को झुकाकर 2 चरों का शेव किया और 3 स्थान को पहले टर्नरी के तत्कालीन / और में स्थान से स्थानांतरित करके:

a.join((!a[2]?' ':', ')).replace(/([^,\s])$/,(!a[1]?'':'and ')+'$1')

@Tomsmeding के लिए धन्यवाद मुझे याद दिलाने के लिए कि मुझे अपने बूलियंस के साथ ज़बरदस्ती नहीं करनी है क्योंकि JS मेरे लिए ऐसा करता है। मुझे यह भी एहसास हुआ कि मैं पहले टर्नरी को अलग करने वाले कोष्ठक को अंदर से बाहर निकालना भूल गया join():

a.join(a[2]?', ':' ').replace(/([^,\s])$/,(a[1]?'and ':'')+'$1')

क्या मैंने सही किया? अप्रचलित नई गोल्फर माफी।


1
लंबी पैदल यात्रा रेगेक्स को मसोचवाद के रूप में जाना जाता है।
seequ

वास्तव में आपको इसकी बिल्कुल आवश्यकता नहीं थी !!; a[2]?A:Bपहले से ही काम करता है। हो सकता है कि आपके मलद्वार फिर से पलटे ।
टॉस

@tomsmeding -- you are correct. I am always wary of JavaScript's default boolean coercion behaviour, so I have the borne-in habit of manually coercing my booleans...
Adrian

@Adrian Correction: for any value but an empty string, a[i] equates to true. Well, almost. I'm assuming that if you get 2 inputs, your array has length two. Then a[2]===undefined and undefined evaluates to false. EDIT: your edit is what I meant :)
tomsmeding

2

Golfscript - 31 39 34 30

Hello, World! I am a long time lurker, first time poster. Here is my 30 byte solution in Golfscript (given the array such as [1 2 3] is already on the stack).

.,3<" and ":A{~A(;\+]", "}if*

The results are proper for all test cases.

EDIT: Take that, CJam!


Edited to account for the length 1 array.
Josiah Winslow

Edited for a more efficient algorithm.
Josiah Winslow

The battle continues. :P
Dennis

Ah, but now we're even. :P
Josiah Winslow

2

Xojo, 52 71 83 chars

dim i as int8=ubound(L)
L(i)=if(i=0,"","and ")+L(i)
Return L.Join(if(i=1," ",", ")

Note that UBound is one less than the array length.


This seems to add the comma when there are 2 items - should not
edc65

Good catch. Edited to fix.
silverpie

2

Excel VBA, 108 Bytes

Anonymous VBE immediate window function that takes input as space delimited array from range A1 and outputs to the VBE immediate window.

x=Split([A1]):y=UBound(x):For i=0To y-2:?x(i)", ";:Next:If y>0Then?x(i)IIf(y>1,",","")" and "x(i+1)Else?[A1]

1

Racket 87

(define(f x)(string-join(map ~a x)", "#:before-last(if(= 2(length x))" and "", and ")))

I still find the function names in lisps to be way too long for golfing.
seequ

1

Python 62 chars

Assuming that i is the list of strings:

(" and", ", and")[len(i) < 2].join(", ".join(i).rsplit(",",1))


1

Julia (53)

print(join(ARGS,", ",(endof(ARGS)>2?",":"")" and "))

Takes args from STDIN and outputs to STDOUT

Solution using Base.join(items, delim[, last])

Edit:

Test cases

julia oxfordComma.jl 1

1

julia oxfordComma.jl 1 2

1 and 2

julia oxfordComma.jl 1 2 3

1, 2, and 3


1
I don't know Julia, but this looks like it doesn't generate the Oxford comma.
flornquake

@flornquake it does print with the Oxford comma, due to the optional "last" argument
Cruor

2
It should be 1, 2, and 3, not 1, 2 and 3.
flornquake

1

Rant (108)

[$[l:@b]:[r:each][s:[cmp:[rc];2;[is:different;,]]\s][before:[last:[notfirst:and\s]]][sync:;ordered][arg:b]]

Ungolfed:

[$[l:@b]:
    [r:each]                            # Repeat for each item
    [s:[cmp:[rc];2;[is:different;,]]\s] # Separate by comma if n > 2
    [before:[last:[notfirst:and\s]]]    # Insert "and" before last item
    [sync:;ordered]                     # Force forward order
    [arg:b]                             # Read list
]

Usage:

[$l:{A|B|C|D|E}]

Try it online


1

Pyth, 28

j>", "qlQ2+_t_Q+?"and "tQkeQ

Examples:

$ pyth programs/oxford.pyth <<< "['1']"
1

$ pyth programs/oxford.pyth <<< "['1','2']"
1 and 2

$ pyth programs/oxford.pyth <<< "['1','2','3']"
1, 2, and 3

I can't seem to figure out how the input should be formatted.
Dennis

@Dennis I'll add some test cases.
isaacg

I had actually tried that, but it didn't work with my version of Pyth (TypeError: can only concatenate list (not "str") to list). It works fine with the latest version.
Dennis

@Dennis Yeah, the adding to list rule was added quite recently.
isaacg

1

PHP - 72

Set up the input:

$i=[1,2,3,4,5];

And then the process:

$x=count($i)-1;if($x) {$i[$x]=" and ".$i[$x];}echo join($x>1?",":"",$i);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.