Generowanie pojedynczego ciągu z przecinkiem Oxford z listy

24

Jakie są sprytne (krótkie i idiomatyczne) podejścia do pobierania listy ciągów i zwracania pojedynczego, poprawnie interpunkcyjnego ciągu zbudowanego z listy, z każdym cytowanym elementem.

To przyszło mi do głowy podczas eksperymentów z Groovy , dla których moje zbyt dosłowne, ale ilustrujące rozwiązanie jest

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
}

To znaczy, czy ['1']powinien ustąpić '1', ['1','2']powinien ustąpić '1 and 2'[zobacz, co tam zrobiłem?] I ['1','2','3']powinien ustąpić '1, 2, and 3'.

Mam kilka dobrych odpowiedzi dla Groovy, ale chciałbym zobaczyć, co potrafią inne języki.

Jakie są zwięzłe sprytne podejścia w różnych językach, które wykorzystują cechy i idiomy tych języków?

orome
źródło
6
Witamy w PPCG. Zasadniczo zamieszczone tutaj pytania stanowią wyzwanie dla społeczności. Jako takie potrzebują obiektywnych kryteriów zwycięstwa. Uważam, że to pytanie dość dobrze odwzorowuje się jako wyzwanie dla golfisty . Czy możesz to tak oznaczyć? Jeśli tak, uważam, że powinieneś nieco zaostrzyć specyfikacje wejścia i wyjścia.
Digital Trauma
7
To byłoby bardziej interesujące z prawdziwymi zdaniami :['we invited the stripper','JFK','Stalin']
ThisSuitIsBlackNot
1
Czy możemy założyć, że same łańcuchy nie zawierają już przecinków?
Martin Ender
2
Wyzwanie powinno być zatytułowane „Kto daje ---- o przecinku Oxford ?”
Igby Largeman
3
@OldCurmudgeon Myślę, że masz na myśli „amerykanizowane śmieci”;)
ThisSuitIsBlackNot

Odpowiedzi:

76

CSS, 132 116 115 bajtów

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

CSS nie pojawia się zbyt często w golfowym kodzie, ponieważ może formatować tylko tekst, ale tak naprawdę działa w tym wyzwaniu i pomyślałem, że fajnie byłoby to zrobić. Zobacz go w akcji za pomocą powyższego fragmentu (kliknij „Pokaż fragment kodu”).

Lista powinna znajdować się w połączonym pliku HTML z każdym elementem otoczonym <a>znacznikami i oddzielonymi podziałami linii. Elementy listy powinny być jedynymi elementami w ich elemencie nadrzędnym, np

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

Wyjaśnienie

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

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

Rozważmy powyższą wersję bez golfisty. Jeśli nie wiesz, jak działa CSS, wszystko poza nawiasami klamrowymi jest selektorem, który określa zestaw elementów HTML, do których mają zastosowanie deklaracje w nawiasach klamrowych. Każda para deklaracji selektora nazywana jest regułą . (Jest to bardziej skomplikowane, ale wystarczy to wyjaśnienie.) Przed zastosowaniem jakiegokolwiek stylu lista wydaje się być oddzielona tylko spacjami.

Chcemy dodawać przecinki po każdym słowie oprócz ostatniego, z wyjątkiem list dwóch słów, które nie otrzymują przecinków. Pierwszy selektor „ a:not(:last-child):nth-child(n+2):afterwybiera wszystkie elementy oprócz pierwszego i ostatniego. :nth-child(n+2)jest krótszym sposobem powiedzenia :not(:first-child)i działa w zasadzie poprzez wybranie elementów, których indeks (od 1) jest większy lub równy 2. (Tak, nadal mnie trochę myli. Dokumenty MDN mogą pomóc).

Teraz musimy tylko wybrać pierwszy element, aby uzyskać przecinek, jeśli łącznie są trzy lub więcej elementów. a:nth-last-child(n+3):afterdziała jak :nth-child, ale licząc od tyłu, więc zaznacza wszystkie elementy oprócz dwóch ostatnich. Przecinek przyjmuje sumę dwóch zestawów, a my używamy :after pseudoelementu, aby dodać contentbezpośrednio po każdym wybranym elemencie.

