문자열 빼기


37

객관적인

문자열 연결을 되 돌리는 함수 만들기

입력

두 개의 문자열 (영숫자 + 공백)로, 하나는 빼야합니다.

  • 빼는 문자열이 다른 문자열보다 크지 않다고 가정 할 수 있습니다.

산출

빼기 결과

빼기

한 문자열을 다른 문자열의 시작 또는 끝에서 제거해야합니다. 문자열이 시작과 끝에 존재하는 경우, 하나만 제거 할 수 있으며, 제거 할 문자열은 사용자에게 달려 있습니다.
문자열이 시작 또는 끝에 없거나 정확하게 일치하지 않으면 뺄셈이 유효하지 않으므로 원래 문자열을 출력해야합니다.

테스트 사례

유효한 빼기

'abcde','ab' -> 'cde'
'abcde','cde' -> 'ab'
'abab','ab' -> 'ab'
'abcab','ab' -> 'abc' or 'cab'
'ababcde','ab' -> 'abcde'
'acdbcd','cd' -> 'acdb'
'abcde','abcde' -> ''
'abcde','' -> 'abcde'
'','' -> ''

잘못된 빼기 (원래 문자열을 반환)

'abcde','ae' -> 'abcde'
'abcde','aa' -> 'abcde'
'abcde','bcd' -> 'abcde'
'abcde','xab' -> 'abcde'
'abcde','yde' -> 'abcde'

유효하지 않은 입력 (처리 할 필요가 없음)

'','a' -> ''

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


4
첫 번째 사례의 결과가 왜 그렇지 cde않습니까? 유효하다는 것은 무엇을 의미합니까? 입력의 유효성을 판단해야합니까, 아니면 잘못된 입력을받지 않을 것입니까?
Leaky Nun

7
'abcde','bcd' -> 'abcde'내 솔루션을 깨뜨린 것에 대해 젠장
John Dvorak

5
문자열이 정규식 안전 (영숫자 + 공백)이라고 가정 할 수 있습니까?
John Dvorak

2
'ababcde', 'ab''abcde'테스트 사례로 제안하겠습니다 . 일부 순진한 알고리즘은 그 알고리즘에서 실패합니다.

2
@로드 당신은 도전 "역 문자열 연결"을 철폐하는 것을 고려할 수 있습니까?
MD XF

답변:


19

자바 8, 46 45 44 40 바이트

TheLethalCoder 덕분에 -1 바이트

내가 바보이기 때문에 -1 바이트 (로드 감사합니다!)

Kevin Cruijssen 덕분에 -4 바이트

a->b->a.replaceFirst("^"+b+"|"+b+"$","")

온라인으로 사용해보십시오! (모든 테스트 케이스 포함)

Java 답변은 실제로 몇 가지 다른 실용적인 언어보다 뛰어납니다. 미소 (이제 JS보다 뛰어납니다!)


a->b->
커리

@TheLethalCoder 감사합니다.
Okx

온라인 예에서 왜 사용하지 않은 해시 맵을 남겨 두었습니까?
Michael

-2 바이트 FirstAll위해를 변경할 수 있습니다 . 때문에 ^$항상 문자열의 끝 또는 시작 부분에 있으므로 replaceAll한 번만 대체합니다. 여기에서 시도하십시오. 추신 : 귀하의 답변에 이전 바이트 수를 추가했습니다. 이는 PPCG에서 코드 골프 편집 후 일반적으로 수행됩니다.
Kevin Cruijssen

@KevinCruijssen 나는 스트라이크 스루에 대해 알고 있었지만 이번에는 잊어 버린 것 같습니다. 그러나 All대신에를 사용하면 다음 First과 같이됩니다."abab" + "ab" -> ""
Okx

9

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

s=>t=>s.replace(eval(`/^${t}|${t}$/`),'')

커리 구문을 통해 입력을 f("abab")("ab")받습니다 ( 예 :) .


3
이제 왜 eval()이전에 RegExes 구성 에 사용 하려고 생각하지 않았 습니까?!
Shaggy

9

Brachylog (Try It Online!), 12 바이트

~cpĊh.∧Ċtw|w

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

문자열을 표준 입력에서 빼고 문자열을 빼서 명령 줄 인수로 취합니다.

설명

~cpĊh.∧Ċtw|w
~c            Split {the input} into pieces
  p           and (possibly) rearrange those pieces
   Ċ          such that there are two pieces
    h         and the first
     .        matches the command line argument
      ∧       then
         w    print
        t     the last
       Ċ      piece.
          |   If all else fails,
           w  print {the input}.


6

자바 스크립트 (ES6), 76 70 45 41 바이트

s=>t=>s.replace(RegExp(`^${t}|${t}$`),"")

