목록에서 Oxford 쉼표로 ​​단일 문자열 생성


24

문자열 목록을 가져 와서 각 요소를 인용하여 목록에서 작성된 올바르게 잘린 문자열을 반환하는 영리한 (간결하고 관용적) 접근 방법은 무엇입니까?

하면서 나에게 와서 그루비 실험을 내 너무 문자 그대로,하지만 설명 해결책이있는,

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
}

즉, ['1']산출한다 '1', ['1','2']양보해야 '1 and 2'하고, [내가?이 무슨 짓을했는지보기] ['1','2','3']산출한다 '1, 2, and 3'.

Groovy에 대한 좋은 답변이 있지만 다른 언어가 무엇을 할 수 있는지 알고 싶습니다.

해당 언어의 기능과 숙어를 활용하는 다양한 언어의 간결한 영리한 접근 방법 은 무엇입니까 ?


6
PPCG에 오신 것을 환영합니다. 일반적으로 여기에 게시 된 질문은 커뮤니티에 대한 문제입니다. 따라서 그들은 객관적인 승리 기준이 필요합니다. 나는이 질문이 코드 골프 도전에 합리적으로 잘 어울린다고 생각합니다 . 태그를 지정할 수 있습니까? 그렇다면 입력 및 출력 사양을 약간 강화해야한다고 생각합니다.
Digital Trauma

7
이것은 실제 문장 과 함께 더 재미있을 것입니다 :['we invited the stripper','JFK','Stalin']
ThisSuitIsBlackNot

1
문자열 자체에 쉼표가 포함되어 있지 않다고 가정 할 수 있습니까?
Martin Ender

2
도전 과제는 "누가 옥스포드 쉼표 에 대해 ---- "
Igby Largeman

3
난 당신이 "미국화 쓰레기"를 의미하는 생각 @OldCurmudgeon)
ThisSuitIsBlackNot

답변:


76

CSS, 132 (116) 115 바이트

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

CSS는 텍스트를 형식화 할 수 있기 때문에 코드 골프에서 너무 자주 보이지는 않지만 실제로이 과제에 적합하며 재미 있다고 생각했습니다. 위의 스 니펫을 사용하여 실제로 확인하십시오 ( "코드 스 니펫 표시"클릭).

목록은 각 요소가 <a>태그 로 묶여 있고 줄 바꿈으로 구분 된 연결된 HTML 파일에 있어야합니다 . 목록 항목은 상위 요소의 유일한 요소 여야합니다. 예 :

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

설명

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

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

위의 ungolfed 버전을 고려해 봅시다. CSS의 작동 방식에 익숙하지 않은 경우 중괄호 외부의 모든 항목은 중괄호 안의 선언이 적용되는 HTML 요소 세트를 결정하는 선택기입니다. 각 선택자 선언 쌍을 규칙 이라고합니다 . (이보다 더 복잡하지만이 설명으로는 충분합니다.) 스타일이 적용되기 전에 목록은 공백으로 구분되어 나타납니다.

쉼표가없는 두 단어 목록을 제외하고 마지막 단어를 제외한 모든 단어 뒤에 쉼표를 추가하려고합니다. 첫 번째 선택기 a:not(:last-child):nth-child(n+2):after는 첫 번째와 마지막을 제외한 모든 요소를 ​​선택합니다. :nth-child(n+2)는 짧은 표현 방법이며 :not(:first-child)기본적으로 색인 (1에서 시작)이 2 이상인 요소를 선택하면 작동합니다 (예, 여전히 조금 혼란 스럽습니다. MDN 문서 가 도움이 될 수 있습니다).

이제 총 3 개 이상의 요소가있는 경우 쉼표를 얻으려면 첫 번째 요소 만 선택하면 됩니다. a:nth-last-child(n+3):after처럼 작동 :nth-child하지만 뒤에서 세기 때문에 마지막 두 요소를 제외한 모든 요소를 ​​선택합니다. 쉼표는 두 세트의 합집합을 취하고 :after 의사 요소 를 사용하여 content선택한 각 요소 바로 뒤에 추가 합니다.

