手紙、動く!


35

文字列を指定すると、アルファベットの位置ごとに(最初の文字から)各文字を移動する必要があります。文字列の最後に到達した場合は、折り返す必要があります。文字以外を移動する必要はありません。

例:

Dog

Dはアルファベットの4番目の文字なので、4スポット右に移動します。ラップした後、文字列をに変更しますoDgoは15番目の文字(15 mod 3)= 0であるため、移動しません。gは7番目の文字-(7 mod 3)= 1であるため、文字列はになりgoDます。

hi*bye

  • h8文字目、8スポット移動- hi*bye=>i*hbye
  • i9文字目、9スポット移動- i*hbye=>*hbiye
  • b2文字目、2スポット移動- *hbiye=>*hiybe
  • y25文字目、25スポット移動- *hiybe=>*hibye
  • e5文字目、5スポット移動- *hibye=>*hibey

文字以外を移動する必要はありませんが、それでもスペースを占有します。

  • cat => tca
  • F.U.N => .F.NU
  • mississippi => msiisppssii

スタンドアロンプ​​ログラムを実行する必要がありますか、それとも機能で十分ですか?また、文字列を印刷する必要がありますか?
かてんきょう

入力に表示できる文字は何ですか?印刷可能なASCII?改行?ASCII ユニコード?
マーティンエンダー

3
また、文字が繰り返されるテストケースも適切です。
マーティンエンダー

@Martin ASCII。
geokavel

@Katenkyo関数が許可されています。関数を使用している場合、出力は戻り値です。
geokavel

回答:


6

CJam、44 42 40バイト

qN+ee_{Xa/~\+XW=eu__el=!\'@-*m<Xa+}fXWf=

出力には末尾の改行が含まれます。

ここでテストしてください。

説明

文字列内で文字を移動する代わりに、文字を繰り返し削除し、それに応じて文字列を回転させてから、文字を再挿入します。これを行うには、1つの落とし穴があります。文字列の先頭と文字列の末尾を区別できるようにする必要があります(単純な回転の後はできません)。これが、ガードとしてラインフィードを最後に挿入する理由です(ラインフィードの前の文字は文字列の終わりであり、その後の文字は始まりです)。ボーナスは、これは自動的に改行が実際に正しい回転の最終文字列を返すことである文字列の末尾を。

lN+     e# Read input and append a linefeed.
ee      e# Enumerate the array, so input "bob" would become [[0 'b] [1 'o] [2 'b] [3 N]]
        e# This is so that we can distinguish repeated occurrences of one letter.
_{      e# Duplicate. Then for each element X in the copy...
  Xa/   e# Split the enumerated string around X.
  ~     e# Dump the two halves onto the stack.
  \+    e# Concatenate them in reverse order. This is equivalent to rotating the current
        e# character to the front and then removing it.
  XW=   e# Get the character from X.
  eu    e# Convert to upper case.
  _     e# Duplicate.
  _el=! e# Check that convert to lower case changes the character (to ensure we have a
        e# letter).
  \'@-  e# Swap with the other upper-case copy and subtract '@, turning letters into 1 to
        e# 26 (and everything else into junk).
  *     e# Multiply with whether it's a letter or not to turn said junk into 0 (that means
        e# everything which is not a letter will be moved by 0 places).
  m<    e# Rotate the string to the left that many times.
  Xa+   e# Append X to the rotated string.
}fX
Wf=     e# Extract the character from each pair in the enumerated array.

これが正しい位置で終わる理由を見るために、hi*bye例の最後の繰り返しを考えてください。を処理したe後、列挙された文字列は次の位置にあります。

[[4 'y] [6 N] [2 '*] [0 'h] [1 'i] [3 'b] [5 'e]]

最初に、改行の周りで分割し、パーツを逆の順序で連結します。

[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y]]

改行は、この文字列の先頭または末尾になります。しかし、改行は文字列の終わりを示す単なるガードなので、これは文字が実際に正しい順序であることを意味します。改行は文字ではないため、配列はまったく回転しません。したがって、改行を追加すると、それが属する場所に移動し、すべてが探している順序になります:

[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y] [6 N]]

誰かがより長いテストケースを比較したい場合、いくつかの追加の結果:

Hello, World!
,W oeHlo!lrld

Programming Puzzles & Code Golf
ago fgliPomomnrr elP& uC dezzsG

The quick brown fox jumps over the lazy dog
t eg chbi ko qfTounyzrj omw epx ueoahs rlvd

abcdefghijklmnopqrstuvwxyz
aqbrcdsetfguhivjwklxmnyozp

zyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyz

最後の1つが好きです。:)


Pythにはリスト上のチョップリストが必要です。
isaacg

@isaacgいや、そうではないと確信しています。;)
マーティン・エンダー

複数行の文字列をサポートするようにできますか?
geokavel

@geokavelまあ、修正しました。
マーティンエンダー

ダース・ブットナー、これは喜んでいる。
geokavel

4

Ruby 125130132139バイト

->q{a=q.chars.map{|c|[c,c=~/[a-z]/i&&c.ord%32]}
while i=a.index{|c,s|s}
c,s=a.delete_at i
a.insert (i+s)%q.size,[c]
end
a*''}

テスト付きのオンラインデモ:http : //ideone.com/GYJm2u

初期(変更されていないバージョン):http ://ideone.com/gTNvWY

編集:彼の提案のためのmanatworkに感謝します!

編集2:文字数を修正しました(最初はCRLFの行末を数えていました。)


かろうじてテスト済み:c.upcase.ord-64c.ord%32
マナトワーク

@manatworkそれはうまくいきます、ありがとう!
クリスチャンルパスク

もう一度見て…待って!a.join??? あなたは誰で、w0lfで何をしましたか?彼は確かにそれを書くでしょうa*''
マナトワーク

@manatwork :)私はそれをするのwhile ... endを忘れてしまったので、私のコードにあることにとても怒っていました。気づいてくれてありがとう!
クリスチャンルパスク

あなたはそれを回すことができないwhile ... end(...)while ...
マーティンエンダー

3

Python 3、278 275 273 270 260 258 249 248 243 238バイト

私はこれをもっと良くゴルフする必要がありますが、ここに私の解決策があります。論理を手伝ってくれたkatenkyoと、ゴルフを手伝ってくれたCyoceMego感謝します。

編集:ついに、私はそれを1つの比較文にまとめました。うわー!(そして、はい、それz=-za,m=m,aビットに移動できましたが、それはバイトを節約せず、必要以上にコードを混乱させました)

編集:バイトカウントがオフでした。

def m(s):
 l=len(s);r=range(l);p=[[i,s[i]]for i in r]
 for i in r:
  if s[i].isalpha():
   a=p[i][0];p[i][0]=m=(a+ord(s[i])%32)%l;z=1
   if a>m:a,m=m,a;z=-z
   for j in r:p[j][0]-=z*(j!=i)*(a<=p[j][0]<=m) 
 return''.join(dict(p).values())

ゴルフをしていない:

def move(string):
 length = len(string)
 places = [[i,string[i]]for i in range(length)]
 for index in range(length):
  char = string[index]
  if char.isalpha():
   a = places[index][0]
   mov = (a + ord(char)%32) % length
   places[index][0] = mov
   for j in range(length):
    k = places[j][0]
    if a <= k <= mov and j!=index:
     places[j][0]-=1
    elif mov <= k <= a and j != index:
     places[j][0]+=1
 return''.join(dict(places).values())

私は*と信じてp[j][0]設定することにより、減少させることができるJ=p[j];インスタンスのが、その後、最初に交換p[j][0]してP[0]
Cyoce

@Cyoceトラブルはp、直接編集する必要がありp[j]、それに割り当てられた変数ではないことだと思います。また、私の改訂履歴を見ると、比較のk = p[j][0]ための変数がありましたが、を使用して保存したよりも余分な行のインデントに設定するバイトを多く保存したためa<=k<=m、ドロップのk方が優れていることがわかりました。kk
Sherlock9
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.