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


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

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


Каков ожидаемый результат для 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

Вау, есть шанс объяснения? Это феноменально!
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является основной строкой.

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


2
Выберите, split(b)чтобы split(b,1)указать, что вы хотите разделить только по первому вхождению.
mypetlion

@ovs, отредактированный для работы над третьим контрольным примером
wnnmaw

@mypetlion, я не знаю, splitпринял больше аргументов, спасибо!
wnnmaw



4

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

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

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

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


играя с аргументами, я нашел это 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

R , 63 58 57 байт

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

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

Mявляется основной строкой, Pявляется стержнем.

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

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

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




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.

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



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

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.