Menghasilkan string tunggal dengan koma Oxford dari daftar


24

Apa saja pendekatan yang pintar (singkat dan idiomatis) untuk mengambil daftar string dan mengembalikan satu string yang diberi tanda baca dengan benar yang dibangun dari daftar, dengan setiap elemen dikutip.

Ini muncul untuk saya saat bereksperimen dengan Groovy , yang mana solusi saya terlalu literal, tetapi ilustratif

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
}

Artinya, ['1']harus menghasilkan '1', ['1','2']harus menghasilkan '1 and 2', [lihat apa yang saya lakukan di sana?] Dan ['1','2','3']harus menghasilkan '1, 2, and 3'.

Saya punya beberapa jawaban bagus untuk Groovy, tetapi saya ingin melihat apa yang bisa dilakukan oleh bahasa lain.

Apa sajakah kompak pendekatan cerdas dalam berbagai bahasa yang mengambil keuntungan dari fitur dan idiom dari bahasa-bahasa tersebut?


6
Selamat datang di PPCG. Umumnya pertanyaan yang diposting di sini adalah tantangan bagi masyarakat. Karena itu mereka membutuhkan kriteria kemenangan yang objektif. Saya percaya pertanyaan ini memetakan dengan cukup baik untuk menjadi tantangan kode-golf . Bisakah Anda memberi tag seperti itu? Jika demikian, saya pikir Anda harus memperketat spesifikasi input dan output sedikit.
Trauma Digital

7
Ini akan lebih menarik dengan kalimat nyata :['we invited the stripper','JFK','Stalin']
ThisSuitIsBlackNot

1
Bisakah kita menganggap bahwa string itu sendiri belum mengandung koma?
Martin Ender

2
Tantangan seharusnya diberi judul "Siapa yang memberi ---- tentang koma Oxford ?"
Igby Largeman

3
@OldCurmudgeon Saya pikir maksud Anda "sampah Amerikanisasi";)
ThisSuitIsBlackNot

Jawaban:


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 tidak terlihat terlalu sering dalam kode golf karena hanya dapat memformat teks, tetapi sebenarnya berfungsi untuk tantangan ini dan saya pikir itu akan menyenangkan untuk dilakukan. Lihat beraksi menggunakan cuplikan di atas (klik "Tampilkan cuplikan kode").

Daftar harus dalam file HTML tertaut dengan setiap elemen dikelilingi oleh <a>tag dan dipisahkan oleh jeda baris. Item daftar harus menjadi satu-satunya elemen dalam elemen induknya, mis

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

Penjelasan

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

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

Mari kita simak versi yang tidak diserang di atas. Jika Anda tidak terbiasa dengan cara kerja CSS, segala sesuatu di luar kurung kurawal adalah pemilih yang menentukan sekumpulan elemen HTML yang berlaku deklarasi di dalam kurung kurawal. Setiap pasangan pemilih-deklarasi disebut aturan . (Ini lebih rumit dari itu tetapi cukup untuk penjelasan ini.) Sebelum gaya apa pun diterapkan, daftar tampak dipisahkan oleh spasi saja.

Kami ingin menambahkan koma setelah setiap kata kecuali yang terakhir, kecuali untuk daftar dua kata, yang tidak mendapat koma. Pemilih pertama a:not(:last-child):nth-child(n+2):after,, memilih semua elemen kecuali yang pertama dan yang terakhir. :nth-child(n+2)adalah cara yang lebih pendek untuk mengatakan :not(:first-child), dan pada dasarnya bekerja dengan memilih elemen yang indeksnya (mulai dari 1) lebih besar dari atau sama dengan 2. (Ya, itu masih sedikit membingungkan saya. Dokumen MDN mungkin membantu.)

