Оберніть два відрізки рядка навколо шарніра


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
До речі, ви можете використати пісочницю наступного разу.
Ерік Аутгольфер

Я думаю, що наголос, "зберігаючи порядок в заміні зазначених підрядків", просто зробив це більш заплутаним. Я вже це розумію, але формулювання зробило це заплутаним, якщо це ви мали на увазі.
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 Додавання пояснення зараз. Але для Jelly це навіть не дуже вражаючий 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,k38 байт.
mypetlion



4

Аліса , 18 байт

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

Спробуйте в Інтернеті!

Пояснення

/...
\...@/

Це лише рамка для лінійного ординарного режиму (обробка рядків) коду. Розгортаючи зигзагоподібний потік управління, отримуємо:

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 Rets вказувала на те, що я можу виправити свою попередню спробу підходу до регулярного виведення

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

додавши ?до першої групи захоплення.



2

JavaScript (ES6), 41 40 bytes

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

Test cases


2

J, 14 bytes

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

How it works:

The left argument is the pivot, the right one - the string to be reversed

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

Try it online!





0

PHP, 62 bytes

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

requires PHP 7.1; may fail if the pivot contains regex special chars (\+*?[^]$(){}=!<>|:-).
no changes if Pivot is empty, empty output if Pivot is not in input.
Run with -n.

safe version, 77 bytes:

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

no changes if Pivot is empty, empty output if Pivot is not in input.
Run with -n.

non-regex version, 71 bytes:

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

yields warnings if the Pivot is empty; no change if Pivot is not in input.

Run with -nr.

Try them online.



0

Swift, 131 bytes

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

Explanation (ungolfed)

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 bytes

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

A lambda, which captures the strings s, p and a, with a as a reference (in-out).

Test code

#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

Clean, 83 bytes

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

A String in Clean is normally {#Char} - an unboxed (#) Char array ({}). This function takes [Char] instead of String, which is a second, valid version of String.

The full function signature is f :: [.t] .t -> [.t] | [.t <= Char].

Try it online!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.