Génération d'une seule chaîne avec une virgule Oxford à partir d'une liste

24

Quelles sont les approches intelligentes (brèves et idiomatiques) pour prendre une liste de chaînes et renvoyer une seule chaîne correctement ponctuée construite à partir de la liste, avec chaque élément cité.

Cela m'est venu en expérimentant avec Groovy , pour lequel ma solution trop littérale, mais illustrative est

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
}

Autrement dit, ['1']devrait céder '1', ['1','2']devrait céder '1 and 2', [voyez ce que j'ai fait là-bas?] Et ['1','2','3']devrait céder '1, 2, and 3'.

J'ai de bonnes réponses pour Groovy, mais j'aimerais voir ce que d'autres langues peuvent faire.

Quelles sont les approches intelligentes compactes dans diverses langues qui tirent parti des fonctionnalités et des idiomes de ces langues?

orome
la source
6
Bienvenue chez PPCG. Généralement, les questions affichées ici sont des défis pour la communauté. En tant que tels, ils ont besoin d'un critère de gain objectif. Je crois que cette question correspond assez bien à un défi de code-golf . Pouvez-vous le marquer comme tel? Si c'est le cas, je pense que vous devriez resserrer un peu les spécifications d'entrée et de sortie.
Digital Trauma
7
Ce serait plus intéressant avec de vraies phrases :['we invited the stripper','JFK','Stalin']
ThisSuitIsBlackNot
1
Pouvons-nous supposer que les chaînes elles-mêmes ne contiennent pas déjà de virgules?
Martin Ender
2
Le défi aurait dû être intitulé "Qui donne une ---- sur une virgule d'Oxford ?"
Igby Largeman
3
@OldCurmudgeon Je pense que vous voulez dire "détritus américanisés";)
ThisSuitIsBlackNot

Réponses:

76

CSS, 132 116 115 octets

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

CSS n'est pas vu trop souvent dans le golf de code car il ne peut que formater du texte, mais il fonctionne réellement pour ce défi et j'ai pensé que ce serait amusant à faire. Voyez-le en action en utilisant l'extrait de code ci-dessus (cliquez sur "Afficher l'extrait de code").

La liste doit être dans un fichier HTML lié avec chaque élément entouré de <a>balises et séparé par des sauts de ligne. Les éléments de la liste doivent être les seuls éléments de leur élément parent, par exemple

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

Explication

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

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

