Tạo một chuỗi đơn bằng dấu phẩy Oxford từ danh sách


24

Một số cách tiếp cận thông minh (ngắn gọn và thành ngữ) để lấy danh sách các chuỗi và trả về một chuỗi có dấu chấm câu đúng được xây dựng từ danh sách, với mỗi phần tử được trích dẫn.

Điều này đã đến với tôi khi thử nghiệm Groovy , giải pháp mang tính minh họa nhưng quá rõ ràng của tôi là

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
}

Đó là, ['1']nên nhường '1', ['1','2']nên nhường '1 and 2', [xem những gì tôi đã làm ở đó?] Và ['1','2','3']nên mang lại '1, 2, and 3'.

Tôi có một số câu trả lời hay cho Groovy, nhưng tôi muốn xem những ngôn ngữ khác có thể làm gì.

Một số cách tiếp cận thông minh nhỏ gọn trong các ngôn ngữ khác nhau tận dụng các tính năng và thành ngữ của các ngôn ngữ đó là gì?


6
Chào mừng đến với PPCG. Nói chung các câu hỏi được đăng ở đây là những thách thức cho cộng đồng. Vì vậy, họ cần một tiêu chí chiến thắng khách quan. Tôi tin rằng câu hỏi này ánh xạ hợp lý để trở thành một thử thách golf-code . Bạn có thể gắn thẻ nó như vậy? Nếu vậy, tôi nghĩ bạn nên thắt chặt các thông số kỹ thuật đầu vào và đầu ra một chút.
Chấn thương kỹ thuật số

7
Điều này sẽ thú vị hơn với các câu thực tế :['we invited the stripper','JFK','Stalin']
ThisSuitIsBlackNot

1
Chúng ta có thể cho rằng bản thân các chuỗi không chứa dấu phẩy không?
Martin Ender

2
Thử thách nên có tiêu đề "Ai đưa ra ---- về dấu phẩy Oxford ?"
Igby Largeeman

3
@OldCurmudgeon Tôi nghĩ bạn có nghĩa là "rác Mỹ hóa";)
ThisSuitIsBlackNot

Câu trả lời:


76

CSS, 132 116 115 byte

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

CSS không được nhìn thấy quá thường xuyên trong golf golf vì nó chỉ có thể định dạng văn bản, nhưng nó thực sự hoạt động cho thử thách này và tôi nghĩ rằng nó sẽ rất thú vị để làm. Xem nó trong hành động bằng cách sử dụng đoạn mã ở trên (nhấp vào "Hiển thị đoạn mã").

Danh sách phải ở trong một tệp HTML được liên kết với mỗi thành phần được bao quanh bởi <a>các thẻ và được phân tách bằng dấu ngắt dòng. Các mục danh sách phải là thành phần duy nhất trong phần tử cha của chúng, vd

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

Giải trình

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

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

Chúng ta hãy xem xét phiên bản không có người ở trên. Nếu bạn không quen với cách CSS hoạt động, mọi thứ bên ngoài dấu ngoặc nhọn là một bộ chọn xác định tập hợp các phần tử HTML mà khai báo bên trong dấu ngoặc nhọn áp dụng. Mỗi cặp chọn-khai báo được gọi là một quy tắc . (Nó phức tạp hơn thế nhưng sẽ đủ cho lời giải thích này.) Trước khi bất kỳ kiểu dáng nào được áp dụng, danh sách chỉ xuất hiện cách nhau bởi các khoảng trắng.

Chúng tôi muốn thêm dấu phẩy sau mỗi từ trừ từ cuối cùng, ngoại trừ danh sách hai từ, không nhận được dấu phẩy. Bộ chọn đầu tiên a:not(:last-child):nth-child(n+2):after, chọn tất cả các thành phần ngoại trừ đầu tiên và cuối cùng. :nth-child(n+2)là một cách nói ngắn hơn :not(:first-child)và về cơ bản nó hoạt động bằng cách chọn các yếu tố có chỉ số (bắt đầu từ 1) lớn hơn hoặc bằng 2. (Có, nó vẫn làm tôi bối rối một chút. Các tài liệu MDN có thể giúp đỡ.)

Bây giờ chúng ta chỉ cần chọn phần tử đầu tiên để có dấu phẩy nếu có tổng số ba phần tử trở lên. a:nth-last-child(n+3):afterhoạt động như thế :nth-child, nhưng đếm từ phía sau, vì vậy nó chọn tất cả các yếu tố ngoại trừ hai yếu tố cuối cùng. Dấu phẩy lấy liên kết của hai bộ và chúng tôi sử dụng :after phần tử giả để thêm contentngay sau mỗi phần tử được chọn.

