Bir listeden bir Oxford virgülüyle tek bir dize oluşturma


24

Akıllıca olan (kısa ve deyimsel), dizelerin bir listesini almaya ve listeden oluşturulmuş tek bir düzgün şekilde dizilmiş bir dizgiyi geri döndürmeye yönelik, her bir öğenin alıntılandığı şeylerden bazıları.

Bu benim için çok hazırlayıcı, ancak benim için açıklayıcı bir çözüm olan Groovy ile deney yaparken ortaya çıktı.

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
}

Yani, ['1']vermeli '1', ['1','2']vermeli '1 and 2', [orada ne yaptım bakalım?] Ve ['1','2','3']vermeli '1, 2, and 3'.

Groovy için iyi cevaplarım var ama başka dillerin neler yapabileceğini görmek istiyorum.

Bu dillerin özelliklerinden ve deyimlerinden yararlanan çeşitli dillerdeki küçük akıllı yaklaşımlar nelerdir?


6
PPCG'ye Hoşgeldiniz. Genel olarak burada yayınlanan sorular topluma yönelik zorluklardır. Bu nedenle nesnel kazanma kriterlerine ihtiyaçları var. Bu sorunun kod-golf mücadelesi için oldukça uygun olduğuna inanıyorum . Öyle etiketleyebilir misin? Öyleyse, giriş ve çıkış özelliklerini biraz sıkmanız gerektiğini düşünüyorum.
Dijital Travma

7
Bu gerçek cümlelerle daha ilginç olurdu :['we invited the stripper','JFK','Stalin']
ThisSuitIsBlackNot

1
Dizelerin kendilerinin virgül içermediğini varsayabilir miyiz?
Martin Ender

2
Mücadelenin " Oxford virgülünü kim ---- ile kim verir ?"
Igby Largeman 12:14

3
@OldCurmudgeon Sanırım "Amerikan çöpü" demek istediniz;)
ThisSuitIsBlackNot 21:14

Yanıtlar:


76

CSS, 132 116 115 bayt

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

CSS kod golfünde çok sık görülmez, çünkü yalnızca metni biçimlendirebilir, ancak aslında bu zorluk için işe yarar ve yapmanın eğlenceli olacağını düşündüm. Yukarıdaki snippet'i kullanarak çalışırken görün ("Kod snippetini göster" i tıklayın).

Liste, her bir öğe <a>etiketlerle çevrili ve satır kesmeleriyle ayrılmış olarak bağlantılı bir HTML dosyasında olmalıdır . Liste öğeleri, üst öğelerinde bulunan tek öğeler olmalıdır; örn.

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

açıklama

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

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

Yukarıda ungolfed versiyonunu düşünelim. CSS'nin nasıl çalıştığını bilmiyorsanız, küme parantezlerinin dışındaki her şey, ayraçların içindeki bildirimlerin uygulanacağı HTML öğeleri kümesini belirleyen bir seçicidir. Her bir seçici-bildirim çiftine kural denir . (Bundan daha karmaşıktır, ancak bu açıklama için yeterli olacaktır.) Herhangi bir stil uygulanmadan önce, liste yalnızca boşluklarla ayrılmış olarak görünür.

