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.


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

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!


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




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!


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




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.

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

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.



2

JavaScript (ES6), 41 bis 40 Byte

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

Testfälle


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!





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 .



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
}


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

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!


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.