角張っていないひも!


12

文字列が与えられたら、まず次のようにそれを二乗します。

まず、文字列を書きます。

abcde

次に、文字列を左に1つ回転して書き込みます。

abcde
bcdea

len(string)行を書くまでこれを続けてください。

abcde
bcdea
cdeab
deabc
eabcd

次に、次のような文字列から読み取ります。

----+
+--+|
|+>||
|+-+|
+---+

与えるもの:

abcdeabcdcbaedcbcdeabaede

この文字列を印刷します。

テストケース

abcdef -> abcdefabcdedcbafedcbcdefabcbafedefaf
cena! -> cena!cenanec!anena!cec!a!
ppcg -> ppcgppcppgcpcgpg
abc -> abcabacbc
ab -> abab
a -> a
 -> 

テストケースが間違っている場合はコメントしてください。

これはであるため、バイト数が最小のコードが優先されます。


2
cena!間違っている。abcde両方とも5文字であるため、例と一致する必要がありますcena!cenanec!anena!cec!a!
ライナス

@Linusありがとう、私はそれを修正しました。
オリバーNi

回答:


7

JavaScript(ES7)、83 80 78 77バイト

s=>s.repeat(l=s.length).replace(/./g,_=>s[(c-=--i**.5-l&1||-1)%l],c=-1,i=l*l)

ボーナスES3準拠プログラム:

for(s=prompt(r=""),c=-1,l=s.length,i=l*l;i;)r+=s[(c-=l-Math.sqrt(i--)&1||-1)%l];alert(r)

説明

これは、たとえば長さ5の文字列の出力が次のように表現できるという事実を利用しています。

abcdeabcd cbaedcb cdeab aed e
012345678 7654321 23456 543 4

ここで、各桁は文字列のインデックスを表し(0から始まります)、文字列の長さを法とします。つまり、nが文字列の長さである場合、インデックスを2n-1回インクリメントし、次に2(n-1) -1回デクリメントし、次に2(n-2)-1回インクリメントします。これは、次のアルゴリズムに簡略化できます。

  • インデックスi-1から開始します。
  • 範囲[n 2 ..1]の各整数xに対して
    • 場合床(SQRT(X))は同じパリティ(偶数/奇数)であるN、増分のI
    • それ以外の場合、iをデクリメントします。
    • インデックスi mod nの文字を出力に追加します。

これは、floor(sqrt(x))2n-1回の反復後にパリティを切り替え、次に2(n-1)-1回の反復などのために動作するためです。


とんでもない。よくやった!
MaytyMonty

1

Pyth、15バイト