두 번째 규칙이 더 쉽습니다. 단일 요소가 아닌 경우 목록의 마지막 요소 앞에 "and"를 추가해야합니다. 즉, 다른 요소가 앞에 오는 마지막 요소를 선택해야합니다. +는 IS 인접 형제 선택기 CSS에서이.


1
훌륭한! 나는 그것을 좋아한다. : D
COTO

을 사용하는 경우에만 <li>.
slebetman

1
<li>이상적이지만 선택기에 두 개의 추가 문자가 추가됩니다. <a>한 글자이기 때문에 선택했고 자체 서식을 적용하지 않았습니다.
NinjaBearMonkey

와우 ... 이것은 매우 인상적입니다. 영리 상.

최고의 답변으로 CSS? 좋은.
Brandon

13

하스켈 : 81, 77 74 문자

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

Haskell 기능 : 패턴 매칭


일부 공백을 제거 할 수 있습니다
Ray

1
당신은 그냥 제거 할 수 있습니다f[x,y,z]
seequ

그리고 지금은 거의 표준 재귀입니다. :)
seequ

- 당신은 쉼표 후 옥스포드 쉼표와 공백을 잊어 f["a","b","c"]있어야하는데 "a, b, and c"그러나 그것은이다"a,b and c"
자랑 haskeller

4
어떻게 대체하여 골프에 대한 y++", and "++z함으로써 f[y++",",z]:
자랑 haskeller을

7

루비, 47 바이트

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

설명

  • 입력은 명령 행 인수 ( $*)입니다.
  • $*세 번째 요소 (이 $*[2]전무를 반환하지 않습니다), 모든 요소를 뺀 마지막을 가지고 사용하여 쉼표로 구분 된 문자열로를 켭니다 Array#*. 마지막으로 쉼표, 문자열 " and "및 마지막 명령 줄 인수를 추가하십시오.
  • 경우 $*에는 세 번째 요소가 없다, 둘, 하나, 제로 인수가 주어졌다. 인수는 문자열 " and "과 안전하게 결합되어 올바른 결과를 생성 할 수 있습니다.

6

파이썬 2 (61)

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

주요 요령은 ", and "하나와 두 개의 요소에 대한 최종 결합 자 부분을 잘라내는 것 입니다. 하나는 모두 잘리고 두 번째는 쉼표를 제거합니다. 이것은 슬라이싱하여 수행됩니다 [8-7*len(s):]( . s다음에 짧아짐 pop).

불행히도, d그 표현으로 대체 될 수 없거나 pop너무 늦게 일어날 수 있습니다.


첫 번째 대체 할 수있는 s과를 s=input()내가 틀리지 않는 경우, 첫 번째 줄을 제거합니다. 2자를 저장합니다.
tomsmeding

@tomsmeding 나는 당신이 제안하는 것을 이해하지 못합니다. 코드는 s여러 번 참조하고 있습니다.
xnor

잠깐, 오늘 아침에 이상한 일을 해요. 잊어 버려 :)
초에 tomsmed

6

CSS, 62 자 112 자

더 짧은 다른 항목에서 영감을 얻었습니다. A 요소는 공백으로 분리하지 않아야합니다.

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

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

Dennis가 지적한대로 "1과 2"를 수정하십시오.

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

펄 (v 5.10+)- 37 35 34 28

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

실행되는 perl -ape목록 제공된 공간에 분리와 함께 STDIN.

다양한 입력을위한 출력 :

$ 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

당신은 당신의 마지막 대체를 변경하여 3 바이트로이 문제를 줄일 수 있습니다s/(\S+)$/and $1/
ThisSuitIsBlackNot

1
@ThisSuitIsBlackNot '\ n'(감사)을 제거 할 수 있지만 공백을 제거 할 수 없거나 "x"의 입력이 "and x"가됩니다.
abligh

