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.


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

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!


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




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!


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




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.

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


2

Java 8, 47 octets

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

Essayez-le en ligne


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


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!





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 .



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
}


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

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!


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.