중간 이름에 쉼표가있는 사람은 누구입니까?


18

당신의 도전은 입력으로 이름 (문자열)을 취하는 것입니다.

Albert Einstein

출력 :

Einstein, Albert

의사 코드 :

set in to input
set arr to in split by " "
set last to the last element of arr
remove the last element of arr
set out to arr joined with " "
prepend ", " to out
prepend last to out
output out

더 많은 테스트 사례 :

John Fitzgerald Kennedy => Kennedy, John Fitzgerald
Abraham Lincoln => Lincoln, Abraham

규칙

  • 입력은 항상 정규식과 일치합니다 ^([A-Z][a-z]+ )+([A-Z][a-z]+)$.
  • 출력이 기술적으로 부정확하더라도 이상한 이름 을 처리 할 필요는 없습니다 .
  • 후행 공백 / 줄 바꿈은 괜찮습니다.
  • 질문 있습니까? 아래의 코멘트!

후행 공백이 허용됩니까?
Value Ink

솔루션은 거의 siply 대체 할 수 있기 때문에 나는 속는로 폐쇄 le와 함께 ,당신이이 질문이
Downgoat

2
@Downgoat이 과제는 두 단어를 지정하지만 이에 대한 솔루션은 임의로 많은 단어에서 작동해야합니다. 지금까지 내가 말할 수있는, TIO 링크와 답변의 만 진심 솔루션은 이 질문 대체하는 정답 제공 le과를 ,.
ngenisis

7
@Downgoat에는 -4가 있습니다. 적어도 이것의 속임수로 그 것을 닫으십시오.
Stephen

1
후행 공백은 괜찮습니까?
Tom Carpenter

답변:


10

05AB1E , 7 바이트

암호:

',ì#Áðý

05AB1E 인코딩을 사용합니다 . 온라인으로 사용해보십시오!

설명:

',ì         # Prepend the input to ","
   #        # Split on spaces
    Á       # Rotate every element one position to the right (wrapping)
     ðý     # Join the array by spaces

1
앞에! 나는 목록 형식으로 그것을 할 수있는 방법이 있어야한다는 것을 알고있었습니다.
Emigna

9

자바 스크립트 (ES6), 34 바이트

s=>s.replace(/(.+) (.+)/,'$2, $1')

데모:

let f = s=>s.replace(/(.+) (.+)/,'$2, $1')

;[ 'Albert Einstein', 'John Fitzgerald Kennedy', 'Abraham Lincoln' ].forEach(
  s => console.log(`${s} => ${f(s)}`)
)



7

젤리 , 7 바이트

;”,Ḳṙ-K

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

젤리는 잘 모르지만 다른 답변을 읽으면 최적의 알고리즘을 사용하지 않은 것처럼 보였습니다 ... 그래서 여기 있습니다 :

설명

;”,Ḳṙ-K
;”,        Append a comma to the end of the string
   Ḳ       Split on spaces
    ṙ-     Rotate the array by -1 (1 time towards the right)
      K    Join with spaces

7

Vim, 10 바이트 / 키 스트로크

v$F dA, <esc>p

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


좋은 점이지만 작동하도록 노력했지만 <esc>코드에 표시되지 않습니다. 시도하고 싶은 다른 사람들에게 알리기 위해 :이 이름은 편집기에서 이름이 작성되었으며 현재 파일의 시작 부분이 일반 모드 인 것으로 가정합니다.
sigvaldm

7

V / vim, 9 8 바이트

$bD0Pa, 

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

덕분에 1 바이트 절약

후행 공백 문자가 있습니다. 규칙에 따라 후행 공백이 남습니다.

설명:

$       " move the cursor to the end of the line
 b      " move the cursor to the beginning of the current word
  D     " delete to the end of the line
   0    " move the cursor to the start of the line
    P   " paste in front of the cursor.
     a  " append (enter insert mode with the cursor one character forward)
      , " Literal text, ", "

좋은 것! 인서트 모드를 마지막에 두는 것이 좋습니다 <esc>. $bD대신에 1 바이트를 절약 할 수 있습니다 $diw. :)
DJMcMayhem

감사. $bD그래도 한 문자 이름을 처리하지 않으므로 OP 가 허용되는지 묻습니다 .
Kevin

업데이트 된 것 같습니다.
Kevin


6

Mathematica, 52 40 바이트

StringReplace[x__~~" "~~y__:>y<>", "<>x]


5

C, 45 바이트

편집 : 방금 입력에 대한 요구 사항이 두 단어 이상일 수 있음을 알았습니다. 이 단어는 두 단어로만 작동한다는 메모와 함께 그대로 두겠습니다.

편집 : 제거 \n. 필요한 경우 2 바이트를 추가하십시오.

main(a,b)int**b;{printf("%s, %s",b[2],b[1]);}

gcc name.cGCC로 컴파일 6.3.1. 경고를 무시하십시오. 용법:

