Inverser deux sections d'une chaîne autour d'un pivot

17

Contexte

Je suis actuellement dans une classe AP Comp Sci A: Java, et je veux commencer certains de mes amis sur le golf de code. J'ai un défi à relever pendant le cours, et j'aimerais voir dans combien d'octets la communauté peut relever ce défi.

Détails du défi:

Étant donné deux chaînes d'entrée, la chaîne principale et la chaîne pivot, procédez comme suit:

Si la chaîne pivot est exactement une fois en tant que sous-chaîne de la chaîne principale, la partie de la chaîne principale qui précède la chaîne pivot doit être permutée avec la partie qui suit, tout en préservant l'ordre dans lesdites sous-chaînes permutées. .

Par exemple:

Si la chaîne pivot est vide ou la chaîne pivot est pas trouvée dans la chaîne principale, le programme n'a pas besoin d'avoir un comportement défini.

S'il existe plusieurs instances de la chaîne pivot, la division doit se produire à la première et uniquement à la première instance du pivot.

Exemples: Étant donné la chaîne principale OneTwoThreeTwoOneet la chaîne pivot Two, la sortie doit être ThreeTwoOneTwoOne.

Étant donné la chaîne principale 1Two2Two3Two4et le pivot Two, la sortie devrait être 2Two3Two4Two1.

Étant donné la chaîne principale OneTwoThreeet la chaîne pivot "Two", la sortie devrait être ThreeTwoOne. Étant donné la chaîne principale the rabbit is faster than the turtleet la chaîne pivot

 is faster than 

(notez le seul espace qui suit et qui précède), la sortie devrait être the turtle is faster than the rabbit.

Étant donné la chaîne principale 1-2-3-4-5-6et le pivot -, la sortie devrait être 2-3-4-5-6-1.

Épilogue:

C'est ma toute première question sur le golf de code, donc si vous avez des suggestions ou des critiques constructives, n'hésitez pas à le dire.

De plus, mon code pour ce projet (écrit en Java parce que le cours se concentre sur cela) peut être trouvé ci-dessous. Si vous avez des conseils, j'adorerais les voir. C'est actuellement 363 octets, mais je parie que vous pouvez trouver des solutions bien meilleures et plus petites.

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

Remarque: Le texte pour les entrées et pour le cas où la chaîne pivot est introuvable est obligatoire pour l'affectation d'origine, mais pas pour ce défi.

ThePlasmaRailgun
la source
Quelle est la sortie attendue pour pivot='-'et main='1-2-3-4-5-6'? La plupart des soumissions produisent 2-3-4-5-6-1pour cela, mais si je comprends bien le défi que cela devrait être 2-1-3-4-5-6.
2017
Il ne devrait diviser la chaîne que sur le premier pivot. La sortie prévue devrait donc l'être 2-3-4-5-6-1.
ThePlasmaRailgun
3
Au fait, vous pourrez utiliser le bac à sable la prochaine fois.
Erik the Outgolfer
Je pense que l'accent "tout en préservant l'ordre dans les sous-chaînes échangées" vient de le rendre plus confus. Je le comprends déjà de cette façon, mais le libellé a rendu la confusion si c'est ce que vous vouliez dire.
kamoroso94

Réponses:

6

Gelée , 6 octets

œṣṙ1j⁴

Essayez-le en ligne!

Explication

œṣṙ1j⁴  Main Link
œṣ      Split around sublists equal to the pivot
  ṙ1    Rotate left by one
    j⁴  Rejoin on the pivot
HyperNeutrino
la source
Wow, une chance d'explication? C'est phénoménal!
ThePlasmaRailgun
@ThePlasmaRailgun Ce n'est pas si phénoménal, en fait: P - Jelly a des fonctionnalités utiles: œṣ"divise x autour de sous-listes égales à y ", ṙ1fait pivoter le tableau d'une place vers la gauche et j⁴rejoint la deuxième entrée.
M. Xcoder
@ThePlasmaRailgun Ajout d'une explication maintenant. Mais pour Jelly, ce n'est même pas extrêmement impressionnant xD
HyperNeutrino
Agréable. J'aime cela.
ThePlasmaRailgun
6

Python 2 , 37 39 octets

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

aest la chaîne principale et bla chaîne pivot.

Essayez-le en ligne!

wnnmaw
la source
2
Remplacez split(b)par split(b,1)pour spécifier que vous ne souhaitez diviser que lors de la première occurrence.
mypetlion
@ovs, édité pour travailler sur le troisième cas de test
wnnmaw
@mypetlion, je ne savais pas splitaccepter plus d'arguments, merci!
wnnmaw
6

