Odwróć dwie sekcje sznurka wokół osi obrotu

17

tło

Obecnie uczęszczam na zajęcia AP Comp Sci A: Java i chcę zacząć od gry w golfa. Mam wyzwanie z kursu i chciałbym zobaczyć, w ilu bajtach społeczność może wykonać to wyzwanie.

Szczegóły wyzwania:

Biorąc pod uwagę dwa ciągi wejściowe, ciąg główny i ciąg przestawny, wykonaj następujące czynności:

Jeżeli łańcuch przestawny jest dokładnie jeden raz jako podciąg łańcucha głównego, część głównego łańcucha, która pojawia się przed łańcuchem obrotowym, powinna zostać zamieniona na część, która następuje po nim, zachowując jednocześnie kolejność wymienionych podciągów .

Na przykład:

Jeśli łańcuch przestawny jest pusty lub łańcuch główny nie zostanie znaleziony w ciągu głównym, program nie musi mieć zdefiniowanego zachowania.

Jeśli istnieje więcej niż jedna instancja ciągu przestawnego, podział powinien nastąpić przy pierwszej i tylko pierwszej instancji przestawnej.

Przykłady: Biorąc pod uwagę ciąg główny OneTwoThreeTwoOnei ciąg przestawny Two, wynikiem powinno być ThreeTwoOneTwoOne.

Biorąc pod uwagę główny ciąg 1Two2Two3Two4i oś przestawną Two, wynikiem powinno być 2Two3Two4Two1.

Biorąc pod uwagę ciąg główny OneTwoThreei ciąg przestawny „Dwa”, wynikiem powinno być ThreeTwoOne. Biorąc pod uwagę główny ciąg the rabbit is faster than the turtlei ciąg przestawny

 is faster than 

(zwróć uwagę na pojedyncze spacje końcowe i poprzedzające), wynikiem powinno być the turtle is faster than the rabbit.

Biorąc pod uwagę główny ciąg 1-2-3-4-5-6i oś przestawną -, wynikiem powinno być 2-3-4-5-6-1.

Posłowie:

To jest moje pierwsze pytanie dotyczące golfa kodowego, więc jeśli masz sugestie lub konstruktywną krytykę, możesz to powiedzieć.

Dodatkowo mój kod dla tego projektu (napisany w Javie, ponieważ kurs koncentruje się na tym) znajduje się poniżej. Jeśli masz jakieś wskazówki, chciałbym je zobaczyć. Obecnie ma 363 bajty, ale założę się, że możecie wymyślić znacznie lepsze i mniejsze rozwiązania.

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

Uwaga: Tekst dla danych wejściowych i przypadku, gdy nie można znaleźć ciągu przestawnego, jest obowiązkowy dla pierwotnego przypisania, ale nie dla tego wyzwania.

ThePlasmaRailgun
źródło
Jaka jest oczekiwana wydajność dla pivot='-'i main='1-2-3-4-5-6'? Większość zgłoszeń wychodzi 2-3-4-5-6-1na to, ale jak rozumiem, powinno to być wyzwanie 2-1-3-4-5-6.
ovs
Powinien on podzielić ciąg tylko na pierwszy element przestawny. Tak więc zamierzony wynik powinien być 2-3-4-5-6-1.
ThePlasmaRailgun,
3
Nawiasem mówiąc, możesz użyć piaskownicy następnym razem.
Erik the Outgolfer,
Myślę, że nacisk „przy jednoczesnym zachowaniu kolejności w ramach zamiany wspomnianych podciągów” sprawił, że stało się to bardziej mylące. Już to rozumiem w ten sposób, ale sformułowanie sprawiło, że było to mylące, jeśli o to ci chodziło.
kamoroso94,

Odpowiedzi:

6

Galaretka , 6 bajtów

œṣṙ1j⁴

Wypróbuj online!

Wyjaśnienie

œṣṙ1j⁴  Main Link
œṣ      Split around sublists equal to the pivot
  ṙ1    Rotate left by one
    j⁴  Rejoin on the pivot
HyperNeutrino
źródło
Wow, jakaś szansa na wyjaśnienie? To fenomenalne!
ThePlasmaRailgun,
@ThePlasmaRailgun W rzeczywistości nie jest to tak fenomenalne: P - Jelly ma przydatne wbudowane funkcje: œṣ„dzieli x wokół podlist równych y ”, ṙ1obraca tablicę o jedno miejsce w lewo i j⁴łączy się z drugim wejściem.
Pan Xcoder,
@ThePlasmaRailgun Dodawanie wyjaśnienia teraz. Ale dla Galaretki nie jest to nawet imponujące xD
HyperNeutrino,
Ładny. Kocham to.
ThePlasmaRailgun,
6

Python 2 , 37 39 bajtów

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

Gdzie ajest ciąg główny i bciąg przestawny.

Wypróbuj online!

wnnmaw
źródło
2
Zmień, split(b)aby split(b,1)określić, że chcesz podzielić tylko za pierwszym razem.
mypetlion
@ovs, edytowany do pracy nad trzecim przypadkiem testowym
wnnmaw,
@mypetlion, nie wiedziałem, że splitzaakceptowałem więcej argumentów, dzięki!
wnnmaw
6

Wolfram Language (Mathematica) , 34 bajty

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

Wypróbuj online!

