围绕枢轴反转字符串的两个部分


17

背景

我目前正在参加AP Comp Sci A:Java课程,并且想结识一些打高尔夫球的朋友。我在课程中遇到了挑战,我想看看社区可以在其中挑战多少字节。

挑战详情:

给定两个输入字符串,即主字符串和枢轴字符串,请执行以下操作:

如果枢轴字符串恰好是主字符串的子字符串一次,则主字符串中位于枢轴字符串之前的部分应与之后的部分交换,同时保留要交换的子字符串中的顺序

例如:

如果转角字符串为空或枢轴字符串不是主字符串中发现,该方案不必有定义的行为。

如果枢轴字符串的实例不止一个,则拆分应在枢轴的第一个实例和第一个实例处进行。

示例:给定主字符串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

它只应在第一个枢轴上分割字符串。因此预期的输出应为2-3-4-5-6-1
ThePlasmaRailgun

3
顺便说一下,您下次可以使用沙箱
暴民埃里克(Erik the Outgolfer)'17年

我认为强调“在保留要交换的子类中的顺序的同时”只会使它更加混乱。我已经这样理解了,但是措辞让您感到困惑,这就是您的意思。
kamoroso94 '17

Answers:



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⁴
Xcoder先生17年

@ThePlasmaRailgun现在添加说明。但是,对于Jelly来说,xD甚至都不是那么令人印象深刻
HyperNeutrino

真好 我喜欢它。
ThePlasmaRailgun

6

Python 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

Python 2中53 44个字节

感谢ThePlasmaRailgun的一些字节

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

在线尝试!


带有枢轴“ Two”和字符串“ 1Two2Two3Two2”的测试用例上的输出应为“ 2Two3Two4TwoTwo1”。它只应在第一个“ Two”上分割,剩下数组[“ 1”,“ 2Two3Two4Two”]。那你就可以print k[1]+p+k[0]。这应该具有预期的行为。
ThePlasmaRailgun

固定。我还将添加一个示例测试用例,向人们展示它应该如何。
ThePlasmaRailgun

@ThePlasmaRailgun下一次您想改善答案时,只需发表评论,然后让操作员对其进行编辑
。– ovs

@ThePlasmaRailgun感谢您的澄清
ovs

第二和第三行变为k,j=m.split(p,1);print j,p,k38个字节。
mypetlion



4

爱丽丝,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

Pyth,8个字节

jQ.<cEQ1

在这里尝试!

说明

jQ.<cEQ1 - Full program.

    cEQ  - Split the second input by the first input.
  .<   1 - Cyclically rotate by 1 place to the left.
jQ       - Join on the first input.

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

R63 58 57字节

function(M,P)sub(sub("_",P,"(.+?)(_)(.+)"),"\\3\\2\\1",M)

在线尝试!

M是主要的字符串,P是关键。

ovs的Retina回答表明,我可以修复我以前使用正则表达式方法的尝试

(.+)(Pivot string)(.+)

通过添加?到第一个捕获组。



2

JavaScript(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

在线尝试!


2

C, 106100 字节

i,l;f(s,p)char*s,*p;{l=strlen(p);for(i=0;strncmp(s+i,p,l);++i);printf("%s%s",s+i+l,p);write(1,s,i);}

在线尝试!




0

PHP,62字节

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

需要PHP 7.1; 如果数据透视表包含正则表达式特殊字符(\+*?[^]$(){}=!<>|:-),则可能会失败。
如果Pivot为空,则没有更改;如果没有输入Pivot,则输出为空。
用运行-n

安全版本,77字节:

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

如果Pivot为空,则没有更改;如果没有输入Pivot,则输出为空。
用运行-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))}

说明(无胶体)

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);}

一个lambda,以a为参考(输入-输出)捕获字符串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))

String清理中的A 通常是{#Char}-未装箱(#)的Char数组({})。该函数[Char]代替String,后者是的第二个有效版本String

全功能签名是 f :: [.t] .t -> [.t] | [.t <= Char]

在线尝试!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.