私たちは始めたところに終わりました!…


29

チャレンジ:

入力:

次の2つの入力を取ります
。-印刷可能なASCIIのみを含む文字列(スペース、タブ、または改行を除く)
-印刷可能なASCII文字

出力:

最初の行には、文字列入力が含まれます。iこのキャラクターが最初に出現するすべての-modulo-3は、南東方向に移動します。すべてのi-modulo-3秒の出現は南方向に移動します。i-modulo-3が3番目に出現するたびに、南西方向に移動します。文字が再び最初の開始位置に来るまで続けます(つまり、必要に応じて一方の側から他方の側に回り込むことを意味します)。次に、文字列入力の最後の行を再度印刷します。それを終わらせて。(すべてのテストケースはlength(input)、後続の入力を含む行を含め、多くの行の後の最初の入力で終了することに注意してください。ただし、以下の最初のテストケースに見られるように、 9.)

これはかなり曖昧かもしれないので、ここに例を示します:

テストケース1:

文字列入力:"This_is_a_test"
文字入力:'s'

出力:

This_is_a_test
    s s    s  
     ss   s   
      s  s    
      sss     
      sss     
      s  s    
     ss   s   
    s s    s  
This_is_a_test

3つの色付きのパスを使用した同じテストケースを次に示しますs

ここに画像の説明を入力してください

ここで、最初's'は南東方向の緑の道をたどります。2番目's'は南の方向に黄色のパスに従います。3番目's'は南西方向に水色の経路をたどります。(4番目がある場合's'は、再び南東方向に進みます。これは、以下の他のテストケースのいくつかで確認できます。)

チャレンジルール:

  • 入力には、印刷可能なASCIIのみが含まれます(スペース、タブ、改行を除く)
  • I / O形式は柔軟です。改行で区切られた文字列、文字マトリックスなどを使用できます。呼び出し。
  • 指定された文字が文字列に存在しない可能性があります。その場合、入力文字列を1回または2回"test", 'a'出力できます(つまり、次のいずれかを出力として使用できます:"test\ntest"/ "test")。
  • 先行スペースは必須です。末尾のスペースはオプションです。1つまたは複数の先頭/末尾の改行が許可されます。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターと戻り値型、完全なプログラムを持つ関数/メソッドを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、必要に応じて説明を追加してください。

テストケース/その他の例:

テストケース2:

文字列入力:"abcabcabcabcabc"
文字入力:'b'

出力:

abcabcabcabcabc
  b b b    b b 
   bbb      bb 
    b        b 
   bbb       bb
b b b b      b 
 b  b  b     b 
b b b   b    b
   bb    b   bb
    b     b  b 
    bb     bbb
    b b    bbb 
    b  b  b  b 
    b   bb   bb
b   b   bb   b 
abcabcabcabcabc

5つの色付きのパスを使用した同じテストケースを次に示しますa

ここに画像の説明を入力してください

テストケース3:

文字列入力:"only_two_paths?"
文字入力:'o'

出力:

only_two_paths?
 o     o       
  o    o       
   o   o       
    o  o       
     o o       
      oo       
       o       
       oo      
       o o     
       o  o    
       o   o   
       o    o  
       o     o 
       o      o
only_two_paths?

以下に、2つの色付きのパスを使用した同じテストケースを示しますo

ここに画像の説明を入力してください

テストケース4:

文字列入力:"lollollollollol"
文字入力:'l'

出力:

lollollollollol
lll   ll  ll   
 ll   ll  ll   
l ll ll ll ll  
  lll l ll l ll
  llllll  ll ll
l l  ll    ll  
 ll  lll   ll  
l l l lll ll l 
  ll  l ll l  l
l l l l llll l 
 ll  lll  lll  
l l   l    ll  
  ll lll  lllll
  l l l ll l ll
lollollollollol

以下に、10個のパスを色付けした同じテストケースを示しますl

ここに画像の説明を入力してください

テストケース5:

文字列入力:"AbCdEeDcBaAbCdEeDcBa_CCCCC"
文字入力:'C'

出力:

AbCdEeDcBaAbCdEeDcBa_CCCCC
C  C        C       C  C  
 C  C       C      C  CCC 
  C  C      C     C  C C C
C  C  C     C    C  C  C  
 C  C  C    C   C  C   C  
  C  C  C   C  C  C    C  
   C  C  C  C C  C     C  
    C  C  C CC  C      C  
     C  C  CC  C       C  
      C  C CC C        C  
       C  C CC         C  
        CC CC C        C  
        CC CC  C       C  
       C  C CC  C      C  
      C  C CC C  C     C  
     C  C   C  C  C    C  
    C  C    CC  C  C   C  
   C  C     C C  C  C  C  
  C  C      C  C  C  C C  
 C  C       C   C  C  CC  
C  C        C    C  C  C  
  C         C     C  C CCC
 C          C      C  CCCC
C           C       C  C  
 C          C        CCCCC
AbCdEeDcBaAbCdEeDcBa_CCCCC

以下は、7つの色付きのパスを使用した同じテストケースCです。

ここに画像の説明を入力してください

テストケース6:

文字列入力:"XyX"
文字入力:'X'

出力:

XyX
 XX
  X
XyX

以下に、2つの色付きのパスを使用した同じテストケースを示しますX

ここに画像の説明を入力してください

テストケース7:

文字列入力:"aaaa"
文字入力:'a'

出力:

aaaa
aa  
aaa 
 aaa
aaaa

4つの色付きのパスを使用した同じテストケースを次に示しますa

ここに画像の説明を入力してください


文字列に3の倍数の文字が含まれる場合、出力の文字列の長さよりも少ない行があるかもしれません。
ニール