Quy tắc thứ hai dễ dàng hơn. Chúng ta cần thêm "và" vào trước phần tử cuối cùng trong danh sách, trừ khi nó là một phần tử duy nhất. Nói cách khác, chúng ta cần chọn phần tử cuối cùng trước phần tử khác. +bộ chọn anh chị em liền kề trong CSS.


1
Rực rỡ! Tôi thích nó. : D
COTO

Nếu chỉ bạn sử dụng <li>.
slebetman

1
<li>sẽ là lý tưởng, nhưng điều đó sẽ thêm hai ký tự phụ vào bộ chọn. Tôi đã chọn <a>vì đó là một chữ cái và không áp dụng định dạng riêng.
NinjaBearMonkey

Wow ... điều này rất ấn tượng. Giải thưởng thông minh.

CSS là câu trả lời hàng đầu? Tốt đẹp.
Brandon

13

Haskell: 81, 77 74 ký tự

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

Các tính năng của Haskell: Khớp mẫu


Bạn có thể xóa một số khoảng trắng
Ray

1
Bạn chỉ có thể xóaf[x,y,z]
xem

Và bây giờ, nó là khá nhiều đệ quy tiêu chuẩn. :)
xem

bạn đã quên dấu phẩy oxford và dấu cách sau dấu phẩy - f["a","b","c"]được cho là "a, b, and c"nhưng nó là"a,b and c"
tự hào

4
Làm thế nào về việc chơi golf bằng cách thay thế y++", and "++zbằng f[y++",",z]:)
tự hào

7

Ruby, 47 byte

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

Giải trình

  • Đầu vào là các đối số dòng lệnh ( $*).
  • Khi $*có phần tử thứ ba ( $*[2]không trả về nil), hãy lấy tất cả các phần tử trừ đi phần tử cuối cùng và biến chúng thành Chuỗi được phân tách bằng dấu phẩy bằng cách sử dụng Array#*. Cuối cùng thêm một dấu phẩy, chuỗi " and "và đối số dòng lệnh cuối cùng.
  • Khi $*không có phần tử thứ ba, hai, một hoặc một đối số được đưa ra. Các đối số có thể được nối một cách an toàn với chuỗi " and "và tạo ra kết quả chính xác.

6

Con trăn 2 (61)

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

Thủ thuật chính là cắt bỏ một phần của công cụ tham gia cuối cùng ", and "cho một và hai yếu tố. Đối với một, tất cả đều bị cắt bỏ và đối với hai, dấu phẩy được xóa. Điều này được thực hiện bằng cách cắt ra [8-7*len(s):](lưu ý rằng snó ngắn hơn sau pop).

Thật không may, dkhông thể thay thế bằng biểu hiện của nó hoặc điều popđó sẽ xảy ra quá muộn.


Bạn có thể thay thế dòng đầu tiên sbằng s=input()và xóa dòng đầu tiên, nếu tôi không nhầm. Tiết kiệm 2 ký tự.
tomsmeding

@tomsmeding Tôi không hiểu những gì bạn đề xuất. Mã này được đề cập đến snhiều lần.
xnor

Đợi đã, tôi làm những thứ kỳ lạ sáng nay. Quên đi. :)
tomsmeding

6

CSS, 62 ký tự 112 ký tự

Lấy cảm hứng từ các mục khác, thậm chí ngắn hơn. Lưu ý rằng nó yêu cầu các phần tử A không được phân tách bằng khoảng trắng:

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

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

Sửa lỗi cho "một và hai", như được chỉ ra bởi Dennis:

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

Perl (v 5.10+) - 37 35 34 28

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

được chạy với perl -ape, với danh sách được cung cấp không gian được phân tách trên STDIN.

Đầu ra cho các đầu vào khác nhau:

$ 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

Bạn có thể giảm 3 byte này bằng cách thay đổi lần thay thế cuối cùng của mình thànhs/(\S+)$/and $1/
ThisSuitIsBlackNot

1
@ ThisSuitIsBlackNot Bạn có thể thả '\ n' (cảm ơn), nhưng bạn không thể bỏ dấu cách hoặc đầu vào của "x" trở thành "và x"
abligh

Rất tiếc, nên đã thử nghiệm với nhiều đầu vào. Dù sao, bạn đã quên $neo trong chỉnh sửa của mình, vì vậy một đầu vào foo bar baztrở thành foo, and bar, baz. Ngoài ra, bạn có thể xóa một trong các khoảng trắng bằng cách thực hiệns/( \S+)$/ and$1/
ThisSuitIsBlackNot