시도 해봐

f=
s=>t=>s.replace(RegExp(`^${t}|${t}$`),"")
o.innerText=f(i.value="abcde")(j.value="ab")
i.oninput=j.oninput=_=>o.innerText=f(i.value)(j.value)
<input id=i><input id=j><pre id=o>


2
당신은 필요하지 않습니다 new .
programmer5000

@ programmer500, ETH 버전을 보았을 때이 작업을 포기했습니다! : D 지금 업데이트되었습니다. 감사.
Shaggy

4

펄 6 , 21 바이트

->$_,$b {S/^$b|$b$//}

시도 해봐

넓히는:

-> $_, $b {   # pointy block lambda

  S/          # Str replace and return (implicitly against 「$_」)

  |   ^ $b    # starting with the second argument
  |     $b $  # or ending with the second argument

  //          # replace with nothing.

}


3

TI 기본 (TI-84 Plus CE), 63 바이트

Prompt Str0,Str2
inString(Str0,Str2
If Ans
sub(Str0,1,Ans-1)+sub(Str0,Ans+length(Str2),length(Str0)-Ans+1-length(Str2→Str0
Str0

질문이 있습니다. Str1을 변수로 사용하지 않은 이유는 무엇입니까?
Zacharý

@ Zacharý 나는 당시에 무언가가 저장되어 있다고 생각합니다. 나는 정말로 기억하지 않는다.
pizzapants184.

Ans네 번째 줄에서 무엇 을 언급합니까?
Zacharý

재커리 @ Ans최종 평가 값을 의미하므로이 경우에는 반환하는 값을 말한다 inString(문자열의 인덱스이며, Str2문자열 Str0또는 0 문자열이 표시되지 않는 경우. if 문은 Ans의 값을 수정하지 않으므로 네 번째 줄에서 인덱스는 여전히 Ans.
pizzapants184.

오, 어떻게 inString작동 했는지 잊어 버렸습니다 . 좋은 골프!
Zacharý

3

수학, 162 바이트

(c=Characters;a=c@#;b=c@#2;l=Length;t={};If[l@Intersection[a,b]==l@b,If[MemberQ[Partition[a,l@b,1],b],t=a;Table[t=DeleteCases[t,b[[i]],1,1],{i,l@b}]],t=a];""<>t)&

테스트 입력 스타일 [ "abcde", "ab"]


1
좋은 해결책! #대신에 를 사용하여 바이트를 저장할 수 있습니다 #1. 정확히 같은 의미입니다. 또한을 사용하는 대신 StringJoin@t빈 문자열을 ""<>tt묶어 속임수 를 사용 하면 모든 항목이 자동으로 함께 결합됩니다. Mathematica 골프 팁 페이지를 보셨습니까 ?
나무가 아님

바이트를 절약하기 위해 할 수있는 일이 몇 가지 더 있습니다 ( t={};예를 들어 처음 에 정의 할 필요는 없다고 생각합니다 ). 다른 접근 방식을 완전히 사용하는 것이 더 쉬울 수 있습니다. StringReplace기능?
나무가 아님

문자열 배열을 입력으로 사용할 수 있으므로 실제로 필요하지는 않습니다.c=Characters;a=c@#;b=c@#2;
JungHwan Min

또한 l@Intersection[a,b]입니다 l[a∩b].
JungHwan Min


3

배쉬 ,66 61 49 바이트

case $1 in *$2)echo ${1%$2};;*)echo ${1#$2};;esac

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

덜 골프 :

a=$1;
case $1 in 
    *$2)  c=${a%$2};;       
    $2*)  c=${a#$2};;
      *)  c=$1;;
esac;
echo $c

대 / 소문자를 사용하여 시작 또는 종료 및 배열 접두사 / 접미사 (% / #)를 테스트합니다.


1
을 잘 사용 case하지만 필요 이상으로 길다. 두 번째 및 세 번째 패턴은 단일 패턴으로 병합 될 수 있습니다 *)c=${1#$2};;. 그런 다음 echovariable $c: 을 사용하는 대신 2 개의 브랜치 만 사용 하면 각 분기가 짧아집니다 case $1 in *$2)echo ${1%$2};;*)echo ${1#$2};;esac. 또는 계속 사용할 수 있지만 case: c=${1%$2};[[ $c = $1 ]]&&c=${1#$2};echo $c.
manatwork

3

APL (Dyalog) , 31 30 바이트

Zacharý 에게 -1 감사합니다 .

이것은 실제로 역 (즉, 역) 연결을 사용합니다! 원래 문자열을 왼쪽 인수로 사용하고 오른쪽 인수로 뺄 것을 취합니다.

{0::⍺{0::⍺⋄,∘⍵⍣¯1⊢⍺}⍵⋄⍵,⍣¯1⊢⍺}

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

언 골프 드 :

{
    0::⍺{          if an error happens, apply the following function on the arguments
        0::⍺           if an error happens, return the left argument unmodified
        ,∘⍵⍣¯1⊢⍺       inverse-append right argument on left argument
        }⍵
    ⍵,⍣¯1⊢⍺       inverse-prepend the right argument on the left argument
}

전설:

{} 익명 기능

 현재 함수의 왼쪽 인수

 현재 함수의 올바른 인수

0::… 오류가 발생하면 이것을 실행하십시오.

⍣¯1⊢ 역

,∘⍵오른쪽에 을  연결

⍵,왼쪽에 을  연결


나는 당신이 바이트를 절약 할 수 있다고 생각합니다 {0::⍺{0::⍺⋄,∘⍵⍣¯1⊢⍺}⍵⋄⍵,⍣¯1⊢⍺}.
Zacharý

@ Zacharý 예, 감사합니다.
Adám



2

하스켈 , 49 바이트

f s a b|s==b=a|a/=b,h:t<-a=f(s++[h])t b|1<3=s
f""

온라인으로 사용해보십시오! 사용법 : f"" "abcdef" "ab". 또는을 정의 (-)=f""하고 사용하십시오 "abcdef" - "ab".

이 정규식이없는 솔루션은 모든 접두사 및 접미사에서 문자열을 재귀 적으로 분할하고 빼는 문자열이 그 중 하나와 일치하는지 확인하여 작동합니다.



1

C #, 88 바이트

s=>r=>s.StartsWith(r)?s.Substring(r.Length):s.EndsWith(r)?s.Substring(0,s.IndexOf(r)):s;

로 컴파일합니다 Func<string, Func<string, string>>.


1

루비 (람다 식), 29 바이트

->a,b{a.sub /^#{b}|#{b}$/,""}

정규 표현식 보간에 대한 예! 정규식 안전 subtrahends가 필요하지만 도전에 따라 괜찮습니다.


1

Tcl , 37 바이트

proc s {a b} {regsub "^$b|$b$" $a {}}

온라인으로 사용해보십시오! (현재 모든 테스트 실행)

Tcl은 간단합니다. 매개 변수 및을 사용 하는 proc s {a b}명명 s된 함수를 정의합니다 . 시작 또는 끝에있을 때 의 값을 빈 문자열로 대체 합니다. 반환은 암시 적입니다.abregsub{}ba


1

C, 96 바이트

확장 골프는 경계선의 마조히즘 적이므로 C의 문자열 조작은 번거 롭다는 것은 일반적인 지식입니다. 나에게 잘 들린다.

f(a,b,t,l)char**a,*b,*t;{t=*a;l=strlen(b);bcmp(t,b,l)?bcmp(t+=strlen(t)-l,b,l)||(*t=0):(*a+=l);}

내가 작성한 덜 읽기 쉬운 프로그램 중 하나입니다. 함수가 어떻게 보이는지에도 불구하고 분리 char**할 문자열을 가리키는 것과 제거 할 문자열을 나타내는 두 가지 입력 을받습니다 char*. 입력 포인터가 제자리에서 편집되어 출력이됩니다 (어쨌든 메모리 누수에 대한 경우).

사용법 예 :

char *a = malloc(6);
strcpy(a, "abcde");
char *b = malloc(4);
strcpy(b, "abc");
f(&a,b);
printf("%s\n", a); // "de"

1

AWK , 21 32 바이트

{sub("^"$2"|"$2"$",z,$1);$0=$1}1

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

원본 제출은 처음이나 끝이 아닌 첫 번째 문자열 내에서 순진하게 텍스트를 대체했습니다.

{sub($2,z,$1);$0=$1}1

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

원래는 중괄호없이 시도했지만 빈 줄을 인쇄하거나 일치하지 않는 항목을 인쇄 하여이 버전보다 더 많은 바이트를 추가 해야하는 트릭이 필요했습니다.


1

R, 20 42 41 바이트

pryr::f(sub(sprintf('^%s|%s$',b,b),'',a))

MickyT 덕분에 -1 바이트!

익명 함수 (순서에 인수가 있음)를 리턴합니다 b,a. 문자열 차이를 계산합니다 a-b. sub패턴의 첫 번째 발생을이 경우 빈 문자열로 바꾸는 간단한 대체입니다 ''. sprintf문자열의 시작과 끝에서만 일치 하도록 정규 표현식 을 구성합니다. 필요 pryr설치할 패키지를.

TIO 링크에서 function(a,b)4 바이트 이상의 함수에 대해 더 자세한 정의를 사용합니다 .

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


1
[정보] 어떤 'abcde','bcd' -> 'abcde'경우?
Jonathan Allan

" sub단순히 처음 발견 스왑하는 간단한 대체이다 b인은 a"두 번째 문자열은 첫 번째 문자열의 중간에이 스왑 인 경우?
TheLethalCoder

나는 질문을 잘못 읽었다! 죄송합니다. 그것을 잡아 주셔서 감사합니다!
주세페

당신은 1 바이트를 얻을 수 있습니다sprintf('^%s|%s$',b,b)
MickyT

@MickyT, 감사합니다! 결정된.
주세페

1

공통 리스프, 121 바이트

(lambda(x y)(cond((equal(#1=subseq x 0 #3=(length y))y)(#1#x #3#))((equal(#1#x #2=(-(length x)#3#))y)(#1#x 0 #2#))(t x)))

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

평범한 wordy Common Lisp!

언 골프 버전 :

(defun f(x y)
  (cond ((equal (subseq x 0 (length y)) y)               ; if x starts with y
         (subseq x (length y)))                          ; return rest of x
        ((equal (subseq x (- (length x) (length y))) y)  ; if x ends with x
         (subseq x 0 (- (length x) (length y))))         ; return first part of x
        (t x)))                                          ; else return x


1

파워 쉘, 34 40 바이트

Invalid Subtraction테스트 케이스 추가 시 +6 바이트

param($s,$t)$s-replace"^$t(?!.*$t$)|$t$"

논평:

정규 표현식 ^$t|$t$은 예상대로 작동하지 않습니다. 두 개의 일치 항목을 모두 대신 바꿉니다 (플래그가 g항상 켜져 있음). 따라서 부정적 예측 그룹을 사용해야합니다.

테스트 스크립트 :

$f = {
    param($s,$t)$s-replace"^$t(?!.*$t$)|$t$"
}

@(
    ,('abcde','ab', 'cde')
    ,('abcde','cde', 'ab')
    ,('abab','ab', 'ab')
    ,('abcab','ab', 'abc', 'cab')
    ,('ababcde','ab', 'abcde')
    ,('acdbcd','cd', 'acdb')
    ,('abcde','abcde', '')
    ,('abcde','', 'abcde')
    ,('','', '')

    ,('abcde','ae', 'abcde')
    ,('abcde','aa', 'abcde')
    ,('abcde','bcd', 'abcde')
    ,('abcde','xab', 'abcde')
    ,('abcde','yde', 'abcde')

    ,('','a', '')
) | % {
    $s,$t,$e = $_
    $r = &$f $s $t
    "$($r-in$e): $r"
}

산출:

True: cde
True: ab
True: ab
True: abc
True: abcde
True: acdb
True:
True: abcde
True:

0

QBIC , 57 바이트

이건 QBIC / QBasic의 혼란입니다 ...

B=@ `+B┘x=instr(;,;)~x|?_t_sB,x-1|+_sB,x+_lC|,_lB|||\?B

B=@ `+B          Prepend a string to B$. Thisis a hack to avoid errors with 
                 removing substrings stating at index 1
┘                Line-break in QBasic output
       (;,;)     Read the string (B$) and the to-be-removed substring (C$)
x=instr          And make x to be the starting index of the first C$ in B$
~x|              IF X <> 0 (ie C$ is present in B$)
?                PRINT
 _t                trimmed version (drops the prepended space)
  _sB,x-1|+        of a substring from 1 to x (the start of C$) -1
  _sB,x+_lC|,_lB   and the rest of the string, starting after C$
                     _l takes the length of a string
  |||              End TRIM, end Substring, end Length
\?B              When missing C$, just print B$


0

처음에 지시 사항을 잘못 읽었습니다. 내 실수를 지적한 Ørjan Johansen 에게 감사합니다 !

PowerShell , 46 51 바이트

Function F($o,$a){([regex]"^$a").replace($o,'',1);}

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


이것은 'abcde' 'bcd'경우에 실패합니다.
Ørjan Johansen

이 테스트 사례에서 예상되는 결과를보고 있습니다. 여기
Jeff Freeman

이는 영업 이익과해야한다 결과의 열거 된 테스트 케이스의 abcde- bcd문자열의 양쪽 끝에 발생하지 않습니다.
Ørjan Johansen

당신이 올바른지. 지시 사항을 잘못 읽었습니다. 지적 해 주셔서 감사합니다!
Jeff Freeman

0

Excel, 129 바이트

=IFERROR(IF(FIND(B1,A1)=1,SUBSTITUTE(A1,B1,"",1),IF(FIND(B1,A1,LEN(A1)-LEN(B1))>LEN(A1)-LEN(B1),LEFT(A1,LEN(A1)-LEN(B1)),A1)),A1)

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