Переверните две секции струны вокруг оси

17

Фон

В настоящее время я учусь в AP Comp Sci A: Java, и я хочу начать с некоторыми из моих друзей заниматься гольфом. У меня есть вызов от курса, и я хотел бы видеть, сколько байтов сообщество может выполнить этот вызов.

Детали вызова:

Учитывая две входные строки, основную строку и строку сводки, сделайте следующее:

Если строка поворота в качестве подстроки основной строки указывается ровно один раз, часть основной строки, которая находится перед строкой поворота, должна быть заменена на часть, которая следует после, при сохранении порядка в указанных подстроках, подлежащего обмену .

Например:

Если строка сводки пуста или строка сводки не найдена в основной строке, программе не требуется определенное поведение.

Если имеется более одного экземпляра строки сводки, разделение должно происходить в первом и только в первом экземпляре сводки.

Примеры: Учитывая основную строку OneTwoThreeTwoOneи строку разворота Two, вывод должен быть ThreeTwoOneTwoOne.

Учитывая основную строку 1Two2Two3Two4и сводку Two, вывод должен быть 2Two3Two4Two1.

Учитывая основную строку 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]);}}

Примечание. Текст для входных данных и для случая, когда строка сводки не найдена, является обязательным для исходного присвоения, но не для этой задачи.

ThePlasmaRailgun
источник
Каков ожидаемый результат для pivot='-'и main='1-2-3-4-5-6'? 2-3-4-5-6-1Для этого выводится большинство заявок , но, как я понимаю, задача должна быть 2-1-3-4-5-6.
овс
Следует только разбить строку по первому стержню. Так должен быть выход 2-3-4-5-6-1.
ThePlasmaRailgun
3
Кстати, вы можете использовать песочницу в следующий раз.
Эрик Outgolfer
Я думаю, что акцент «при сохранении порядка внутри указанных подстрок обменивается» только запутал его. Я уже понимаю это таким образом, но формулировка сбивает с толку, если вы это имели в виду.
kamoroso94

Ответы:

6

Желе , 6 байт

œṣṙ1j⁴

Попробуйте онлайн!

объяснение

œṣṙ1j⁴  Main Link
œṣ      Split around sublists equal to the pivot
  ṙ1    Rotate left by one
    j⁴  Rejoin on the pivot
HyperNeutrino
источник
Вау, есть шанс объяснения? Это феноменально!
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является основной строкой.

Попробуйте онлайн!

wnnmaw
источник
2
Выберите, split(b)чтобы split(b,1)указать, что вы хотите разделить только по первому вхождению.
mypetlion
@ovs, отредактированный для работы над третьим контрольным примером
wnnmaw
@mypetlion, я не знаю, splitпринял больше аргументов, спасибо!
wnnmaw
6

Wolfram Language (Mathematica) , 34 байта

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

Попробуйте онлайн!

Неименованная карри-функция, которая должна вызываться с первой точкой поворота и второй основной строкой. Например, если вы присвоили функции имя f:

f["-"]["1-2-3-4-5-6"]
Мартин Эндер
источник
4

Perl 5 , 20 + 2 ( -pl) = 22 байта

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

Попробуйте онлайн!

Принимает строку поворота в первой строке, затем полную строку во второй.

Xcali
источник
играя с аргументами, я нашел это 20-байтовое решение , в противном случае /окружение $_можно удалить
Nahuel Fouilleul
также $_=~<>;$_="$'$&$"составляет 20 байтов и читает аргументы в правильном порядке"
Науэль Фуийе
4

Python 2 , 53 44 байта

спасибо ThePlasmaRailgun за несколько байтов

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

Попробуйте онлайн!

овс
источник
Выходные данные в вашем тестовом случае с пивотом «Два» и строкой «1Two2Two3Two4» должны быть «2Two3Two4Two1». Он должен делиться только на первые два, оставляя вам массив ["1", "2Two3Two4Two"]. Тогда вы можете просто print k[1]+p+k[0]. Это должно было иметь предполагаемое поведение.
ThePlasmaRailgun
Исправлена. Я также собираюсь добавить пример теста, чтобы показать людям, как это должно быть.
ThePlasmaRailgun
@ThePlasmaRailgun в следующий раз , когда вы хотите , чтобы улучшить ответ просто оставить комментарий и дайте оп редактировать его в.
овсе
@ThePlasmaRailgun спасибо за ваше разъяснение
OVS
Вторая и третья строки делаются k,j=m.split(p,1);print j,p,kпо 38 байт.
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

Pyth , 8 байт

jQ.<cEQ1

Попробуй это здесь!

объяснение

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.
Мистер Xcoder
источник
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является стержнем.

Ответ Retina на ovs показал, что я могу исправить мою более раннюю попытку подхода регулярных выражений

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

добавив ?в первую группу захвата.

Giuseppe
источник
2

Java 8, 47 байт

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

Попробуйте онлайн

Науэль Фуйе
источник
изменил replaceFirst на replaceAll, потому что на 2 байта короче и когда регулярное выражение совпадает со всей строкой, замена выполняется только один раз
Науэль Фуийе
2

JavaScript (ES6), 41 40 байт

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

Контрольные примеры

Arnauld
источник
2

J , 14 байт

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

Как это устроено:

Левый аргумент - это стержень, правый - строка, которая должна быть обращена

            ,~   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 пуст, пустой вывод, если Pivot не на входе.
Беги с -n.

безопасная версия, 77 байт:

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

без изменений, если Pivot пуст, пустой вывод, если Pivot не на входе.
Беги с -n.

версия без регулярных выражений, 71 байт:

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

выдает предупреждения, если Pivot пуст; без изменений, если Pivot отсутствует на входе.

Беги с -nr.

Попробуйте их онлайн .

Titus
источник
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))}

Объяснение (без золота)

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, со ссылкой в ​​качестве (in-out).

Тестовый код

#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
источник
0

Чисто , 83 байта

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

А Stringв Clean это обычно {#Char}- массив unboxed ( #) Char( {}). Эта функция принимает [Char]вместо Stringвторой действительной версииString .

Полная функция подписи есть f :: [.t] .t -> [.t] | [.t <= Char].

Попробуйте онлайн!

Οurous
источник