Đảo ngược hai phần của chuỗi xung quanh trục


17

Lý lịch

Tôi hiện đang tham gia lớp AP Comp Sci A: Java và tôi muốn bắt đầu một số người bạn của mình chơi golf. Tôi có một thử thách từ khóa học, và tôi muốn xem cộng đồng có thể thực hiện thử thách này bao nhiêu byte.

Chi tiết thử thách:

Cho hai chuỗi đầu vào, chuỗi chính và chuỗi trục, thực hiện như sau:

Nếu chuỗi trục chính xác một lần là chuỗi con của chuỗi chính, phần của chuỗi chính đi trước chuỗi trục sẽ được hoán đổi với phần đi sau, trong khi vẫn giữ trật tự trong chuỗi phụ được nói .

Ví dụ:

Nếu chuỗi trục trống hoặc chuỗi trục không được tìm thấy trong chuỗi chính, chương trình không phải có hành vi được xác định.

Nếu có nhiều hơn một phiên bản của chuỗi trục, sự phân tách sẽ xảy ra ở lần đầu tiên và chỉ là phiên bản đầu tiên của trục.

Ví dụ: Cho chuỗi chính OneTwoThreeTwoOnevà chuỗi trục Two, đầu ra phải là ThreeTwoOneTwoOne.

Cho chuỗi chính 1Two2Two3Two4và trục Two, đầu ra phải là 2Two3Two4Two1.

Cho chuỗi chính OneTwoThreevà chuỗi trục "Hai", đầu ra phải là ThreeTwoOne. Cho chuỗi chính the rabbit is faster than the turtlevà chuỗi trục

 is faster than 

(lưu ý dấu vết không gian đơn và trước đó), đầu ra phải là the turtle is faster than the rabbit.

Cho chuỗi chính 1-2-3-4-5-6và trục -, đầu ra phải là 2-3-4-5-6-1.

Lời bạt:

Đây là câu hỏi đầu tiên của tôi về môn đánh gôn, vì vậy nếu bạn có đề xuất hoặc phê bình mang tính xây dựng, thì hãy thoải mái nói như vậy.

Ngoài ra, mã của tôi cho dự án này (được viết bằng Java vì khóa học tập trung vào đó) có thể được tìm thấy bên dưới. Nếu bạn có bất cứ lời khuyên nào, tôi rất muốn thấy chúng. Nó hiện có 363 byte, nhưng tôi cá rằng các bạn có thể đưa ra các giải pháp tốt hơn và nhỏ hơn nhiều.

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

Lưu ý: Văn bản cho các đầu vào và trong trường hợp không tìm thấy chuỗi trục là bắt buộc đối với bài tập gốc, nhưng không phải cho thử thách này.


Sản lượng dự kiến ​​cho pivot='-'và là main='1-2-3-4-5-6'gì? Hầu hết các bài nộp đầu ra 2-3-4-5-6-1cho điều này, nhưng theo tôi hiểu thì đó là thách thức 2-1-3-4-5-6.
trứng

Nó chỉ nên phân tách chuỗi trên trục đầu tiên . Vì vậy, đầu ra dự định nên được 2-3-4-5-6-1.
ThePlasmaRailgun

3
Nhân tiện, bạn có thể sử dụng hộp cát vào lần tới.
Erik the Outgolfer

Tôi nghĩ rằng sự nhấn mạnh "trong khi duy trì trật tự trong các chuỗi con nói đã bị tráo đổi" chỉ khiến nó trở nên khó hiểu hơn. Tôi đã hiểu nó theo cách đó, nhưng từ ngữ làm cho nó khó hiểu nếu đó là những gì bạn có ý nghĩa.
kamoroso94

Câu trả lời:



6

Thạch , 6 byte

œṣṙ1j⁴

Hãy thử trực tuyến!

Giải trình

œṣṙ1j⁴  Main Link
œṣ      Split around sublists equal to the pivot
  ṙ1    Rotate left by one
    j⁴  Rejoin on the pivot

Wow, bất kỳ cơ hội của một lời giải thích? Thật phi thường!
ThePlasmaRailgun

