Зміна символів у рядку


12

У цьому виклику вам потрібно перенести символи у введений рядок n кількість разів та вивести зміщену рядок

Вхідні дані

Спочатку вхід буде містити рядок. У наступному рядку nбуде присутнє ціле число, яке позначає .

Вихідні дані

  • Якщо nє позитивним, перемістіть символи в рядку в потрібний nчас.
  • Якщо nвід’ємник, пересуньте символи в рядку вліво n.
  • Якщо nнуль, не зміщуйте символи в рядку.

Після зсуву (за винятком випадків, коли nнуль) надрукуйте зміщену рядок.

Примітки

  • Рядок не буде порожній або null.
  • Рядок не буде довше 100 символів і міститиме лише символи ASCII в діапазоні (пробіл) до ~(тильда) (символьні коди від 0x20 до 0x7E включно). Для ознайомлення дивіться таблицю ASCII .
  • Зсув циклічний.
  • Цифра nможе бути додатною, негативною або нульовою.
  • n завжди буде більшим або рівним -1000 та меншим або рівним 1000
  • Ви можете приймати дані через stdinаргументи командного рядка або з нього
  • Зміщена рядок повинна виводитися в stdout(або найближчий еквівалент)
  • Ви можете написати повну програму або функцію, яка приймає введення та виводить рядок у stdoutнайближчий еквівалент

Випробування

1)

Hello world!
5             -->orld!Hello w

2)

Testing...
-3            -->ting...Tes

3)

~~~
1000          -->~~~

4)

12345
0             -->12345

5)

ABA
17            -->BAA

Оцінка балів

Це , тому найкоротше подання (у байтах) виграє.

Відповіді:


5

Pyth, 4 байти

.>zQ

Це майже аналогічно моїй байтовій версії CJam 5 , за винятком того, що Pyth як оператор введення auto-eval Q.

.>              # Cyclic right shift of 
  z             # Input first line as string
   Q            # Rest of the input as evaluated integer

Спробуйте його онлайн тут


Точно таке ж рішення, як і це :-)
Spikatrix

@CoolGuy Це досить прямо вперед. Хоча я цього не бачив у пісочниці ..
Оптимізатор

Здається, чомусь більше не працює. Ось робоча альтернатива, також 4 байти.
hakr14

3

Javascript ( ES5 ), 55 52 байти

p=prompt;with(p())p(slice(b=-p()%length)+slice(0,b))

Прокоментував:

p = prompt; // store a copy of prompt function for reuse
with(p()) // extend scope chain with first input
    p( // print result
        slice(b = -p() % length) // take second input negated and modulo length
        +                        // and slice string by result
        slice(0, b) // concatenate with opposite slice
    )

2

CJam, 5 байт

llim>

Це досить прямо вперед.

l               e# Read the first line
 li             e# Read the second line and convert to integer
   m>           e# Shift rotate the first string by second integer places

Спробуйте його онлайн тут


1
Чи підпадає це під вбудовані функції?
LegionMammal978

@ LegionMammal978 Це є вбудованою функцією. Але ОП не обмежує використання вбудованих модулів
Optimizer

1
Вбудовані функції - це стандартні лазівки .
LegionMammal978

4
@ LegionMammal978 ви вказуєте на відповідь, яка має майже 50-50 голосів "вгору / вниз". Це не рішення громади.
Оптимізатор

2

C, 93 байти

main(a,v,n)char**v;{a=v[2]-v[1]-1;n=atoi(v[2]);a=a*(n>0)-n%a;printf("%s%.*s",v[1]+a,a,v[1]);}

Більш чіткою є версія функції-аргументу, яка була модифікована для створення версії аргументу командного рядка

f(s,n,c)char*s;{c=strlen(s);c=c*(n>0)-n%c;printf("%s%.*s",s+c,c,s);}

У цьому лише 68 байт, що просто показує, наскільки вразливим є C під час роботи з аргументами командного рядка.