Druga zasada jest łatwiejsza. Musimy dodać „i” przed ostatnim elementem na liście, chyba że jest to pojedynczy element. Innymi słowy, musimy wybrać ostatni element poprzedzony innym elementem. +to sąsiedni selektor rodzeństwa w CSS.

NinjaBearMonkey
źródło
1
Znakomity! Kocham to. : D
COTO,
Gdybyś tylko użył <li>.
slebetman
1
<li>byłoby idealne, ale dodałoby to dwa dodatkowe znaki do selektorów. Wybrałem, <a>ponieważ jest to jedna litera i nie stosuje własnego formatowania.
NinjaBearMonkey
Wow ... to jest bardzo imponujące. Nagroda za spryt.
CSS jako najlepsza odpowiedź? Miły.
Brandon
13

Haskell: 81, 77 74 znaków

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

Funkcje Haskell: Dopasowywanie wzorów

użytkownik3389669
źródło
Możesz usunąć niektóre spacje
Ray
1
Możesz po prostu usunąćf[x,y,z]
patrz
A teraz jest to prawie standardowa rekurencja. :)
patrz
zapomniałeś przecinka w Oxfordzie i spacji po przecinkach - f["a","b","c"]ma być, "a, b, and c"ale tak jest"a,b and c"
dumny haskeller
4
jak o golfa poprzez zastąpienie y++", and "++zprzez f[y++",",z]:)
dumną haskeller
7

Ruby, 47 bajtów

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

Wyjaśnienie

  • Dane wejściowe to argumenty wiersza poleceń ( $*).
  • Kiedy $*ma trzeci element ( $*[2]nie zwraca zera), weź wszystkie elementy minus ostatni i zamień je w łańcuch rozdzielany przecinkami za pomocą Array#*. Na koniec dodaj dodatkowy przecinek, ciąg " and "i ostatni argument wiersza poleceń.
  • Gdy $*nie ma trzeciego elementu, podano dwa, jeden lub zero argumentów. Argumenty można bezpiecznie połączyć z ciągiem " and "i uzyskać poprawny wynik.
Britishtea
źródło
6

Python 2 (61)

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

Główną sztuczką jest odcięcie części końcowego łącznika ", and "dla jednego i dwóch elementów. Po pierwsze, wszystko jest wycięte, a po dwa przecinek jest usuwany. Odbywa się to poprzez wycinanie [8-7*len(s):](zauważając, że sjest to jeden raz po nim pop).

Niestety, dnie można go po prostu zastąpić jego wyrażeniem, inaczej popbyłoby to zbyt późno.

xnor
źródło
Można wymienić pierwsze sz s=input()i wyjąć pierwszą linię, jeśli się nie mylę. Zapisuje 2 znaki.
tomsmeding
@tomsmeding Nie rozumiem, co sugerujesz. Kod odnosi się swielokrotnie.
xnor
Czekaj, robię dziś dziwne rzeczy. Zapomnij, że. :)
tomsmeding
6

CSS, 62 znaki 112 znaków

Inspirowane innymi wpisami, nawet krótszymi. Zauważ, że wymaga to, aby elementy A nie były oddzielone białymi spacjami:

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

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

Naprawiono „jeden i dwa”, jak wskazał 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
źródło
5

Perl (wer. 5.10+) - 37 35 34 28

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

do uruchomienia z perl -aperozdzieloną listą spacji STDIN.

Dane wyjściowe dla różnych danych wejściowych:

$ 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
w płomieniach
źródło
Możesz to zmniejszyć o 3 bajty, zmieniając swoje ostatnie podstawienie nas/(\S+)$/and $1/
ThisSuitIsBlackNot
1
@ThisSuitIsBlackNot Możesz upuścić „\ n” (dzięki), ale nie możesz upuścić spacji, lub wejście „x” staje się „i x”
powyżej
Ups, powinienem był przetestować przy większej ilości danych wejściowych. W każdym razie zapomniałeś $kotwicy w swojej edycji, więc wejście foo bar bazstaje się foo, and bar, baz. Możesz także usunąć jedną ze spacji, wykonującs/( \S+)$/ and$1/
ThisSuitIsBlackNot
Mój ostatni komentarz nadal pozostawia na 35, ale można napisać $#F>1jak @F>2ogolił jednego więcej. Przepraszam za wszystkie sugestie dotyczące mikro ulepszeń, po prostu bardzo podoba mi się ta odpowiedź :)
ThisSuitIsBlackNot
@ThisSuitIsBlack Wcale nie - mile widziane mikroedycje. W tajemnicy konkuruję z 28 bajtami CJam i 30 bajtami Golfscript. Jednak doszedłem do 34 bez tłumaczenia twojego komentarza przed ostatnim (testowane z echo -n ... | wc -c). Jeśli przegapisz spację, zanim (\S+)uzyskasz 33 znaki, ale jeśli wstawisz test this, dostaniesz test and this(dwie spacje po test), więc bez więcej Myślę, że to nie tak
pobliżu
4

JavaScript (63)

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

Skrzynie:

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

Zastrzeżenie: zmodyfikuje to ostatni element w tablicy o długości> 2.

machać
źródło
2
Niezłe użycie&&
Chris Bloom
4

GNU sed - 69 znaków, w tym 1 dla -rflagi

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

Pobiera listę rozdzieloną spacjami (dość idiomatyczną dla skryptów powłoki).

Przykład

$ 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
$
Cyfrowa trauma
źródło
Tak, chodźmy z golfem .
orome
Drugie wyjście powinno być 1 and 2zamiast1, 2
Optimizer
@Optimizer - całkiem słusznie. Naprawiony.
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]

Liczba znaków, w tym zarówno, jak inputi print.

Falko
źródło
3

Rubinowy, 57 bajtów

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

Łączę ciąg z, ,a następnie zamieniam ostatni przecinek w ciągu na and(i opcjonalny przecinek w zależności od długości listy).

Martin Ender
źródło
3

Kobra - 60

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

List<of T>.joinFunkcja Cobry pozwala określić inny separator dla dwóch ostatnich elementów listy, co czyni go tak krótkim.

Obrzydliwe
źródło
3

Perl - 59

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

Łączy listę z przecinkami, a jeśli lista zawiera więcej niż jeden element, albo dodaje ' and'po ostatnim przecinku (jeśli długość> = 3), albo zastępuje go ostatnim przecinkiem (jeśli długość == 2).

faubi
źródło
3

PHP, 192 167 146 136 znaków:

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

Na podstawie funkcji, którą napisałem lata temu na http://www.christopherbloom.com/2011/05/21/join-implode-an-array-of-string-values-with-formatting/

Chris Bloom
źródło
Czy możesz wstawić kod (z przecinkami Oxford) w tekście odpowiedzi?
Tak, przepraszam. Rozmawiałem przez telefon i kod nie byłby poprawnie wklejany. Będę aktualizować z mojego pulpitu
Chris Bloom
@ Chrisbloom7, nawet jeśli dodawanie go jest trywialne, odpowiedź powinna zawierać działający kod, a nie taki, który można uczynić jednym. ponieważ celem jest zmniejszenie kodu do minimum, brak opublikowania działającego kodu spowoduje, że wynik nie będzie istniał.
dumny haskeller
Jeszcze raz przepraszam. Pierwszy raz plakat w CG. Naprawiłem swoją odpowiedź
Chris Bloom
3

Partia - 151 bajtów

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

Uwaga; trzeba zadzwonić skrypt z cmdze /vzbioru jako switch on, to tak nie mam na to zbyt długi setLocal enableDelayedExpansionw skrypcie. W przeciwnym razie dodaj 30 do liczby bajtów i wywołaj skrypt normalnie.

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
nieprzyzwoity
źródło
3

Groovy, 47 43 57 znaków, JavaScript ES6 56 znaków

Groovy:

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

Ponieważ tablica jest wypełniona znaków, możemy zastąpić a.size>1przeza[1]

JavaScript, ES6:

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

W obu przypadkach założono, że zmienna a ma omawianą tablicę.

Optymalizator
źródło
6
Przecinek Oxford jest przecinkiem przed koniunkcją.
Dennis
3

PHP, 86 84 znaków

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

Po zainicjowaniu tablicy zaczynamy odliczać:

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