죄송합니다. 더 많은 입력을 테스트해야합니다. 어쨌든 $편집 에서 앵커 를 잊어 버렸 으므로 입력 foo bar bazfoo, and bar, baz입니다. 또한 다음 을 수행하여 공백 중 하나 를 제거 할 수 있습니다.s/( \S+)$/ and$1/
ThisSuitIsBlackNot

내 마지막 코멘트는 여전히 35에서 당신을 잎,하지만 당신은 쓸 수 $#F>1@F>2더 하나 떨어져 면도한다. 마이크로 개선에 대한 모든 죄송 제안, 내가 정말 :)이 답변처럼
ThisSuitIsBlackNot

@ThisSuitIsBlack 아무것도 아닙니다. 나는 28 바이트의 CJam과 30 바이트의 Golfscript와 비밀리에 경쟁하고 있습니다. 그러나 나는 테스트 (마지막 전에 주석의 번역을하지 않고 34에 도착 않았다 echo -n ... | wc -c)전에 공간을 그리워합니다. (\S+)당신은 33 개 문자에 도착 싶지만, 당신이에 넣어 경우 test this당신은 얻을 것이다 test and this(두 개의 공백 후 test더없이 그렇게,) 나는 그것이 틀렸다고 생각한다
abligh

4

자바 스크립트 (63)

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

사례 :

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

주의 사항 : 이것은 길이가 2보다 큰 배열의 마지막 요소를 수정합니다.


2
좋은 사용&&
Chris Bloom

4

GNU sed- -r플래그를 위한 1을 포함하여 69 개의 ​​문자

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

공백으로 구분 된 목록을 가져옵니다 (쉘 스크립트의 경우 관용적 임).

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

예, code-golf 와 함께 갑시다 .
orome

두 번째 출력은 다음 1 and 2과 같아야합니다.1, 2
Optimizer

@Optimizer-아주 그렇습니다. 결정된.
Digital Trauma

3

파이썬 2-71, 70 68

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

글자 수는 모두를 포함 input하고 print.


3

루비, 57 바이트

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

문자열을 결합한 다음 문자열 ,의 마지막 쉼표를 and(및 길이에 따라 선택적인 쉼표) 로 바꿉니다 .


3

코브라-60

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

Cobra의 List<of T>.join기능을 사용하면 목록의 마지막 두 요소에 대해 다른 구분 기호를 지정할 수 있습니다.


3

펄-59

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

쉼표로 목록을 조인 한 다음 목록에 둘 이상의 요소가있는 ' and'경우 마지막 쉼표 뒤에 추가하거나 (길이> = 3 인 경우) 마지막 쉼표를 목록으로 대체하십시오 (길이 == 2 인 경우).


3

PHP, 192 개 167 146 136 문자 :

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

몇 년 전에 http://www.christopherbloom.com/2011/05/21/join-implode-an-array-of-string-values-with-formatting/ 에서 작성한 기능을 기반으로합니다 .


옥스포드 쉼표로 코드를 답안 텍스트에 넣을 수 있습니까?

네 죄송합니다. 전화를했는데 코드를 제대로 붙여 넣지 않았습니다. 내 데스크탑에서 업데이트하겠습니다
Chris Bloom

@ Chrisbloom7 추가하는 것이 사소한 경우에도 대답은 작동 코드가 아닌 하나의 작업 코드를 포함해야합니다. 또한 목표는 코드를 최대한 작게 만드는 것이므로 작업 코드를 게시하지 않으면 점수가 존재하지 않습니다.
자랑스런 Haskeller

다시 사과드립니다. CG에서 처음으로 포스터. 내 대답을 수정했습니다
Chris Bloom

3

배치-151 바이트

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

노트; 당신은에서 스크립트를 호출 할 필요가 cmd/v같은 스위치 설정 on나는 긴 포함 할 필요가 없습니다 있도록이이며, setLocal enableDelayedExpansion스크립트를. 그렇지 않으면 바이트 수에 30을 더하고 스크립트를 정상적으로 호출하십시오.

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

그루비 :

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

배열은 문자로 채워져 있으므로 대체 할 수 있습니다 a.size>1 에 의해a[1]

자바 스크립트, ES6 :

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

