두 문자열 합치기


18

소개

S 1 = a...bS 2 = 라고 가정하겠습니다 ..c... 우리가 서로의 위에 놓으면 다음과 같은 결과를 얻습니다.

a...b
..c..

우리 .는 액체 문자 (겹칠 수 있음) 와 함께 두 문자열을 병합합니다 . 우리는 이것을 얻습니다 :

a.c.b

문자열 중 하나가 다른 문자열보다 길면 동일한 알고리즘을 적용합니다.

a.....b
..c..  

becomes:

a.c...b

a.....b
..c.......

becomes:

a.c...b...

두 문자가 충돌하면 맨 아래 문자 만 사용합니다.

a..b
...c

becomes:

a..c

작업

비어 있지 않은 두 개의 문자열이 제공되면 병합 된 문자열을 출력하십시오 . 참고 , 당신은 입력 만 포함되어 있다고 가정 할 수 기간소문자 문자 (즉, 더 편리 경우 또는 대문자).

테스트 사례

Input              Output
a....b ..c...      a.c..b
aaaaaa bbbbbb      bbbbbb
ab.ab. b.b.b.      bbbab.
a.......b c        c.......b

이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!


입력이 a.....b ..c.......가능합니까? 그러면 출력은 무엇입니까?
Luis Mendo

@DonMuesli 그것은 될 것 a.c...b...입니다.
Adnan

문자열 대신 문자 목록을 출력 할 수 있습니까?
Denker

@DenkerAffe 아니오, 죄송합니다
Adnan

줄을 반대 순서로 가져올 수 있습니까?
Mego

답변:


10

젤리 , 5 바이트

Œu»Œl

명령 줄 인수를 통해 입력합니다.

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

설명

이것은 내 CJam 답변 의 직접 포트입니다 (이것이 왜 작동하는지 설명을 보려면 참조하십시오).

Œu     # Convert first argument to upper case.
  »    # Element-wise maximum between both strings.
   Œl  # Convert result back to lower case.

5
아니! 젤리도 입양 할 수 없습니다! 우리는 모든 모드를 골프 마스터로 남겨 둘 것입니다.
Rɪᴋᴇʀ

@rikerw haha, 왜 그들이 모드라고 생각합니까? 그들이 골프를 잘하는 원인 : P
cat

3
@RikerW 방금 내 솔루션을 Jelly로 이식하여 다른 사람을 때리는 것을 선점해야했습니다. ¯ \ _ (ツ) _ / ¯
Martin Ender

15

CJam, 9 바이트

leul.e>el

여기에서 테스트하십시오.

설명

사실을 사용합니다 '.' < upper case letters < lower case letters. 이 방법으로 두 문자열 사이에서 요소 별 최대 값을 취하면 모든 문자가 a를 재정의 .하지만 두 번째 입력의 문자는 첫 번째 대문자 인 경우 첫 번째 문자보다 우선합니다. 혼란 스러운가? 다음은 테스트 사례 중 하나입니다.

ab.ab.
b.b.b.

먼저 대문자로 변환하십시오.

AB.AB.
b.b.b.

요소 별 최대 값을 취하십시오.

bBbAb.

소문자로 다시 변환 :

bbbab.

코드는 다음과 같습니다.

l    e# Read first line.
eu   e# Convert to upper case.
l    e# Read second line.
.e>  e# Take element-wise maximum. If the lengths are different, the additional elements
     e# from the longer list are just appended.
el   e# Convert back to lower case.

4
좋은 eu/ el트릭!
Luis Mendo

6

자바 스크립트 ES6, 52 55 자

(a,b)=>b.replace(/\./g,(m,i)=>a[i]||m)+a.slice(b.length)

테스트

f=(a,b)=>b.replace(/\./g,(m,i)=>a[i]||m)+a.slice(b.length)
;`
a....b ..c...      a.c..b
aaaaaa bbbbbb      bbbbbb
ab.ab. b.b.b.      bbbab.
a.......b c        c.......b
c a....b           a....b
`.split('\n').filter(Boolean).map(s=>s.split(/\s+/)).every(a=>f(a[0],a[1])==a[2])

1
다음과 같은 입력에 실패합니다 :f('c', 'a....b')
andlrc

@ dev-null, 고정
Qwertiy




3

하스켈, 43 42 바이트

(a:b)#(c:d)|c<'a'=a:b#d|1<2=c:b#d
a#b=a++b

사용 예 : "ab.ab." # "b.b.b."-> "bbbab.".

작동 방식 :

  • 두 목록이 모두 비어 있지 않으면 두 번째 목록의 헤드가 인 경우 첫 번째 목록의 헤드를 "."선택하고 두 번째 목록의 헤드를 선택하십시오. 목록의 꼬리와 함께 재귀 호출을 추가하십시오.

  • 하나 이상의 목록이 비어 있으면 두 목록을 모두 추가하십시오.

