Drehen Sie zwei Abschnitte einer Zeichenfolge um einen Drehpunkt um

17

Hintergrund

Ich bin zurzeit in einer AP Comp Sci A: Java-Klasse und möchte einige meiner Freunde mit dem Code-Golfen beginnen. Ich habe eine Herausforderung aus dem Kurs und möchte sehen, in wie vielen Bytes die Community diese Herausforderung durchführen kann.

Herausforderungsdetails:

Wenn zwei Eingabezeichenfolgen, die Hauptzeichenfolge und die Pivotzeichenfolge, angegeben werden, gehen Sie wie folgt vor:

Wenn die Pivot-Zeichenfolge genau einmal Teil der Hauptzeichenfolge ist, muss der Teil der Hauptzeichenfolge, der vor der Pivot-Zeichenfolge liegt, mit dem nachfolgenden Teil ausgetauscht werden , wobei die Reihenfolge innerhalb der auszutauschenden Unterzeichenfolgen beibehalten wird .

Beispielsweise:

Wenn die Pivot-Zeichenfolge leer ist oder die Pivot-Zeichenfolge nicht in der Hauptzeichenfolge gefunden wird, muss das Programm kein definiertes Verhalten aufweisen.

Wenn mehr als eine Instanz der Pivot-Zeichenfolge vorhanden ist, sollte die Aufteilung bei der ersten und nur bei der ersten Instanz des Pivots erfolgen.

Beispiele: Ausgehend von der Hauptzeichenfolge OneTwoThreeTwoOneund der Pivotzeichenfolge Twosollte die Ausgabe sein ThreeTwoOneTwoOne.

Wenn der Hauptstring 1Two2Two3Two4und der Drehpunkt gegeben sind Two, sollte die Ausgabe sein 2Two3Two4Two1.

Bei der gegebenen Hauptzeichenfolge OneTwoThreeund der Pivotzeichenfolge "Zwei" sollte die Ausgabe sein ThreeTwoOne. Gegeben die Hauptschnur the rabbit is faster than the turtleund die Pivotschnur

 is faster than 

(beachte das einzelne Leerzeichen nach und vor), sollte die Ausgabe sein the turtle is faster than the rabbit.

Wenn der Hauptstring 1-2-3-4-5-6und der Drehpunkt gegeben sind -, sollte die Ausgabe sein 2-3-4-5-6-1.

Nachwort:

Dies ist meine allererste Frage zum Thema Codegolf. Wenn Sie also Vorschläge oder konstruktive Kritik haben, können Sie dies gerne sagen.

Außerdem ist mein Code für dieses Projekt (in Java geschrieben, weil der Kurs darauf abzielt) unten zu finden. Wenn Sie Tipps haben, würde ich sie gerne sehen. Derzeit sind es 363 Bytes, aber ich wette, ihr könnt euch viel bessere und kleinere Lösungen einfallen lassen.

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

Hinweis: Der Text für die Eingaben und für den Fall, dass die Pivot-Zeichenfolge nicht gefunden wird, ist für die ursprüngliche Zuweisung obligatorisch, jedoch nicht für diese Herausforderung.

DiePlasmaRailgun
quelle
Was ist die erwartete Ausgabe für pivot='-'und main='1-2-3-4-5-6'? Die meisten Einreichungen geben 2-3-4-5-6-1dies aus, aber so wie ich es verstehe, sollte es eine Herausforderung sein 2-1-3-4-5-6.
OVS
Es sollte nur die Zeichenfolge auf dem ersten Drehpunkt aufgeteilt werden. So soll die vorgesehene Ausgabe sein 2-3-4-5-6-1.
ThePlasmaRailgun
3
Übrigens können Sie den Sandkasten beim nächsten Mal benutzen .
Erik der Outgolfer
Ich denke, die Betonung "während die Reihenfolge innerhalb der ausgetauschten Subtrings beibehalten wird" hat es nur verwirrender gemacht. Ich verstehe das schon so, aber der Wortlaut hat es verwirrend gemacht, wenn Sie das so gemeint haben.
Kamoroso94

Antworten:

6

Gelee , 6 Bytes

œṣṙ1j⁴

Probieren Sie es online!

Erläuterung

œṣṙ1j⁴  Main Link
œṣ      Split around sublists equal to the pivot
  ṙ1    Rotate left by one
    j⁴  Rejoin on the pivot
HyperNeutrino
quelle
Wow, gibt es eine Chance auf eine Erklärung? Das ist phänomenal!
ThePlasmaRailgun
@ThePlasmaRailgun Es ist in der Tat nicht so phänomenal: P - Jelly hat nützliche eingebaute Funktionen: œṣ" x um Unterlisten gleich y teilen ", ṙ1dreht das Array um eine Stelle nach links und j⁴verbindet sich mit der zweiten Eingabe.
Mr. Xcoder
@ThePlasmaRailgun Jetzt wird eine Erklärung hinzugefügt. Aber für Jelly ist das nicht mal extrem beeindruckend xD
HyperNeutrino
Nett. Ich liebe es.
ThePlasmaRailgun
6

Python 2 , 37 39 Bytes

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

Wo aist die Hauptsaite und bist die Pivot-Saite.

Probieren Sie es online!

wnnmaw
quelle
2
Ändern Sie split(b)zu, split(b,1)um anzugeben, dass Sie nur beim ersten Auftreten aufteilen möchten.
Mypetlion
@ovs, bearbeitet, um am dritten Testfall zu arbeiten
wnnmaw
@mypetlion, ich wusste nicht splitmehr Argumente akzeptiert, danke!
wnnmaw
6

Wolfram Language (Mathematica) , 34 Byte