두 경우 모두 변수 a에 해당 배열이 있다고 가정합니다.


6
옥스포드 쉼표 연결하기 전에 쉼표 입니다 .
Dennis

3

PHP, 86 84 자

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

배열이 초기화되면 계산을 시작합니다.

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

확인 됨 :

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

목록의 마지막 항목이 수정되었습니다. PHP에서는 배열 할당과 함수 호출이 복사를 수행하기 때문에 괜찮습니다.


3

CJam, 35 30 28 27 바이트

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

STDIN에서 읽고 STDOUT으로 인쇄하는 프로그램입니다. 온라인으로 사용해보십시오.

작동 원리

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

예제 실행

$ 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

나는 당신의 꼬리에 있습니다-아래 참조 :-)
abligh

3

Google 스프레드 시트, 67 68 67 92 바이트

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

입력은 셀에서 시작하여 A1많은 항목이 있으면 계속 작동합니다.
JOIN각각을 쉼표로 구분하여 모두 문자열로 병합합니다.
FILTER공백이 아닌 것을 제거하여 끝에서 무한한 쉼표로 끝나지 않습니다. 공백이 아닌 입력
SUBSTITUTECOUNTA계산하여 찾은 마지막 쉼표를 대체합니다 .

매우 흥미롭지는 않지만 단일 셀에서 가능합니다.


이것은 옥스포드 쉼표를 생략합니다.
Umbrella

@Umbrella 글쎄, 그건 바보 였지? +1 바이트
엔지니어 토스트

)이 공식 에서 터미널 을 -1 바이트 동안 제거 할 수 있어야합니다 . 글쎄, 그것은 내가 본 것 중 가장 빠른 편집이었다
Taylor Scott

이를 테스트 한 후 두 개의 메모- A:A>""로 변환해야하며 A:A<>""두 개체의 경우 옥스포드 쉼표 생략을 구현하지 않습니다
Taylor Scott

@TaylorScott 나는 텍스트로만 테스트하고의 문제를 놓친 것 같습니다 >"". 이전에 작성한 빠른 수정 사항은 테스트되지 않았습니다. 나는 방향 좋아하지 않아 ...
엔지니어 토스트

2

자바 스크립트 (ES6) 60

입력 배열에 빈 문자열이 없다고 가정

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

FireFox / Firebug 콘솔에서 테스트

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

산출

 We invited the stripper, JFK, and Stalin

이것을 어떻게 실행합니까? 나는 node --harmony문자열 배열로 시도했지만 var a = 'abcdefgh'.split('');a ...와 함께 앉아서 아무것도하지 않는 것처럼 보입니다. 고유 한 ES6 기능을 사용하기위한 +1도 있습니다 ()=>.
Adrian

@Adrian 함수는 출력없이 문자열을 반환합니다. 답변에 테스트를 추가하겠습니다.
edc65

나는 f=(a,b=a.pop())=>a[0]?a.join(', ')+', and '+b:b또한 정확하고 13 바이트 더 짧다고 생각 합니다.
Ingo Bürk

1
@ IngoBürk는 2 개의 항목이있는 쉼표를 처리하는 부분을 잘라냅니다. 맞춰봐? 2 개 항목으로 출력이 잘못되었습니다.
edc65

@ edc65 아,도. 나쁘다.
Ingo Bürk

2

자바 스크립트 -60 56 71 67 63

정확히 관용적 인 접근 방식은 아니지만 재미있게 작성했으며 정규식을 좋아합니다.

배열이 다음에 저장된다고 가정합니다 var a.

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

단순히 인덱스를 확인하여 단축 [2]: (yay boolean coercion)

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

분명히 나는 ​​테스트를 빨고 단일 항목 테스트를 건너 뛰었습니다. 고정 버전은 다음과 같습니다.

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

내 부울을 뒤집어 2 문자를 삭감하고 연결에서 첫 번째 삼항의 다음 / 다른 공간으로 공간을 이동하여 3자를 줄였습니다.

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