Prenons la version non golfée ci-dessus. Si vous n'êtes pas familier avec le fonctionnement de CSS, tout ce qui se trouve en dehors des accolades est un sélecteur qui détermine l'ensemble des éléments HTML auxquels s'appliquent les déclarations à l'intérieur des accolades. Chaque paire sélecteur-déclaration est appelée une règle . (C'est plus compliqué que cela, mais suffira pour cette explication.) Avant d'appliquer un style, la liste apparaît séparée uniquement par des espaces.

Nous voulons ajouter des virgules après chaque mot, sauf le dernier, à l'exception des listes de deux mots, qui n'obtiennent aucune virgule. Le premier sélecteur,, a:not(:last-child):nth-child(n+2):aftersélectionne tous les éléments à l'exception du premier et du dernier. :nth-child(n+2)est une façon plus courte de dire :not(:first-child), et cela fonctionne essentiellement en sélectionnant des éléments dont l'index (à partir de 1) est supérieur ou égal à 2. (Oui, cela m'embrouille encore un peu. Les documents MDN pourraient aider.)

Il nous suffit maintenant de sélectionner le premier élément pour obtenir une virgule s'il y a trois éléments ou plus au total. a:nth-last-child(n+3):afterfonctionne comme :nth-child, mais en comptant de l'arrière, donc il sélectionne tous les éléments sauf les deux derniers. La virgule prend l'union des deux ensembles, et nous utilisons le :after pseudo-élément pour ajouter contentimmédiatement après chaque élément sélectionné.

La deuxième règle est plus simple. Nous devons ajouter "et" avant le dernier élément de la liste, sauf s'il s'agit d'un seul élément. En d'autres termes, nous devons sélectionner le dernier élément précédé d'un autre élément. +est le sélecteur frère adjacent en CSS.

NinjaBearMonkey
la source
1
Brillant! J'aime cela. : D
COTO
Si seulement vous utilisiez <li>.
slebetman
1
<li>serait idéal, mais cela ajouterait deux caractères supplémentaires aux sélecteurs. J'ai choisi <a>car il s'agit d'une seule lettre et n'applique pas sa propre mise en forme.
NinjaBearMonkey
Wow ... c'est très impressionnant. Prix ​​de l'intelligence.
CSS comme première réponse? Agréable.
Brandon
13

Haskell: 81, 77 74 caractères

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

Caractéristiques Haskell: Correspondance de motifs

user3389669
la source
Vous pouvez supprimer certains espaces
Ray
1
Vous pouvez simplement supprimerf[x,y,z]
seequ
Et maintenant, c'est à peu près la récursivité standard. :)
seequ
vous avez oublié la virgule et les espaces d'Oxford après les virgules - f["a","b","c"]est censé l'être, "a, b, and c"mais c'est le cas"a,b and c"
fier haskeller
4
que diriez-vous de jouer au golf en remplaçant y++", and "++zpar f[y++",",z]:)
fier haskeller
7

Rubis, 47 octets

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

Explication

  • Les entrées sont les arguments de ligne de commande ( $*).
  • Quand $*a un troisième élément ( $*[2]ne renvoie pas nil), prenez tous les éléments moins le dernier et transformez-les en une chaîne séparée par des virgules à l'aide de Array#*. Enfin, ajoutez une virgule supplémentaire, la chaîne " and "et le dernier argument de ligne de commande.
  • Lorsqu'il $*n'y a pas de troisième élément, deux, un ou zéro arguments ont été donnés. Les arguments peuvent être joints en toute sécurité à la chaîne " and "et produire le résultat correct.
britishtea
la source
6

Python 2 (61)

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

L'astuce principale est de couper une partie du menuisier final ", and "pour un et deux éléments. Pour un, tout est coupé, et pour deux, la virgule est supprimée. Cela se fait en découpant [8-7*len(s):](en notant que sc'est un plus court après le pop).

Malheureusement, dne peut pas simplement être remplacé par son expression ou popcela arriverait trop tard.

xnor
la source
Vous pouvez remplacer le premier spar s=input()et supprimer la première ligne, si je ne me trompe pas. Enregistre 2 caractères.
tomsmeding
@tomsmeding Je ne comprends pas ce que vous proposez. Le code fait référence à splusieurs fois.
xnor
Attends, je fais des trucs bizarres ce matin. Oublie ça. :)
tomsmeding
6

CSS, 62 caractères 112 caractères

Inspiré des autres entrées, encore plus court. Notez qu'il nécessite que les éléments A ne soient pas séparés par des espaces blancs:

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

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

Correction du "un et deux", comme l'a souligné 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/

olvlvl
la source
5

Perl (v 5.10+) - 37 35 34 28

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

pour être exécuté avec perl -ape, l'espace de liste fourni étant séparé STDIN.

Sortie pour différentes entrées:

