Bir dizenin pivot etrafındaki iki bölümünü ters çevirme


17

Arka fon

Şu anda bir AP Comp Sci A: Java sınıfındayım ve bazı arkadaşlarımı kod golf konusunda başlatmak istiyorum. Kurstan bir meydan okumam var ve topluluğun bu meydan okumayı kaç bayt yapabileceğini görmek istiyorum.

Zorluk detayları:

İki giriş dizesi (ana dize ve pivot dizesi) verildiğinde aşağıdakileri yapın:

Pivot dizesi tam olarak bir kez ana dizenin bir alt dizesi ise, ana dizenin pivot dizesinden önce gelen kısmı, söz konusu alt diziler içindeki sırayı korurken, pivot dizesinden önce gelen parça ile değiştirilir .

Örneğin:

Pivot dize boş veya Pivot dize ise değil ana dize içinde bulunan program tanımlı davranışa sahip olmak zorunda değildir.

Pivot dizesinin birden fazla örneği varsa, bölünme, pivotun ilk ve yalnızca ilk örneğinde gerçekleşmelidir.

Örnekler: Ana dize OneTwoThreeTwoOneve pivot dize Twoverildiğinde, çıktı olmalıdır ThreeTwoOneTwoOne.

Ana dize 1Two2Two3Two4ve pivot göz önüne alındığında, Twoçıktı olmalıdır 2Two3Two4Two1.

Ana dize OneTwoThreeve pivot dize "Two" verildiğinde, çıktı olmalıdır ThreeTwoOne. Ana dize the rabbit is faster than the turtleve pivot dizesi verildiğinde

 is faster than 

(tek boşluk sonunu ve öncesini not edin), çıkış olmalıdır the turtle is faster than the rabbit.

Ana dize 1-2-3-4-5-6ve pivot verildiğinde, -çıktı olmalıdır 2-3-4-5-6-1.

Sonsöz:

Bu kod golf hakkında ilk sorum, bu yüzden önerileriniz veya yapıcı eleştirileriniz varsa, bunu söylemekten çekinmeyin.

Ayrıca, bu proje için kodum (derse odaklandığı için Java ile yazılmış) aşağıda bulunabilir. Eğer herhangi bir ipucu varsa, onları görmek isterim. Şu anda 363 bayt, ama eminim sizler çok daha iyi ve daha küçük çözümler üretebilirsiniz.

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

Not: Girişler ve pivot dizesinin bulunmadığı durumlar için metin, orijinal atama için zorunludur, ancak bu sınama için zorunlu değildir.


İçin beklenen çıkış nedir pivot='-'ve main='1-2-3-4-5-6'? Çoğu başvuru bunun için çıktı 2-3-4-5-6-1, ama ben anlamak zor gibi olmalıdır 2-1-3-4-5-6.
17'de

Dizeyi yalnızca ilk pivotta bölmelidir. Yani amaçlanan çıktı olmalıdır 2-3-4-5-6-1.
ThePlasmaRailgun

3
Bu arada, bir sonraki sefer korumalı alanı kullanabilirsiniz .
Outgolfer Erik

Bence "sözü geçen altyazılar içindeki düzeni korurken değiş tokuş" vurgusu daha da kafa karıştırıcı hale geldi. Bunu zaten bu şekilde anlıyorum, ama ifade etmek istediğin buysa kafa karıştırıcıydı.
kamoroso94

Yanıtlar:



6

Jöle , 6 bayt

œṣṙ1j⁴

Çevrimiçi deneyin!

açıklama

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

Vay, açıklama şansı var mı? Bu olağanüstü!
ThePlasmaRailgun

@ThePlasmaRailgun Aslında bu olağanüstü değil: P - Jelly kullanışlı yerleşik özelliklere sahiptir: œṣ" x'i y'ye eşit alt listeler etrafında böl ", ṙ1diziyi bir yere sola döndürür j⁴ve ikinci girdiyle birleşir.
Bay Xcoder

@ThePlasmaRailgun Şimdi bir açıklama ekliyor. Ancak Jelly için bu son derece etkileyici bir xD bile değil
HyperNeutrino

Güzel. Onu seviyorum.
ThePlasmaRailgun

6

Python 2 , 37 39 bayt

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

aAna dize ve bpivot dizesi nerede .

Çevrimiçi deneyin!


2
Yalnızca ilk yinelemede bölmek istediğinizi belirtmek split(b)için split(b,1)olarak değiştirin .
mypetlion

@ovs, üçüncü test davası üzerinde çalışmak için düzenlendi
wnnmaw

@ mypetlion, splitkabul edilen daha fazla argümanı bilmiyordum , teşekkürler!
wnnmaw




4

Python 2 , 53 44 bayt

bazı baytlar için ThePlasmaRailgun'a teşekkürler

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

Çevrimiçi deneyin!


Pivot "Two" ve "1Two2Two3Two4" dizesi ile test durumunuzdaki çıktı "2Two3Two4Two1" olmalıdır. Sadece ilk "İki" üzerine bölünmeli ve size ["1", "2Two3Two4Two"] dizisini bırakmalıdır. O zaman sadece yapabilirsiniz print k[1]+p+k[0]. Bunun amaçlanan davranışı olmalıdır.
ThePlasmaRailgun

Sabit. Ayrıca insanlara nasıl olması gerektiğini göstermek için örnek bir test örneği ekleyeceğim.
ThePlasmaRailgun

@ThePlasmaRailgun bir dahaki sefere bir yanıtı geliştirmek istediğinizde sadece bir yorum bırakın ve op'un içeri girmesine izin verin.
ovs

Senin açıklama @ThePlasmaRailgun teşekkürler
ovs

İkinci ve üçüncü satırlar k,j=m.split(p,1);print j,p,k38 bayt olur.
mypetlion



4

Alice , 18 bayt

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

Çevrimiçi deneyin!

açıklama

/...
\...@/

Bu yalnızca doğrusal Ordinal mod (dize işleme) kodu için bir çerçevedir. Zikzak kontrol akışını açarken:

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 bytes

jQ.<cEQ1

Try it here!

Explanation

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

Charcoal, 13 bytes

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

Try it online! Link is to verbose version of code. Explanation:

  θ             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 bytes

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

Try it online!

M is the main string, P is the pivot.

ovs' Retina answer indicated that I could repair my earlier attempt at a regex approach

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

by adding ? to the first capture group.



2

JavaScript (ES6), 41 40 bytes

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

Test cases


2

J, 14 bytes

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

How it works:

The left argument is the pivot, the right one - the string to be reversed

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

Try it online!


2

C,  106  100 bytes

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

Try it online!




0

PHP, 62 bytes

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

requires PHP 7.1; may fail if the pivot contains regex special chars (\+*?[^]$(){}=!<>|:-).
no changes if Pivot is empty, empty output if Pivot is not in input.
Run with -n.

safe version, 77 bytes:

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

no changes if Pivot is empty, empty output if Pivot is not in input.
Run with -n.

non-regex version, 71 bytes:

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

yields warnings if the Pivot is empty; no change if Pivot is not in input.

Run with -nr.

Try them online.



0

Swift, 131 bytes

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

Explanation (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 bytes

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

A lambda, which captures the strings s, p and a, with a as a reference (in-out).

Test code

#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

Clean, 83 bytes

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

A String in Clean is normally {#Char} - an unboxed (#) Char array ({}). This function takes [Char] instead of String, which is a second, valid version of String.

The full function signature is f :: [.t] .t -> [.t] | [.t <= Char].

Try it online!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.