Sekarang kita hanya perlu memilih elemen pertama untuk mendapat koma jika ada tiga atau lebih elemen total. a:nth-last-child(n+3):afterbekerja seperti :nth-child, tetapi menghitung dari belakang, sehingga memilih semua elemen kecuali dua yang terakhir. Koma mengambil gabungan dari dua set, dan kami menggunakan :after elemen pseudo untuk menambahkan contentsegera setelah setiap elemen yang dipilih.

Aturan kedua lebih mudah. Kita perlu menambahkan "dan" sebelum elemen terakhir dalam daftar, kecuali itu adalah elemen tunggal. Dengan kata lain, kita perlu memilih elemen terakhir yang didahului oleh elemen lain. +adalah pemilih saudara yang berdekatan di CSS.


1
Cemerlang! Aku menyukainya. : D
COTO

Kalau saja Anda akan menggunakan <li>.
slebetman

1
<li>akan ideal, tetapi itu akan menambah dua karakter tambahan untuk pemilih. Saya memilih <a>karena ini satu huruf dan tidak menerapkan pemformatannya sendiri.
NinjaBearMonkey

Wow ... ini sangat mengesankan. Penghargaan kepintaran.

CSS sebagai jawaban teratas? Bagus.
Brandon

13

Haskell: 81, 77 74 karakter

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

Fitur Haskell: Pencocokan pola


Anda dapat menghapus beberapa spasi
Ray

1
Anda bisa menghapusf[x,y,z]
seequ

Dan sekarang, sudah cukup banyak rekursi standar. :)
seequ

Anda lupa koma oxford dan spasi setelah koma - f["a","b","c"]seharusnya "a, b, and c"tapi itu"a,b and c"
bangga haskeller

4
bagaimana dengan bermain golf dengan menggantinya y++", and "++zdengan f[y++",",z]:)
bangga haskeller

7

Ruby, 47 byte

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

Penjelasan

  • Input adalah argumen baris perintah ( $*).
  • Ketika $*memiliki elemen ketiga ( $*[2]tidak mengembalikan nihil), ambil semua elemen minus yang terakhir dan ubah menjadi String yang dipisahkan dengan koma Array#*. Terakhir, tambahkan koma tambahan, string, " and "dan argumen baris perintah terakhir.
  • Ketika $*tidak memiliki elemen ketiga, dua, satu, atau nol argumen diberikan. Argumen dapat dengan aman digabungkan dengan string " and "dan menghasilkan hasil yang benar.

6

Python 2 (61)

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

Trik utamanya adalah memotong bagian dari joiner terakhir ", and "untuk satu dan dua elemen. Untuk satu, semuanya dipotong, dan untuk dua, koma dihilangkan. Ini dilakukan dengan mengiris [8-7*len(s):](mencatat bahwa situ lebih pendek setelah pop).

Sayangnya, dtidak bisa hanya diganti dengan ekspresinya atau popakan terjadi terlambat.


Anda dapat mengganti yang pertama sdengan s=input()dan menghapus baris pertama, jika saya tidak salah. Menghemat 2 karakter.
tommeding

@tommeding Saya tidak mengerti apa yang Anda sarankan. Kode mengacu sbeberapa kali.
xnor

Tunggu, saya melakukan hal-hal aneh pagi ini. Lupakan itu. :)
tommeding

6

CSS, 62 karakter 112 karakter

Terinspirasi oleh entri lain, bahkan lebih pendek. Perhatikan bahwa ini mensyaratkan bahwa elemen A tidak dipisahkan oleh spasi putih:

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

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

Perbaiki untuk "satu dan dua", seperti yang ditunjukkan oleh 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 /

untuk dijalankan perl -ape, dengan daftar ruang yang disediakan dihidupkan STDIN.

Output untuk berbagai input:

$ 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

Anda dapat mengurangi ini dengan 3 byte dengan mengubah subtitusi terakhir Anda kes/(\S+)$/and $1/
ThisSuitIsBlackNot

1
@ThisSuitIsBlackNot Anda dapat menjatuhkan '\ n' (terima kasih), tetapi Anda tidak dapat menjatuhkan spasi, atau input "x" menjadi "dan x"
abligh