Nhận xét cuối cùng của tôi vẫn để lại cho bạn ở tuổi 35, nhưng bạn có thể viết $#F>1như @F>2để cạo đi một cái nữa. Xin lỗi vì tất cả các đề xuất cải tiến vi mô, tôi thực sự thích câu trả lời này :)
ThisSuitIsBlackNot

@ ThisSuitIsBlackNot hoàn toàn không - chào mừng bạn. Tôi đang bí mật cạnh tranh với 28 byte CJam và 30 byte Golfscript. Tuy nhiên tôi đã nhận được 34 mà không thực hiện bản dịch nhận xét của bạn trước đó (đã được thử nghiệm echo -n ... | wc -c). Nếu bạn bỏ lỡ khoảng trắng trước khi (\S+)bạn nhận được 33 ký tự, nhưng nếu bạn đặt vào, test thisbạn sẽ nhận được test and this(hai khoảng trắng sau test), vì vậy không cần thêm Tôi nghĩ đó là sai.
abligh

4

Javascript (63)

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

Các trường hợp:

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

Hãy cẩn thận: điều này sẽ sửa đổi phần tử cuối cùng trong một mảng có độ dài> 2.


2
Công dụng tuyệt vời của&&
Chris Bloom

4

GNU sed - 69 ký tự trong đó có 1 cho -rcờ

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

Đưa ra một danh sách được phân tách bằng dấu cách (khá thành ngữ cho các kịch bản shell).

Thí dụ

$ 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
$

Vâng, chúng ta hãy đi với golf-code .
orome

Đầu ra thứ hai nên 1 and 2thay vì1, 2
Trình tối ưu hóa

@Optimizer - hoàn toàn đúng. Đã sửa.
Chấn thương kỹ thuật số

3

Con trăn 2 - 71, 70 68

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

Số lượng nhân vật bao gồm cả hai, inputprint.


3

Ruby, 57 byte

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

Tôi đang tham gia chuỗi với ,và sau đó tôi sẽ thay thế dấu phẩy cuối cùng trong chuỗi bằng một anddấu phẩy (và dấu phẩy tùy chọn tùy thuộc vào độ dài danh sách).


3

Rắn hổ mang - 60

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

List<of T>.joinChức năng của Cobra cho phép bạn chỉ định một dấu tách khác nhau cho hai thành phần cuối cùng của danh sách, đây là yếu tố khiến cho điều này trở nên quá ngắn.


3

Perl - 59

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

Tham gia danh sách bằng dấu phẩy, sau đó nếu danh sách có nhiều phần tử, sẽ thêm ' and'sau dấu phẩy cuối cùng (nếu chiều dài> = 3) hoặc thay thế dấu phẩy cuối cùng bằng dấu phẩy (nếu length == 2).


3

PHP, 192 167 146 136 ký tự:

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

Dựa trên một chức năng tôi đã viết cách đây nhiều năm tại http://www.christopherbloom.com/2011/05/21/join-implode-an-array-of-opes-values-with-formatted/


Bạn có thể vui lòng đặt mã của bạn (với dấu phẩy Oxford) vào văn bản trả lời không?

Vâng xin lôi. Tôi đã ở trên điện thoại của tôi và nó sẽ không dán mã đúng. Tôi sẽ cập nhật từ máy tính để bàn của mình
Chris Bloom

@ Chrisbloom7 ngay cả khi nó là tầm thường để thêm, câu trả lời nên bao gồm một mã làm việc, không phải là một mã có thể được làm thành một. Ngoài ra, vì mục tiêu là làm cho mã càng nhỏ càng tốt, không đăng mã làm việc khiến điểm của bạn không tồn tại.
tự hào

Xin lỗi lần nữa. Áp phích lần đầu tiên tại CG. Tôi đã sửa câu trả lời của mình
Chris Bloom

3

Mẻ - 151 byte

@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!

Chú thích; bạn phải gọi tập lệnh từ cmdvới bộ /vchuyển đổi là on, vì vậy tôi không phải bao gồm độ dài setLocal enableDelayedExpansiontrong tập lệnh. Nếu không, thêm 30 vào số byte và gọi kịch bản bình thường.

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

Groovy, 47 43 57 ký tự, JavaScript ES6 56 ký tự

Groovy:

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

Vì mảng chứa đầy các ký tự, chúng ta có thể thay thế a.size>1bằnga[1]

