ひもを風車に変える


14

このサイトのコードは急速に枯渇しています。再生可能なストリングに投資する必要があります。そのため、文字列を取得して風車に変換するプログラムを作成する必要があります。

チャレンジ

簡単な風車のひもを例に取りましょう。文字列を取りますabcピボットは、この場合、中央の文字、ですb。文字列は3文字の長さであるので、すべての出力は次のようになります正確に背の高い3行3つの文字幅。手順1の出力を次に示します(空白に注意してください)。

abc

次のステップに進むには、ピボットを中心に各文字を時計回りに回転させます。これがステップ2です。

a
 b
  c

手順3〜8は次のとおりです。

 a
 b
 c
  a
 b
c
cba

c
 b
  a
 c
 b
 a
  c
 b
a

そして、9番目のステップで、元の文字列に完全な円を描きます。

abc

bずっと同じ場所に留まったことに注意してください。これはb、ピボット文字であるためです。入力として文字列を受け取り、プログラムが終了するまでこのシーケンスを繰り返し出力するプログラムまたは関数を作成する必要があります。

明確化

  • すべての入力文字列の文字数は奇数です。(すべての風車がピボットを持つように)

  • チャレンジを簡単にするために、すべての文字列には大文字と小文字のアルファベットのみが含まれます。

  • 出力はlen(input_string)文字の幅と高さでなければなりません。

  • 永遠に回転とループを続ける限り、シーケンスのどのステップから始めても構いません。

より多くのテストIO:

投稿はすでにかなり長いため、「windmill」の出力へのリンクを次に示します。

サイドノート:

これは風車であるはずなので、小さな時間遅延または各ステップ間のユーザー入力でアニメーション化するボイラープレートコードを含めると素晴らしいでしょう。ただし、一部の言語には時間の組み込み機能がないため、これは必須ではありません。提出物の競合部分は、できるだけ早くシーケンスを印刷できます。


回答:


7

MATL35 33 21バイト

jtn2/kYaG1$Xd`wtD3X!T

以下は風車をアニメーション化します26バイト

jtn2/kYaG1$Xd`wtXxDlY.3X!T

オンラインデモ

このバージョンではXx1Y.は、表示をクリアすることを指定し、1秒の一時停止です。

説明

基本的な考え方は、入力の2つのバージョンを作成することです。「直交」バージョン

+-----+
|     |       
|     |
|abcde|
|     |
|     |
+-----+

そして「対角線」バージョン

+-----+
|a    |
| b   |
|  c  |
|   d |
|    e|
+-----+

これら2つのバージョンをスタックにプッシュします。ループを通過するたびに、スタックの順序を切り替え、上部を時計回りに回転させます。

j       % Grab the input as a string
t       % Duplicate the input

%--- Create the "orthogonal" version ---%

n2/     % Determine numel(input) / 2
k       % Round down to nearest integer
Ya      % Pad the input string with floor(numel(input)/2) rows above and below 

%--- Create the "diagonal" version ---%

G       % Grab the input again
1$Xd    % Place the input along the diagonal of a matrix    

