카테고리 보관물: 코딩

코딩

문자열 X가 문자열 Y의 하위 시퀀스입니까? Y의 하위 시퀀스인지 여부를 올바르게

주어진 문자열 X와 Y는 X가 Y의 서브 시퀀스 인지 여부를 판별합니다 . 빈 문자열은 모든 문자열의 서브 시퀀스로 간주됩니다. (예 '''anna'의 서브 시퀀스이다 'banana'.)

입력

  • X, 대소 문자를 구분하는 영숫자 문자열
  • 대소 문자를 구분하는 영숫자 문자열 인 Y

산출

  • X가 Y의 하위 시퀀스인지 여부를 올바르게 나타내는 True 또는 False (또는 동등한 항목)

I / O 예제

X      Y        output

''     'z00'    True
'z00'  'z00'    True
'z00'  '00z0'   False
'aa'   'anna'   True
'anna' 'banana' True
'Anna' 'banana' False

기준

  • 소스 코드의 바이트 수에 따라 가장 짧은 프로그램이 승리합니다.

예제 프로그램

  • 관련 게시물 에 적용 할 수있는 여러 프로그램이 있습니다 .


답변

Perl 5 , 17 바이트 (+1?), 전체 프로그램

s//.*/g;$_=<>=~$_

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

에서와 같이 p펄 인터프리터에 플래그를 사용하여 호출하십시오 perl -pe 's//.*/g;$_=<>=~$_'. 당 이 문제가 처음 게시 된 기존의 채점 규칙 ,이 플래그를 하나 추가 바이트를 요한다. 에서 최근 규칙 , AFAICT, 그것은 무료로 할 수있다.

어느 쪽이든, 입력 문자열은 stdin에서 별도의 줄 바꿈으로 끝나는 줄에 제공되어야합니다. 1첫 번째 입력 문자열이 두 번째의 하위 문자열이거나 그렇지 않은 경우 아무것도 출력되지 않습니다 (stdout) .

참고 모두 입력 라인 끝에서 줄 바꿈이 있어야합니다, 또는 프로그램이 제대로 작동하지 않습니다. 또는l 펄이 개행을 제거하도록 명령 행 플래그를 호출에 . 유효한 점수 규칙에 따라 1 바이트의 추가 비용이 들거나 들지 않을 수 있습니다. 이 플래그를 사용하면 출력에 개행이 추가됩니다.

원본 버전 (스 니펫, 18 바이트 / 문자)

$x=~s//.*/g,$y=~$x

입력 값은 변수에 제공 $x되며 $y결과는 스칼라 컨텍스트의 표현식 값입니다. 참고 $x과정에서 수정됩니다. (예, $_대신 사용 하는 것을 알고 있습니다.$x 하면 네 개의 문자를 절약 할 수 있지만 약간 치즈 맛이 나는 스 니펫에서 그렇게하는 것이 좋습니다.)

어떻게 작동합니까?

첫 번째 부분 은의 각 문자 사이 $x=~s//.*/g에 문자열을 삽입합니다 . 두 번째 부분 은 정규 표현식으로 취급 하고 일치 합니다. Perl 정규식에서는 0 개 이상의 임의의 문자를 일치시키는 반면 모든 영숫자는 편리하게 일치합니다..*$x$y=~$x$x$y.*


답변

루비, 32 자

s=->x,y{y=~/#{[*x.chars]*".*"}/}

이 솔루션은 하위 시퀀스가 ​​아닌 nil경우 숫자를 반환하고 그렇지 않으면 숫자를 반환합니다 (예 : 및 루비에 해당 ). 예 :xyfalsetrue

p s['','z00']        # => 0   (i.e. true)
p s['z00','z00']     # => 0   (i.e. true)
p s['z00','00z0']    # => nil (i.e. false)
p s['anna','banana'] # => 1   (i.e. true)
p s['Anna','banana'] # => nil (i.e. false)


답변

하스켈, 51 37

h@(f:l)%(g:m)=f==g&&l%m||h%m;x%y=x<=y

실질적인 개선을위한 Hammar에게 감사드립니다. 이제는 infix 함수이지만, 그렇게하지 않아야 할 이유가없는 것 같습니다.

데모:

GHCi> :{
GHCi| zipWith (%) [""   , "z00", "z00" , "anna"  , "Anna"]
GHCi|             ["z00", "z00", "00z0", "banana", "banana"]
GHCi| :}
[True,True,False,True,False]


답변

파이썬 (48 자)

import re;s=lambda x,y:re.search('.*'.join(x),y)

Howard의 Ruby 답변과 동일한 접근 방식입니다. 파이썬이 정규식 패키지와 “verbose”를 가져와야한다는 점이 너무 나쁩니다 lambda. 🙂


답변

파이썬, 59 자

def s(x,y):
 for c in y:
  if x:x=x[c==x[0]:]
 return x==""

내 대답이 파이썬으로 더 잘 표현 될 것이라고 생각했습니다.

편집 : 입술의 제안을 추가했습니다.


답변

GolfScript (22 자)

X[0]+Y{1$(@={\}*;}/0=!

입력은 두 개의 미리 정의 된 변수로 간주된다고 가정 X하고 Y그 GolfScript에서 다소 특이하지만,. 잎 1사실 또는 0스택에 거짓합니다.


답변

C (52 자)

s(char*x,char*y){return!*x||*y&&s(*x-*y?x:x+1,y+1);}

테스트 사례