편집 : @ Lin은 바이트를 저장했습니다. 감사!


“입력에 마침표와 소문자 만 포함되어 있다고 가정 할 수 있으므로 c<'a' 바이트 저장 여부 를 확인할 수 있습니다 .
Lynn

3

파이썬 2, 47 바이트

lambda s,t:`map(max,s.upper(),t)`[2::5].lower()

매우 골프! 나는 upper ()와 lower ()를 제거하는 방법을 찾고 있지만 지금까지 운이 없다 ...
Max

2

줄리아, 101 바이트

f(s,t,r=i->rpad(i,max((n=endof)(s),n(t)),"."))=join([min(a,b)<90?max(a,b):b for(a,b)=zip(r(s),r(t))])

두 개의 문자열을 받아들이고 문자열을 반환하는 함수입니다.

m두 입력의 최대 길이로 계산 한 다음 r입력을 .s로 오른쪽으로 채우고 m함수 인수로 저장 하는 함수를 정의합니다 . 그런 다음 zip오른쪽으로 채워진 입력을 확인하고 각 쌍의 최소값 (ASCII 코드로 정의)을 확인합니다. 이 경우 .코드가 큰 문자를 사용하고 그렇지 않으면 두 번째 입력에서 온 문자를 사용합니다. 결과 배열은 join문자열로 변환되어 반환됩니다.


2

C, 106 89 바이트

i,j,k;f(s,z)char*s,*z;{for(i=0,j=k=1;j|k;i++)putchar((k=k?z[i]:0)>46|!(j=j?s[i]:0)?k:j);}

ideone에서 라이브 테스트 .


1

망막 , 55

$

+`(.? (\ S *) (\ w) | (\ S) (\ S *).?) (\ S *. *)
$ 2 $ 5 $ 6 $ 3 $ 4


5 행은 단일 공간입니다. 6 행은 빈 줄입니다 (후행 줄 바꿈 없음).

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

나는 이것을 GNU sed에서 시작했습니다 (-r 옵션 사용). 정규식을 알아 낸 후 Retina 로의 간단한 포트. sed 버전은 다음과 같습니다

s/$/ /
:
s/(.?(\S* )(\w)|(\S)(\S* ).?)(\S* .*)/\2\5\6\3\4/
t
s/ *//

1
Retina 버전 실패a..k.f....b c...f.g...g. => .c..kffg...g
randomra

1

파이썬 2, 70 바이트

lambda x,y:"".join([k if k!="."and k else j for j,k in map(None,x,y)])

여기 사용해보십시오!

먼저 두 문자열을 하나의 목록으로 압축합니다. 두 번째 문자열이 첫 번째 문자열보다 길면 None( 그것으로) 채워집니다 map(None,x,y).
그런 다음 j첫 번째 문자열의 문자와 두 번째 문자열의 문자를 사용하여이 목록을 반복 k합니다. k점이 아닌 경우 선택 합니다 j.

결과를 문자열 대신 문자 목록으로 출력 할 수 있다면 61 바이트가 될 수 있습니다.


1

펄, 48 + 3 = 51 바이트

s/\./substr($^I,$.=pos,1)||$&/ge;$_.=substr$^I,$.

Bah는 더 짧은 해결책을 찾을 수 없습니다. (@Qwertiy의 JavaScript 답변과 동일한 접근 방식).
요구 -pl로부터 입력을 받아 stdin-i

$ perl -i'a...ce' -ple's/\./substr($^I,$.=pos,1)||$&/ge;$_.=substr$^I,$.' <<< '..b.d..f'
a.b.de..f

대상 문자열을 미리 확장하십시오 (매우 예쁘게 보입니다).$_^=$^I^$^I;s/\.|\0/substr$^I,pos,1or$&/ge
Ton Hospel


0

q / kdb +, 43 40 바이트

해결책:

lower{l:max(#:)each(x;y);upper[l$x]|l$y}

예:

q)lower{l:max(#:)each(x;y);upper[l$x]|l$y}["a..b..";"...c"]
"a..c.."

설명:

(#:)                // k equivalent of count
max (#:) each(x;y)  // takes each string, count the length, return maximum
l$x                 // whites-space pad string x to length l
|                   // take the maximum (per Martin's strategy)
upper[...]          // convert padded string 1 to uppercase
lower{...}          // convert result of function to lowercase

참고 : 나는 활용 데려 갈거야 "을 감안할 때이 비어 있지 않은 문자열 " 과 입력이 문자열 가정. kdb "c"에서 원자 (),"c"는 문자열이며, 그렇지 않으면 원자를 채우는 데 사용할 수 없으므로 점수에 6 바이트를 추가해야합니다 $...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.