JavaScript, ES6:

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

Cả hai trường hợp đều cho rằng biến a có mảng trong câu hỏi.


6
Dấu phẩy Oxford dấu phẩy trước khi kết hợp.
Dennis

3

PHP, 86 84 ký tự

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

Với mảng được khởi tạo, chúng tôi bắt đầu đếm:

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

Chuẩn bị:

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

Mục cuối cùng trong danh sách được sửa đổi. Điều này sẽ ổn vì trong PHP, việc gán mảng và gọi hàm thực hiện các bản sao.


3

CJam, 35 30 28 27 byte

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

Đây là một chương trình đọc từ STDIN và in ra STDOUT. Hãy thử trực tuyến.

Làm thế nào nó hoạt động

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)                               ";

Chạy ví dụ

$ 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

Tôi đang theo đuôi bạn - xem bên dưới :-)
abligh

3

Google Sheets, 67 68 67 92 byte

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

Đầu vào bắt đầu tại ô A1và tiếp tục xuống tuy nhiên có nhiều mục tồn tại.
JOINhợp nhất tất cả chúng thành một chuỗi với dấu phẩy - khoảng trắng giữa mỗi chuỗi.
FILTERxóa bất kỳ khoảng trống nào để bạn không kết thúc bằng dấu phẩy vô hạn ở cuối.
SUBSTITUTEthay thế dấu phẩy cuối cùng (được tìm thấy bằng cách COUNTAđếm các đầu vào không trống).

Nó không thú vị lắm nhưng nó có thể thực hiện được trong một ô.


Điều này để lại dấu phẩy oxford.
Ô

@Umhima Chà, điều đó thật ngu ngốc đối với tôi, phải không? +1 byte
Kỹ sư nướng bánh mì

Bạn sẽ có thể thả thiết bị đầu cuối )ra khỏi công thức này cho -1 Byte; Chà, đó là bản chỉnh sửa nhanh nhất tôi từng thấy +1
Taylor Scott

Hai lưu ý sau khi kiểm tra điều này - A:A>""nên được chuyển đổi thành A:A<>""và điều này không thực hiện bỏ qua dấu phẩy oxford trong trường hợp chỉ có 2 đối tượng
Taylor Scott

@TaylorScott Tôi đoán tôi chỉ từng thử nghiệm với văn bản và bỏ lỡ vấn đề với >"". Sự điều chỉnh nhanh chóng mà tôi đã thực hiện trước đó rõ ràng không được kiểm tra. Tôi không thích sự chỉ đạo đi ...
Kỹ sư Toast

2

JavaScript (ES6) 60

Giả sử không có chuỗi trống trong mảng đầu vào

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

Kiểm tra trong bảng điều khiển FireFox / Fireorms

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

Đầu ra

 We invited the stripper, JFK, and Stalin

Làm thế nào để tôi chạy cái này? Tôi đã thử nó node --harmonyvới một chuỗi các chuỗi var a = 'abcdefgh'.split('');, nhưng nó chỉ ngồi đó với một ...và dường như không làm gì cả. Cũng +1 để sử dụng tính năng ES6 độc đáo ()=>.
Adrian

@Adrian hàm trả về một chuỗi, không có bất kỳ đầu ra nào. Tôi sẽ thêm một bài kiểm tra trong câu trả lời.
edc65

Tôi nghĩ f=(a,b=a.pop())=>a[0]?a.join(', ')+', and '+b:bcũng đúng và ngắn hơn 13 byte.
Ingo Bürk

1
@ IngoBürk cắt phần xử lý dấu phẩy có 2 mục. Đoán xem cái gì? Với 2 mục đầu ra là sai.
edc65

@ edc65 À, ờ. Có thể xấu.
Ingo Bürk

2

JavaScript - 60 56 71 67 63

Không hẳn là một cách tiếp cận thành ngữ, nhưng tôi rất vui khi viết nó và tôi thích regex.

Giả sử mảng được lưu trữ trong var a:

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

Rút ngắn bằng cách đơn giản kiểm tra chỉ mục [2]: (yay boolean cưỡng chế)

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

Rõ ràng tôi không kiểm tra và bỏ qua một bài kiểm tra đơn. Đây là phiên bản cố định:

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

Cạo sạch 2 ký tự bằng cách đảo ngược các booleans của tôi và 3 ký tự khác bằng cách di chuyển không gian từ phần nối vào sau đó / khác của ternary đầu tiên:

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

