ย้อนกลับสองส่วนของสตริงรอบเดือย


17

พื้นหลัง

ขณะนี้ฉันอยู่ใน AP Comp Sci A: คลาส Java และฉันต้องการเริ่มเพื่อนบางคนของฉันเกี่ยวกับการตีกอล์ฟ ฉันมีความท้าทายจากหลักสูตรและฉันต้องการดูว่ามีกี่ไบต์ที่ชุมชนสามารถทำสิ่งนี้ได้

รายละเอียดการท้าทาย:

กำหนดสตริงอินพุตสองสตริงคือสตริงหลักและสตริง pivot ให้ทำดังนี้:

ถ้าสตริงเดือยเป็นสิ่งที่ครั้งหนึ่งเคยเป็น substring ของสตริงหลักส่วนหนึ่งของสตริงหลักที่มาก่อนสตริงเดือยจะต้องสลับกับส่วนหนึ่งที่เกิดขึ้นหลังจากที่ในขณะที่การรักษาสินค้าได้ภายใน subtrings กล่าวถูกเปลี่ยน

ตัวอย่างเช่น:

หากสตริงสาระสำคัญว่างเปล่าหรือไม่พบสตริงสาระสำคัญภายในสตริงหลักโปรแกรมไม่จำเป็นต้องกำหนดพฤติกรรมไว้

หากมีมากกว่าหนึ่งอินสแตนซ์ของสตริงเดือยการแยกควรเกิดขึ้นในอินสแตนซ์แรกและอินสแตนซ์แรกเท่านั้นของเดือย

ตัวอย่าง: ให้สตริงหลักOneTwoThreeTwoOneและสตริงเดือยผลผลิตที่ควรจะเป็นTwoThreeTwoOneTwoOne

ได้รับสตริงหลัก1Two2Two3Two4และหมุนเอาท์พุทที่ควรจะเป็นTwo2Two3Two4Two1

ได้รับสตริงหลักOneTwoThreeและสตริงเดือย "สอง" ThreeTwoOneเอาท์พุทที่ควรจะเป็น รับสายหลักthe rabbit is faster than the turtleและสายหมุน

 is faster than 

(หมายเหตุพื้นที่เดียวต่อท้ายและก่อนหน้านี้) the turtle is faster than the rabbitเอาท์พุทที่ควรจะเป็น

ได้รับสตริงหลัก1-2-3-4-5-6และหมุนเอาท์พุทที่ควรจะเป็น-2-3-4-5-6-1

เล่ม:

นี่เป็นคำถามแรกของฉันเกี่ยวกับการตีกอล์ฟดังนั้นถ้าคุณมีข้อเสนอแนะหรือคำวิจารณ์ที่สร้างสรรค์คุณสามารถพูดอย่างนั้นได้

นอกจากนี้รหัสของฉันสำหรับโครงการนี้ (เขียนด้วยภาษา Java เพราะหลักสูตรเน้นที่เรื่องนั้น) ดูได้ที่ด้านล่าง หากคุณมีคำแนะนำใด ๆ ฉันชอบที่จะเห็นพวกเขา ขณะนี้มีขนาด 363 ไบต์ แต่ฉันคิดว่าคุณสามารถสร้างโซลูชันที่ดีและเล็กลงได้

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

หมายเหตุ: ข้อความสำหรับอินพุตและสำหรับกรณีที่ไม่พบสตริงสาระสำคัญจำเป็นสำหรับการกำหนดค่าดั้งเดิม แต่ไม่ใช่สำหรับความท้าทายนี้


ผลลัพธ์ที่คาดหวังสำหรับpivot='-'และmain='1-2-3-4-5-6'คืออะไร? ส่วนใหญ่ส่งออกการส่ง2-3-4-5-6-1นี้ 2-1-3-4-5-6แต่ที่ผมเข้าใจความท้าทายที่ควรจะเป็น
ovs