p#2<>p<>#&@@StringSplit[#,p,2]&

Probieren Sie es online!

Eine unbenannte Curry-Funktion, die mit dem Pivot zuerst und dem Hauptstring zweitens aufgerufen werden sollte. Wenn Sie beispielsweise die Funktion einem Namen zugewiesen haben f:

f["-"]["1-2-3-4-5-6"]
Martin Ender
quelle
4

Perl 5 , 20 + 2 ( -pl) = 22 Bytes

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

Probieren Sie es online!

Nimmt die Pivot-Zeichenfolge in die erste Zeile, dann die vollständige Zeichenfolge in die zweite.

Xcali
quelle
spielen mit Argumenten fand ich diese 20 Byte Lösung , da sonst die /s um $_entfernt werden kann
Nahuel FOUILLEUL
auch $_=~<>;$_="$'$&$"` ist 20 Bytes und liest Argumente in der richtigen Reihenfolge
Nahuel Fouilleul
4

Python 2 , 53 44 Bytes

danke an ThePlasmaRailgun für ein paar Bytes

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

Probieren Sie es online!

ovs
quelle
Die Ausgabe auf Ihrem Testfall mit Pivot "Two" und String "1Two2Two3Two4" sollte "2Two3Two4Two1" sein. Es sollte nur bei den ersten "Zwei" aufgeteilt werden, so dass Sie das Array ["1", "2Two3Two4Two"] erhalten. Dann kannst du einfach print k[1]+p+k[0]. Dies sollte Verhalten beabsichtigt haben.
ThePlasmaRailgun
Fest. Ich werde auch einen Beispieltestfall hinzufügen, um den Leuten zu zeigen, wie es sein sollte.
ThePlasmaRailgun
@ThePlasmaRailgun für das nächste Mal, wenn Sie eine Antwort verbessern möchten, hinterlassen Sie einfach einen Kommentar und lassen Sie das Op sie bearbeiten.
Ovs
@ThePlasmaRailgun danke für Ihre Klarstellung
Ovs
Zweite und dritte Zeile werden k,j=m.split(p,1);print j,p,kfür 38 Bytes.
Mypetlion
4

Alice , 18 Bytes

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

Probieren Sie es online!

Erläuterung

/...
\...@/

Dies ist nur ein Framework für Code im linearen Ordinalmodus (Zeichenfolgenverarbeitung). Wenn wir den Zick-Zack-Kontrollfluss entfalten, erhalten wir:

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).
Martin Ender
quelle
2

Pyth , 8 Bytes

jQ.<cEQ1

Probieren Sie es hier aus!

Erläuterung

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.
Mr. Xcoder
quelle
2

Kohle , 13 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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

R , 63 58 57 Bytes

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

Probieren Sie es online!

Mist die Hauptsaite, Pist der Dreh- und Angelpunkt.

Die Retina-Antwort von ovs zeigte an, dass ich meinen früheren Versuch eines Regex-Ansatzes reparieren konnte

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

durch Hinzufügen ?zur ersten Erfassungsgruppe.

Giuseppe
quelle
2

Java 8, 47 Bytes

x->y->x.replaceAll("(.*?)("+y+")(.*)","$3$2$1")

Probieren Sie es online aus

Nahuel Fouilleul
quelle
replaceFirst durch replaceAll geändert, da 2 Bytes kürzer sind und da der reguläre Ausdruck mit der gesamten Zeichenfolge übereinstimmt, erfolgt das Ersetzen nur einmal
Nahuel Fouilleul,
2

JavaScript (ES6), 41 bis 40 Byte

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

Testfälle

Arnauld
quelle
2

J , 14 Bytes

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

Wie es funktioniert:

Das linke Argument ist der Drehpunkt, das rechte der umzukehrende String

            ,~   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

Probieren Sie es online!

Galen Ivanov
quelle
2

C  106  100 Bytes

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

Probieren Sie es online!

Steadybox
quelle
0

Perl 6 , 31 Bytes

->$_,$b {S/(.*?)$b(.*)/$1$b$0/}

Probier es aus

Brad Gilbert b2gills
quelle
0

PHP, 62 Bytes

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

benötigt PHP 7.1; kann fehlschlagen, wenn der Pivot Regex-Sonderzeichen ( \+*?[^]$(){}=!<>|:-) enthält.
Keine Änderungen, wenn Pivot leer ist. Leere Ausgabe, wenn Pivot nicht in der Eingabe ist.
Laufen Sie mit -n.

sichere Version, 77 Bytes:

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

Keine Änderungen, wenn Pivot leer ist. Leere Ausgabe, wenn Pivot nicht in der Eingabe ist.
Laufen Sie mit -n.

Nicht-Regex-Version, 71 Bytes:

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

gibt Warnungen aus, wenn der Pivot leer ist; Keine Änderung, wenn Pivot nicht in der Eingabe ist.

Laufen Sie mit -nr.

Probieren Sie sie online aus .

Titus
quelle
0

Schnell , 131 Bytes

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

Erklärung (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
}
Herman L
quelle
0

C ++ 11, 64 Bytes

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

Ein Lambda, das die Zeichenfolgen s, p und a erfasst, mit a als Referenz (in-out).

Code testen

#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;
}
Surt
quelle
0

Sauber , 83 Bytes

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

Ein Stringin Clean ist normalerweise {#Char}- ein unboxed ( #) CharArray ( {}). Diese Funktion benötigt [Char]stattdessen Stringeine zweite, gültige Version von String.

Die Vollfunktionssignatur ist f :: [.t] .t -> [.t] | [.t <= Char].

Probieren Sie es online!

Οurous
quelle