Ups, seharusnya diuji dengan lebih banyak input. Ngomong-ngomong, Anda lupa $jangkar di sunting, jadi input foo bar bazmenjadi foo, and bar, baz. Selain itu, Anda dapat menghapus salah satu spasi dengan melakukans/( \S+)$/ and$1/
ThisSuitIsBlackNot

Komentar terakhir saya masih meninggalkan Anda di 35, tapi Anda dapat menulis $#F>1sebagai @F>2untuk mencukur off satu lagi. Maaf untuk semua saran untuk perbaikan mikro, saya sangat suka jawaban ini :)
ThisSuitIsBlackNot

@ ThisSuitIsBlackTidak sama sekali - sambutan mikro. Diam-diam saya bersaing dengan 28 byte CJam dan 30 byte Golfscript. Namun saya mendapatkan ke 34 tanpa melakukan terjemahan dari komentar Anda sebelum yang terakhir (diuji dengan echo -n ... | wc -c). Jika Anda kehilangan ruang sebelum (\S+)Anda akan sampai 33 karakter, tetapi jika Anda memasukkan test thisAnda akan mendapatkan test and this(dua spasi setelah test), jadi tanpa lebih Saya pikir itu salah
abligh

4

Javascript (63)

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

Kasus:

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

Peringatan: ini akan memodifikasi elemen terakhir dalam array dengan panjang> 2.


2
Penggunaan yang bagus dari&&
Chris Bloom

4

GNU sed - 69 karakter termasuk 1 untuk -rbendera

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

Mengambil daftar yang dipisahkan oleh spasi (cukup idiomatis untuk skrip shell).

Contoh

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

Ya, mari kita pergi dengan kode-golf .
orome

Output kedua seharusnya 1 and 2bukan1, 2
Pengoptimal

@ Opptizer - cukup benar. Tetap.
Digital Trauma

3

Python 2 - 71, 70 68

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

Jumlah karakter termasuk keduanya, inputdan print.


3

Ruby, 57 byte

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

Saya bergabung dengan string ,dan kemudian saya mengganti koma terakhir dalam string dengan and(dan koma opsional tergantung pada panjang daftar).


3

Cobra - 60

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

List<of T>.joinFungsi Cobra memungkinkan Anda menentukan pemisah yang berbeda untuk dua elemen terakhir dari daftar, yang membuat ini sangat singkat.


3

Perl - 59

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

Bergabung dengan daftar dengan koma, maka jika daftar memiliki lebih dari satu elemen, tambahkan ' and'setelah koma terakhir (jika panjang> = 3), atau ganti koma terakhir dengan itu (jika panjang == 2).


3

PHP, 192 167 146 136 karakter:

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

Berdasarkan suatu fungsi yang saya tulis bertahun-tahun yang lalu di http://www.christopherbloom.com/2011/05/21/join-implode-an-array-of-string-values-with-formatting/


Bisakah Anda memasukkan kode Anda (dengan koma Oxford) ke dalam teks jawaban?

Ya maaf. Saya menggunakan ponsel saya dan tidak akan menempelkan kode dengan benar. Saya akan memperbarui dari desktop saya
Chris Bloom

@ Chrisbloom7 bahkan jika itu sepele untuk ditambahkan, jawabannya harus mencakup kode yang berfungsi, bukan yang bisa dibuat menjadi satu. juga, karena tujuannya adalah untuk membuat kode sekecil mungkin, tidak memposting kode kerja membuat skor Anda tidak ada.
haskeller bangga

Permintaan maaf lagi. Poster pertama kali di CG. Saya telah memperbaiki jawaban saya
Chris Bloom

3

Batch - 151 Bytes

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

Catatan; Anda harus memanggil skrip dari cmddengan /vsakelar yang diatur sebagai on, ini jadi saya tidak harus menyertakan setLocal enableDelayedExpansionskrip yang panjang . Jika tidak, tambahkan 30 ke jumlah byte, dan panggil script secara normal.

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 karakter, JavaScript ES6 56 karakter