Sonuncusu hariç her kelimenin arkasına virgül eklemek istiyoruz, iki kelimeli listeler hariç, virgül yok. İlk seçici, a:not(:last-child):nth-child(n+2):afterilk ve son hariç tüm elemanları seçer. :nth-child(n+2)bu, daha kısa bir ifade şeklidir :not(:first-child)ve temel olarak indeksi (1'den başlayarak) 2'den büyük veya ona eşit olan öğeleri seçerek çalışır. (Evet, hala beni biraz şaşırtıyor . MDN belgeleri yardımcı olabilir.)

Şimdi sadece bir virgül almak için ilk elemanını seçmek gerekir eğer üç veya daha fazla unsur var toplamı vardır. a:nth-last-child(n+3):aftergibi çalışır :nth-child, ancak arkadan sayılarak son iki hariç tüm öğeleri seçer. Virgül, iki kümenin birleşimini alır ve seçili her öğenin hemen ardından eklemek için :after sözde öğeyi kullanırız content.

İkinci kural daha kolaydır. Tek bir öğe olmadıkça listedeki son öğeden önce "ve" eklememiz gerekir. Başka bir deyişle, daha önce başka bir öğeden önce gelen öğeyi seçmemiz gerekir. +olan bitişik Kardeş seçici CSS.


1
Parlak! Onu seviyorum. : D
COTO 11:14

Keşke kullanırsan <li>.
Slebetman

1
<li>ideal olurdu, ancak seçicilere iki karakter daha ekleyecekti. <a>Bir harf olduğundan ve kendi biçimlendirmesini uygulamadığı için seçtim .
NinjaBearMonkey 12:14

Vay ... bu çok etkileyici. Akıllılık ödülü.

En iyi cevap olarak CSS? Güzel.
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

Haskell özellikleri: Desen eşleştirme


Bazı boşlukları kaldırabilirsiniz
Ray

1
Sadece kaldırabilirsinizf[x,y,z]
seequ

Ve şimdi, hemen hemen standart özyinelemektir. :)
14:40

virgül sonrası oxford virgülünü ve uzaylarını unuttun - f["a","b","c"]olması gerekiyordu "a, b, and c"ama öyle"a,b and c"
gururlu haskeller

4
nasıl değiştirerek golf yaklaşık y++", and "++zgöre f[y++",",z]:)
gururlu haskeller

7

Ruby, 47 bayt

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

açıklama

  • Giriş komut satırı argümanlarıdır ( $*).
  • $*Üçüncü bir öğeye sahip olduğunda ( $*[2]sıfır döndürmez), tüm öğeleri eksi olandan al ve bunları kullanarak virgülle ayrılmış bir Dize dönüştür Array#*. Son olarak, fazladan virgül, dize " and "ve son komut satırı argümanı ekleyin .
  • Ne zaman $*üçüncü bir eleman yer alır, iki, bir ya da sıfır argümanlar verildi. Argümanlar dizeyle güvenli bir şekilde birleştirilebilir " and "ve doğru sonucu verebilir .

6

Piton 2 (61)

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

Ana numara ", and "bir ve iki element için son marangoz parçasını kesmektir . Birincisi, hepsi kesilir ve iki tanesi için virgül kaldırılır. Bu dilimleme ile yapılır [8-7*len(s):](bunun sbir taneden daha kısa olduğuna dikkat edin pop).

Ne yazık ki, dsadece ifadesiyle yer değiştirilemez, aksi takdirde popgecikme olur.


Yanılmıyorsam ilk sile değiştirebilir s=input()ve ilk satırı kaldırabilirsiniz. 2 karakter kazandırır.
tomsmeding

@tomsmeding Ne önerdiğini anlamıyorum. Kod sbirden çok kez atıfta bulunuyor .
xnor

Bekle, bu sabah tuhaf şeyler yapıyorum. Unutmak. :)
13:16

6

CSS, 62 karakter 112 karakter

Diğer girişlerden esinlenmiş, hatta daha kısa. A öğelerinin beyaz boşluklarla ayrılmamasını gerektirdiğini unutmayın:

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

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

Dennis'in işaret ettiği gibi "bir ve iki" için düzeltme:

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 /

perl -apeBirlikte verilen liste ayrılmış alanla birlikte çalıştırılmalıdır STDIN.

Çeşitli girişler için çıkış:

$ 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

Bunu, son s/(\S+)$/and $1/
ikameinizi

1
@BuSuitIsBlackNot '\ n' yi (teşekkürler) düşürebilirsiniz, ancak boşlukları bırakamazsınız ya da "x" girişi "ve" olur
18:41