Nienazwana funkcja curry, którą należy wywołać najpierw z osią przestawną, a drugą z ciągiem głównym. Na przykład, jeśli przypisałeś funkcję do nazwy f:

f["-"]["1-2-3-4-5-6"]
Martin Ender
źródło
4

Perl 5 , 20 + 2 ( -pl) = 22 bajtów

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

Wypróbuj online!

Bierze ciąg przestawny w pierwszym wierszu, a następnie pełny ciąg w drugim wierszu.

Xcali
źródło
grając z argumentami, znalazłem to 20 bajtowe rozwiązanie , w przeciwnym razie można usunąć /s wokół$_
Nahuel Fouilleul
również $_=~<>;$_="$'$&$„” ma 20 bajtów i odczytuje argumenty w odpowiedniej kolejności
Nahuel Fouilleul,
4

Python 2 , 53 44 bajty

dzięki ThePlasmaRailgun za niektóre bajty

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

Wypróbuj online!

ovs
źródło
Dane wyjściowe w przypadku testowym z osią przestawną „Two” i ciągiem „1Two2Two3Two4” powinny mieć wartość „2Two3Two4Two1”. Powinien podzielić się tylko na pierwszych „Two”, pozostawiając ci tablicę [„1”, „2Two3Two4Two”]. Więc możesz po prostu print k[1]+p+k[0]. To powinno mieć zamierzone zachowanie.
ThePlasmaRailgun,
Naprawiony. Dodam też przykładowy przypadek testowy, aby pokazać ludziom, jak powinno być.
ThePlasmaRailgun,
@ThePlasmaRailgun po raz kolejny, aby poprawić odpowiedź, po prostu zostaw komentarz i pozwól, aby
operator
@ThePlasmaRailgun dzięki za wyjaśnienia
2017 r. O
Drugi i trzeci wiersz stają się k,j=m.split(p,1);print j,p,kdla 38 bajtów.
mypetlion
4

Alice , 18 bajtów

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

Wypróbuj online!

Wyjaśnienie

/...
\...@/

Jest to po prostu framework dla liniowego kodu trybu Ordinal (przetwarzanie łańcuchów). Po rozwinięciu zygzakowatego przepływu sterowania otrzymujemy:

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
źródło
2

Pyth , 8 bajtów

jQ.<cEQ1

Wypróbuj tutaj!

Wyjaśnienie

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.
Pan Xcoder
źródło
2

Węgiel drzewny , 13 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

  θ             First input
   η            Second input
 ⪪              Split
≔   θ           Assign result
      Eθ        Map over result
           κ    Current index
          ⊕     Incremented
        §θ      Circularly index into result
     ⪫      η   Join
                Implicitly print
Neil
źródło
2

R , 63 58 57 bajtów

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

Wypróbuj online!

Mjest głównym ciągiem, Pjest osią obrotu.

Odpowiedź Retina z serwisu ovs wskazała, że ​​mogę naprawić moją wcześniejszą próbę zastosowania wyrażenia regularnego

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

dodając ?do pierwszej grupy przechwytywania.

Giuseppe
źródło
2

Java 8, 47 bajtów

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

Wypróbuj online

Nahuel Fouilleul
źródło
zmieniono replace Najpierw przez replaceAll, ponieważ 2 bajty są krótsze i gdy wyrażenie regularne pasuje do całego łańcucha, zastąpienie odbywa się tylko raz
Nahuel Fouilleul
2

JavaScript (ES6), 41 40 bajtów

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

Przypadki testowe

Arnauld
źródło
2

J , 14 bajtów

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

Jak to działa:

Lewy argument jest osią obrotu, prawy - ciąg znaków, który ma zostać odwrócony

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

Wypróbuj online!

Galen Iwanow
źródło
2

C,  106  100 bajtów

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

Wypróbuj online!

Steadybox
źródło
0

Perl 6 , 31 bajtów

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

Sprawdź to

Brad Gilbert b2gills
źródło
0

PHP, 62 bajty

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

wymaga PHP 7.1; może się nie powieść, jeśli pivot zawiera specjalne znaki regularne ( \+*?[^]$(){}=!<>|:-).
bez zmian, jeśli Pivot jest pusty, puste wyjście, jeśli Pivot nie jest wprowadzony.
Uruchom z -n.

wersja bezpieczna, 77 bajtów:

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

bez zmian, jeśli Pivot jest pusty, puste wyjście, jeśli Pivot nie jest wprowadzony.
Uruchom z -n.

wersja bez wyrażenia regularnego, 71 bajtów:

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

wyświetla ostrzeżenia, jeśli element przestawny jest pusty; bez zmian, jeśli Pivot nie jest wprowadzany.

Uruchom z -nr.

Wypróbuj je online .

Tytus
źródło
0

Szybki , 131 bajtów

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

Wyjaśnienie (bez golfa)

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.
źródło
0

C ++ 11, 64 bajty

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

Lambda, która przechwytuje ciągi s, p i a, jako odniesienie (wejście-wyjście).

Kod testowy

#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
źródło
0

Czysty , 83 bajty

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

A Stringw Clean to normalnie {#Char}- unboxed ( #) Chararray ( {}). Ta funkcja przyjmuje [Char]zamiast String, czyli drugą, poprawną wersjęString .

Pełna sygnatura funkcji to f :: [.t] .t -> [.t] | [.t <= Char] .

Wypróbuj online!

Obrzydliwe
źródło