Invertire due sezioni di una stringa attorno a un perno


17

sfondo

Sono attualmente in un AP Comp Sci A: classe Java e voglio iniziare alcuni dei miei amici sul golf del codice. Ho una sfida dal corso e vorrei vedere in quanti byte la community può fare questa sfida.

Dettagli della sfida:

Dati due stringhe di input, la stringa principale e la stringa pivot, attenere alla seguente procedura:

Se la stringa pivot è esattamente una volta come sottostringa della stringa principale, la parte della stringa principale che precede la stringa pivot deve essere scambiata con la parte che segue, preservando allo stesso tempo l'ordine all'interno di tali sottotitoli .

Per esempio:

Se la stringa pivot è vuota o la stringa pivot non viene trovata nella stringa principale, il programma non deve avere un comportamento definito.

Se esiste più di un'istanza della stringa pivot, la divisione dovrebbe avvenire nella prima e solo nella prima istanza del pivot.

Esempi: data la stringa principale OneTwoThreeTwoOnee la stringa pivot Two, l'output dovrebbe essere ThreeTwoOneTwoOne.

Data la stringa principale 1Two2Two3Two4e pivot Two, l'output dovrebbe essere 2Two3Two4Two1.

Data la stringa principale OneTwoThreee la stringa pivot "Two", l'output dovrebbe essere ThreeTwoOne. Data la stringa principale the rabbit is faster than the turtlee la stringa pivot

 is faster than 

(notare il singolo spazio finale e precedente), l'output dovrebbe essere the turtle is faster than the rabbit.

Data la stringa principale 1-2-3-4-5-6e il perno -, l'output dovrebbe essere 2-3-4-5-6-1.

Epilogo:

Questa è la mia prima domanda in assoluto sul code golf, quindi se hai suggerimenti o critiche costruttive, sentiti libero di dirlo.

Inoltre, il mio codice per questo progetto (scritto in Java perché il corso si concentra su questo) può essere trovato sotto. Se hai qualche consiglio, mi piacerebbe vederli. Sono attualmente 363 byte, ma scommetto che voi ragazzi potete trovare soluzioni molto migliori e più piccole.

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

Nota: il testo per gli input e nel caso in cui la stringa pivot non venga trovata è obbligatorio per l'assegnazione originale, ma non per questa sfida.


Qual è l'output previsto per pivot='-'e main='1-2-3-4-5-6'? La maggior parte degli invii ha prodotto 2-3-4-5-6-1questo risultato, ma a quanto ho capito la sfida dovrebbe essere 2-1-3-4-5-6.
Ovs,

Dovrebbe solo dividere la stringa sul primo perno. Quindi l'output previsto dovrebbe essere 2-3-4-5-6-1.
ThePlasmaRailgun

3
A proposito, puoi usare la sandbox la prossima volta.
Erik the Outgolfer,

Penso che l'enfasi "preservando l'ordine all'interno di detti sottotitoli che vengono scambiati" abbia appena reso più confuso. Lo capisco già in questo modo, ma la formulazione ha reso confuso se questo è ciò che intendevi.
kamoroso94

Risposte:



6

Gelatina , 6 byte

œṣṙ1j⁴

Provalo online!

Spiegazione

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

Caspita, qualche possibilità di spiegazione? È fenomenale!
ThePlasmaRailgun

@ThePlasmaRailgun In realtà non è fenomenale: P - Jelly ha utili incorporamenti: œṣè "diviso x attorno a liste secondarie uguali a y ", ṙ1ruota l'array di un posto a sinistra e si j⁴unisce al secondo input.
Mr. Xcoder,

@ThePlasmaRailgun Aggiungendo una spiegazione ora. Ma per Jelly non è nemmeno estremamente impressionante xD
HyperNeutrino l'

Bello. Lo adoro.
ThePlasmaRailgun

6

Python 2 , 37 39 byte

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

Dov'è ala stringa principale ed bè la stringa pivot.

Provalo online!


2
Passare split(b)a split(b,1)per specificare che si desidera dividere solo alla prima occorrenza.
mypetlion l'

@ovs, modificato per funzionare sul terzo test case
wnnmaw

@mypetlion, non sapevo di aver splitaccettato altri argomenti, grazie!
wnnmaw




4

Python 2 , 53 44 byte

grazie a ThePlasmaRailgun per alcuni byte

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

Provalo online!


L'output sul test case con perno "Two" e stringa "1Two2Two3Two4" dovrebbe essere "2Two3Two4Two1". Dovrebbe essere diviso solo sul primo "Due", lasciandoti l'array ["1", "2Two3Two4Two"]. Allora puoi solo print k[1]+p+k[0]. Questo dovrebbe avere un comportamento previsto.
ThePlasmaRailgun

Fisso. Ho anche intenzione di aggiungere un esempio di test case per mostrare alla gente come dovrebbe essere.
ThePlasmaRailgun

@ThePlasmaRailgun per la prossima volta che vuoi migliorare una risposta, lascia un commento e lascia che l'op lo modifichi.
Ovs,

@ThePlasmaRailgun grazie per il tuo chiarimento
ovs

La seconda e la terza riga diventano k,j=m.split(p,1);print j,p,kper 38 byte.
mypetlion l'



4

Alice , 18 byte

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

Provalo online!

Spiegazione

/...
\...@/

Questo è solo un framework per il codice della modalità Ordinale lineare (elaborazione delle stringhe). Spiegando il flusso di controllo a zigzag, otteniamo:

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 byte

jQ.<cEQ1

Provalo qui!

Spiegazione

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

Carbone , 13 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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

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

Provalo online!

Mè la stringa principale, Pè il perno.

La risposta di Retina di ovs indicava che avrei potuto riparare il mio precedente tentativo di approccio regex

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

aggiungendo ?al primo gruppo di acquisizione.


2

Java 8, 47 byte

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

Provalo online


cambiato per primo Sostituisci per tutto perché 2 byte in meno e poiché il regex corrisponde all'intera stringa la sostituzione viene eseguita una sola volta
Nahuel Fouilleul,

2

JavaScript (ES6), 41 40 byte

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

Casi test


2

J , 14 byte

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

Come funziona:

L'argomento sinistro è il perno, quello destro - la stringa da invertire

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

Provalo online!


2

C,  106  100 byte

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

Provalo online!




0

PHP, 62 byte

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

richiede PHP 7.1; potrebbe non riuscire se il pivot contiene caratteri speciali regex ( \+*?[^]$(){}=!<>|:-).
nessuna modifica se Pivot è vuoto, output vuoto se Pivot non è in input.
Corri con-n .

versione sicura, 77 byte:

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

nessuna modifica se Pivot è vuoto, output vuoto se Pivot non è in input.
Corri con-n .

versione non regex, 71 byte:

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

genera avvisi se il Pivot è vuoto; nessuna modifica se Pivot non è in input.

Corri con -nr.

Provali online .



0

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

Spiegazione (non golfizzato)

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

Una lambda, che cattura le stringhe s, p e a, con a come riferimento (in-out).

Codice di prova

#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

Pulito , 83 byte

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

A Stringin Clean è normalmente {#Char}- un unboxed ( #) Chararray ( {}). Questa funzione accetta [Char]invece di String, che è una seconda versione valida di String.

La firma della funzione completa è f :: [.t] .t -> [.t] | [.t <= Char].

Provalo online!


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.