Hata! Daha fazla giriş ile test edilmiş olmalı. Her neyse, $düzenlemedeki bağlantıyı unuttun , böylece bir girdi foo bar bazhaline geldi foo, and bar, baz. Ayrıca, boşluklardan birini yaparak kaldırabilirsinizs/( \S+)$/ and$1/
ThisSuitIsBlackNot 18:14

Benim son yorum hala 35 yaşında bırakır, ancak yazabilir $#F>1olarak @F>2daha birisinden bir tıraş için. Mikro iyileştirmeler için tüm önerileriniz için üzgünüm, sadece bu cevabı gerçekten beğendim :)
ThisSuitIsBlackNot

@BuSuitIsBlackHiçbirinde değil - mikroplar hoş geldiniz. Gizlice 28 byte CJam ve 30 byte Golfscript ile rekabet ediyorum. Ancak yorumunuzu en sondan önce çevirisini yapmadan 34'e ulaştım (test edildi echo -n ... | wc -c). Önce boşluğu kaçırırsanız, (\S+)33 karaktere ulaşırsınız, ancak eğer koyarsanız (iki boşluk sonra ) test thisalacaksınız , Bunun yanlış olduğunu düşünüyorum.test and thistest
abligh

4

Javascript (63)

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

Durumlar:

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

Uyarma: Bu, uzunluğu> 2 olan bir dizideki son elemanı değiştirir.


2
Güzel kullanımı&&
Chris Bloom

4

GNU sed - -rbayrak için 1 tane olmak üzere 69 karakter

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

Boşluk içeren bir liste alır (kabuk komut dosyaları için oldukça deyimsel).

Örnek

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

Evet, haydi kod-golf ile gidelim .
orome

İkinci çıktı 1 and 2bunun yerine olmalı1, 2
Optimizer

@Optimizer - oldukça doğru. Sabit.
Dijital Travma

3

Python 2 - 71, 70 68

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

Her ikisini de içeren karakter sayısı inputve print.


3

Ruby, 57 bayt

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

Dizeye katılıyorum ,ve ardından dizedeki son virgüyü bir and(ve liste uzunluğuna bağlı olarak isteğe bağlı virgül) ile değiştiriyorum.


3

Kobra - 60

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

Cobra'nın List<of T>.joinişlevi, listenin son iki öğesi için farklı bir ayırıcı belirlemenizi sağlar; bu da bu kadar kısa olmasını sağlar.


3

Perl - 59

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

Listeye virgüllerle katılır, ardından listede birden fazla öğe ' and'varsa, son virgülden sonra ekler (eğer uzunluk> = 3 ise) veya son virgül onunla değiştirilirse (uzunluk ==2 ise).


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

Yıllar önce http://www.christopherbloom.com/2011/05/21/join-implode-an-array-of-string-values-with-formatting/ adresinde yazdığım bir işleve dayanarak


Lütfen kodunuzu (Oxford virgül ile) cevap metnine ekleyebilir misiniz?

Evet üzgünüm. Telefonumdaydım ve kodu düzgün yapıştırmazdı. Masaüstümden güncelleme yapacağım
Chris Bloom

@ Chrisbloom7 eklemek önemsiz olsa bile, cevapta bir olması gereken bir çalışma kodu içermelidir. Ayrıca, amaç kodu olabildiğince küçültmek olduğundan, çalışma kodunu göndermemek puanınızı varolmaz hale getirir.
Gurur haskeller 12:14

Tekrar özür dilerim. CG'de ilk kez poster. Cevabımı düzelttim
Chris Bloom

3

Toplu İş - 151 Bayt

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

Not; Eğer komut dosyası aramak zorunda cmdolan /volarak anahtar seti onBen uzun dahil etmek zorunda kalmamak için bu, setLocal enableDelayedExpansionsenaryodaki. Aksi takdirde, bayt sayımına 30 ekleyin ve komut dosyasını normal şekilde çağırın.

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]

Dizi karakterleri ile doldurulur yana, yerini alabilir a.size>1tarafındana[1]