@ThePlasmaRailgun Thực tế không phải là hiện tượng đó: P - Jelly có các phần dựng sẵn hữu ích: œṣlà "chia x quanh các danh sách con bằng y ", ṙ1xoay mảng một vị trí sang trái và j⁴nối với đầu vào thứ hai.
Ông Xcoder

@ThePlasmaRailgun Thêm giải thích ngay bây giờ. Nhưng đối với Jelly, điều đó thậm chí không ấn tượng lắm xD
HyperNeutrino

Đẹp. Tôi thích nó.
ThePlasmaRailgun

6

Python 2 , 37 39 byte

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

Trong trường hợp alà chuỗi chính và blà chuỗi trục.

Hãy thử trực tuyến!


2
Thay đổi split(b)để split(b,1)chỉ định rằng bạn chỉ muốn tách trong lần xuất hiện đầu tiên.
mypetlion

@ovs, được chỉnh sửa để hoạt động trên trường hợp thử nghiệm thứ ba
wnnmaw

@mypetlion, tôi không biết splitchấp nhận nhiều tranh luận hơn, cảm ơn!
wnnmaw




4

Python 2 , 53 44 byte

cảm ơn ThePlasmaRailgun cho một số byte

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

Hãy thử trực tuyến!


Đầu ra trên trường hợp thử nghiệm của bạn với trục "Hai" và chuỗi "1Two2Two3Two4" phải là "2Two3Two4Two1". Nó chỉ nên phân chia trên "Hai" đầu tiên, để lại cho bạn mảng ["1", "2Two3Two4Two"]. Sau đó, bạn có thể chỉ print k[1]+p+k[0]. Điều này nên có hành vi dự định.
ThePlasmaRailgun

Đã sửa. Tôi cũng sẽ thêm một trường hợp thử nghiệm ví dụ để cho mọi người thấy nó nên như thế nào.
ThePlasmaRailgun

@ThePlasmaRailgun cho lần tiếp theo bạn muốn cải thiện câu trả lời chỉ cần để lại nhận xét và để op chỉnh sửa nó.
ovs

Nhờ @ThePlasmaRailgun để làm rõ của bạn
OVS

Dòng thứ hai và thứ ba trở thành k,j=m.split(p,1);print j,p,k38 byte.
mypetlion



4

Alice , 18 byte

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

Hãy thử trực tuyến!

Giải trình

/...
\...@/

Đây chỉ là một khung cho mã chế độ tuyến tính (xử lý chuỗi) tuyến tính. Mở ra luồng điều khiển ngoằn ngoèo, chúng tôi nhận được:

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

Than , 13 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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



2

JavaScript (ES6), 41 40 byte

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

Các trường hợp thử nghiệm


2

J , 14 byte

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

Làm thế nào nó hoạt động:

Đối số bên trái là trục, bên phải - chuỗi được đảo ngược

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

Hãy thử trực tuyến!





0

PHP, 62 byte

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

yêu cầu PHP 7.1; có thể thất bại nếu trục có chứa ký tự đặc biệt regex ( \+*?[^]$(){}=!<>|:-).
không thay đổi nếu Pivot trống, đầu ra trống nếu Pivot không có trong đầu vào.
Chạy với -n.

phiên bản an toàn, 77 byte:

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

không thay đổi nếu Pivot trống, đầu ra trống nếu Pivot không có trong đầu vào.
Chạy với -n.

phiên bản không phải regex, 71 byte:

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

mang lại cảnh báo nếu Pivot trống; không thay đổi nếu Pivot không có trong đầu vào.

Chạy với -nr.

Hãy thử chúng trực tuyến .



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

Giải thích (vô danh)

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

Một lambda, bắt các chuỗi s, p và a, với tư cách là một tham chiếu (vào ra).

Mã kiểm tra

#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

Sạch , 83 byte

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

Một Stringtrong sạch là bình thường {#Char}- một không có hộp bọc ( #) Charmảng ( {}). Hàm này [Char]thay thế String, là phiên bản hợp lệ thứ hai của String.

Chữ ký đầy đủ chức năng là f :: [.t] .t -> [.t] | [.t <= Char].

Hãy thử trực tuyến!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.