转换字符串中的字符


12

在此挑战中,您需要将输入字符串中的字符移位n次并输出移位后的字符串

输入值

输入将首先包含一个字符串。在下一行中,将显示一个整数,它表示n

输出量

  • 如果n为正,则将字符串中的字符移至正确的n时间。
  • 如果n为负,则将字符串中的字符向左移动n一次。
  • 如果n为零,请不要移动字符串中的字符。

移位后(n零时除外),打印移位后的字符串。

笔记

  • 该字符串将不会为空或null
  • 该字符串不得超过100个字符,并且只能包含(空格)至~(波浪号)范围内的ASCII字符(字符代码0x20至0x7E(包括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

计分

这是,因此最短的提交(以字节为单位)获胜。

Answers:


5

Pyth,4个字节

.>zQ

这几乎与我的CJam 5字节版本相似,除了Pyth作为自动评估输入运算符之外Q

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

在这里在线尝试


完全相同的解决方案:-)
Spikatrix

@CoolGuy非常简单。虽然,我没有看到这个沙箱..
优化

似乎由于某种原因不再起作用。是一个可行的替代方法,也是4个字节。
hakr14 '18

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 2015年

@ LegionMammal978这一个内置函数。但是OP不限制内置插件的使用
优化

1
内置功能是标准漏洞
LegionMammal978

4
@ LegionMammal978,您指向的答案几乎具有50-50票赞成/反对票。这不是社区的决定。
Optimizer

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
婷...特斯
$ ./rotstr“ ~~~” 1000
~~~
$ ./rotstr“ 12345” 0
12345
$ ./rotstr“ ABA” 17
BAA
$ ./rotstr“你好,世界!” -16
全世界!地狱

它不符合我的预期。当v[2]为时"1",代码仅输出字符串而不进行任何修改。并且只有"~~~""12345"作品。其余的输出错误。如果他们再旋转一次,那将是正确的。
Spikatrix

我已经在Linux上用gcc和(稍加修改main(a,v,n)-> n;main(a,v))clang 都对其进行了测试,并且可以正常工作。对于gcc,我使用的是5.1.0版,并使用进行编译gcc -o rotstr rotstr.c。您正在使用什么编译器?
CL-

试图使n全球也。同样的问题。我使用编译gcc file.c -o file。我在Windows上使用GCC 4.8.1。您的代码中是否存在未定义的行为?
Spikatrix

更换v[2]-v[1]-1strlen(v[1])可能会有所作为,这是我能想到的一些微妙事情的唯一地方。不幸的是,我无法使用Windows计算机进行测试。
CL

是。当我更改代码时,代码起作用了。
Spikatrix 2015年

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 2015年

2

K,8 7字节

{|x!|y}

已经有一个原始的“旋转”(!),可以对列表执行此操作的一般化。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)

之所以有效,是因为Pip中的字符串和列表索引是循环的:"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字节并不会产生太大的变化。当我回想起枚举S {; ...}而不是类S {...}时,这也提醒我们,因为(即使在此示例中它们占用相同数量的字节)如果我需要一个实例,该类的枚举版本需要多一个字节:枚举S {X; ...}。如果我想在类中声明一个方法或变量,而不必使用static关键字或显式实例化该类的新对象,则这会有所帮助。
Jack Ammo 2015年

哇!真好 不知道enums可以这样使用!
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

Casio Basic,27个字节

StrRotate s,s,-n:Print s

事实证明,卡西欧ClassPad内置了此功能!但这反过来起作用-n

代码的24个字节,指定s,n为参数的3个字节。


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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.