爆発する猫!


17

チャレンジ

lengthの文字列入力を受け取るプログラム/関数を作成しますn

  1. 置くkth場所、空間の中心に文字をk = (n+1)/2。これがグラウンドゼロの位置になります。
  2. 残りの非空白文字をグラウンドゼロの周りにランダムに配置します。チャーからのピタゴラスの距離はを超えてはなりませんn
  3. 結果を出力します。

説明が必要な場合は、以下の例を参照してください。


ルール

  • 標準的な抜け穴が適用されます!
  • I / Oは文字列の形式である必要があります。
  • グラウンドゼロに配置する中央の文字を確保するために、入力は常に奇数になります。
  • すべての有効な出力は、ゼロ以外の確率で発生するはずです。

これはです。バイト単位の最短コードが勝ちます!


入力: qwert

グラウンドゼロから発生する爆発の境界(xのマークは、残りの文字の有効な場所です):

     x
  xxxxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
xxxxxexxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
  xxxxxxx
     x

出力例:

       t
     r

q    e


      w

ランダムに位置を選択すると、1つの文字が他の文字と同じ位置に移動して上書きされる可能性があります。これは許されますか?(私の提案:いいえ)
edc65

あなたは正しいです:いいえ
ママ楽しいロール

1
これは私を爆破することに何の関係がありますか?(タイトルの関連性を本当に理解していません...)
cat

1
@catこれはcatプログラムの修正ですが、入力を爆発させることを除きます。
ママファンロール

回答:


0

APL(Dyalog Classic)68 66 65 63 62バイト

{⍵@(n⊣¨¨@(⊢≡¨⌽)i[n?≢i←⍸(××n≥*∘.5)+.ר⍨n-⍳s])⊢''⍴⍨s21+2×n←≢⍵}

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

{ } 引数付きの無名関数

n←≢⍵変数nは長さです

s←2⍴1+2×n 変数 sは結果の形状です:2n + 1 x 2n + 1

''⍴⍨s その形状の正方形のスペースを作成します

A@I⊢BA(ペアの)インデックスに要素を置くI行列のにB

+.ר⍨n-⍳s 行列の中心からの二乗距離

(××n≥*∘.5) それらの距離がゼロ以外の場所を示すブール行列 ≤n

ブール行列の1の座標ペア

i[n?≢i← ... ] ランダムにn個を選択します(重複なし)

n⊣¨¨@(⊢≡¨⌽) 中央のものを n n

⍵@( ... )⊢ ... スペースの行列の指定されたインデックスに引数から文字を入れます


3

JavaScript(ES6)、211 216 220

1バイト保存されたthx @usandfriendsを編集

s=>[...s].map((c,i)=>{for(R=_=>Math.random()*h-l|0;x=R(y=R()),!(i-(l/2|0)?x|y&&x*x+y*y<=l*l&g[y+=l][x+=l]<'!':x=y=l););z=[...g[y]],z[x]=c,g[y]=z.join``},l=s.length,g=Array(h=l-~l).fill(' '.repeat(h)))&&g.join`
`

テスト

f=s=>[...s].map((c,i)=>{for(R=_=>Math.random()*h-l|0;x=R(y=R()),!(i-(l/2|0)?x|y&&x*x+y*y<=l*l&g[y+=l][x+=l]<'!':x=y=l););z=[...g[y]],z[x]=c,g[y]=z.join``},l=s.length,g=Array(h=l-~l).fill(' '.repeat(h)))&&g.join`
`

// Less golfed
U=s=>(
  l=s.length,
  h=l-~l, // l+l+1
  g=Array(h).fill(' '.repeat(h)),
  [...s].map((c,i)=>{
    for(R=_=>Math.random()*h-l|0;
        x=R(y=R()), // set x,y to a random value in range -l ... l
        !(i - (l/2|0) // check if at mid point of input string
          ? x|y && // if not, check x and y must not be both 0
            x*x + y*y <= l*l &  // then check position inside the circle of ray L
            g[y+=l][x+=l] < '!' // then add offset L and check if position is not already used 
          : x=y=l // if at midpoint in input string, x and y have fixed value L
         );
       ); // loop until valid position found
    z = [...g[y]];  // modify string at current position: convert to array ...
    z[x] = c;       // ... set element ...
    g[y] = z.join`` // ... back to string
  }),
  g.join`\n`
)  

setInterval(_=>O.textContent=(f(I.value)),1000)
Word <input id=I value='qwert'><pre id=O></pre>


前に余分なスペースがありますg.map(r=>r.join``)...
-usandfriends

