Membalik dua bagian string di sekitar pivot

17

Latar Belakang

Saya saat ini berada dalam kelas AP Comp Sci A: Java, dan saya ingin memulai beberapa teman saya dengan bermain golf kode. Saya mendapat tantangan dari kursus, dan saya ingin melihat berapa byte yang dapat dilakukan oleh komunitas ini.

Detail tantangan:

Diberikan dua string input, string utama dan string pivot, lakukan hal berikut:

Jika string pivot tepat sekali sebagai substring dari string utama, bagian dari string utama yang datang sebelum string pivot akan ditukar dengan bagian yang datang setelahnya, sambil menjaga urutan dalam substring yang sedang ditukar .

Sebagai contoh:

Jika string pivot kosong atau string pivot tidak ditemukan dalam string utama, program tidak harus memiliki perilaku yang ditentukan.

Jika ada lebih dari satu instance dari string pivot, perpecahan harus terjadi pada yang pertama dan hanya instance pertama dari pivot.

Contoh: Diberikan string utama OneTwoThreeTwoOnedan string pivot Two, output seharusnya ThreeTwoOneTwoOne.

Mengingat string 1Two2Two3Two4dan pivot utama Two, output harus 2Two3Two4Two1.

Mengingat string utama OneTwoThreedan string pivot "Dua", output seharusnya ThreeTwoOne. Diberikan string utama the rabbit is faster than the turtledan string pivot

 is faster than 

(perhatikan spasi tunggal sebelum dan sesudahnya), hasilnya harus the turtle is faster than the rabbit.

Mengingat string utama 1-2-3-4-5-6dan pivot -, output seharusnya 2-3-4-5-6-1.

Kata penutup:

Ini adalah pertanyaan pertama saya tentang golf kode, jadi jika Anda memiliki saran atau kritik yang membangun, maka jangan ragu untuk mengatakannya.

Selain itu, kode saya untuk proyek ini (ditulis dalam bahasa Jawa karena kursus berfokus pada itu) dapat ditemukan di bawah. Jika Anda memiliki tips, saya ingin sekali melihatnya. Saat ini 363 byte, tapi saya yakin kalian bisa datang dengan solusi yang jauh lebih baik dan lebih kecil.

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

Catatan: Teks untuk input dan untuk kasus bahwa string pivot tidak ditemukan adalah wajib untuk tugas asli, tetapi tidak untuk tantangan ini.

ThePlasmaRailgun
sumber
Apa output yang diharapkan untuk pivot='-'dan main='1-2-3-4-5-6'? Sebagian besar hasil kiriman 2-3-4-5-6-1untuk ini, tapi seperti yang saya mengerti tantangannya seharusnya 2-1-3-4-5-6.
ovs
Seharusnya hanya membagi string pada pivot pertama . Jadi output yang dimaksudkan seharusnya 2-3-4-5-6-1.
ThePlasmaRailgun
3
Omong-omong, Anda dapat menggunakan kotak pasir di waktu berikutnya.
Erik the Outgolfer
Saya pikir penekanannya "sambil mempertahankan urutan dalam subtring yang sedang bertukar" hanya membuatnya lebih membingungkan. Saya sudah memahaminya seperti itu, tetapi kata-katanya membuatnya membingungkan jika itu yang Anda maksudkan.
kamoroso94

Jawaban:

6

Jelly , 6 byte

œṣṙ1j⁴

Cobalah online!

Penjelasan

œṣṙ1j⁴  Main Link
œṣ      Split around sublists equal to the pivot
  ṙ1    Rotate left by one
    j⁴  Rejoin on the pivot
HyperNeutrino
sumber
Wow, ada kemungkinan penjelasan? Itu fenomenal!
ThePlasmaRailgun
@ThePlasmaRailgun Ini tidak terlalu fenomenal, pada kenyataannya: P - Jelly memiliki built-in yang berguna: œṣadalah "membagi x sekitar sublists sama dengan y ", ṙ1memutar array satu tempat ke kiri dan j⁴bergabung dengan input kedua.
Tuan Xcoder
@ThePlasmaRailgun Menambahkan penjelasan sekarang. Tapi untuk Jelly, itu bahkan bukan xD yang sangat mengesankan
HyperNeutrino
Bagus. Aku menyukainya.
ThePlasmaRailgun
6

Python 2 , 37 39 byte

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

Di mana astring utama dan bstring pivot.

Cobalah online!

wnnmaw
sumber
2
Ubah split(b)ke split(b,1)untuk menentukan bahwa Anda hanya ingin membagi pada kesempatan pertama.
mypetlion
@ovs, diedit untuk bekerja pada test case ketiga
wnnmaw
@ Maxyplion, saya tidak tahu splitmenerima lebih banyak argumen, terima kasih!
wnnmaw
6

Bahasa Wolfram (Mathematica) , 34 byte

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

Cobalah online!

Fungsi tanpa nama, kari yang harus dipanggil dengan pivot pertama dan kedua string utama. Misalnya, jika Anda menetapkan fungsi ke nama f:

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

Ohm v2 , 4 byte

ïλ⁴j

Cobalah online!