$ 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
abligh
la source
Vous pouvez réduire cela de 3 octets en remplaçant votre dernière substitution pars/(\S+)$/and $1/
ThisSuitIsBlackNot
1
@ThisSuitIsBlackNot Vous pouvez supprimer le '\ n' (merci), mais vous ne pouvez pas supprimer les espaces, ou une entrée de "x" devient "et x"
abligh
Oups, aurait dû tester avec plus d'entrées. Quoi qu'il en soit, vous avez oublié l' $ancre dans votre modification, donc une entrée de foo bar bazdevient foo, and bar, baz. En outre, vous pouvez supprimer l' un des espaces en faisants/( \S+)$/ and$1/
ThisSuitIsBlackNot
Mon dernier commentaire vous laisse encore à 35 ans, mais vous pouvez écrire $#F>1que de @F>2se raser un plus. Désolé pour toutes les suggestions d'améliorations micro, j'aime vraiment cette réponse :)
ThisSuitIsBlackNot
@ThisSuitIsBlackNot pas du tout - les microédits sont les bienvenus. Je suis en compétition secrète avec 28 octets de CJam et 30 octets de Golfscript. Cependant, je suis arrivé à 34 sans faire la traduction de votre commentaire avant la dernière fois (testé avec echo -n ... | wc -c). Si vous manquez l'espace avant (\S+)d'obtenir 33 caractères, mais si vous insérez, test thisvous obtiendrez test and this(deux espaces après test), donc sans plus Je pense que c'est faux.
abligh
4

Javascript (63)

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

Cas:

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

Mise en garde: cela modifiera le dernier élément d'un tableau de longueur> 2.

mway
la source
2
Bonne utilisation de&&
Chris Bloom
4

GNU sed - 69 caractères dont 1 pour le -rdrapeau

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

Prend une liste séparée par des espaces (assez idiomatique pour les scripts shell).

Exemple

$ 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
$
Traumatisme numérique
la source
Oui, allons-y avec le code-golf .
orome
La deuxième sortie devrait être 1 and 2au lieu de1, 2
Optimizer
@Optimizer - tout à fait raison. Fixé.
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]

Nombre de caractères incluant les deux, inputet print.

Falko
la source
3

Rubis, 57 octets

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

Je rejoins la chaîne avec ,puis je remplace la dernière virgule de la chaîne par un and(et une virgule facultative en fonction de la longueur de la liste).

Martin Ender
la source
3

Cobra - 60

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

La List<of T>.joinfonction de Cobra vous permet de spécifier un séparateur différent pour les deux derniers éléments de la liste, ce qui rend cela si court.

Οurous
la source
3

Perl - 59

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

Joint la liste avec des virgules, puis si la liste a plus d'un élément, soit ajoute ' and'après la dernière virgule (si longueur> = 3), ou remplace la dernière virgule par elle (si longueur == 2).

faubi
la source
3

PHP, 192 167 146 136 136 caractères:

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

Basé sur une fonction que j'ai écrite il y a des années à http://www.christopherbloom.com/2011/05/21/join-implode-an-array-of-string-values-with-formatting/

Chris Bloom
la source
Pouvez-vous s'il vous plaît mettre votre code (avec des virgules Oxford) dans le texte de la réponse?
Oui désolé. J'étais sur mon téléphone et il ne collait pas le code correctement. Je vais mettre à jour depuis mon bureau
Chris Bloom
@ Chrisbloom7 même s'il est insignifiant à ajouter, la réponse devrait inclure un code de travail, pas un qui puisse être fait pour être un. aussi, parce que l'objectif est de rendre le code aussi petit que possible, ne pas publier de code de travail rend votre score inexistant.
fier haskeller du
Toutes mes excuses. Première affiche au CG. J'ai corrigé ma réponse
Chris Bloom
3

Lot - 151 octets

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

Remarque; vous devez appeler le script cmdavec le /vcommutateur défini comme on, c'est ainsi je n'ai pas à inclure le long setLocal enableDelayedExpansiondans le script. Sinon, ajoutez 30 au nombre d'octets et appelez le script normalement.

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
dégrader
la source
3

Groovy, 47 43 57 caractères, JavaScript ES6 56 caractères

Sensationnel:

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

Puisque le tableau est rempli de caractères, nous pouvons remplacer a.size>1 para[1]

JavaScript, ES6:

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

Les deux cas supposent que la variable a a le tableau en question.

Optimiseur
la source
6
La virgule d'Oxford est la virgule avant la conjonction.
Dennis
3

PHP, 86 84 caractères

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