JS가 나를 위해 그렇게하기 때문에 내 부울을 강요 할 필요가 없다는 것을 상기시켜 준 @tomsmeding에게 감사드립니다. 또한 내부의 연결에서 첫 번째 삼항을 분리하는 괄호를 제거하는 것을 잊었습니다 join().

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

내가 그랬어? 의무적 인 새로운 골퍼 사과.


1
좋아하는 정규 표현식을 마조히즘이라고합니다.
seequ

실제로 당신은 전혀 필요하지 않았다 !!; a[2]?A:B이미 작동합니다. 부울을 다시 뒤집어 야 할 수도 있습니다 .
tomsmeding

@tomsmeding-맞습니다. 나는 항상 JavaScript의 기본 부울 강제 행동에주의를 기울여서 부울을 수동으로 강제하는 습관이 있습니다 ...
Adrian

@Adrian Correction : 빈 문자열을 제외한 모든 값의 경우 truea[i] 와 같습니다 . 거의. 2 개의 입력을 받으면 배열의 길이가 2라고 가정합니다. 그런 다음 로 평가됩니다 . 편집 : 당신의 편집은 내가 의미하는 것입니다 :)a[2]===undefinedundefinedfalse
tomsmeding

2

골프 스크립트 -31 39 34 30

안녕, 월드! 저는 오랜 시간을 보낸 사람입니다. 처음으로 포스터입니다. 다음은 Golfscript의 30 바이트 솔루션입니다 ([1 2 3]과 같은 배열이 이미 스택에 있음).

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

결과는 모든 테스트 사례에 적합합니다.

편집 : CJam!


길이 1 배열을 설명하도록 편집되었습니다.
Josiah Winslow

보다 효율적인 알고리즘을 위해 편집되었습니다.
Josiah Winslow

전투는 계속됩니다. : P
Dennis

아, 그러나 지금 우리는 짝수입니다. : P
Josiah Winslow

2

소조, 52 71 83 자

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

UBound는 배열 길이보다 1이 적습니다.


이 두 항목이있을 때 쉼표를 추가하는 것 -해야하지
edc65

잘 잡았습니다. 수정하도록 수정되었습니다.
silverpie

2

Excel VBA, 108 바이트

범위에서 공간으로 구분 된 배열로 입력 A1을 받고 VBE 즉시 창으로 출력하는 익명 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

라켓 87

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

여전히 lisps의 함수 이름이 너무 길어서 골프를 칠 수는 없습니다.
seequ

1

파이썬 62 문자

i가 문자열 목록이라고 가정합니다.

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

1

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;

1

줄리아 (53)

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

STDIN에서 인수를 가져 와서 STDOUT으로 출력

Base.join (items, delim [, last])을 사용하는 솔루션

편집하다:

테스트 사례

julia oxfordComma.jl 1

1

julia oxfordComma.jl 1 2

1과 2

julia oxfordComma.jl 1 2 3

1, 2 및 3


1
Julia를 모르지만 옥스포드 쉼표를 생성하지 않는 것 같습니다.
flornquake

@flornquake 선택적 "마지막"인수로 인해 옥스포드 쉼표로 인쇄됩니다
Cruor

2
그것은해야 1, 2, and 3하지 1, 2 and 3.
flornquake

1

란트 (108)

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

언 골프 드 :

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

용법:

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

온라인으로 사용해보십시오


1

피 이스, 28

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

예 :

$ 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

입력 형식을 지정하는 방법을 알 수없는 것 같습니다.
Dennis

@Dennis 테스트 사례를 추가하겠습니다.
isaacg 2016 년

실제로 시도했지만 Pyth ( TypeError: can only concatenate list (not "str") to list) 버전에서는 작동하지 않았습니다 . 최신 버전에서 잘 작동합니다.
Dennis

@Dennis 예, 목록에 추가 규칙이 최근에 추가되었습니다.
isaacg 2009 년

1

PHP-72

입력을 설정하십시오.

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

그리고 프로세스 :

$x=count($i)-1;if($x) {$i[$x]=" and ".$i[$x];}echo join($x>1?",":"",$i);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.