Groovy:

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

Karena array diisi dengan karakter, kita dapat menggantinya a.size>1dengana[1]

JavaScript, ES6:

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

Kedua kasus mengasumsikan bahwa variabel a memiliki array yang dimaksud.


6
Koma Oxford adalah koma sebelum konjungsi.
Dennis

3

PHP, 86 84 karakter

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

Dengan array diinisialisasi, kita mulai menghitung:

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

Item terakhir dalam daftar dimodifikasi. Ini harus OK karena dalam PHP, tugas array dan panggilan fungsi melakukan salinan.


3

CJam, 35 30 28 27 byte

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

Ini adalah program yang membaca dari STDIN dan mencetak ke STDOUT. Cobalah online.

Bagaimana itu bekerja

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

Contoh dijalankan

$ 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

Saya
mendukung

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

Input dimulai pada sel A1dan terus turun untuk banyak entri yang ada.
JOINmenggabungkan mereka semua menjadi string dengan koma-ruang di antara masing-masing.
FILTERmenghapus non-kosong sehingga Anda tidak berakhir dengan koma tak terbatas di akhir.
SUBSTITUTEmenggantikan koma terakhir (ditemukan dengan COUNTAmenghitung input yang tidak kosong).

Ini tidak terlalu menarik tetapi bisa dilakukan dalam satu sel.


Ini menghilangkan koma oxford.
Payung

@ Umbrella Yah, itu bodoh saya, bukan? +1 byte
Engineer Toast

Anda harus dapat menurunkan terminal )dari rumus ini untuk -1 Byte; Ya ampun, itu edit tercepat yang pernah saya lihat +1
Taylor Scott

Dua catatan setelah pengujian ini - A:A>""harus dikonversi ke A:A<>""dan ini tidak menerapkan menghilangkan koma oxford pada kasus hanya 2 objek
Taylor Scott

@AylorScott Saya kira saya hanya pernah diuji dengan teks dan merindukan masalah dengan >"". Koreksi kilat yang saya buat sebelumnya jelas tidak diuji. Saya tidak suka arah yang menuju ...
Engineer Toast

2

JavaScript (ES6) 60

Dengan asumsi tidak ada string kosong dalam array input

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

Tes di konsol FireFox / Firebug

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

Keluaran

 We invited the stripper, JFK, and Stalin

Bagaimana saya menjalankan ini? Saya mencobanya node --harmonydengan berbagai string var a = 'abcdefgh'.split('');, tetapi hanya duduk di sana dengan ...dan tampaknya tidak melakukan apa-apa. Juga memberi +1 untuk menggunakan fitur ES6 yang unik ()=>.
Adrian

@Adrian fungsi mengembalikan string, tanpa output apa pun. Saya akan menambahkan tes dalam jawabannya.
edc65

Saya pikir f=(a,b=a.pop())=>a[0]?a.join(', ')+', and '+b:bjuga benar dan 13 byte lebih pendek.
Ingo Bürk

1
@ IngoBürk yang memotong bagian yang menangani koma memiliki 2 item. Tebak apa? Dengan 2 item, outputnya salah.
edc65

@ edc65 Ah, d'oh. Mungkin buruk.
Ingo Bürk

2

JavaScript - 60 56 71 67 63

Bukan pendekatan idiomatis, tapi saya senang menulisnya dan saya suka regex.

Dengan asumsi array disimpan di var a:

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

Dipersingkat dengan hanya memeriksa indeks [2]: (yay boolean coercion)

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

Rupanya saya payah dalam pengujian dan melewatkan tes satu entri. Ini versi yang sudah diperbaiki:

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

Mencukur 2 karakter dengan membalikkan boolean saya dan 3 lainnya dengan memindahkan ruang dari penggabungan ke saat itu / yang lain di ternary pertama:

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