Avec le tableau initialisé, nous commençons à compter:

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

Prettifié:

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

Le dernier élément de la liste est modifié. Cela devrait être correct car en PHP, les affectations de tableaux et les appels de fonction effectuent des copies.

Damian Yerrick
la source
3

CJam, 35 30 28 27 octets

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

Il s'agit d'un programme qui lit depuis STDIN et imprime vers STDOUT. Essayez-le en ligne.

Comment ça marche

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

Exemple d'exécution

$ 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
Dennis
la source
Je suis sur ta queue - voir ci-dessous :-)
abligh
3

Google Sheets, 67 68 67 92 octets

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

L'entrée commence à la cellule A1et continue vers le bas pour autant d'entrées existent.
JOINles fusionne tous en une chaîne avec un espace virgule entre chacun.
FILTERsupprime tous les non-blancs afin que vous ne vous retrouviez pas avec des virgules infinies à la fin.
SUBSTITUTEremplace la dernière virgule (trouvée parCOUNTA comptant les entrées non vides).

Ce n'est pas très excitant mais c'est faisable dans une seule cellule.

Ingénieur Toast
la source
Cela laisse de côté la virgule d'Oxford.
Umbrella
@ Umbrella Eh bien, c'était stupide de ma part, n'est-ce pas? +1 octets
Engineer Toast
Vous devriez pouvoir supprimer le terminal )de cette formule pour -1 octet; Eh bien dang, c'était le montage le plus rapide que j'aie jamais vu +1
Taylor Scott
Deux notes après avoir testé ceci - A:A>""devraient être converties en A:A<>""et cela n'implémente pas l'omission de la virgule oxford sur les cas de seulement 2 objets
Taylor Scott
@TaylorScott Je suppose que je n'ai jamais testé qu'avec du texte et manqué le problème avec >"". La correction rapide que j'ai faite plus tôt n'a clairement pas été testée. Je n'aime pas la direction qui est allée ...
Engineer Toast
2

JavaScript (ES6) 60

En supposant qu'aucune chaîne vide dans le tableau d'entrée

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

Test dans la console FireFox / Firebug

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

Sortie

 We invited the stripper, JFK, and Stalin
edc65
la source
Comment exécuter cela? Je l'ai essayé node --harmonyavec un tableau de chaînes var a = 'abcdefgh'.split('');, mais il se trouve juste là avec un ...et semble ne rien faire. +1 également pour l'utilisation de la fonction ES6 unique ()=>.
Adrian
@Adrian, la fonction renvoie une chaîne, sans aucune sortie. Je vais ajouter un test dans la réponse.
edc65
Je pense que f=(a,b=a.pop())=>a[0]?a.join(', ')+', and '+b:bc'est aussi correct et 13 octets plus court.
Ingo Bürk
1
@ IngoBürk qui coupe la partie qui gère la virgule avec 2 éléments. Devine quoi? Avec 2 éléments, la sortie est incorrecte.
edc65 du
@ edc65 Ah, d'oh. Peut mal.
Ingo Bürk du
2

JavaScript - 60 56 71 67 63

Pas exactement une approche idiomatique, mais je me suis amusé à l'écrire et j'aime l'expression régulière.

En supposant que le tableau est stocké dans var a:

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

Raccourci en vérifiant simplement l'index [2]: (yay coercition booléenne)

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

Apparemment, je suis nul lors des tests et j'ai sauté un test à entrée unique. Voici la version fixe:

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

Rasé 2 caractères en inversant mes booléens et 3 autres en déplaçant l'espace de la concaténation dans le puis / sinon du premier ternaire:

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

Merci à @tomsmeding de m'avoir rappelé que je n'ai pas à contraindre mes booléens car JS le fait pour moi. J'ai également réalisé que j'avais oublié de supprimer les parenthèses séparant le premier ternaire de la concaténation à l'intérieur du join():

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

Est-ce que j'ai bien fait ça? Nouvelles excuses obligatoires des golfeurs.