.Wp.(H0_CZ.<LQU

aの入力を受け取り"quoted string"、結果を出力するプログラム。

オンラインでお試しください!または、すべてのテストケースを検証します(複数入力用に変更)。

使い方

.Wp.(H0_CZ.<LQU  Program. Input: Q
            L U  Map over [0, 1, 2, 3, ..., Q-1] (implicit input):
          .< Q     Q left-shifted by that many characters
                 Call this X
.W               While
   .(H0          popping the first element of X (mutates X in-place)
  p              and printing it with no trailing newline is truthy:
         Z           X = 
        C            X transposed
       _             reversed

1

Python 2.7(CMD.EXE内)、91バイト

これには、作業用のbackspace(\b)を備えた端末が必要であり、repl.itまたはideone.comでは機能しません。コンマで終わるprintステートメントは、改行または改行ではなくスペースでさらに出力を区切ります。バックスペースにより、分離スペースを上書きできます。

s=input();r=s[::-1];n=len(s)-1;i=0
while i<=n:print'\b'+s[i:]+s[:n-i]+r[i+2:]+r[:n-i],;i+=2

Python 2.7、96バイト

ideone.comまたはrepl.itで試してください(Oliverに感謝)。入力はpython文字列である必要があります'cena!'

s=input();r=s[::-1];n=len(s)-1;i=0;S=''
while i<=n:S+=s[i:]+s[:n-i]+r[i+2:]+r[:n-i];i+=2
print S

ループによって添付4つのスライスは、( 、s[i:]s[:n-i]r[i+2:]r[:n-i]螺旋の四辺から取られます。たとえば01234、正方形の場合:

01234
12340
23401
34012
40123

我々が取るので0123401232104321。変数iは、プロセスの各ステップの左上の値のインデックスです。最後のスパイラルでは、スライスのいくつかが空の場合があります。


それはおそらく唯一の保存はありませんが、Pythonの3に変更することで、を取り除くS=''print SS+=、と前にラッピングのすべてi+=2ではprint()との声明sep=''、あなたは2つのバイトを保存することができます。
ケード

@Shebang私はすぐにフォローしていません。Python 3の回答を自由に追加してください。
ライナス

変更i<=nすることができますn>i
オリバーNi

バイトを節約します。
オリバーNi

@オリバー、ありがとう...しかし、それは動作しません"a string of odd length."
ライナス

1

ゼリー11 10 バイト

ẋ2µṖȮṖUµÐL

TryItOnline!、またはすべてのテスト

どうやって?

スパイラルのない正方形は、「上端と右端」および「下端と左端」の一連の実行であり、それぞれは、最初と最後の文字なしで前の実行の逆であり、その最初は入力に最後の文字のない入力を加えたものです(たとえば、入力"abcde"の出力は"abcdeabcd" + "cbaedcb" + "cdeab" + "aed" + "e")。

ẋ2µṖȮṖUµÐL - Main link: s                            e.g. abcde
ẋ2         - repeat s twice                          e.g. abcdeabcde
  µ    µ   - monadic chain separation
        ÐL - repeat until results are no longer unique:
   Ṗ       -     remove the last character                abcdeabcd / cbaedcb / cdeab / aed / e   / ""
    Ȯ      -     print z (with no linefeed) and return z
     Ṗ     -     remove the last character                abcdeabc  / cbaedc  / cdea  / ae  / ""  / ""
      U    -     reverse                                  cbaedcba  / cdeabc  / aedc  / ea  / ""  / "" <- no longer unique.

1

05AB1E、12バイト

2×[DõQ#¨D?¨R

オンラインでお試しください!

説明:

 2×[DõQ#¨D?¨R
               # Implicit input
 2×            # Repeat twice
   [           # Begin infinite loop
┏>  DõQ#       # If empty string, break
┃       ¨      # Remove last character
┃        D     # Duplicate
┃         ?    # Print with no newline and pop
┃          ¨   # Remove last character
┃           R  # Reverse
┗━━━━━━━━━━━━┛ # Implicit end infinite loop


0

C、95 94バイト

i,j,k,l;f(char*s){for(k=-1,l=i=strlen(s);i--;)for(j=i*2;~j--;putchar(s[(k+=(l-i)%2*2-1)%l]));}

@ETHproductionsの回答に触発されました。


0

Perl、99バイト

$_=<>;
chop;
@a=split//;
print(@a[$%,(@f=1-($b=@a-$%)..$b-3),$b-1?$b-2:(),reverse@f]),$%+=2 until$%>@a

空白はプログラムの一部ではなく、読みやすくするために提供されています。

非常に効率的なコードではありません。どういうわけか最初の3行を短くできるはずですが、私がやろうとしたすべてが失敗しました。この三項演算子も何らかの方法で修正する必要がありますが、この方法を使用すると、コードを10バイト短くすることができました。

このコードは、引き抜く文字列の場所の値を表す偶数で区切られた回文のリストをコンパイルすることで機能します。


あなたは使用することができます-F ライン1を交換し、3で入力を与えるであろうecho -n削除しますchop。(これで約81バイトになります)
ダダ

0

実際には21 13バイト

このアルゴリズムは、主にJonathan AllanのJelly answerに基づいています。結果を1つの文字列として出力するには、2つの方法があります。ここで使用されるアプローチは、中間ステップを複製し、それをレジスタ1の積算合計(デフォルトでは空の文字列)に追加します。;╕関数内で、最後に。もう1つのアプローチは、中間ステップを複製し、それらの複製ステップをスタックに残し、それらを最後に1つの文字列にまとめることです。;関数内で、最後に。

ゴルフの提案を歓迎します。オンラインでお試しください!

2*`dX;╕dXR`Y╛

アンゴルフ

         Implicit input s.
2*       Push a string that repeats s two times.
`...`Y   Call the following function until there is no change from the last call
  dX       Discard the last element. Call this new string m.
  ;╕       Duplicate m and add it to the running total in register 1.
  dXR      Discard the last element again and reverse the string.
╛        Push the unspiralled string from register 1 to the stack.
         Implicit return.


-1

Python 3、93バイト

s=input();r,n,i=s[::-1],len(s)-1,0
while n-i:print(s[i:]+s[:n-i]+r[i+2:]+r[:n-i],end='');i+=2

オンラインでお試しください!


むしろよりprint(...,end='')行う、print(end=s[i:]+s[:n-i]+r[i+2:]+r[:n-i]
FlipTack

1
とにかく、このソリューションはのために動作しませんabcde、それeは最後に欠落しています。
FlipTack

あなたの状態のi<=n代わりに試してくださいn-i
リーナス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.