Якщо зсув,, nє позитивним, то strlen(s)-n%strlen(s)це зміщення, а якщо nнегативне - зміщення -n%strlen(s). У printfпринтах від зсуву, cдо кінця рядка, а потім кінцевим cсимволам з самого початку.

Приклади:

$ ./rotstr "Привіт, світ!" 5
привіт! Привіт ж
$ ./rotstr "Тестування ..." -3
ting ... Тес
$ ./rotstr "~~~" 1000
~~~
$ ./rotstr "12345" 0
12345
$ ./rotstr "ABA" 17
BAA
$ ./rotstr "Привіт, світ!" -16
o світ!

Це не працює, як очікувалося для мене. Коли v[2]це так "1", код просто виводить рядок без будь-яких модифікацій. І тільки "~~~"і "12345"працює. Решта з них дає неправильні результати. Якби вони все оберталися ще один раз, це був би коректор.
Spikatrix

Я перевірив це як з gcc, так і (з незначною модифікацією main(a,v,n)-> n;main(a,v)) clang на Linux, і він працює як очікувалося. Для gcc я використовую версію 5.1.0 і компілюю gcc -o rotstr rotstr.c. Який компілятор ви використовуєте?
CL

Спробував зробити nглобальний теж. Те саме питання. Я склав за допомогою gcc file.c -o file. Я використовую GCC 4.8.1 на windows. Чи є у вашому коді невизначена поведінка?
Spikatrix

Заміна v[2]-v[1]-1на strlen(v[1])може змінити значення, це єдине місце, де я можу придумати щось тонке. На жаль, у мене немає доступу до машини Windows для тестування.
CL

Так. Код спрацював, коли я це змінив.
Spikatrix

2

Python 3, 45 байт

s=input();n=int(input());print(s[-n:]+s[:-n])

Ядром програми є

s[-n:]+s[:-n]

Все інше - це просто незграбна робота з вводу-виводу.


2
Це не вдалося до останнього ABA 17тестового випадку, і взагалі, якби|n| > length of string
Sp3000

якщо ви використовуєте n=int(input())%len(s);, він буде працювати для цілих чисел, більших за довжину рядка, але потрібно 7 символів
JPMC

2

К, 8 7 байт

{|x!|y}

Вже є примітивний "rotate" ( !), який виконує узагальнення цієї операції для списків. K рядки - це списки символів, тому воно застосовується. Спеціалізація трохи надає перевагу CJam та Pyth, тому що обертання K відбувається в іншому напрямку бажаного. Обгортання !функції та відмова від неявного аргументу xбуде робити те, що ми хочемо:

  f:{(-x)!y}
{(-x)!y}
  f[5;"Hello world!"]
"orld!Hello w"
  f[-3;"Testing..."]
"ting...Tes"
  f[17;"ABA"]
"BAA"

Трохи коротший підхід, запропонований kirbyfan64sos, полягає у тому, щоб усунути дужки та заперечення на користь |обертання рядка ( ) до та після обертання.

Якби не ця невідповідність імпедансу, рішення було б просто

!

Викликається однаково:

  f:!
!
  f[5;"Hello, World!"]
", World!Hello"
  f[-5;"Hello, World!"]
"orld!Hello, W"
  f[0;"Hello, World!"]
"Hello, World!"

1
Чи вдасться змінити рядок за допомогою |, обертати його та знову повернути його такий же результат? Якщо так, ви можете відрізати персонажа.
kirbyfan64sos

Гарна думка! Це спрацювало б.
JohnE

1

Піп, 10 байт

Це цілком можливо вдосконалити. Але для мови без оператора зміни 10 байт - це не погано.

a@_M-b+,#a

Пояснення:

            a, b are command-line args (implicit)
       ,#a  range(len(a))
    -b+     range(-b, len(a)-b)
a@_M        map(lambda x: a[x], range(-b, len(a)-b))
            Concatenate the list and print (implicit)

Це працює , тому що рядок і список індексації в Піп циклічно: "Hello"@9 == "Hello"@4 == "o".