Adrian
la source
1
Aimer les regex est connu sous le nom de masochisme.
seequ
En fait, vous n'en aviez pas du tout besoin !!; a[2]?A:Bfonctionne déjà. Vous devrez peut-être inverser à nouveau vos booléens .
tomsmeding
@tomsmeding - vous avez raison. Je me méfie toujours du comportement de coercition booléenne par défaut de JavaScript, j'ai donc l'habitude de contraindre manuellement mes booléens ...
Adrian
@Adrian Correction: pour toute valeur sauf une chaîne vide, a[i]équivaut à true . Enfin presque. Je suppose que si vous obtenez 2 entrées, votre tableau a une longueur de deux. Puis a[2]===undefinedet undefinedévalue à false. EDIT: votre montage est ce que je voulais dire :)
tomsmeding
2

Golfscript - 31 39 34 30

Bonjour le monde! Je suis un rôdeur de longue date, première affiche. Voici ma solution de 30 octets dans Golfscript (étant donné que le tableau tel que [1 2 3] est déjà sur la pile).

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

Les résultats sont valables pour tous les cas de test.

EDIT: Prenez ça, CJam!

Josiah Winslow
la source
Modifié pour tenir compte du tableau de longueur 1.
Josiah Winslow
Modifié pour un algorithme plus efficace.
Josiah Winslow
La bataille continue. : P
Dennis
Ah, mais maintenant nous sommes encore. : P
Josiah Winslow
2

Xojo, 52 71 83 caractères

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

Notez que UBound est un de moins que la longueur du tableau.

silverpie
la source
Cela semble ajouter la virgule lorsqu'il y a 2 éléments - ne devrait pas
edc65
Bonne prise. Modifié pour corriger.
silverpie
2

Excel VBA, 108 octets

Fonction de fenêtre immédiate VBE anonyme qui prend les entrées en tant que tableau délimité par des espaces de la plage A1et les sorties vers la fenêtre immédiate 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]
Taylor Scott
la source
1

Raquette 87

(define(f x)(string-join(map ~a x)", "#:before-last(if(= 2(length x))" and "", and ")))
Matthew Butterick
la source
Je trouve toujours que les noms de fonction dans les lisps sont beaucoup trop longs pour le golf.
seequ
1

Python 62 caractères

En supposant que i est la liste des chaînes:

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

Caractères C # 102

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;
Stephan Schinkel
la source
1

Julia (53 ans)

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

Prend les arguments de STDIN et sort vers STDOUT

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

Modifier:

Cas de test

julia oxfordComma.jl 1

1

julia oxfordComma.jl 1 2

1 et 2

julia oxfordComma.jl 1 2 3

1, 2 et 3

Cruor
la source
1
Je ne connais pas Julia, mais cela semble ne pas générer la virgule d'Oxford.
flornquake le
@flornquake il s'imprime avec la virgule d'Oxford, en raison du "dernier" argument
optionnel
2
Ça devrait l'être 1, 2, and 3, non 1, 2 and 3.
flornquake du
1

Coup de gueule (108)

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

Non golfé:

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

Essayez-le en ligne

Berkin
la source
1

Pyth, 28

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

Exemples:

$ 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
isaacg
la source
Je n'arrive pas à comprendre comment l'entrée doit être formatée.
Dennis
@Dennis Je vais ajouter quelques cas de test.
isaacg
J'avais essayé, mais cela ne fonctionnait pas avec ma version de Pyth ( TypeError: can only concatenate list (not "str") to list). Cela fonctionne très bien avec la dernière version.
Dennis
@ Dennis Ouais, la règle d'ajout à la liste a été ajoutée assez récemment.
isaacg
1

PHP - 72

Configurez l'entrée:

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

Et puis le processus:

$x=count($i)-1;if($x) {$i[$x]=" and ".$i[$x];}echo join($x>1?",":"",$i);
apathie-
la source