`       % do...while loop   
  w     % Flip the order of the first two elements on the stack
  t     % Duplicate the top of the stack

  %--- OCTAVE ONLY (converts NULL to space chars) ---%

  O       % Create a scalar zero
  32      % Number literal (ASCII code for ' ')
  XE      % Replaces 0 elements in our 3D array with 32 (' ')

  %--- END OCTAVE ONLY ---%

  D     % Display the element     
  3X!   % Rotate this element 90 degrees counter-clockwise 3 times (clockwise)
  T     % Explicit TRUE to create an infinite loop
        % Implicit end of while loop

8

JavaScript(ES6)、291バイト

r=a=>{w.textContent=a.map(a=>a.join``).join`
`;for(i=j=h=a.length>>1;j++,i--;){t=a[i][i];a[i][i]=a[h][i];a[h][i]=a[j][i];a[j][i]=a[j][h];a[j][h]=a[j][j];a[j][j]=a[h][j];a[h][j]=a[i][j];a[i][j]=a[i][h];a[i][h]=t}}
s=w=>{a=[...w=[...w]].map(_=>w.map(_=>' '));a[w.length>>1]=w;setInterval(r,1000,a)}
s("windmills")
<pre id=w>


重量時間を減らして、数バイト離れてゴルフできませんでしたか?
MayorMonty


5

ルビー、122 119バイト

->n{c=0
loop{i=[l=n.size,m=l+1,m+1,1][3-c=c+1&7]*(3.5<=>c)
s=(' '*l+$/)*l
l.times{|j|s[m*l/2-1+(j-l/2)*i]=n[j]}
$><<s}}

テストプログラムでのスリープを使用したゴルフのないバージョン

コンソールの全高では回転はあまり説得力がありません。ただし、入力文字列の長さまで高さを減らすと、回転はより説得力があります。

f=->n{
  c=0                                     #loop counter
  m=1+l=n.size                            #l=string length. m=l+1
  loop{                                   #start infinite loop
    s=(' '*l+$/)*l                        #make a string of l newline-terminated lines of l spaces. Total m characters per line.              
    i=[m-1,m,m+1,1][3-c=c+1&7]*(3.5<=>c)  #array contains positive distance between characters in string 1=horizontal, m=vertical, etc.
                                          #c=c+1&7 cycles through 0..7. Array index 3..-4 (negative indices count from end of array, so 3=-1, 0=-4 etc)
                                          #(3.5<=>c) = 1 or -1. We use to flip the sign. This is shorter than simply using 8 element array [m-1,m,m+1,1,1-m,-m,-m+1,-1]  
    l.times{|j|s[m*l/2-1+i*(j-l/2)]=n[j]} #for each character in n, write the appropriate space character in s to the character in n
    puts s                                #print s
    sleep 1                               #sleep for 1 second
  }
}

f[gets.chomp]                             #get input, remove newline, call function


3

Python 3、193バイト

def c(a):e = ''; s = len(a); l = int(s / 2); b = range(s); m = '\ n' * l; print(m、a、m ); x for b:print(e * x、a [x]); x for b:print(e * l、a [x]); x for b:print(e *(s-1-) x)、a [x]); a = input(); while True:c(a); c(a [::-1]);

非ゴルフ

def c(a):
    e = ''; s = len(a); l = int(s / 2); b = range(s); m = '\ n' * l;
    print(m、a、m);
    for x in b:print(e * x、a [x]);
    x for b:print(e * l、a [x]);
    for x in b:print(e *(s-1-x)、a [x]); 
a = input();
Trueの場合:
    c(a);
    c(a [::-1]);

再帰的、177バイト

(数秒後にクラッシュ)

def c(a):e = ''; s = len(a); l = int(s / 2); b = range(s); m = '\ n' * l; print(m、a、m ); x for b:print(e * x、a [x]); x for b:print(e * l、a [x]); x for b:print(e *(s-1-) x)、a [x]); c(a [::-1]); c(input());

非ゴルフ

def c(a):
    e = ''; s = len(a); l = int(s / 2); b = range(s); m = '\ n' * l;
    print(m、a、m);
    for x in b:print(e * x、a [x]);
    x for b:print(e * l、a [x]);
    for x in b:print(e *(s-1-x)、a [x]);
    c(a [::-1])
c(input());

別のソリューション、268バイト

i; def w(a):e = ''; s = len(a); l = int(s / 2); t = '\ n'; m =(l-1)* t; hとしてitertoolsをインポート= list(i.chain.from_iterable((e * x + a [x]、e * l + a [x]、e *(s-1-x)+ a [x])範囲内のxに対して)); print(m、a、m、t.join(h [:: 3])、t.join(h [1 :: 3])、t.join(h [2 :: 3])、sep = t、end = ''); a = input(); while True:w(a); w(a [::-1]);

非ゴルフ

itertoolsをiとしてインポートします。
def w(a):
    e = ''; s = len(a); l = int(s / 2); t = '\ n'; m =(l-1)* t;
    h = list(i.chain.from_iterable((e * x + a [x]、e * l + a [x]、e *(s-1-x)+ a [x])for range(s )))
    print(m、a、m、t.join(h [:: 3])、t.join(h [1 :: 3])、t.join(h [2 :: 3])、sep = t、 end = '');
a = input();
Trueの場合:
    w(a);
    w(a [::-1]);

これを借りてもいいですか?
リーキー修道女

ところで、PPCGようこそ
リーキー修道女

また、最後の文字列を反転するのを忘れていました(第1レベルのインデント)。
リーキー修道女

この出力は無効です。ステップ1と5には、先頭の空白がありません。
DJMcMayhem

かわった!@MyHamDJ
p1714825

2

Pyth、48バイト

JlzK/J2#*btKz*btKM+*dG@zHVJgNN)VJgKN)VJg-JNN)=_z

オンラインでお試しください!(注:これは、インタープリターをクラッシュさせるため、永久にループしないバージョンです。)

@ByHHによってPython 3ソリューションから恥知らずに翻訳されました

使い方:

JlzK/J2#*btKz*btKM+*dG@zHVJgNN)VJgKN)VJg-JNN)=_z
                                                 assign('z',input())
Jlz                                              assign("J",Plen(z))
   K/J2                                          assign("K",div(J,2))
       #                                         loop-until-error:
        *btK                                      imp_print(times(b,tail(K)))
            z                                     imp_print(z)
             *btK                                 imp_print(times(b,tail(K)))
                                                  @memoized
                 M                                def gte(G,H):
                  +*dG@zH                          return plus(times(d,G),lookup(z,H))
                         VJ   )                   for N in num_to_range(J):
                           gNN                     imp_print(gte(N,N))
                               VJ   )             for N in num_to_range(J):
                                 gKN               imp_print(gte(K,N))
                                     VJ     )     for N in num_to_range(J):
                                       g-JNN       imp_print(gte(minus(J,N),N))
                                             =_z  assign('z',neg(z))

この出力は無効です。ステップ1と5には、先頭の空白がありません。
DJMcMayhem

今大丈夫???
漏れの修道女

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