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.


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

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!


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




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!


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

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




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.

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

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.



2

JavaScript (ES6), 41 40 byte

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

Uji kasus


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!


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!




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 .



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
}


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

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!


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.