피벗 주위에서 문자열의 두 섹션 반전


17

배경

저는 현재 AP Comp Sci A : Java 클래스에 있으며 코드 골프에 대해 친구들과 함께 시작하고 싶습니다. 나는 코스에서 도전을 받았으며 커뮤니티 가이 도전을 할 수있는 바이트 수를보고 싶습니다.

도전 세부 사항 :

기본 문자열과 피벗 문자열의 두 입력 문자열이 제공되면 다음을 수행하십시오.

피봇 스트링이 메인 스트링의 서브 스트링으로서 정확히 1 회이면, 피봇 스트링 이전에 오는 메인 스트링의 부분 은 교체되는 상기 서브 트레이스 내의 순서유지하면서 이후의 부품과 교환 될 것이다 .

예를 들면 다음과 같습니다.

피벗 문자열이 비어 있거나 기본 문자열 내에 피벗 문자열이 없으면 프로그램에서 동작을 정의하지 않아도됩니다.

피벗 문자열 인스턴스가 두 개 이상인 경우 피벗 의 첫 번째 인스턴스 에서만 분할이 발생해야합니다 .

예 : 기본 문자열 OneTwoThreeTwoOne과 피벗 문자열이 주어지면 Two출력은이어야합니다 ThreeTwoOneTwoOne.

기본 문자열 1Two2Two3Two4과 피벗이 주어지면 Two출력은이어야합니다 2Two3Two4Two1.

기본 문자열 OneTwoThree과 피벗 문자열 "Two"가 주어지면 출력은입니다 ThreeTwoOne. 메인 스트링 the rabbit is faster than the turtle과 피벗 스트링이 주어지면

 is faster than 

(단일 공백 ​​뒤에 오는 공백에 유의하십시오) 출력은이어야합니다 the turtle is faster than the rabbit.

메인 스트링 1-2-3-4-5-6과 피벗이 주어지면 -출력은되어야합니다 2-3-4-5-6-1.

후 :

이것은 코드 골프에 대한 나의 첫 번째 질문이므로 제안이나 건설적인 비판이 있으면 자유롭게 말씀하십시오.

또한이 프로젝트에 대한 내 코드 (코스에 초점을 맞추기 때문에 Java로 작성 됨)는 아래에서 찾을 수 있습니다. 당신이 어떤 팁이 있다면, 나는 그것을보고 싶습니다. 현재 363 바이트이지만 훨씬 더 좋고 작은 솔루션을 만들 수 있습니다.

import java.util.Scanner;interface Main{static<T>void D(T f){System.out.println(f);}static void main(String[]A){Scanner s=new Scanner(System.in);D("Enter the first String:");String a=s.nextLine();D("Enter the pivot String:");String p=s.nextLine();if(p.isEmpty()|!a.contains(p)){D("Error: Pivot String not found.");return;}String w[]=a.split(p,2);D(w[1]+p+w[0]);}}

참고 : 입력 및 피벗 문자열을 찾을 수없는 경우에 대한 텍스트는 원래 과제에는 필수이지만이 과제에는 적용되지 않습니다.


pivot='-'과에 대한 예상 결과는 무엇입니까 main='1-2-3-4-5-6'? 대부분의 제출물 2-3-4-5-6-1이 이것에 대해 출력 되지만 도전을 이해함에 따라 반드시 있어야합니다 2-1-3-4-5-6.
ovs December

첫 번째 피벗 에서만 문자열을 분할해야합니다 . 따라서 의도 된 출력은이어야합니다 2-3-4-5-6-1.
ThePlasmaRailgun

3
그런데 다음 에 샌드 박스를 사용할 수 있습니다 .
Erik the Outgolfer

"서브 트링 내에서 순서를 유지하면서 교환하는 것"을 강조하는 것이 더 혼란 스러웠다 고 생각합니다. 나는 이미 그런 식으로 이해하지만, 그 말이 당신이 의도 한 것이면 혼란 스럽습니다.
kamoroso94

답변:



6

젤리 , 6 바이트

œṣṙ1j⁴

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

설명

œṣṙ1j⁴  Main Link
œṣ      Split around sublists equal to the pivot
  ṙ1    Rotate left by one
    j⁴  Rejoin on the pivot

와우, 설명의 기회? 놀랍습니다!
ThePlasmaRailgun

@ThePlasmaRailgun 사실 그다지 놀라운 것은 아닙니다. 실제로 : P-Jelly는 유용한 내장 기능을 가지고 있습니다 : œṣ" y와 같은 서브리스트 주위에 x 를 나누고 " 배열을 왼쪽으로 한 칸 회전 시키고 두 번째 입력 과 합 칩니다. ṙ1j⁴
Mr. Xcoder

@ThePlasmaRailgun 지금 설명을 추가하십시오. 그러나 Jelly에게는 매우 인상적인 xD도 아닙니다
HyperNeutrino

좋은. 나는 그것을 좋아한다.
ThePlasmaRailgun 2014

6

파이썬 2 , 37 39 바이트

lambda a,b:b.join(a.split(b,1)[::-1])

a기본 문자열은 어디에 b있고 피벗 문자열입니다.

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


2
첫 번째 발생에서만 분할하도록 지정 split(b)하려면 split(b,1)로 변경하십시오 .
mypetlion

@ovs, 세 번째 테스트 사례에서 작동하도록 편집
wnnmaw

@ mypetlion, 나는 split더 많은 논쟁을 받아 들였다.
wnnmaw




4

파이썬 2 , 53 44 바이트

몇 바이트 동안 ThePlasmaRailgun 덕분에

p,m=input()
k=m.split(p,1)
print k[1]+p+k[0]

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