มันควรแยกสตริงบนเดือยแรกเท่านั้น 2-3-4-5-6-1ดังนั้นการส่งออกควรจะตั้งใจ
ThePlasmaRailgun

3
โดยวิธีการที่คุณสามารถใช้กล่องทรายในครั้งต่อไป
Erik the Outgolfer

ฉันคิดว่าการเน้น "ในขณะที่รักษาลำดับภายใน subtrings ดังกล่าวถูกสลับ" เพียงทำให้สับสนมากขึ้น ฉันเข้าใจแล้วเป็นอย่างนั้น แต่ข้อความทำให้สับสนถ้านั่นคือสิ่งที่คุณหมายถึง
kamoroso94

คำตอบ:



6

เยลลี่ 6 ไบต์

œṣṙ1j⁴

ลองออนไลน์!

คำอธิบาย

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

ว้าวโอกาสของคำอธิบายไหม? นั่นเป็นปรากฏการณ์!
ThePlasmaRailgun

@ThePlasmaRailgun ไม่ใช่ปรากฏการณ์ที่จริงแล้ว: P - Jelly มีประโยชน์ในตัว: œṣคือ "แยกxรอบรายการย่อยเท่ากับy " ṙ1หมุนอาร์เรย์หนึ่งไปทางซ้ายและj⁴เชื่อมต่อกับอินพุตที่สอง
นาย Xcoder

@ThePlasmaRailgun กำลังเพิ่มคำอธิบายทันที แต่สำหรับเจลลี่นั้นไม่น่าประทับใจอย่างยิ่ง xD
HyperNeutrino

ดี ฉันรักมัน.
ThePlasmaRailgun

6

Python 2 , 37 39ไบต์

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

aสตริงหลักอยู่ที่ไหนและbเป็นสตริงเดือย

ลองออนไลน์!


2
เปลี่ยนsplit(b)เป็นsplit(b,1)เพื่อระบุว่าคุณต้องการแยกในการเกิดครั้งแรกเท่านั้น
mypetlion

@ovs แก้ไขเพื่อทำงานในกรณีทดสอบที่สาม
wnnmaw

@mypetlion ฉันไม่รู้จักsplitยอมรับการโต้แย้งเพิ่มขึ้นขอบคุณ!
wnnmaw

6

ภาษา Wolfram (Mathematica) , 34 ไบต์

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

ลองออนไลน์!

ฟังก์ชั่นที่ไม่มีชื่อ curried ซึ่งควรจะเรียกด้วยเดือยแรกและสายหลักที่สอง เช่นถ้าคุณมอบหมายฟังก์ชั่นให้กับชื่อf:

f["-"]["1-2-3-4-5-6"]


4

Perl 5 , 20 + 2 ( -pl) = 22 ไบต์

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

ลองออนไลน์!

รับสตริง pivot บนบรรทัดแรกจากนั้นสตริงเต็มในวินาที


เล่นกับข้อโต้แย้งที่ฉันพบนี้20 ไบต์แก้ปัญหามิฉะนั้น/s รอบ$_สามารถถอดออกได้
Nahuel Fouilleul