Ostatni element na liście został zmodyfikowany. Powinno to być OK, ponieważ w PHP przypisania tablic i wywołania funkcji wykonują kopie.

Damian Yerrick
źródło
3

CJam, 35 30 28 27 bajtów

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

Jest to program, który czyta ze STDIN i drukuje do STDOUT. Wypróbuj online.

Jak to działa

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

Przykładowy przebieg

$ 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
źródło
Jestem na twoim ogonie - patrz poniżej :-)
powyżej
3

Arkusze Google, 67 68 67 92 bajtów

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

Dane wejściowe zaczynają się od komórki A1i są kontynuowane w dół, mimo że istnieje wiele wpisów.
JOINscala je wszystkie w ciąg znaków z przecinkiem między nimi.
FILTERusuwa wszelkie niepuste znaki, dzięki czemu nie kończą się nieskończonymi przecinkami na końcu.
SUBSTITUTEzastępuje ostatni przecinek (znaleziony przez COUNTAzliczenie niepustych danych wejściowych).

Nie jest to zbyt ekscytujące, ale można to zrobić w pojedynczej komórce.

Inżynier Toast
źródło
To pomija przecinek z Oxfordu.
Parasol
@Umbrella Cóż, to było dla mnie głupie, prawda? +1 bajty
Inżynier Toast
Powinieneś być w stanie porzucić terminal )z tej formuły dla -1 bajtów; Cholera, to była najszybsza edycja, jaką kiedykolwiek widziałem +1
Taylor Scott,
Dwie notatki po przetestowaniu tego - A:A>""należy przekonwertować na A:A<>""to i nie wprowadza się pominięcia przecinka oxford w przypadku tylko 2 obiektów
Taylor Scott
@TaylorScott Wydaje mi się, że kiedykolwiek testowałem tylko z tekstem i nie udało mi się rozwiązać problemu >"". Szybka korekta, którą zrobiłem wcześniej, najwyraźniej nie została przetestowana. Nie podoba mi się kierunek, w którym poszło ...
Inżynier Toast
2

JavaScript (ES6) 60

Zakładając, że nie ma pustych ciągów w tablicy wejściowej

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

Przetestuj w konsoli FireFox / Firebug

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

Wydajność

 We invited the stripper, JFK, and Stalin
edc65
źródło
Jak to uruchomić? Próbowałem tego node --harmonyz szeregiem ciągów var a = 'abcdefgh'.split('');, ale po prostu tam jest ...i wydaje się, że nic nie robi. Również +1 za użycie unikalnej funkcji ES6 ()=>.
Adrian
@Adrian funkcja zwraca ciąg, bez żadnych danych wyjściowych. Dodam test w odpowiedzi.
edc65
Myślę, że f=(a,b=a.pop())=>a[0]?a.join(', ')+', and '+b:bjest również poprawny i 13 bajtów krótszy.
Ingo Bürk,
1
@ IngoBürk, który tnie część, która obsługuje przecinek, mając 2 elementy. Zgadnij co? Przy 2 elementach wyjście jest nieprawidłowe.
edc65
@ edc65 Ah, d'oh. Może źle.
Ingo Bürk,
2

JavaScript - 60 56 71 67 63

Nie do końca idiomatyczne podejście, ale dobrze się pisałem i lubię wyrażenia regularne.

Zakładając, że tablica jest przechowywana w var a:

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

Skrócony przez proste sprawdzenie indeksu [2]: (yay boolean coercion)

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

Najwyraźniej jestem do kitu i pominąłem test pojedynczego wejścia. Oto poprawiona wersja:

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

Ogoliłem 2 znaki, odwracając moje booleany i 3 kolejne, przenosząc przestrzeń z konkatenacji do ówczesnej / trzeciej pierwszej trójki:

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

Dzięki @tomsmeding za przypomnienie mi, że nie muszę zmuszać moich booleanów, ponieważ JS robi to za mnie. Uświadomiłem sobie również, że zapomniałem usunąć nawiasy oddzielające pierwszą trójskładnikową od konkatenacji wewnątrz join():

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

Czy zrobiłem to dobrze? Obowiązkowe nowe przeprosiny dla golfistów.

