ピボットの周りの文字列の2つのセクションを反転します


17

バックグラウンド

私は現在、AP Comp Sci A:Javaクラスに参加しており、コードゴルフの友達を何人か始めたいと思っています。コースからの挑戦がありますが、この挑戦​​をコミュニティが何バイトできるかを知りたいと思います。

チャレンジの詳細:

メイン文字列とピボット文字列の2つの入力文字列が与えられた場合、次の操作を行います。

ピボットストリングがメインストリングのサブストリングとして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

最初のピボットでのみ文字列を分割する必要があります。したがって、意図する出力はである必要があります2-3-4-5-6-1
ThePlasmaRailgun

3
ところで、次回はサンドボックスを使用できます。
エリックアウトゴルファー

「交換されるサブトリング内の順序を維持しながら」強調することで、混乱がさらに深まったと思います。私はすでにそのように理解していますが、それがあなたが意味するものである場合、文言はそれを混乱させました。
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を分割」し、配列を1つ左に回転し、2番目の入力と結合します。ṙ1j⁴
ミスターXcoder

@ThePlasmaRailgun説明を追加します。しかし、ゼリーのためにも非常に印象的xDではないこと
HyperNeutrino

いいね 大好きです。
ThePlasmaRailgun

6

パイソン2、37の39バイト

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

どこaがメイン文字列でbあり、ピボット文字列があります。

オンラインでお試しください!


2
に変更split(b)split(b,1)て、最初の発生時にのみ分割することを指定します。
mypetlion

@ ovs、3番目のテストケースで動作するように編集
wnnmaw

@mypetlion、私はsplitそれ以上の議論を受け入れたことを知りませんでした、ありがとう!
wnnmaw



4

Perl 5、20 + 2(-pl)= 22バイト

<>=~/$_/;$_="$'$_$`"

オンラインでお試しください!

最初の行でピボット文字列を取得し、2番目の行で完全な文字列を取得します。


私はこの発見の引数で遊んソリューションバイト20を、それ以外/の周りのSは$_削除することができます
ナウエルFouilleul

また、$_=~<>;$_="$'$&$「 `は20バイトであり、正しい順序で引数を読み取ります
ナウエルフイユル

4

パイソン253の 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

あなただけのコメントを残して、OP編集その中を聞かせて答えを改善したい次回@ThePlasmaRailgun。
OVS

あなたの明確化のため@ThePlasmaRailgun感謝
OVS

2行目と3行目k,j=m.split(p,1);print j,p,kは38バイトになります。
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

、13バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

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




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が必要です。ピボットに正規表現の特殊文字(\+*?[^]$(){}=!<>|:-)が含まれていると失敗する場合があります。
Pivotが空の場合は変更なし、Pivo​​tが入力内にない場合は空の出力。
で実行し-nます。

安全なバージョン、77バイト:

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

Pivotが空の場合は変更なし、Pivo​​tが入力内にない場合は空の出力。
で実行し-nます。

非正規表現バージョン、71バイト:

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

ピボットが空の場合、警告が生成されます。Pivotが入力にない場合は変更されません。

で実行し-nrます。

オンラインで試してください



0

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

ラムダ。文字列s、p、およびaをキャプチャし、参照として(in-out)を使用します。

テストコード

#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))

A Stringin Cleanは通常{#Char}-箱なし(#Char配列({})です。この関数は、の[Char]代わりにString、の2番目の有効なバージョンを取りますString

完全な関数シグネチャはf :: [.t] .t -> [.t] | [.t <= Char]です。

オンラインでお試しください!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.