JavaScript, ES6:

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

Her iki durumda da değişken a'nın söz konusu diziye sahip olduğunu varsayıyoruz.


6
Oxford virgül , birleşmeden önceki virgüldür.
Dennis,

3

PHP, 86 84 karakter

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

Dizi başlatıldığında saymaya başlarız:

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

Listedeki son öğe değiştirildi. Bu tamam olmalı, çünkü PHP'de dizi ataması ve işlev çağrıları kopya gerçekleştirir.


3

CJam, 35 30 28 27 bayt

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

Bu, STDIN'den okuyan ve STDOUT'a basan bir programdır. Çevrimiçi deneyin.

Nasıl çalışır

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

Örnek çalışma

$ 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

:-) aşağıya bakınız - Ben kuyruğunda değilim
abligh

3

Google Sayfaları, 67 68 67 92 bayt

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

Girdi, hücrede başlar A1ve bir çok girdi için devam eder.
JOINhepsini, her biri arasında virgül boşluğu olan bir dizgede birleştirir.
FILTERboşlukları kaldırır, böylece sonunda sonsuz virgül kalmaz.
SUBSTITUTESon virgenin yerine geçer ( COUNTAboş olmayan girişleri sayarak bulunur ).

Çok heyecan verici değil ama tek bir hücrede yapılabilir.


Bu oxford virgül bırakır.
Şemsiye

@Şemsiye, Bu benim aptallıktı, değil mi? +1 bayt
Mühendis Tost

Terminali )-1 bayt için bu formülün dışına bırakabilmelisiniz ; Pekala, bu şimdiye kadar gördüğüm en hızlı kurgundu +1
Taylor Scott

Bunu test ettikten sonra iki nota - A:A>""dönüştürülmeli A:A<>""ve bu sadece 2 nesnenin durumunda oxford virgülünün çıkarılmasını uygulamamaktadır
Taylor Scott,

@TaylorScott Sanırım sadece metinle test ettim ve konuyu özledim >"". Daha önce açıkça yaptığım hızlı düzeltme test edilmedi. Ben yönde sevmiyorum ... gitti
Mühendis Tost

2

JavaScript (ES6) 60

Giriş dizisinde boş dize olmadığı varsayımı

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

FireFox / Firebug konsolunda test edin

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

Çıktı

 We invited the stripper, JFK, and Stalin

Bunu nasıl çalıştırırım? node --harmonyBir dizi dizeyle denedim var a = 'abcdefgh'.split('');, ama orada bir ile oturuyor ...ve hiçbir şey yapmıyor gibi görünüyor. Ayrıca benzersiz ES6 özelliğini kullanmak için +1 ()=>.
Adrian

@Adrian işlevi herhangi bir çıktısız bir dize döndürür. Cevapta bir test ekleyeceğim.
edc65

Bence f=(a,b=a.pop())=>a[0]?a.join(', ')+', and '+b:bde doğru ve 13 bayt daha kısa.
Ingo Bürk

1
@ 2 maddeli virgülle çalışan kısmı kesen IngoBürk. Bil bakalım ne oldu? 2 öğe ile çıktı yanlış.
edc65

@ edc65 Ah, ooh. Kötü olabilir.
Ingo Bürk

2

JavaScript - 60 56 71 67 63

Tam olarak aptalca bir yaklaşım değil, ama yazarken eğlendim ve regex'i seviyorum.

Dizinin saklandığı varsayılarak var a:

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

Sadece endeksi kontrol ederek kısaltılmış [2]: (yay boolean zorlama)

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

Görünüşe göre test emmek ve bir tek giriş testi atladı. İşte sabit sürüm:

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

Boole'larımı tersine çevirerek 2 kareyi kazın ve 3 tane daha uzayı ilk üçlünün / sonrasına taşıyarak alanı boşaltın:

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