1

rs , 180 символів

^(-\d+) (.*)/\1 \2\t
+^(-\d+) (.)(.*?)\t(.*)$/\1 \3\t\2\4
^(-\d+) \t/\1 
^(-?)(\d+)/\1 (_)^^(\2)
+_(_*) (.*)(.)$/\1 \3\2
^- /- \t
+^- (.*?)\t(.*?)(.)$/- \1\3\t\2
^-? +/
\t/

Демонстраційна демонстрація .

Більшість із них обертає рядок, якщо вхідне число від’ємне. Я скористався тим, що лише деякі символи ASCII є дійсним вкладом, і використовував вкладку на мою користь.

Зауважте, що мені довелося трохи обдурити: оскільки rs є однорядним модифікатором тексту, мені довелося використовувати <number> <text>як формат введення.


1

Ява, 167

enum S{;public static void main(String[]r){int n=-Integer.parseInt(r[1]),l=r[0].length();while(n<0)n+=l;n%=l;System.out.print(r[0].substring(n)+r[0].substring(0,n));}}

Здійснює введення через командний рядок.

Досить смішно, спочатку я випадково перевернув, як слід зміщувати струну. Але виправити цю помилку було коротше - просто помножити n на -1, щоб правильно записати логіку.

розширено:

enum Shift{
    ;
    public static void main(String[]args){
        int n=-Integer.parseInt(args[1]),length=args[0].length();
        while(n<0)n+=length;
        n%=length;
        System.out.print(args[0].substring(n)+args[0].substring(0,n));
    }
}

Чому у вас є enum S{; ... }?
Spikatrix

1
Я вирішив написати повну програму, оскільки 9 байт насправді не призвело до значних змін. Крім того, це нагадування, коли я озираюся, що я віддаю перевагу enum S {; ...} над класом S {...}, оскільки (навіть якщо вони займають однакову кількість байтів у цьому прикладі), якщо мені коли-небудь потрібно мати примірник класу, він займає ще один байт з версією enum: enum S {X; ...}. Це допомагає, якщо я хочу оголосити метод або змінну в класі, не використовуючи статичне ключове слово або експліцитно інстанціюючи новий об'єкт класу.
Jack Ammo

Оце Так! Приємно. Ніколи не знав, що enums можна використовувати так!
Spikatrix

Я знаю, що минуло два роки, як ти опублікував це, але ти можеш пограти в декілька речей. Integer.parseIntможе бути new Integer(-5 байт); і n%=l;може бути видалений, якщо ви зміните r[0].substring(n)+на r[0].substring(n%=l)+(-2 байти). Крім того, ви можете вказати, що це Java 6, тому що в Java 7 або вище, перерахунок з main-методом вже не можливий.
Кевін Кройсейсен

занадто ледачий, щоб не турбуватися редагувати, але належним чином відзначати економію.
Джек Аммо



1

Casio Basic, 27 байт

StrRotate s,s,-n:Print s

Як виявляється, для цього є вбудований модуль Casio ClassPad! Але це працює і в зворотному напрямку -n.

24 байти для коду, 3 байти - вказати s,nяк аргументи.


1

05AB1E , 6 байт

DgI+FÁ

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

D         # Duplicate the text input
 g        # Take it's length
          #  i.e. "Testing..." → 10
  I       # Take the integer input
   +      # Add them together
          #  i.e. 10 and -3 → 7
    F     # Loop that many times
     Á    #  And rotate once towards the right during every iteration

Оскільки 05AB1E має вбудовані пристрої для обертання лише один раз вправо / вліво , а не обертати Nкількість вправо / вліво , я обертаю length + inputкількість разів і обертаю стільки разів вправо.

Наприклад:

  • "Тестування ..." і -3 обертатимуться 10 + -3 = 7вправо, в результаті чого ting...Tes.
  • "Здрастуйте, світ" і 5 обертаються 11 + 5 = 16разів вправо, в результаті чого worldHello.



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