@usandfriends thx私はそれを逃した方法がわからない
-edc65

new Date()%h-l代わりに使用しますMath.random()*h-l|0。バイトを節約します。
ericw31415

1
@ ericw31415は0のみを使用します。バイトも節約します。しかし、両方が動作しません
edc65

2

ルビー、 211 207 203 196文字

4文字のedc65に感謝

->(x){x=x.chars
o,b,c=x.size
l=o*2+1
a=Array.new(l){Array.new l,' '}
a[o][o]=x.delete_at o/2
a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]
a.map(&:join).join $/}

説明:

->(x){...} 引数を取る匿名関数を定義する x

x=x.charsx文字列から1文字の文字列の配列に変換します

o,b,c=x.size入力の長さoを後で使用するために保存します。bそして、c単純に初期化する必要が何か以前の割り当てに装着することにより、その保存2つの文字が。

l=o*2+1 これは、すべてのキャラクターが移動できるフィールドの長さ/幅であり、爆発円の直径でもあります。

Array.new(l){Array.new l,' '}作りl、xはl空白文字の2次元配列をサイズに。

a[o][o]=x.delete_at o/2配列の中心をx(入力)の値の中心に設定し、その値をx

... while x[0]空になるwhileまでブロック(この場合はインラインであるため前のコード)を繰り返し実行しxます。rubyでは、存在しないインデックスにアクセスするとnilfalseの値を返します。

a[b=rand(l)][c=rand(l)]==' '割当b及びcランダム値に0 <= N < l。スポットがあればチェックしbc空である(別名スペース文字に設定されています)

(b-o)**2+(c-o)**2<=o*oピタゴラス距離チェック。o入力の長さです。**はルビーのべき乗演算子であり、val<=o*oよりも短いval**0.5<=o

a[b][c]=x.popから最後の値を削除しますx。位置を設定しab配列内のその値にa

a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]その位置が自由で爆発範囲内にある場合、ランダムな位置を最後の値に設定します。配置するキャラクターがなくなるまでこれを続けてください。

$/オペレーティングシステムの改行に設定されます。また、よりも短いです"\n"

a.map(&:join).join $/すべての配列をa単一文字列バージョンにマッピングします(例['a','b','c']-> 'abc')。その新しい配列を取得し、改行で結合します。暗黙の戻り。


o * oは** 0.5より短い
edc65

0

Python 3、286バイト

import random as r
i=input()
l=len(i)
a=range(-l,l+1)
g=[(y,x)for y in a for x in a]
p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
m=i[l//2]
d=[*i.replace(m,"",1).center(len(p))]
r.shuffle(d)
o=""
for c in g:
	o+=m if c==(0,0)else d.pop()if c in p else" "
	if c[1]==l:o+="\n"
print(o)

オンラインで試すことはオプションです。

フープは、最近の活動のためにこれにつまずいたが、私がこれにしばらく費やしたまで、それが何らかの形で2歳以上であることに気づかなかった。まあ、2つの答えはちょっと悲しいので、とにかく投稿するのはおそらく良い考えです。これを改善する方法はたくさんあると確信しています。入力が常に奇妙であることに気付かなかったので、知っておくと役に立ちました。

説明

i=input()入力はもちろん、l=len(i)文字列の長さを節約しているのは、文字列が何度も使用されているためです。

a=range(-l,l+1) — 1つの次元に沿って、原点から両方向に利用可能な距離の範囲で反復子を作成するための簡単なツール

g=[(y,x)for y in a for x in a] 最終グリッド全体を構成するタプル座標のリストを作成します。

p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y] 中心以外の文字が到達する可能性のある座標のみを含むリストのサブセットを作成します。

m=i[l//2] 中心文字を確立します。

d=[*i.replace(m,"",1).center(len(p))]—中心のキャラクターが取り除かれ、他の破片が残ります。のcenter()関数は、特定の文字数になるまで行(デフォルトではスペース)を埋めることができるため、非常に便利です。ここで、これは文字が到達できるスペースの数であり、必要な分布を反映しています。

r.shuffle(d) 当然のことながら、配布は実際に...シャッフルされます。

ループはfor c in g: o+=m if c==(0,0)else d.pop()if c in p else" "、実行可能なタイルの正方形全体を調べ、その上にある可能性のあるものに関係なく、必要に応じて出力文字列に文字を追加しますo。キャラクターはデブリのサンプルからポップアウトされるため、一度しか表示されません。

if c[1]==l:o+="\n"—改行も追加します。戻り値。

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