피벗 "Two"및 문자열 "1Two2Two3Two4"를 사용한 테스트 케이스의 출력은 "2Two3Two4Two1"이어야합니다. 첫 번째 "Two"에서만 분할하여 [ "1", "2Two3Two4Two"] 배열을 남겨 두어야합니다. 그럼 당신은 할 수 있습니다 print k[1]+p+k[0]. 의도 된 동작이어야합니다.
ThePlasmaRailgun

결정된. 또한 사람들에게 어떻게해야하는지 보여주기 위해 예제 테스트 사례를 추가 할 것입니다.
ThePlasmaRailgun

@ThePlasmaRailgun 다음에 답변을 개선하고 싶을 때는 의견을 남기고 op가 편집하도록하십시오.
ovs

@ThePlasmaRailgun 감사합니다
ovs

두 번째와 세 번째 줄은 k,j=m.split(p,1);print j,p,k38 바이트가됩니다.
mypetlion



4

Alice , 18 바이트

/?.?.Qz
\IoI%!oo@/

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

설명

/...
\...@/

이것은 선형 서수 모드 (문자열 처리) 코드의 프레임 워크 일뿐입니다. 지그재그 제어 흐름을 전개하면 다음과 같은 이점이 있습니다.

I.I.!zo?o?%Qo

I.  Read the first string, duplicate it.
I   Read the second string (the pivot).
.!  Store a copy of the pivot on the tape.
z   Drop. Removes everything up to and including the pivot from the first string,
    so we get only the stuff after the pivot.
o   Output that.
?o  Retrieve the pivot from the tape and output it.
?%  Retrieve the pivot again and split the input around (all occurrences of)
    the pivot.
Q   Reverse the stack.
o   Output the top of the stack (i.e. the chunk in front of the first pivot).





2

, 13 바이트

≔⪪θηθ⪫Eθ§θ⊕κη

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

  θ             First input
   η            Second input
 ⪪              Split
≔   θ           Assign result
      Eθ        Map over result
           κ    Current index
          ⊕     Incremented
        §θ      Circularly index into result
     ⪫      η   Join
                Implicitly print



2

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

(s,p,[a,...r]=s.split(p))=>r.join(p)+p+a

테스트 사례


2

J , 14 바이트

#@[}.{.@ss|.,~

작동 방식 :

왼쪽 인수는 피벗, 오른쪽 것은 반전되는 문자열입니다.

            ,~   appends the pivot to the string
     {.@ss       finds the positions of the pivot in the string and takes the first one
          |.     rotates the appended string to the left, so that the pivot is at the start
#@[              finds the length of the pivot string (n)
   }.            drops n characters from the begining of the rotated string

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





0

PHP, 62 바이트

<?=![,$s,$p]=$argv,preg_filter("(^(.*)$p(.*)$)U","$2$p$1",$s);

PHP 7.1이 필요합니다. 피벗에 정규식 특수 문자 ( \+*?[^]$(){}=!<>|:-) 가 포함되어 있으면 실패 할 수 있습니다 .
피벗이 비어 있으면 변경 사항이없고 피벗이 입력되지 않으면 출력이 비어 있습니다.
로 실행하십시오 -n.

안전한 버전, 77 바이트 :

<?=preg_filter("(^(.*)".preg_quote($p=$argv[1])."(.*)$)U","$2$p$1",$argv[2]);

피벗이 비어 있으면 변경 사항이없고 피벗이 입력되지 않으면 출력이 비어 있습니다.
로 실행-n .

비정규 버전, 71 바이트 :

$a=explode($p=$argv[2],$argv[1]);$a[]=array_shift($a);echo join($p,$a);

피벗이 비어 있으면 경고를 표시합니다. 피벗이 입력되지 않으면 변경되지 않습니다.

로 실행하십시오 -nr.

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



0

스위프트 , 131 바이트

import Foundation
func f(s:String,d:String){var c=s.components(separatedBy:d);print((c+[c[0]]).suffix(from:1).joined(separator:d))}

설명 (ungolfed)

import Foundation                     // Import String.components
func f(s:String,d:String){
    var c=s.components(separatedBy:d) // Split the input string by the separator
    print((c+[c[0]])                  // Add the last element of c ([A,B,C] -> [A,B,C,A])
        .suffix(from:1)               // Remove the first element  ([A,B,C,A] -> [B,C,A])
        .joined(separator:d))         // Join with the separator
}


0

C ++ 11, 64 바이트

[s,p,&a]{int f=s.find(p);a=s.substr(f+p.size())+p+s.substr(0,f);}

람다는 문자열 s, p 및 a를 참조 (입력)로 캡처합니다.

테스트 코드

#include <iostream>
#include <string>

std::string Test(std::string s, std::string p) {
    std::string a;
[s,p,&a]{int f=s.find(p);a=s.substr(f+p.size())+p+s.substr(0,f);}();
    return a; 
}

int main() {
    std::string 
        s = "OneTwoThreeTwoOne",
        p = "Two",
        r = "ThreeTwoOneTwoOne";
    auto a = Test(s,p);
    std::cout << ((a==r)?"OK":"Failed") << ": " << a << std::endl; 

    return 0;
}

0

클린 , 83 바이트

import StdEnv;f s c=(\p=p takeWhile++[hd s,c:p dropWhile])\g=reverse(tl(g((<>)c)s))

StringClean in A 는 일반적으로 상자가없는 {#Char}( #) Char배열 ( {})입니다. 이 함수는 [Char]String유효한 두 번째 버전 인을 (를) 대신 사용 합니다 String.

전체 기능 서명은입니다 f :: [.t] .t -> [.t] | [.t <= Char].

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


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