Terima kasih kepada @tomsmeding karena mengingatkan saya bahwa saya tidak perlu memaksa boolean saya karena JS melakukan itu untuk saya. Saya juga menyadari bahwa saya lupa menghapus tanda kurung yang memisahkan terner pertama dari rangkaian di dalam join():

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

Apakah saya melakukan itu dengan benar? Permintaan pegolf baru yang wajib.


1
Menyukai regex dikenal sebagai masokisme.
seequ

Sebenarnya Anda tidak membutuhkannya !!sama sekali; a[2]?A:Bsudah bekerja. Mungkin harus membalikkan boolean Anda lagi .
tommeding

@tommeding - Anda benar. Saya selalu waspada terhadap perilaku paksaan default boolean JavaScript, jadi saya memiliki kebiasaan untuk secara manual memaksa boolean saya ...
Adrian

@Adrian Correction: untuk nilai apa pun selain string kosong, a[i]sama dengan true . Hampir saja. Saya berasumsi bahwa jika Anda mendapatkan 2 input, array Anda memiliki panjang dua. Kemudian a[2]===undefineddan undefinedmengevaluasi ke false. Sunting: suntingan Anda adalah yang saya maksud :)
tomsmeding

2

Golfscript - 31 39 34 30

Halo Dunia! Saya lama bersembunyi, poster pertama kali. Berikut adalah solusi 30 byte saya di Golfscript (diberikan array seperti [1 2 3] sudah ada di stack).

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

Hasilnya tepat untuk semua kasus uji.

EDIT: Ambil itu, CJam!


Diedit ke akun untuk array panjang 1.
Josiah Winslow

Diedit untuk algoritma yang lebih efisien.
Josiah Winslow

Pertempuran berlanjut. : P
Dennis

Ah, tapi sekarang kita genap. : P
Josiah Winslow

2

Xojo, 52 71 83 karakter

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

Perhatikan bahwa UBound kurang dari panjang array.


Ini sepertinya menambah koma ketika ada 2 item - tidak boleh
edc65

Tangkapan yang bagus. Diedit untuk diperbaiki.
silverpie

2

Excel VBA, 108 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input sebagai array yang dibatasi ruang dari rentang A1dan keluaran ke jendela langsung 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

Raket 87

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

Saya masih menemukan nama fungsi di lisps terlalu lama untuk bermain golf.
seequ

1

Python 62 chars

Dengan asumsi bahwa saya adalah daftar string:

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

Membawa args dari STDIN dan output ke STDOUT

Solusi menggunakan Base.join (item, delim [, terakhir])

Edit:

Uji kasus

julia oxfordComma.jl 1

1

julia oxfordComma.jl 1 2

1 dan 2

julia oxfordComma.jl 1 2 3

1, 2, dan 3


1
Saya tidak tahu Julia, tetapi ini sepertinya tidak menghasilkan koma Oxford.
flornquake

@flakequake print dengan koma Oxford, karena argumen opsional "terakhir"
Cruor

2
Seharusnya 1, 2, and 3tidak 1, 2 and 3.
flornquake

1

Kata-kata kasar (108)

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

Tidak Disatukan:

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

Pemakaian:

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

Cobalah online


1

Pyth, 28

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

Contoh:

$ 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

Sepertinya saya tidak tahu bagaimana input harus diformat.
Dennis

@ Dennis Saya akan menambahkan beberapa test case.
isaacg

Saya sebenarnya sudah mencobanya, tetapi tidak berhasil dengan versi Pyth ( TypeError: can only concatenate list (not "str") to list) saya. Ini berfungsi dengan baik dengan versi terbaru.
Dennis

@ Dennis Ya, aturan menambahkan ke daftar baru-baru ini ditambahkan.
isaacg

1

PHP - 72

Siapkan input:

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

Dan kemudian prosesnya:

$x=count($i)-1;if($x) {$i[$x]=" and ".$i[$x];}echo join($x>1?",":"",$i);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.