$./a.out Albert Einstein
Einstein, Albert

언어 남용 :

  • 암시 적 반환 형식 intmain아무것도 반환.
  • 의 암시 적 선언 printf. GCC는 어쨌든 그것을 포함시킬 것이다.
  • 유형이 잘못되었습니다 b. 상관 없습니다%s

@ Khaled.K main(a,b)int**b;보다는 사용에 대한 팁을 주셔서 감사합니다 main(int a, int **b).


니스 처음 골프, 웹 사이트에 오신 것을 환영합니다, 또한 main(a,**b){printf("%s, %s",b[2],b[1]);}40 바이트
Khaled.K

고마워 :) 실제로 유형을 완전히 생략하는 것에 대해 생각했지만 어떤 이유로 든 컴파일되지 않습니다.
sigvaldm

1
이 작품main(a,b)int**b;{printf("%s, %s\n",b[2],b[1]);}
Khaled.K


4

sed, -E = 20 바이트의 경우 19 + 1

s/(.*) (.*)/\2, \1/

그룹화 괄호를 피하지 않으려면 -r (GNU) 또는 -E (BSD, 최근 GNU)를 사용해야합니다.

명령 행에 작성된 경우 쉘에서 여러 토큰으로 구문 분석되지 않도록 따옴표로 묶어야합니다.

sed -E 's/(.*) (.*)/\2, \1/'

4

C, 68 바이트

다른 게시물을 추가하는 것이 잘못된 것은 아니지만 여기에 이전에 게시 한 C 솔루션과 약간 다른 솔루션이 있습니다. 이것은 많은 수의 이름을 허용합니다.

main(a,b)int**b;{for(printf("%s,",b[--a]);--a;printf(" %s",*++b));}

gcc name.c(GCC 6.3.1)로 컴파일 하고 경고를 무시하십시오. 용법:

$./a.out John Fitzgerald Kennedy
Kennedy, John Fitzgerald

팁에 대한 @ Khaled.K에게 감사합니다. main(a,b)int**b;

@Alkano의 for 루프 팁에 감사드립니다.


1
while 대신 사용하여 2 바이트를 얻을 수 있습니다 main(a,b)int**b;{for(printf("%s,",b[--a]);++b,--a;printf(" %s",*b));}
Alkano

미치게 들리지만 그렇게 할 수 있습니다main(a,b)int**b;{a&&printf("%s,"b[a-1])&&main(a-1,b);}
Khaled.K

아주 좋은 트릭 :) 나는 주를 재귀 적으로 호출하는 것에 대해 생각하지 않았습니다. 그러나 그것은 효과가 없습니다. 결과는 "Kennedy, Fitzgerald, John,. / a.out"입니다. 부분 솔루션은입니다 main(a,b)int**b;{--a&&printf("%s, ",b[a])&&main(a,b);}. 2 바이트 더 짧아서 프로그램 이름을 인쇄하지 않지만 각 이름 사이에 쉼표를 사용합니다.
sigvaldm

3

Mathematica, 45 바이트

#/.{a__,s=" ",b__}/;{b}~FreeQ~s->{b,",",s,a}&

입력을 문자열이 아닌 문자 목록으로 사용하여 ngenisis의 답변 보다 몇 바이트를 절약했습니다 . 패턴 교체 규칙을 사용하는 순수한 기능.

매스 매 티카, 49 바이트

#~Join~{","," "}~RotateLeft~Last@Position[#," "]&

문자리스트를 입력으로 받아서 문자리스트를 리턴하는 또 다른 순수한 함수. 이것은 입력에 추가 ","하고 " "마지막 공백이 끝날 때까지 문자 목록을 회전시킵니다. (따라서 위의 첫 번째 함수와 달리 출력에 후행 공백이 있습니다.)


#/.{a__,s=" ",b:Except@s..}->{b,",",s,a}&이다는 4짧은 바이트,하지만 난이 있음을 발견 Except나를 절약, 문자열 패턴에 대한 불필요한 12바이트.
ngenisis 17 년

아, 자동으로 가장 긴 x답변을 선택합니까?
Greg Martin

그러나 문자열 패턴 일치는 욕심이지만 규칙적인 패턴 일치는 게으 릅니다.
ngenisis

멋진 <파도 깃발>
Greg Martin

3

C #, 76 72 바이트

s=>System.Text.RegularExpressions.Regex.Replace(s,"(.+) (.+)","$2, $1");

@KevinCruijssen의 도움으로 4 바이트 절약

76 바이트에 하위 문자열을 사용하는 이전 버전 :

s=>s.Substring(s.LastIndexOf(' ')+1)+", "+s.Substring(0,s.LastIndexOf(' '));

1
System.Text.RegularExpressions.RegexC #에서 너무 나쁘다 .. s=>new System.Text.RegularExpressions.Regex("(.+) (.+)").Replace(s,"$2, $1");1 바이트 이상입니다.
Kevin Cruijssen