Wolfram Language (Mathematica) , 34 octets

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

Essayez-le en ligne!

Une fonction au curry sans nom qui doit être appelée avec le pivot en premier et la chaîne principale en second. Par exemple, si vous avez attribué la fonction à un nom f:

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

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

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

Essayez-le en ligne!

Prend la chaîne pivot sur la première ligne, puis la chaîne complète sur la seconde.

Xcali
la source
en jouant avec les arguments, j'ai trouvé cette solution de 20 octets , sinon le /s autour $_peut être supprimé
Nahuel Fouilleul
aussi $_=~<>;$_="$'$&$"` fait 20 octets et lit les arguments dans le bon ordre
Nahuel Fouilleul
4

Python 2 , 53 44 octets

merci à ThePlasmaRailgun pour quelques octets

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

Essayez-le en ligne!

ovs
la source
La sortie sur votre cas de test avec pivot "Two" et chaîne "1Two2Two3Two4" devrait être "2Two3Two4Two1". Il ne devrait se diviser que sur le premier "Two", vous laissant le tableau ["1", "2Two3Two4Two"]. Ensuite, vous pouvez simplement print k[1]+p+k[0]. Cela devrait avoir un comportement voulu.
ThePlasmaRailgun
Fixé. Je vais également ajouter un exemple de cas de test pour montrer aux gens comment cela devrait être.
ThePlasmaRailgun
@ThePlasmaRailgun pour la prochaine fois que vous voulez améliorer une réponse, il suffit de laisser un commentaire et de laisser l'op l'éditer.
ovs
@ThePlasmaRailgun merci pour votre clarification
ovs
Les deuxième et troisième lignes deviennent k,j=m.split(p,1);print j,p,k38 octets.
mypetlion
4

Alice , 18 octets

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

Essayez-le en ligne!

Explication

/...
\...@/

Ceci est juste un cadre pour le code en mode Ordinal linéaire (traitement de chaîne). En dépliant le flux de contrôle en zigzag, nous obtenons:

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
la source
2

Pyth , 8 octets

jQ.<cEQ1

Essayez-le ici!

Explication

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.
M. Xcoder
la source
2

Fusain , 13 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

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

R , 63 58 57 octets

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

Essayez-le en ligne!

Mest la chaîne principale, Pest le pivot.

La réponse d'ovs sur la rétine a indiqué que je pouvais réparer ma tentative antérieure d'approche regex

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

en ajoutant ?au premier groupe de capture.

Giuseppe
la source
2

Java 8, 47 octets

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

Essayez-le en ligne

Nahuel Fouilleul
la source
changé replaceFirst par replaceAll parce que 2 octets de moins et que l'expression régulière correspond à la chaîne entière, le remplacement n'est effectué qu'une seule fois
Nahuel Fouilleul
2

JavaScript (ES6), 41 40 octets

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

Cas de test

Arnauld
la source
2

J , 14 octets

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

Comment ça fonctionne:

L'argument de gauche est le pivot, celui de droite - la chaîne à inverser

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

Essayez-le en ligne!

Galen Ivanov
la source
2

C,  106  100 octets

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

Essayez-le en ligne!

Steadybox
la source
0

Perl 6 , 31 octets

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

Essaye-le

Brad Gilbert b2gills
la source
0

PHP, 62 octets

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

nécessite PHP 7.1; peut échouer si le pivot contient des caractères spéciaux regex ( \+*?[^]$(){}=!<>|:-).
aucun changement si Pivot est vide, sortie vide si Pivot n'est pas en entrée.
Courir avec-n .

version sûre, 77 octets:

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

aucun changement si Pivot est vide, sortie vide si Pivot n'est pas en entrée.
Courez avec -n.

version non regex, 71 octets:

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

renvoie des avertissements si le pivot est vide; aucun changement si Pivot n'est pas en entrée.

Courez avec -nr.

Essayez-les en ligne .

Titus
la source
0

Swift , 131 octets

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

Explication (non golfée)

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
la source
0

C ++ 11, 64 octets

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

Un lambda, qui capture les chaînes s, p et a, avec a comme référence (in-out).

Code de test

#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
la source
0

Nettoyer , 83 octets

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

Un Stringdans Clean est normalement {#Char}- un tableau unboxed ( #) Char( {}). Cette fonction prend la [Char]place de String, qui est une deuxième version valide de String.

La signature de fonction complète est f :: [.t] .t -> [.t] | [.t <= Char].

Essayez-le en ligne!

Οurous
la source