文字列内の文字をシフトする


12

このチャレンジでは、入力した文字列の文字をn回シフトし、シフトした文字列を出力する必要があります

入力

入力には最初に文字列が含まれます。次の行には、n存在することを示す整数があります。

出力

  • nが正の場合、文字列内の文字を正しいn時間にシフトします。
  • nが負の場合、文字列内の文字を左にシフトしnます。
  • nがゼロの場合、文字列内の文字をシフトしません。

シフト後(nゼロの場合を除く)、シフトされた文字列を出力します。

ノート

  • 文字列は空またはにはなりませんnull
  • 文字列は100文字以下で、範囲(スペース)から~(チルダ)(文字コード0x20から0x7Eを含む)のASCII文字のみが含まれます。見るリファレンス 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

これは、Pythが自動評価入力演算子として使用されていることを除いて、私のCJam 5バイトバージョンとほぼ同じ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これ組み込み関数です。ただし、OPは組み込みの使用を制限しません
オプティマイザー

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 "Hello world!" 5
こんにちは!
$ ./rotstr "テスト中..." -3
ting ... Tes
$ ./rotstr "~~~" 1000
~~~
$ ./rotstr "12345" 0
12345
$ ./rotstr "ABA" 17
BAA
$ ./rotstr "Hello world!" -16
o世界!地獄

私の期待どおりには動作しません。場合v[2]され"1"、コードは単に変更せずに文字列を出力します。そして唯一"~~~""12345"動作します。それらの残りは間違った出力を与えます。それらがすべてもう一度回転した場合、それは正しいでしょう。
スピカトリックス

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

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

K、8 7バイト

{|x!|y}

!リストに対してこの操作の一般化を実行するプリミティブな「回転」()が既にあります。K文字列は文字のリストなので、適用されます。ただし、Kの回転は必要な方向とは逆方向に発生するため、仕様ではCJamとPythが少し優先されます。!関数をラップして暗黙的な引数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

Java、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 {; ...}を好むように振り返ると、(この例では同じバイト数を使用しますが)インスタンスが必要になるためです。クラスの場合、enumバージョンではenum S {X; ...}でさらに1バイトかかります。これは、静的キーワードを使用したり、クラスの新しいオブジェクトを明示的にインスタンス化したりせずに、クラスでメソッドまたは変数を宣言する場合に役立ちます。
ジャックの弾薬

うわー!いいね enumsがこのように使用できることを決して知らなかった!
Spikatrix

これを投稿してから2年近くが経ちますが、いくつかゴルフをすることができます。(-5バイト)にInteger.parseIntすることができますnew Integer。そしてn%=l;、あなたが変更した場合に削除することができますr[0].substring(n)+r[0].substring(n%=l)+(-2バイト)。また、Java 7以降でmainは、-method を指定した列挙型は使用できないため、これをJava 6に指定することもできます。
ケビンCruijssen

編集するのが面倒ですが、節約のために注意してください。
ジャックの弾薬



1

カシオベーシック、27バイト

StrRotate s,s,-n:Print s

結局のところ、Casio 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にはRotateが一度だけright / leftの方向に組み込まれ、RotateのN量はright / leftの方向には組み込まれていないためlength + input、何度ループし、その回数だけ右に向かって回転します。

例えば:

  • 「Testing ...」および-3は10 + -3 = 7、時間を右に回転させ、結果をにしting...Tesます。
  • 「Hello world」と5は11 + 5 = 16時間を右に回転させ、結果はになりworldHelloます。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.