1
@KevinCruijssen True 그러나 정적 메소드를 사용하여 Regex4 바이트를 절약 할 수 있습니다
TheLethalCoder






2

MATLAB / 옥타브 , 37 바이트

@(a)regexprep(a,'(.+) (.+)','$2, $1')

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

@ngenisis의 Retina 답변을 기반으로 옥타브와 MATLAB에서 정규식 게임을 플레이하여 이전 답변보다 몇 바이트를 절약 할 수 있습니다.


기존 답변 :

간단한 정규 표현식에 비해 더 독특한 방법이라는 점을 고려 하여이 답변을 여기에 남겨 두겠습니다.

옥타브 , 49 47 바이트

@(a)[a((b=find(a==32)(end))+1:end) ', ' a(1:b)]

오래된 온라인 시도!

출력을 생성하는 익명 함수

기본적으로 코드는 먼저을 사용하여 문자열에서 마지막 공백을 찾습니다 b=find(a==32)(end). 그런 다음을 사용하여 문자열의 끝 부분 (공백 뒤)을 사용합니다 a(b+1:end). 여기서는 b마지막 공간을 찾는 결과입니다. 또한으로 문자열을 시작 a(1:b-1)하고 둘 다를 연결합니다.', ' 사이를 in .

나는 전형적인 몇 바이트를 이미 저장했다 find(a==32,1,'last'). 저장할 것이 훨씬 더 확실하지 않습니다.


2

젤리 , 9 바이트

ḲµṪ;⁾, ;K

설명, ish :

ḲµṪ;⁾, ;K
Ḳ           # Split the input by spaces
 µ          # Separate the link into two chains. Essentially calls the right half with the split string monadically.
  Ṫ         # The last element, (The last name), modifying the array.
   ;        # Concatenated with...
    ⁾,      # The string literal; ", "
       ;    # Concatenated with...
        K   # The rest of the array, joined at spaces.

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

모든 테스트 사례를 시도하십시오.


2

파이썬 3, 52 바이트

lambda s:s.split()[-1]+", "+" ".join(s.split()[:-1])

매우 간단하고 골프 도움말을 사용할 수 있습니다. 마지막 단어를 앞에 놓고 ","로 연결합니다.

테스트 케이스 :

>>> f=lambda s:s.split()[-1]+", "+" ".join(s.split()[:-1])
>>> f("Monty Python")
'Python, Monty'
>>> f("Albus Percival Wulfric Brian Dumbledore")
'Dumbledore, Albus Percival Wulfric Brian'


2

자바, 110 62 바이트

String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}

비 정적 방법.

Kevin Cruijssen 덕분에 -48 바이트


String c(String s){int i=s.lastIndexOf(' ');return s.substring(i+1)+", "+s.substring(0,i);}더 짧습니다 ( 91 바이트 ).
Kevin Cruijssen

그리고 String d(String s){return s.replaceAll("(.+) (.+)","$2, $1");}더 짧습니다 ( 62 바이트 ).
Kevin Cruijssen

@KevinCruijssen 오 이런. 감사! 더 나은 정규식을 사용하는 방법을 배우게한다 : P
HyperNeutrino


2

엑셀 174 170 168 바이트

Wernisch 덕분에 2 바이트 절약

=MID(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+1,LEN(A1))&", "&LEFT(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))

이것은 공상 또는 영리하지 않습니다. 상당히 기본적인 방법입니다. 배열 수식을 사용하면 더 짧은 방법이 있어야한다고 생각하지만 작동하는 수식을 찾을 수 없습니다.


솔루션은 이름이 세 개인 경우에만 작동합니다. 예를 들어 "Albert Einstein"을 처리하지 않습니다.
Wernisch

@Wernisch 감사합니다! 지금 작동합니다.
엔지니어 토스트

질문에 따라 후행 공백이 허용됩니다. -1LEFT 함수에서 를 생략하여 2 바이트를 절약 할 수 있다고 생각하십시오 .
Wernisch


1

MATL , 10 바이트

44hYb1YSZc

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

설명

44h    % Implicitly input a string. Postpend a comma
       % STACK: 'John Fitzgerald Kennedy,'
Yb     % Split on spaces
       % STACK: {'John', 'Fitzgerald', 'Kennedy,'}
1YS    % Circularly shift 1 step to the right
       % STACK: {'Kennedy,', 'John', 'Fitzgerald'}
Zc     % Join with spaces between. Implicitly display
       % STACK: 'Kennedy, John Fitzgerald'

1

23 자

* =@append{s; *}
\Z=,$s

여기서 주목할만한 점은 도전이 어떻게 Gema 패턴의 무의미 함을 약화시키는 지에 대한 것입니다.

샘플 실행 :

bash-4.4$ echo -n 'John Fitzgerald Kennedy' | gema '* =@append{s; *};\Z=,$s'
Kennedy, John Fitzgerald
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.