benar-benar manusiawi
sumber
1
@ThePlasmaRailgun Sama seperti Jelly, built-in yang lebih pendek
Mr. Xcoder
4

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

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

Cobalah online!

Mengambil string pivot pada baris pertama, lalu string penuh pada baris kedua.

Xcali
sumber
bermain dengan argumen saya menemukan solusi 20 byte ini , jika /s sekitar $_dapat dihapus
Nahuel Fouilleul
juga $_=~<>;$_="$'$&$"` adalah 20 byte dan membaca argumen dalam urutan yang benar
Nahuel Fouilleul
4

Python 2 , 53 44 byte

terima kasih kepada ThePlasmaRailgun untuk beberapa byte

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

Cobalah online!

ovs
sumber
Output pada test case Anda dengan pivot "Dua" dan string "1Two2Two3Two4" harus "2Two3Two4Two1". Seharusnya hanya dibagi pada "Dua" pertama, meninggalkan Anda array ["1", "2Two3Two4Two"]. Maka Anda bisa saja print k[1]+p+k[0]. Ini seharusnya memiliki perilaku yang dimaksudkan.
ThePlasmaRailgun
Tetap. Saya juga akan menambahkan contoh uji kasus untuk menunjukkan kepada orang bagaimana seharusnya.
ThePlasmaRailgun
@ThePlasmaRailgun untuk waktu berikutnya Anda ingin meningkatkan jawaban, tinggalkan komentar dan biarkan op mengeditnya.
Ovs
@ThePlasmaRailgun terima kasih atas klarifikasi Anda
ovs
Baris kedua dan ketiga menjadi k,j=m.split(p,1);print j,p,kuntuk 38 byte.
mypetlion
4

Python 2 , 37 byte

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

Cobalah online!

Tuan Xcoder
sumber
4

Alice , 18 byte

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

Cobalah online!

Penjelasan

/...
\...@/

Ini hanya kerangka kerja untuk mode ordinal linear (pemrosesan string) kode. Membuka kontrol aliran zigzag, kita mendapatkan:

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
sumber
4

SOGL V0.12 , 9 5 byte

ΘK+,∑

Coba Di Sini!

Penjelasan:

Θ      split the 2nd input on the 1st one
 K     get the 1st element
  +    and add it to the end
   ,∑  join on the 1st input
dzaima
sumber
3

Retina , 24 23 byte

tank ke Martin Ender selama -1 byte

(.*)¶(.*?)\1(.*)
$3$1$2

Cobalah online!

ovs
sumber
2

Pyth , 8 byte

jQ.<cEQ1

Coba di sini!

Penjelasan

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.
Tuan Xcoder
sumber
2

Arang , 13 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

R , 63 58 57 byte

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

Cobalah online!

Madalah string utama, Padalah pivot.

Jawaban retina ovs menunjukkan bahwa saya dapat memperbaiki upaya saya sebelumnya pada pendekatan regex

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

dengan menambahkan ?ke grup tangkap pertama.

Giuseppe
sumber
2

Java 8, 47 byte

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

Cobalah online

Nahuel Fouilleul
sumber
diganti replaceFirst oleh replaceAll karena 2 byte lebih pendek dan sesuai dengan regex, seluruh penggantian string dilakukan hanya sekali
Nahuel Fouilleul
2

JavaScript (ES6), 41 40 byte

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

Uji kasus

Arnauld
sumber
2

J , 14 byte

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

Bagaimana itu bekerja:

Argumen kiri adalah pivot, yang benar - string yang akan dibalik

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

Cobalah online!

Galen Ivanov
sumber
2

C,  106  100 byte

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

Cobalah online!

Steadybox
sumber
0

Perl 6 , 31 byte

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

Menguji

Brad Gilbert b2gills
sumber
0

PHP, 62 byte

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

membutuhkan PHP 7.1; mungkin gagal jika pivot berisi regex chars khusus ( \+*?[^]$(){}=!<>|:-).
tidak ada perubahan jika Pivot kosong, kosongkan output jika Pivot tidak dalam input.
Jalankan dengan -n.

versi aman, 77 byte:

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

tidak ada perubahan jika Pivot kosong, kosongkan output jika Pivot tidak dalam input.
Jalankan dengan -n.

versi non-regex, 71 byte:

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

menghasilkan peringatan jika Pivot kosong; tidak ada perubahan jika Pivot tidak dimasukkan.

Jalankan dengan -nr.

Cobalah secara online .

Titus
sumber
0

Swift , 131 byte

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

Penjelasan (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.
sumber
0

C ++ 11, 64 byte

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

Sebuah lambda, yang menangkap string s, p dan a, dengan sebagai referensi (masuk-keluar).

Kode uji

#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
sumber
0

Bersih , 83 byte

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

Sebuah Stringdi Clean biasanya {#Char}- sebuah tanpa box ( #) Chararray ( {}). Fungsi ini mengambil [Char]alih-alih String, yang merupakan versi valid keduaString .

Tanda tangan fungsi penuh adalah f :: [.t] .t -> [.t] | [.t <= Char] .

Cobalah online!

Suram
sumber