เช่นกัน$_=~<>;$_="$'$&$"` คือ 20 ไบต์และอ่านข้อโต้แย้งในลำดับที่ถูกต้อง
Nahuel Fouilleul

4

Python 2 , 53 44 ไบต์

ขอบคุณThePlasmaRailgunสำหรับบางไบต์

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

ลองออนไลน์!


เอาต์พุตในกรณีทดสอบของคุณด้วย pivot "สอง" และสตริง "1Two2Two3Two4" ควรเป็น "2Two3Two4Two1" มันควรจะแยกใน "สอง" ครั้งแรกปล่อยให้คุณอาร์เรย์ ["1", "2Two3Two4T สอง"] print k[1]+p+k[0]จากนั้นคุณก็สามารถ สิ่งนี้ควรมีพฤติกรรมที่ตั้งใจไว้
ThePlasmaRailgun

แก้ไขแล้ว. ฉันจะเพิ่มกรณีทดสอบตัวอย่างเพื่อแสดงให้คนเห็นว่าควรเป็นอย่างไร
ThePlasmaRailgun

@ThePlasmaRailgun สำหรับครั้งต่อไปที่คุณต้องการที่จะปรับปรุงคำตอบเพียงแค่แสดงความคิดเห็นและให้สหกรณ์แก้ไขใน.
OVS

@ ThePlasmaRailgun ขอขอบคุณสำหรับความกระจ่างของคุณ
ovs

บรรทัดที่สองและสามกลายเป็นk,j=m.split(p,1);print j,p,k38 ไบต์
mypetlion



4

อลิซอายุ 18 ไบต์

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

ลองออนไลน์!

คำอธิบาย

/...
\...@/

นี่เป็นเพียงกรอบงานสำหรับโค้ดโหมดเชิงเส้น Ordinal (การประมวลผลสตริง) ตีแผ่การควบคุมการไหลของซิกแซกเราได้รับ:

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

ถ่าน 13 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

  θ             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 ไบต์

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

ลองออนไลน์!

Mเป็นสายหลักPคือเดือย

คำตอบจอประสาทตาของ ovsระบุว่าฉันสามารถซ่อมแซมความพยายามก่อนหน้าของฉันด้วยวิธี regex

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

โดยเพิ่ม?กลุ่มการจับภาพแรก


2

Java 8, 47 ไบต์

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

ลองออนไลน์


เปลี่ยน replaceFirst โดย replaceAll เนื่องจาก 2 ไบต์สั้นลงและเป็น regex ที่ตรงกับการแทนที่สตริงทั้งหมดจะกระทำเพียงครั้งเดียว
Nahuel Fouilleul


2

J , 14 ไบต์

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

มันทำงานอย่างไร:

อาร์กิวเมนต์ซ้ายคือ pivot หนึ่งอันที่ถูกต้อง - สตริงที่จะย้อนกลับ

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

ลองออนไลน์!





0

PHP, 62 ไบต์

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

ต้องการ PHP 7.1; อาจล้มเหลวหาก pivot มีตัวอักษรพิเศษ regex ( \+*?[^]$(){}=!<>|:-)
ไม่มีการเปลี่ยนแปลงหาก Pivot ว่างเปล่าเอาต์พุตว่างถ้า Pivot ไม่ได้อยู่ในอินพุต ทำงานด้วย
-n

รุ่นที่ปลอดภัย, 77 ไบต์:

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

ไม่มีการเปลี่ยนแปลงหาก Pivot ว่างเปล่าเอาต์พุตว่างถ้า Pivot ไม่ได้อยู่ในอินพุต ทำงานด้วย
-n

รุ่นที่ไม่ใช่ regex, 71 ไบต์:

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

ให้คำเตือนถ้า Pivot ว่างเปล่า ไม่มีการเปลี่ยนแปลงหาก Pivot ไม่ได้อยู่ในอินพุต

-nrทำงานด้วย

ลองพวกเขาออนไลน์



0

Swift , 131 ไบต์

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

คำอธิบาย (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 ไบต์

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

แลมบ์ดาซึ่งจับสตริง s, p และ a, พร้อมกับเป็นข้อมูลอ้างอิง (เข้า - ออก)

รหัสทดสอบ

#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

ทำความสะอาด , 83 ไบต์

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

Stringในสะอาดเป็นปกติ{#Char}- ค่าไม่มีกล่อง ( #) Chararray ( {}) ฟังก์ชันนี้ใช้[Char]แทนStringซึ่งเป็นรุ่นที่สองที่ถูกต้องของStringซึ่งเป็นสองรุ่นที่ถูกต้อง

ฟังก์ชั่นลายเซ็นเต็มรูปแบบคือ f :: [.t] .t -> [.t] | [.t <= Char]ลายเซ็นเต็มฟังก์ชั่น

ลองออนไลน์!


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.