Сдвиг символов в строке

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

счет

Это , поэтому выигрывает самое короткое представление (в байтах).

Spikatrix
источник

Ответы:

5

Pyth, 4 байта

.>zQ

Это почти похоже на мою 5-байтовую версию CJam , за исключением того, что Pyth как оператор ввода с автоматическим вычислением 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
    )
nderscore
источник
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 Это является встроенной функцией. Но ОП не ограничивает использование встроенных модулей
Оптимизатор
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
orld! Привет
$ ./rotstr "Тестирование ..." -3
тин ... Tes
$ ./rotstr "~~~" 1000
~~~
$ ./rotstr "12345" 0
12345
$ ./rotstr "ABA" 17
BAA
$ ./rotstr "Привет, мир!" -16
о мир! ад
CL-
источник
Это не работает, как ожидалось для меня. Когда 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]

Все остальное - просто неуклюжая работа с I / O.

Дверная ручка
источник
2
Это не удастся для последнего ABA 17тестового случая, и будет в целом, если|n| > length of string
Sp3000
если вы используете n=int(input())%len(s);, он будет работать для целых чисел, превышающих длину строки, но потребует еще 7 символов
JPMC
2

К, 8 7 байт

{|x!|y}

Уже существует примитив rotate ( !), который выполняет обобщение этой операции для списков. К строкам относятся списки символов, так что это применимо. Однако спецификация немного предпочитает 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!"
Johne
источник
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".

DLosc
источник
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>в качестве формата ввода.

kirbyfan64sos
источник
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; ...}. Это помогает, если я хочу объявить метод или переменную в классе без использования статического ключевого слова или явного создания экземпляра нового объекта класса.
Джек Боеприпасы
Вот это да! Ницца. Никогда не знал, что enumможно использовать таким образом!
Spikatrix
Я знаю, что прошло уже почти два года с тех пор, как вы опубликовали это, но вы можете сыграть в гольф несколько вещей. Integer.parseIntможет быть new Integer(-5 байт); и n%=l;может быть удален, если вы измените r[0].substring(n)+на r[0].substring(n%=l)+(-2 байта). Кроме того, вы можете указать, что это Java 6, потому что в Java 7 или выше перечисление с main-method больше невозможно.
Кевин Круйссен
слишком ленив, чтобы потрудиться редактировать, но должным образом отмечен для экономии.
Джек Боеприпасы
1

PHP> = 7.1, 88 байт (неконкурентный)

for([,$s,$t]=$argv;$t;)$s=$t<0?substr($s,1).$s[!$t++]:$s[-1].substr($s,!$t--,-1);echo$s;

Testcases

Йорг Хюльсерманн
источник
Почему «неконкурентный»?
Spikatrix
@CoolGuy Используемая версия PHP - это сборка после начала вопроса
Йорг Хюльсерманн,
1

Casio Basic, 27 байтов

StrRotate s,s,-n:Print s

Как выясняется, для Casio ClassPad это встроено! Но это работает наоборот, следовательно -n.

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

numbermaniac
источник
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.
  • «Hello world» и 5 повернут 11 + 5 = 16время вправо, в результате чего worldHello.
Кевин Круйссен
источник