@Neil 3の倍数かどうかはわかりませんが、それほど詳しく調べていません。私が知っているのはせいぜいlength(input)すべてが再び一致するということだけですが、最初のテストケースが証明すると、より早くなる可能性があります。しかし、3の倍数については確かに正しいようです(100%確かではありませんが)。
ケビンクルーッセン

@Neil文字が連続して3回しか表示されない文字列は、それが長くても3行を印刷します
Asone Tuhid

2行の印刷行の間に後続の改行を使用できますか?
アソーントゥヒッド

@AsoneTuhid申し訳ありませんが、いいえ。予想される出力全体の前後に、後続の改行や先頭の改行がいくらあってもかまいませんが、行間には入れません。斜めの線はもう、同様..正しいではないでしょう
ケビンCruijssen

回答:


1

スタックス、24 バイト

»v↕*δó‼Γ█|q┬YM╨|·£↕fßßZo

オンラインで実行してデバッグする

これは、同じプログラムのASCII表現です。

YxP|Ic{{i3%v-x%%mb-!Czny&PWxP

すべての文字のインデックスを取得し、元のインデックスとセット的に等しくなるまでそれらを変更します。すべての変更について、それらのインデックスにある文字を含む文字列を出力します。

Y                               Store character in y.  Now the inputs are x and y.
 xP                             Print x.
   |Ic                          Get all indices of y in x. Make a copy.
      {                   W     Loop until cancelled.
       {        m               Map index array using block.
        i3%v-                   Subtract i%3-1 from each element. i is the loop index.
             x%%                Modulo len(x)
                 b-!            Is the mutated array set-equal to the original?
                    C           If so, cancel W loop
                     zny&P      Print a string with y at all specified indices
                           xP   Finally, print x again

8

パール5-plF 101の 100 99 98 97 96バイト

\0リテラル0バイトで置き換えて96を取得します。TryIt Onlineリンクには、リテラル0文字を入力できないように見えるため、97バイトであることに注意してください。

#!/usr/bin/perl -plF
say;say$$l=~y/\0/ /runtil--$l,(s:\Q${\<>}:$$l|=v0 x((++$#$l%3*$l-$l+"@-")%@F).$&;v0:oreg^$$l)eq$_

コードゴルフperl蛍光ペンは#、コメントを開始すると考えています。なんて素朴な😈

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

使い方

$l最初の行の後の行のカウンターです(ただし、カウントダウンします。たとえば、先頭の文字列の下3行で-3)。最初の文字列を印刷した後、次の操作を繰り返します。

最初の文字列でターゲット文字の出現を検索し、どのオフセットで表示されるかを計算します。(++$#$l%3*$l-$l+"@-")%@Fこれは、現在の位置に行番号(負)倍-1, 0, 1(循環)を加えたものです。何度\0もターゲット文字とそれに続くorアキュムレータで文字列を構築します$$l(それはそれぞれに対して異なるアキュムレータで$lあり、理由$l$1$2などであるため、カウントダウンするのは読み取り専用です)。$#$lループを通して毎回異なる配列を同様に参照します。結果は$lth行ですが\0、スペースの代わりになります。

最初の文字列のターゲット文字はに置き換えられる\0ため\0、ターゲット文字の元の位置に「穴」(で)が付いた元の文字列になります。xorアキュムレータを使用すると、アキュムレータの元の位置にターゲットキャラクタがある場合にのみ穴が埋められるため、結果は元の文字列になります。これはループを終了するために使用されます。ループがまだ終了していない場合は\0、スペースで置き換えてアキュムレーターを印刷します。

ループが-pオプションを終了すると、もう一度最初の文字列が出力され、プログラムが終了します。

ターゲットキャラクターは、ややトリッキーな方法でピックアップされます。${\<>}変換ラインは直ちに正規表現に逆参照し、置換されている基準にSTDINから読み取ら。\Q接頭辞は正規表現(のように特別なすべての文字をエスケープ.して*)。\E暗黙的です。o修飾子は、検索部が再び評価されなかったが、単に(STDINに何ももうありませんので、良いです)以降のすべての試合で繰り返されないようにします。


nullバイトを直接置くことはできないと思いますが、bashなどで実行できます。
FryAmTheEggman

@FryAmTheEggmanありがとう、それはいいダッジです。しかし、私は気にするつもりはありません。人々は自分で試してみたいと思わないなら、それが機能することを私に信頼しなければなりません:
トンホスペル

完全に公平ですが、他の人が見ることができるようにコメントを残します。ところで、素敵なゴルフ:)
FryAmTheEggman

4

パイソン2199の 193 191バイト

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;break
 print''.join((' '+c)[i in j]for i in r(l))

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


例外を介してループを終了できる場合:

Python 2、187バイト

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;q
 print''.join((' '+c)[i in j]for i in r(l))

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


  • ジョナサンフレッシュのおかげで-4バイト
  • リンのおかげで-2バイト

189バイト可能(例外を介してループを終了)。
ジョナサン

(j[i]-i%3+1)%l2バイトのペアをドロップできます。
リン


2

JavaScript(Node.js)197 194バイト

s=>c=>{(C=console.log)(s);w=0;g=[];while(~(w=s.indexOf(c,w)))g.push(w++);h=(H=_=>g.map(x=>A[x]=c,A=Array(l=s.length).fill` `)&&A.join``)();while(h!=(y=H(g=g.map((x,i)=>(l-~x-i%3)%l))))C(y);C(s)}

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

カリー化構文の入力を受け取りますf(s)(c)

完全なものではありませんが、JSが必要です。機能の多くの機能。



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