Adrian
źródło
1
Lubienie wyrażenia regularnego jest znane jako masochizm.
patrz
Właściwie wcale nie potrzebujesz !!; a[2]?A:Bjuż działa. Może trzeba odwrócić swoje wartości logicznych ponownie .
tomsmeding
@tomsmeding - masz rację. Zawsze obawiam się domyślnego zachowania wymuszonego logicznego JavaScript, więc mam zwyczaj ręcznego wymuszania moich boolean ...
Adrian
@Adrian Correction: dla dowolnej wartości oprócz pustego ciągu a[i]odpowiada prawdzie . Cóż prawie. Zakładam, że jeśli otrzymasz 2 wejścia, twoja tablica ma długość dwa. Następnie a[2]===undefinedi undefinedocenia false. EDYCJA: chodziło mi o twoją edycję :)
tomsmeding
2

Golfscript - 31 39 34 30

Witaj świecie! Jestem lurkerem od dawna, plakatu po raz pierwszy. Oto moje 30-bajtowe rozwiązanie w Golfscript (biorąc pod uwagę, że tablica taka jak [1 2 3] jest już na stosie).

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

Wyniki są właściwe dla wszystkich przypadków testowych.

EDYCJA: Weź to, CJam!

Josiah Winslow
źródło
Edycja uwzględniająca tablicę o długości 1.
Josiah Winslow
Edytowano dla bardziej wydajnego algorytmu.
Josiah Winslow,
Bitwa trwa. : P
Dennis
Ach, ale teraz jesteśmy kwita. : P
Josiah Winslow,
2

Xojo, 52 71 83 znaków

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

Zauważ, że UBound jest o jeden mniejszy niż długość tablicy.

srebrnik
źródło
To wydaje się dodawać przecinek, gdy są 2 elementy - nie powinny
edc65
Dobry chwyt Edytowane, aby naprawić.
silverpie
2

Excel VBA, 108 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe jako tablicę rozdzielaną spacjami od zakresu A1i danych wyjściowych do bezpośredniego okna 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
źródło
1

Rakieta 87

(define(f x)(string-join(map ~a x)", "#:before-last(if(= 2(length x))" and "", and ")))
Matthew Butterick
źródło
Nadal uważam, że nazwy funkcji w seplenienie są zbyt długie do gry w golfa.
patrz
1

Python 62 znaki

Zakładając, że i jest listą ciągów:

(" and", ", and")[len(i) < 2].join(", ".join(i).rsplit(",",1))
głęboko
źródło
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;
Stephan Schinkel
źródło
1

Julia (53)

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

Pobiera argumenty ze STDIN i wysyła do STDOUT

Rozwiązanie za pomocą Base.join (przedmioty, delim [, ostatni])

Edytować:

Przypadki testowe

julia oxfordComma.jl 1

1

julia oxfordComma.jl 1 2

1 i 2

julia oxfordComma.jl 1 2 3

1, 2 i 3

Cruor
źródło
1
Nie znam Julii, ale wygląda na to, że nie generuje przecinka Oxford.
trzęsienie ziemi
@flornquake drukuje za pomocą przecinka Oxford ze względu na opcjonalny „ostatni” argument
Cruor
2
To powinno być 1, 2, and 3, nie 1, 2 and 3.
trzęsienie ziemi
1

Rant (108)

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

Nie golfowany:

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

Stosowanie:

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

Wypróbuj online

Berkin
źródło
1

Pyth, 28

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

Przykłady:

$ 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
źródło
Nie mogę się domyślić, jak należy sformatować dane wejściowe.
Dennis
@Dennis Dodam kilka przypadków testowych.
isaacg
Próbowałem tego, ale to nie działało z moją wersją Pyth ( TypeError: can only concatenate list (not "str") to list). Działa dobrze z najnowszą wersją.
Dennis
@Dennis Tak, reguła dodawania do listy została dodana całkiem niedawno.
isaacg
1

PHP - 72

Skonfiguruj wejście:

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

A potem proces:

$x=count($i)-1;if($x) {$i[$x]=" and ".$i[$x];}echo join($x>1?",":"",$i);
apatia-
źródło