Cảm ơn @tomsmeding đã nhắc nhở tôi rằng tôi không phải ép buộc các booleans của mình vì JS làm điều đó cho tôi. Tôi cũng nhận ra rằng tôi đã quên xóa dấu ngoặc đơn ngăn cách phần ba đầu tiên khỏi phần nối bên trong join():

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

Tôi đã làm điều đó phải không? Bắt buộc xin lỗi golfer mới.


1
Regex Liking được gọi là khổ dâm.
xem

Thật ra bạn không cần !!gì cả; a[2]?A:Blàm việc rồi Có thể phải đảo ngược booleans của bạn một lần nữa .
tomsmeding

@tomsmeding - bạn đúng rồi. Tôi luôn cảnh giác với hành vi cưỡng chế boolean mặc định của JavaScript, vì vậy tôi có thói quen tự mình ép buộc các booleans của mình ...
Adrian

@Adrian Correction: với mọi giá trị trừ một chuỗi rỗng, a[i]tương đương với true . Vâng, gần như vậy. Tôi giả sử rằng nếu bạn nhận được 2 đầu vào, mảng của bạn có độ dài hai. Sau đó a[2]===undefinedundefinedđánh giá để false. EDIT: chỉnh sửa của bạn là những gì tôi muốn nói :)
tomsmeding

2

Golfscript - 31 39 34 30

Chào thế giới! Tôi là một người ẩn giấu thời gian dài, lần đầu tiên áp phích. Đây là giải pháp 30 byte của tôi trong Golfscript (được cung cấp mảng như [1 2 3] đã có trên ngăn xếp).

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

Kết quả là phù hợp cho tất cả các trường hợp thử nghiệm.

EDIT: Lấy cái đó đi, CJam!


Đã chỉnh sửa để chiếm 1 mảng dài.
Josiah Winslow

Chỉnh sửa cho một thuật toán hiệu quả hơn.
Josiah Winslow

Trận chiến tiếp tục. : P
Dennis

Ah, nhưng bây giờ chúng tôi thậm chí. : P
Josiah Winslow

2

Xojo, 52 71 83 ký tự

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

Lưu ý rằng UBound là một ít hơn chiều dài mảng.


Điều này dường như thêm dấu phẩy khi có 2 mục - không nên
edc65

Nắm bắt tốt. Chỉnh sửa để sửa chữa.
Silverpie

2

VBA Excel, 108 byte

Hàm cửa sổ ngay lập tức VBE ẩn danh lấy đầu vào là mảng phân cách không gian từ phạm vi A1và đầu ra cho cửa sổ ngay lập tức VBE.

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

Vợt 87

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

Tôi vẫn thấy các tên hàm trong lisps quá dài để chơi gôn.
xem

1

Python 62 ký tự

Giả sử rằng tôi là danh sách các chuỗi:

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

1

C # 102 Chars

var i=m.Count(),l=i;if(l>2)l--;var r=string.Join(", ",m.Take(l));if(l!=i)r+=" and "+m.Last();return r;

1

Julia (53)

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

Đưa ra lập luận từ STDIN và xuất ra STDOUT

Giải pháp sử dụng Base.join (mục, delim [, last])

Chỉnh sửa:

Các trường hợp thử nghiệm

julia oxfordComma.jl 1

1

julia oxfordComma.jl 1 2

1 và 2

julia oxfordComma.jl 1 2 3

1, 2 và 3


1
Tôi không biết Julia, nhưng có vẻ như nó không tạo ra dấu phẩy Oxford.
flornquake

@flornquake nó được in bằng dấu phẩy Oxford, do đối số "cuối cùng" tùy chọn
Cruor

2
Nó nên 1, 2, and 3, không phải 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]]

Ung dung:

[$[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
]

Sử dụng:

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

Dùng thử trực tuyến


1

Bình thường, 28

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

Ví dụ:

$ 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

Tôi dường như không thể tìm ra làm thế nào đầu vào nên được định dạng.
Dennis

@Dennis Tôi sẽ thêm một số trường hợp thử nghiệm.
isaacg

Tôi thực sự đã thử nó, nhưng nó không hoạt động với phiên bản Pyth ( TypeError: can only concatenate list (not "str") to list) của tôi. Nó hoạt động tốt với phiên bản mới nhất.
Dennis

@Dennis Vâng, quy tắc thêm vào danh sách đã được thêm vào gần đây.
isaacg

1

PHP - 72

Thiết lập đầu vào:

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

Và sau đó là quá trình:

$x=count($i)-1;if($x) {$i[$x]=" and ".$i[$x];}echo join($x>1?",":"",$i);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.