JS, benim için yaptığı için, booleans'ımı zorlamak zorunda olmadığımı hatırlattığım için @tomsmeding'e teşekkür ederim. Ayrıca, ilk üçlüyü, içindeki içindekilerden ayıran parantezleri çıkarmayı unuttuğumu da farkettim join():

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

Bunu doğru yaptım mı? Zorunlu yeni golfçü özürü.


1
Regex sevme mazoşizm olarak bilinir.
seequ

Aslında hiç ihtiyacın yoktu !!; a[2]?A:Bzaten çalışıyor. Booleanlerinizi tekrar ters çevirmek zorunda kalabilirsiniz .
14'te

@tomsmeding - haklısın. Ben her zaman JavaScript'in varsayılan boole zorlama davranışına karşı temkinli davranıyorum, bu yüzden boole'larımı manuel olarak zorlama alışkanlığım var ...
Adrian

@Adrian Düzeltme: herhangi bir değere ancak boş bir dize için, a[i]eşittir gerçek . Neredeyse. 2 giriş alırsanız, dizinizin iki uzunluğu olduğunu varsayıyorum. Sonra a[2]===undefinedve undefineddeğerlendirir false. DÜZENLEME: Düzenlemeniz ne demek istediğim :)
14:14

2

Golf Betiği - 31 39 34 30

Selam Dünya! Ben uzun zamandır bir avukatım, ilk defa posterim. Golfscript'teki 30 baytlık çözümüm ([1 2 3] dizisinin zaten yığında olduğu gibi).

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

Sonuçlar tüm test durumları için uygundur.

EDIT: Al şunu, CJam!


Uzunluk 1 dizisi için hesap düzenlenir.
Josiah Winslow

Daha verimli bir algoritma için düzenlendi.
Josiah Winslow,

Savaş devam ediyor. : P
Dennis,

Ah, ama şimdi biz eşitiz. : 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," ",", ")

UBound'un dizi uzunluğundan daha küçük olduğunu unutmayın.


Bu, 2 öğe olduğunda virgül ekliyor gibi görünüyor - olmamalı
edc65

İyi yakalama. Düzeltmek için düzenlendi.
silverpie

2

Excel VBA, 108 Bayt

Girdiyi aralıktan alanla sınırlandırılmış dizi olarak alan A1ve VBE anlık penceresine çıkış yapan anonim VBE anlık pencere işlevi .

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

Lisps'teki fonksiyon isimlerini hala golf için çok uzun buluyorum.
seequ 12:14

1

Python 62 karakter

Ben dize listesi olduğunu varsayalım:

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

1

C # 102 Karakterler

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

STDIN'den args alır ve STDOUT'a çıkar

Base.join kullanarak çözüm (öğeler, sınırsız [, son])

Düzenle:

Test durumları

julia oxfordComma.jl 1

1

julia oxfordComma.jl 1 2

1 ve 2

julia oxfordComma.jl 1 2 3

1, 2 ve 3


1
Julia'yı tanımıyorum ama bu Oxford virgülünü yaratmıyor gibi görünüyor.
Flornquake

@flornquake, isteğe bağlı "son" argüman nedeniyle Oxford virgülle
basıyor

2
Öyle olmalı 1, 2, and 3, değil 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
]

Kullanımı:

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

Çevrimiçi deneyin


1

Pyth, 28

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

Örnekler:

$ 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

Girişin nasıl biçimlendirilmesi gerektiğini çözemiyorum.
Dennis,

@Dennis Bazı test durumları ekleyeceğim.
isaacg

Bunu gerçekten denemiştim, ancak Pyth ( TypeError: can only concatenate list (not "str") to list) sürümümle çalışmadı . En son sürümle iyi çalışır.
Dennis,

@Dennis Evet, liste kuralına ekleme oldukça yakın zamanda eklendi.
isaacg,

1

PHP - 72

Girişi ayarlayın:

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

Ve sonra süreç:

$x=count($i)-1;if($x) {$i[$x]=" and ".$i[$x];}echo join($x>1?",":"",$i);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.