シフトするドット


16

プログラムは、ドットと改行が後に続くいくつかのスペースを印刷する必要があります。スペースの数は、0 <x <30で定義されたドットのx位置です。

すべての新しい行はターンです。プログラムは30ターン実行されます。プログラムはランダムなx位置から始まり、毎ターン、定義された領域内にとどまりながら、この位置を1ずつ左または右にランダムにシフトします。ターンごとに、ドットの位置を1ずつ変更する必要があります。

スコアは文字数です。すべての印刷行が正確に30文字(および改行)で構成されている場合、10のボーナスポイントを獲得できます。プログラムが定義された領域の中央にランダムに留まる傾向がある場合、50のボーナスポイントを獲得できます。

編集: 50のボーナスポイントは、ドットを中央に引き寄せることを目的としています。たとえば、ドットがx = 20にあり、66%が左に、33%が右に移動する可能性がある場合に適用されます。これは開始点から独立している必要があり、左右のパーセント値を動的に変更することによってのみ発生します。

いかなる種類の入力も許可されず、出力は実行中のコンソール上になければなりません!

理解を深めるために、javaで読みやすい例を示します。これにより、スコア723が得られます。

public class DotJumper{
    public static void main(String[] args){
        int i = (int)(Math.random()*30);
        int max = 29;
        int step = 1;
        int count = 30;
        while(count>0){
            if(i<=1){
                i+=step;
            }else if(i>=max){
                i-=step;
            }else{
                if(Math.random() > 0.5){
                    i+=step;
                }else{
                    i-=step;
                }
            }
            print(i);
            count--;
        }
    }
    public static void print(int i){
        while(i>0){
            System.out.print(' ');
            i--;
        }
        System.out.println('.');
    }
}

あなたの例では、代わりにあるint i = (int)(Math.random()*30);べきだと思いますint i = 1 + (int)(Math.random()*29);。そのままで、の0 >= x > 30代わりに数値を生成し0 > x > 30ます。
ビクターStafusa 14

元のコードは正しいと思います。
user2846289 14

私は最初にシフトし、印刷するので、それは正しいです。そのため、ランダム値が境界を超えた場合でも、ifは最初に修正してから印刷します。
レゲエムフィン14

@Kostronorしかし、これは、開始点の位置が均一な分布に従っていないことを意味します。最初の位置は、おそらく他の位置の2倍です。均一に分布しているOTOHも要件ではありませんでした。
ビクターStafusa 14

ドットがさらに飛び回るプログラムを作成するのは難しいようです。それでは、なぜその動きを制限することにボーナスがあるのでしょうか?
クリスラプランテ14

回答:


18

APL、39 – 10 – 50 = –21

0/{⎕←30↑'.',⍨⍵↑''⋄⍵+¯1*⍵>.5+?28}/31/?29

Dyalogでテスト⎕IO←1し、⎕ML←3それは非常に移植する必要があります。

説明

                   ?29  take a random natural from 1 to 29
                31/     repeat it 31 times
              }/        reduce (right-fold) the list using the given function:
          ⍵↑''          . make a string of ⍵ (the function argument) spaces
     '.',⍨              . append a dot to its right
⎕←30↑                   . right-pad it with spaces up to length 30 and output
                ◇       . then
             ?28        . take a random natural from 1 to 28
          .5+           . add 0.5, giving a number ∊ (1.5 2.5 ... 27.5 28.5)
        ⍵>              . check whether the result is <⍵ (see explanation below)
     ¯1*                . raise -1 to the boolean result (0 1 become resp. 1 -1)
   ⍵+                   . add it to ⍵ and return it as the new accumulator value
0/{                     finally ignore the numeric result of the reduction

すべてのステップで、このコードは、(1.5 2.5 ... 27.5 28.5)から選択された乱数が現在のドット位置よりも小さい確率に応じて、ドットを左に移動するか右に移動するかを決定します。

したがって、現在のドット位置(左側のスペースの数)が1である場合、増分は常に+1(すべての数値1.5 ... 28.5は> 1)であり、29の場合は常に-1(すべての数値)です。 <29); それ以外の場合は、+ 1と-1の間でランダムに選択され、確率はそれらの両極端間の線形補間になります。したがって、ドットは常に動いており、常に側面よりも中心に向かって移動する可能性が高くなります。真ん中にある場合、どちらかの側に移動する可能性は50%です。

レプリケートされた値の削減(右折り)は、値から開始して各反復の結果を次のアキュムレータ()引数に{...}/a/bする関数a-1時間を繰り返すために思いついたトリックです。2番目と2番目の入力引数()と最終結果は無視されます。ガード付きの通常の再帰呼び出しよりもずっと短いことが判明しました。b

実行例

0/{⎕←30↑'.',⍨⍵↑''⋄⍵+¯1*⍵>.5+?28}/31/?29
                   .          
                    .         
                   .          
                  .           
                 .            
                .             
               .              
                .             
               .              
                .             
               .              
              .               
             .                
              .               
             .                
              .               
               .              
              .               
               .              
                .             
                 .            
                  .           
                 .            
                  .           
                 .            
                  .           
                 .            
                .             
               .              
                .             

aplはゴルフに最適な言語です(ただし、読みにくいです)。アップ!
blabla999 14

@ blabla999 APLには多くの一般的な記号といくつかの奇妙な記号がありますが、一度その機能を習得すると、言語は簡単に読み書きできます。「ゴルフ」言語のASCIIノイズは確かに簡単ですが、通常の言語よりもさらに簡単だと言いたいと思います。構文は、あなたが唯一のルールを持っている、非常に規則的である:表現は、それらが左から右に読むことができるように、右から左に実行されます:+/2×⍳9「9にナチュラルズまで:2回の合計を」しかし、ある読まれます反対の方法で実行されます。
トビア14

それは私ですか、ここに1行に31文字がありますか?
ガスドール14

上記の例の1行をエディターにコピーアンドペーストし、コードを再度チェックすると、30になります。⎕←30↑...は、文字列が何であっても、30文字と改行を印刷します...
トビア14

12

Mathematica 138-10-50 = 78

私はそれが特によくゴルフだと思うので、これを投稿しません、しかし、他の理由のために。これは、ボールを「中心に置く」ように設計された遷移マトリックスを備えたマルコフプロセス定義を使用します。

Mathematicaでマルコフプロセスを使用すると、以下に示すように、いくつかの有用な統計を計算できます。

最初にコード(スペースは不要):

r = Range@28/28;
s = DiagonalMatrix;
ListPlot[RandomFunction[DiscreteMarkovProcess[RandomInteger@#, r~ s ~ -1 + s[29/28- r, 1]], 
                                              #], PlotRange -> #] &@{1, 29}

いくつかの出力:

Mathematicaグラフィックス

私が使用した遷移行列は次のとおりです。

MatrixPlot[s[r, -1] + s[29/28 - r, 1]]

Mathematicaグラフィックス

しかし、私が言ったように、興味深い部分は、使用DiscreteMarkovProcess[]することで、何が起こっているのかを把握できることです。

ボールが15いつでもt 特定のランダムな状態から始まる確率を見てみましょう:

d = DiscreteMarkovProcess[RandomInteger@29, s[r, -1] + s[29/28 - r, 1]];
k[t_] := Probability[x[t] == 15, x \[Distributed] d]
ListLinePlot[Table[k[t], {t, 0, 50}], PlotRange -> All]

Mathematicaグラフィックス

0から0.3に近い値の間で変動していることがわかります。これは、開始状態に応じて、奇数または偶数のステップで15にしか到達できないためです。

これで同じことができますが、すべての可能な初期状態から始まる統計を考慮するようにMathematicaに指示します。15ある時間後にいる確率はどのくらいtですか?:

d = DiscreteMarkovProcess[Array[1 &, 29]/29, s[r, -1] + s[29/28 - r, 1]];
k[t_] := Probability[x[t] == 15, x \[Distributed] d]
ListLinePlot[Table[k[t], {t, 0, 100}], PlotRange -> All]

Mathematicaグラフィックス

あなたもそれが振動するのを見ることができます...なぜ?答えは簡単です。間隔[1, 29]には偶数よりも奇数があります:)

ボールが次の位置にある確率を求めると、振動はほとんどなくなります14 OR 15

Mathematicaグラフィックス

また、状態確率の制限(チェザーロの意味で)を求めることもできます。

ListLinePlot@First@MarkovProcessProperties[d, "LimitTransitionMatrix"]

Mathematicaグラフィックス

ああ、まあ、多分私はそのようなトピック外の答えのためにいくつかの下票に値するでしょう。お気軽に。


2
これは最短ではありませんが、本当にクールです。
カスララーヘルディ14

Upvoted、そして今、あなたのスコアは、もはや2222 ...である
cormullion

@cormullionありがとう!あなたは一生懸命
ダウン投票

7

バッシュ、スコア21(81バイト-50ボーナス-10ボーナス)

o=$[RANDOM%28];for i in {D..a};{ printf " %$[o+=1-2*(RANDOM%29<o)]s.%$[28-o]s
";}

この答えでは、ドットは「引っ張られて」中央に戻ります。これは、開始点を0または30にハードコーディングすることでテストできます。


良い解決策!しかし、開始点をハードコードしないでください;)
レゲエムフィン14

1
@Kostronor-おっと-私はそれを見逃し、今それを修正しました。
デジタル外傷14

2
に置き換えること{1..30}によって文字を保存{P..m}
ジェフリーディ14

oが返されたらどう1なりRANDOM%30ます0か?そして、次の繰り返しでも?
user2846289 14

@VadimR-境界条件は現在修正されていると思います。
デジタル外傷14

5

ルビー69 66 64-60 = 4

i=rand(30);30.times{a=' '*30;a[i]=?.;puts a;i+=rand>i/29.0?1:-1}

サンプル:

            .             
           .              
            .             
           .              
          .               
           .              
            .             
             .            
              .           
             .            
              .           
               .          
              .           
               .          
              .           
             .            
            .             
             .            
              .           
             .            
              .           
             .            
            .             
             .            
            .             
             .            
            .             
           .              
          .               
           .              

i=rand 30;代わりにを使用してバイトを保存できますi=rand(30);
ヨルダン

5

Smalltalk、161 159 145-60 = 85

すべての列の長さは30文字です(可変文字列bで動作)。

ランダムな移動の可能性は、p(rnd(0..29)-p)でrnd値をバイアスし、符号(-1/0/1)を取得し、(-1 |を介して(-1 / + 1)に調整することにより調整されます。 1)、これは移動デルタと見なされます(実質的にx sign <= 0 ifTrue:-1 ifFalse:1を計算します)。STは1ベースのインデックスを使用するため、すべての文字列参照を+1調整する必要があります(-1 | 1ビットをいじるハック;-))。

p:=((r:=Random)next*29)rounded.(b:=String new:30)at:p+1put:$..0to:29do:[:i|b at:p+1put:$ .p:=(p+(((r next*29)-p)sign-1|1))min:29max:0.b at:p+1put:$..b printCR]

Rubyバージョン(thanx&Up @fipgr)からアイデアを盗むと、最小/最大チェックを取り除くことができます。

p:=((r:=Random)next*29)rounded.(b:=String new:30)at:p+1put:$..1to:30 do:[:i|b at:p+1put:$ .p:=p+((r next-(p/29))sign-1|1).b at:p+1put:$.;printCR]

出力:(後から手動で列番号と垂直バーを追加しました。上記のコードでは生成されません)

 012345678901234567890123456789
|                     .        |
|                    .         |
|                   .          |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                .             |
|                 .            |
|                .             |
|               .              |
|                .             |
|                 .            |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                  .           |
|                 .            |
|                .             |
|               .              |
|                .             |
|               .              |
|                .             |
|               .              |
|              .               |
|               .              |
|              .               |
 012345678901234567890123456789

4

C、86

rand()関数をシードする必要がないと仮定します。

k=30;main(i){i=rand()%k;while(k--){printf("%*c\n",i+=i==30?-1:i==1||rand()%2?1:-1,46);}}

説明:

Cで、中出力の長さが最小長を有するであろうし、この最小長さは、関数呼び出しの引数によって決定されることを意味する(この場合、それは。手段次の引数()(文字でありますドット)。"%*c"*i+=i==30?-1:i==1||rand()%2?1:-1c46

境界チェックについては、それを忘れてしまったことをおlogびします。15文字のコストでこれを答えに追加しました。三項演算子は次のように機能しますboolean_condition?value_if_true:value_if_false。Cではtrueは1であり、falseは0であることに注意してください。


コードで何が起こっているのかを拡張できますか?printf("%*c\n",i+=rand()%2?1:-1,46)スペースを印刷する方法と、ドットが29を超えて移動しないようにする方法を理解するのに苦労しています。事前に感謝します。(申し訳ありませんが、私はCプログラマーではありません。)
まともなダブラー14

@fireeyedboy完了、ご理解ください:)
user12205 14

ああ、ちょっと浮気してる感じがした。;-)しかし、残りは確かに明確になりました。ありがとうございました!そして素晴らしい解決策!C rand()%2は非常に予測しやすいという奇妙な振る舞いもしていますか(奇数/偶数ターン)。私はrand()%2PHPソリューションであなたを試してみましたが、これは非常に予測可能な振る舞いを示しました(rand(0,1)。とは対照的に) 。
ディーセント生噛じり

@fireeyedboy rand()関数をシードしませんでした。Cでrand()明示的にシードされていない場合、毎回常に同じシードを使用します。それが予測可能な理由です。私はそれをシードする必要があった場合、私はそれを行うことができsrand(time());ます14文字
-user12205

しかし、後続の各呼び出しでも奇数から偶数に切り替わるほど予測可能ですか?PHP もうrand()シードする必要はありませんがsrand()、この奇妙な動作を示しています。
まともなダブラー14

4

ジャワ:204 183 182 176 175文字- 16 - 50 = 115

class K{public static void main(String[]y){int k,j=0,i=(int)(29*Math.random());for(;j++<30;i+=Math.random()*28<i?-1:1)for(k=0;k<31;k++)System.out.print(k>29?10:k==i?'.':32);}}

まず、ドットの位置は0 < x < 30、つまり[1-29]でなければなりません。これにより、0〜28の数値が均一に分布し、このプログラムの目的では[0-28]は[1-29]と同じ効果があります。

i=(int)(29*Math.random());

私が個人的には14時頃に配布されるのが好きですが、私の答えはもっと長くなります:

i=0;for(;j<29;j++)i+=(int)(2*Math.random());

第二に、このコードはそれが真ん中にある傾向があることを保証します:

i+=Math.random()*28<i?-1:1

+1を取得する確率はの値が小さいほど大きくなりi、-1の場合は逆になります。iが0の場合、+ 1が得られる確率は100%で、-1が得られる確率は0%です。i28の場合、その反対が起こります。

第三に、出力をより見やすく32する'_'ために末尾を置き換えることにより、各行に30文字と新しい行が含まれることがわかります。

__________.___________________
_________.____________________
________._____________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
_________.____________________
________._____________________
_________.____________________
________._____________________
_________.____________________
__________.___________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
_________.____________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
____________._________________
_____________.________________
______________._______________
_____________.________________
______________._______________
_______________.______________
______________._______________
_____________.________________

以前のバージョンでの誤解を指摘してくれた@VadimR(現在、user2846289)に感謝します。

この回答が最初に投稿されてから2年半以上経っても、6文字を削除してくれた@KevinCruijssenに感謝します。


しかしiになっては0、それは、違法ではないのですか?
user2846289 14

@VadimR、私にとってiは範囲[0-29]です。これは[1-30]または[288-317]と同等で、出力は同じです。重要なのは、間隔[0-29]に30個の整数があることです。
ビクターStafusa 14

「スペースの数は、0 <x <30で定義されたドットのx位置です。つまり、スペースの数(または0ベースのドット位置)は1..29です。iすることはできません0。私はそれが楽しみを持つことのすべてであることを理解していますが、それでも悲しいです。
user2846289 14

@VadimR、ああ、ありがとう。修繕。これは、ドットが右端の位置に配置されないことを意味しますが、とにかく、それが指定されたものです。
ビクターStafusa 14

申し訳ありませんが、何も修正されませんでした。最初にi取得し1、最初の反復でMath.random()0、次にをi取得することを想像してください0。誤解しないでください、それはあなたの答えではありません。むしろ、Cライク以外のほとんどの言語を読むことができないことについて。それから、エラーについて反応なしで(アップ投票を除く)、エラーが正しいかどうかをどのように知ることができますか?
user2846289 14

3

Mathematica 157-10-50 = 97

開始には1〜30の乱数が使用されます。ドットの残りの列番号はすべて、を介して選択 RandomChoice[If[c > 15, {2, 1}, {1, 2}] -> {-1, 1}] + cされます。「前の列番号が15より大きい場合、セット{-1,1}から1つの番号を選択します。 1;それ以外の場合、ウェイトを反転し、同じセットから選択します。

ReplacePart 対象の列に対応する30個の空白スペースのリストの要素を置き換えます。

f@c_ := Switch[d = RandomChoice[If[c > 15, {2, 1}, {1, 2}] -> {-1, 1}] + c, 1, 2, 30, 29, d, d]
Row@ReplacePart[Array["_" &, 29], # -> "."] & /@ NestList[f, RandomInteger@29+1, 30] // TableForm

ドット


ナイスユースRandomChoice[]
Dr. belisarius 14

3

> <>、358-10 = 348

これはcodegolfでは勝ちませんが、動作します。(Windows 7では、このインタープリターを使用して、「p」命令をesolangページで定義したものとは異なる方法で実装します)

1v        >a"                              "v
v<      0<} vooooooooooooooooooooooooooooooo<
&  _>   v : >$" "@p1+:2f*(?v;
  |x1>  v^}!               <
  |xx2> v p
  |xxx3>v  
  |xxxx4v $
>!|xxx< v }
  |xxxx6v }
  |xxx7>v @
  |xx8> v :
  |x9v  < @>  5)?v$:67*)?vv
   _>>&?v!@^     >$:b(?v v
  v }"."< :        v+ 1<  <
  >a+b+00}^0}}${"."< <- 1<

この言語の名前はグーグル検索できないので、好奇心の強い人のためのエソランの記事はこちらです。


-50の要件を50文字未満でコーディングできますか?
ビクターStafusa 14

1
@Victorおそらく、しかし> <>はコードを書くのが大変な苦痛です(楽しい巨大な苦痛)ので、休憩する必要があります。
SirCxyrtyx 14

@SirCxyrtyxこれは私をくすくす笑わせた よくゴルフをしました。
ガスドール14

3

PHP、118 113 112 111(、-10ボーナスポイント= 101)

(2回目の試行、恐ろしく予測可能なrand()動作、およびもう少し効率化)

for($n=30,$i=rand(1,29),$t=$s=pack("A$n",'');$n--;$i+=$i<2|rand()%2&$i<28?1:-1,$t=$s){$t[$i-1]='.';echo"$t\n";}

可能な結果:

______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________
______._______________________
_____.________________________

PHP、130(、-10ボーナスポイント= 120)

(初挑戦)

これはおそらくはるかに効率的です。

for($n=30,$i=rand(1,29),$t=$s=str_repeat(' ',$n)."\n";$n--;$i=$i<2?2:($i>28?28:(rand(0,1)?$i+1:$i-1)),$t=$s){$t[$i-1]='.';echo$t;}

スペースをアンダースコアに置き換えた場合(表示目的)、これは考えられる結果です。

________._____________________
_______.______________________
______._______________________
_______.______________________
________._____________________
_______.______________________
______._______________________
_______.______________________
______._______________________
_______.______________________
________._____________________
_______.______________________
________._____________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
_________.____________________
________._____________________
_________.____________________
________._____________________
_______.______________________
______._______________________
_____.________________________
____._________________________
_____.________________________
____._________________________
___.__________________________

奇妙なことにrand(0,1)rand()%2(Windows XPのPHP 5.4)に置き換えると、ランダムな結果は次の各反復で常に奇数から偶数に、またはその逆に切り替わりrand()、その意味で、突然、予測不可能になります。この「バグ」は2004年以来知られているもののようです。ただし、まったく同じ「バグ」かどうかは完全にはわかりません。


3

J 42文字-50-10 = -18

'_.'{~(|.~((I.%<:@#)*@-?@0:))^:(<@#)1=?~30

説明は右から始めます(列車に関するいくつかの知識が役立ちます)。

init=: 0=?~30          NB. where is the 0 in the random permutation of [0,29]
rep =: ^:(<@#)         NB. repeat as many times as the array is long, showing each step

rnd =: ?@0:            NB. discards input, generates a random number between 0 and 1

signdiff =: *@-        NB. sign of the difference (because this works nicely with
                       NB. the shift later on).

left_prob =: (I.%<:@#) NB. probability of shifting left. The position of the one (I.) divided by the length -1.

shift =: |.~           NB. x shift y , shifts x by y positions to the left.

output =: {&'_.'       NB. for selecting the dots and bars.

NB. Piecing things together:
output (shift (left_prob signdiff rnd))rep init

中心傾向、-50、1000回を超える実行の例:

NB. Amounts of ones in each column (sum)
   ]a=:+/ (|.~((I.%<:@#)*@-?@0:))^:(<1000)0=?30
0 0 0 0 0 0 2 6 10 12 25 60 95 121 145 161 148 99 49 27 19 13 6 1 1 0 0 0 0 0
   +/a NB. check the number of ones in total
1000
   |. |:(<.a%10) #"0 1] '*' NB. plot of those values
           *              
           *              
          ***             
          ***             
         ****             
         ****             
         ****             
        ******            
        ******            
        ******            
       *******            
       *******            
       ********           
       ********           
      **********          
    **************        

実行例、各行に正確に30バイトを出力

_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
________________._____________
_______________.______________
______________._______________
_______________.______________
________________._____________
_________________.____________
________________._____________
_______________.______________
______________._______________
_____________.________________
____________._________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
______________._______________

非常に良い解決策です!
レゲエムフィン14

非常に良い挑戦でもあります!
jpjacobs 14

3

Pythonの2.7:126 109 -10-50 = 49

ハードコーディングされた開始点を取り除きました-ランダムな点から開始します。このため、randintが必要だったため、オフセットの代わりにそれを使用することにしました。そのために(-1)** boolトリックを使用しました。

from random import randint as r;p=r(0,29)
for i in range(30):
 print' '*p+'.'+' '*(29-p);p+=(-1)**(r(0,29)<p)

ここでいくつかの素晴らしい答え。Pythonでの最初の試み。改善について考えます。インポートの必要性に助けられません。

-10-はい各行に30文字+ \ n

-50-中心から離れるほど、逆方向に移動する可能性が高くなります(+ / iオフセットの数が異なるリストを作成することで達成されます)

以前の試み:

from random import choice;p,l=15,[]
for i in range(30):
 q=29-p;l+=[' '*p+'.'+' '*q];p+=choice([1]*q+[-1]*p)
print'\n'.join(l)

あなたのforループはすべて1行になりますが、さらに良くあることができfor i in[0]*30:、より良いまだですeval"..."*30
mbomb007

2

Java- 198183文字

これは、あなたが質問で与えた例の単純で、単純で、直接的で、創造的でないゴルフです。

class A{public static void main(String[]y){int c,j,i=(int)(Math.random()*30);for(c=30;c>0;c--)for(j=i+=i<2?1:i>28?-1:Math.random()>0.5?1:-1;j>=0;j--)System.out.print(j>0?" ":".\n");}}

2

バッチ-(288バイト-10)278

@echo off&setlocal enabledelayedexpansion&set/ap=%random%*30/32768+1&for /l %%b in (1,1,30)do (set/ar=!random!%%2&if !r!==1 (if !p! GTR 1 (set/ap-=1)else set/ap+=1)else if !p! LSS 30 (set/ap+=1)else set/ap-=1
for /l %%c in (1,1,30)do if %%c==!p! (set/p"=."<nul)else set/p"=_"<nul
echo.)

ゴルフをしていない:

@echo off
setlocal enabledelayedexpansion
set /a p=%random%*30/32768+1
for /l %%b in (1,1,30) do (
    set /a r=!random!%%2
    if !r!==1 (
        if !p! GTR 1 (set /a p-=1) else set /a p+=1
    ) else if !p! LSS 30 (set /a p+=1) else set /a p-=1
    for /l %%c in (1,1,30) do if %%c==!p! (set /p "=."<nul) else set /p "=_"<nul
    echo.
)

アンダースコアの代わりにスペースを出力するには-372 バイト -

@echo off&setlocal enabledelayedexpansion&for /f %%A in ('"prompt $H &echo on&for %%B in (1)do rem"')do set B=%%A
set/ap=%random%*30/32768+1&for /l %%b in (1,1,30)do (set/ar=!random!*2/32768+1&if !r!==1 (if !p! GTR 1 (set/ap-=1)else set/ap+=1)else if !p! LSS 30 (set/ap+=1)else set/ap-=1
for /l %%c in (1,1,30)do if %%c==!p! (set/p"=."<nul)else set/p"=.%B% "<nul
echo.)

次のロジックでいくつかのヘルプを探していますが、これは確かに最もスペース効率の良い方法ではありません(!r!は1または2に展開されます)-

if !r!==1 (
    if !p! GTR 1 (set /a p-=1) else set /a p+=1
) else if !p! LSS 30 (set /a p+=1) else set /a p-=1

以下にゴルフします。 if !r!==1 (if !p! GTR 1 (set/ap-=1)else set/ap+=1)else if !r! LSS 30 (set/ap+=1)else set/ap-=1


2

J、42文字、ボーナスなし

' .'{~(i.30)=/~29<.0>.+/\(-0&=)?(,2#~<:)30

実行例:

          ' .'{~(i.30)=/~29<.0>.+/\(-0&=)?(,2#~<:)30
                       .
                      .
                     .
                      .
                     .
                      .
                     .
                      .
                       .
                      .
                     .
                    .
                     .
                    .
                     .
                    .
                     .
                      .
                       .
                        .
                       .
                        .
                       .
                      .
                     .
                      .
                       .
                      .
                     .
                    .

2

Python 2.7(126-10(固定長)-50(中央傾向)= 66)

次のプログラムは、より大きなサンプルを中心に傾向があります

s=id(9)%30
for e in ([[0,2][s>15]]*abs(s-15)+map(lambda e:ord(e)%2*2,os.urandom(30)))[:30]:
    s+=1-e;print" "*s+"."+" "*(28-s)

デモ

         .           
        .            
       .             
      .              
     .               
      .              
       .             
        .            
         .           
          .          
           .         
          .          
           .         
          .          
         .           
        .            
       .             
        .            
       .             
      .              
     .               
      .              
       .             
      .              
     .               
    .                
   .                 
    .                
   .                 
    .              

シードのs = id(9)%30のように。OSはインポートする必要がありますか?そして、これは1-30の全範囲をカバーしますか?ああ... * *ページ上部の不平等を再読み込みを待つ
psion5mx

2

Javascript 125 73 72 60(120-50-10 )

i=0;r=Math.random;s=r()*30|0;do{a=Array(30);a[s=s>28?28:s?r()<s/30?s-1:s+1:1]='.';console.log(a.join(' '))}while(++i<30)

編集: 50ポイントのボーナスと10ポイントのボーナスを修正。

編集2:さらに短く!


50ポイントのボーナスを獲得できる場所を説明できますか?私は...現時点ではそれを取得していないです
reggaemuffin

@Kostronor要件の編集を見ました。私はまだ50ポイントを獲得していないようです。
aebabis

@acbabis、よくやった!:あなたは、いくつかのバイト(116)を保存することができますr=Math.random;s=r()*30|0;for(i=0;i++<30;a=Array(30)){a[s=s>28?28:s?r()<s/30?s-1:s+1:1]='.';console.log(a.join(' '))}
マイケル・M.

@Michaelヒントをありがとう。forただし、作業中に配列の初期化を取得できませんでした。しばらく使用しなければなりませんでした。
aebabis 14

2

D- 167162、144(154-10)

Golfed

import std.stdio,std.random;void main(){int i=uniform(1,30),j,k;for(;k<30;++k){char[30]c;c[i]='.';c.writeln;j=uniform(0,2);i+=i==29?-1:i==0?1:j==1?1:-1;}}

ゴルフをしていない

import std.stdio, std.random;

void main()
{
    int i = uniform( 1, 30 ), j, k;

    for(; k < 30; ++k )
    {
        char[30] c;
        c[i] = '.';
        c.writeln;
        j = uniform( 0, 2 );
        i += i == 29 ? -1 : i == 0 ? 1 : j == 1 ? 1 : -1;
    }
}

編集1-私のコードが-50ボーナスの資格があるかどうかはよくわかりません。iいつも途中で開始しますが、中にはありませんforループ、決してドットんがときに、より多くの3ヶ所のいずれかの方向のようなより移動しi ない中央付近に開始、全部が同様にそこに滞在する傾向があります。

EDIT 2-コードは-10ボーナスの対象となります。これは、29文字の配列に続いてLFが1行あたり合計30文字で印刷されるためです。


LFが後に続く29文字の配列を印刷するため-30文字にLFが続く必要があります。
ビクターStafusa 14

@Victorああ、訂正してくれてありがとう、私はメインの投稿を誤解した。
トニーエリス14

2

PowerShell、77-10-50 = 17

$x=random 30
1..30|%{$x+=random(@(-1)*$x+@(1)*(29-$x))
'_'*$x+'.'+'_'*(29-$x)}

出力

_.____________________________
__.___________________________
___.__________________________
____._________________________
___.__________________________
____._________________________
_____.________________________
______._______________________
_______.______________________
______._______________________
_____.________________________
______._______________________
_______.______________________
________._____________________
_________.____________________
__________.___________________
___________.__________________
__________.___________________
___________.__________________
____________._________________
___________.__________________
__________.___________________
_________.____________________
__________.___________________
_________.____________________
________._____________________
_________.____________________
________._____________________
_________.____________________
__________.___________________

スマートランダム。あなたはゴルフバージョンを使用することができます$x=random 30;1..30|%{' '*($x+=,-1*$x+,1*(29-$x)|random)+'.'|% *ht 30}。66バイト
-10-50

2

R、107文字-60ポイントボーナス= 47

s=sample;i=s(29,1);for(j in 1:30){a=rep(' ',30);i=i+s(c(-1,1),1,p=c(i-1,29-i));a[i]='.';cat(a,'\n',sep='')}

iドットのインデックスです。a30個のスペースの配列です。開始点はランダムです(1から29まで均一)。各反復でi、重み付き確率を使用して-1または+1をランダムに追加します:i-1for -1および29-i for +1(確率として供給される値は1に合計する必要はありません)、つまり、下からそれを防ぎながら、ドットを中心に向ける傾向があることを意味します1以上29(両方のケースで確率が0になるため)。

_読みやすさのためにスペースの代わりに実行する例:

> s=sample;i=s(1:30,1);for(j in 1:30){a=rep('_',30);i=i+s(c(-1,1),1,p=c(i-1,29-i));a[i]='.';cat(a,'\n',sep='')}
_______________________.______
______________________._______
_____________________.________
______________________._______
_____________________.________
______________________._______
_____________________.________
______________________._______
_____________________.________
____________________._________
_____________________.________
______________________._______
_____________________.________
______________________._______
_____________________.________
____________________._________
___________________.__________
____________________._________
___________________.__________
__________________.___________
_________________.____________
________________._____________
_______________.______________
______________._______________
_______________.______________
________________._____________
_________________.____________
________________._____________
_______________.______________
______________._______________

私があなたのコードを読み間違えていなければ、どちらかになるi ことができますか?030
user2846289 14

はい、あなたは正しいですが、それは30でも(それ以上ではありません)、それを変更します。
plannapus

1
現在修正されています。1から0に移動する又は29から30に移動する確率は、今0ランダム起点1と29との間今
plannapus

ヒント:あなたは置き換えることにより、2つの以上の文字を保存することができますs(1:29,1)s(29,1)
スベンホーエンシュタイン14

あなた@SvenHohensteinしている右の私はいつも1つ忘れてしまう
plannapus

2

C#184-10-50 = 123

using System;namespace d{class P{static void Main(){var r=new Random();int p=r.Next(30);for(int i=0;i<30;i++){Console.WriteLine(".".PadLeft(p+1).PadRight(29));p+=r.Next(30)<p?-1:1;}}}}

出力

space_読みやすくするために置き換えられました。

____________.________________
___________._________________
__________.__________________
___________._________________
____________.________________
_____________._______________
______________.______________
_____________._______________
______________.______________
_______________._____________
______________.______________
_______________._____________
______________.______________
_______________._____________
______________.______________
_____________._______________
____________.________________
___________._________________
____________.________________
_____________._______________
______________.______________
_____________._______________
____________.________________
___________._________________
____________.________________
___________._________________
____________.________________
___________._________________
__________.__________________
___________._________________

if...else if...elseあなたのコードの最後に小さなコードを取得することが可能であるはずです。さらに、あなたの出力は、私はそれが真ん中にある傾向があるという疑いを抱かせますが、あなたのコードは正しいようです。
ビクターStafusa 14

コードを編集したときに出力を更新するのを忘れました。r.Next(30)<p?-1:1;それが起こることができます。ifステートメントを小さくできるかどうかはわかりません。switch必須であるためbreak/ は大きくreturn、最終elsedefault:{}ケースを必要とし、それも長いです。
ガスドール14

@Victorの入力に感謝します。編集しました。
ガスドール14

場合はpゼロであり、p+=r.Next(30)<p?-1:1;常に、1を得るための必要はありませんので、しますif(p==0)。同様にp==29p30になることはないので、を取り除くことができますelse if
ビクターStafusa 14

@Victorグランド。これらの変更を行う病気。じゃ
ガスドール14

1

PHP

センタリングボーナスあり:82-50 = 32

$i=rand(0,29);for($c=0;$c++<30;rand(0,28)<$i?$i--:$i++)echo pack("A$i",'').".\n";

このバージョン(以下の古いバージョン)では、センタリングコードで処理されるため、最小/最大チェックを削除しました。rand(1,28)ここでは、$i++29(実際の最大)までプッシュできるため、重要になります。

編集:不要な括弧、移動コード


センタリングの単純なアルゴリズム:0〜29の新しい数値を生成し、現在の数値と比較します。大きな側の数字を取得して「中心」に向ける「確率」を利用します。

実際の結果:(その後に行番号が追加されます)

01|        .
02|       .
03|        .
04|         .
05|          .
06|           .
07|            .
08|           .
09|            .
10|             .
11|              .
12|             .
13|            .
14|             .
15|            .
16|             .
17|            .
18|             .
19|              .
20|               .
21|              .
22|             .
23|              .
24|               .
25|                .
26|               .
27|                .
28|                 .
29|                .
30|               .

アーカイブ済み:

$i=rand(0,29);for($c=0;$c++<30;){($i<1?$j=1:($i>28?$j=28:$j=rand(0,29)));($j<$i?$i--:$i++);echo pack("A$i",'').".\n";} 119文字

$i=rand(0,29);for($c=0;$c++<30;){($i<1?$i++:($i>28?$i--:(rand(0,29)<$i?$i--:$i++)));echo pack("A$i",'').".\n";} 112文字


私は私が私の最初のバージョン以来、49個の文字を削り取らことを印象づけちょっと...だ
ヨーダ

44文字を削りました。前回39だったことを意味する必要があります。
依田14

1

JavaScript ES6 125-10(30文字行)-50(中央に向かってシフト)= 65

私は自分のユニットにリフトを登るというひらめきを持っていたので、それが私の記憶を残す前にそれを降ろさなければなりませんでした...

z=(j=Array(t=29).join`_`)+"."+j;x=(r=Math.random)()*t;for(i=30;i--;)console.log(z.substr(x=(x+=r()<x/t?-1:1)>t?t:x<0?0:x,30))

x/t... によって示されるシフト確率を計算するための少し可変の位置シャッフルと少しの創造性(それを指摘してくれたKostronorに感謝します!)私は今、中央へのシフトのために-50ボーナスを獲得し、私も開始位置を行の全範囲で、2バイトを削ることができました!

....5....0....5....0....5....0 <-- Ruler
_.____________________________
__.___________________________
___.__________________________
__.___________________________
___.__________________________
__.___________________________
_.____________________________
__.___________________________
___.__________________________
__.___________________________
___.__________________________
____._________________________
_____.________________________
______._______________________
_______.______________________
________._____________________
_______.______________________
______._______________________
_______.______________________
________._____________________
_______.______________________
________._____________________
_________.____________________
__________.___________________
_________.____________________
__________.___________________
___________.__________________
____________._________________
_____________.________________
______________._______________

ここでの初期ドット位置のランダム性は、2つまたは3つの可能性に制限されていませんか?そして、それはドットを真ん中に保持することです(実行回数が非常に短い= 30であるため)、したがって-50の価値がありますか?
user2846289 14

引用OPのテキスト:『あなたのランダムなx位置とプログラムが起動し、毎ターンシフトこの位置ランダムに1ずつ左右には』私のコードが最初に定義されて15+r()*2いることは15から16.9999999998に何であるか、そうどのラウンドできた可能性がありオフから17まで。14 x+=r()<.5?-1:1から18の範囲に追加することで、追加のランダム性が少しランダムになります。技術的には、求められたものの定義内にあるランダムな数字になります。 -1)ほとんどの場合、真ん中に戻します
;;

さて、ランダムなことに、あなたは私を手に入れました...それは「可能なすべての位置からランダムな位置」であることを意味していましたが、50ポイントが明らかに適用されないため、あまり利点はありません!このボーナスの説明をもう一度読んでください。0.5%固定されていない場合は受け取れません!
レゲエムフィン14

有効なポイントは、私が...それに応じて自分のスコアをやり直します
WallyWest

@Kostonor Codeが適切なソリューションで更新され、それに応じてスコアが更新されました!
WallyWest

1

k、53-10-50 = -7

解決策1

{{a:30#" ";a[x]:".";a}'{x+$[*x<1?!30;1;-1]}\[x;*1?x]}

使用法

{{a:30#" ";a[x]:".";a}'{x+$[*x<1?!30;1;-1]}\[x;*1?x]}30

"      .                       "
"       .                      "
"      .                       "
"       .                      "
"      .                       "
"       .                      "
"        .                     "
"         .                    "
"        .                     "
"         .                    "
"        .                     "
"         .                    "
"          .                   "
"           .                  "
"            .                 "
"             .                "
"              .               "
"               .              "
"              .               "
"             .                "
"            .                 "
"           .                  "
"          .                   "
"         .                    "
"        .                     "
"       .                      "
"        .                     "
"         .                    "
"          .                   "
"         .                    "
"          .                   "

解決策2

{r::x;{a:r#" ";a[x]:".";a}'{a:r#0b;a[x?r]:1b;x+$[a@*1?r;-1;1]}\[x;*1?x]}[30]

1

Scala、95-10 = 85バイト

def r=math.random
Seq.iterate(r*30,30){n=>println(("#"*30)updated(n.toInt,'.'))
(r*2-1+n)round}

私はまだ50バイトのボーナスについて考えています。

説明:

def r=math.random //define a shortcut for math.random, which returns a number 0 <= n < 1
Seq.iterate(      //build a sequence,
  r*30,             //starting with a random number bewteen 0 and 29
  30                //and containing 30 elements.
){n=>             //Calculate each element by applying this function to the previous element
  println(        //print...
    (" "*30)             //30 spaces
    updated(n.toInt,'.') //with the n-th char replaced with a dot
  )               //and a newline.
                  //The next element is
  (r*2-1+n)       //an random number between -1 and 1 plus n
  round           //rounded to the nearest integer.
}

1

Javascript、125(135-10)

q=Math.random,p=~~(q()*31)+1;for(i=0;i++<30;){s='',d=j=1;for(;j++<31;)s+=j==p?'.':" ";p+=q()<.5?1:-1;p-=p>28?2:p<2?-2:0;console.log(s)}

コメントやアドバイスを歓迎します。


残念ながら、あなたのソリューションは資格がなく、あなたのアウトプットを他のソリューションのアウトプットと比較してください。ドットを1文字シフトします。
レゲエムフィン14

@Kostronor Oh!ああ!本当に申し訳ない!質問のその部分を読むのを忘れました!私はすぐに新しいバージョンを開発しようとします。指摘してくれてありがとう!
ガランタンドン14

@Kostronorプログラムの編集。
ゴーランタンドン14

1

JavaScript

114文字-10(30文字行)-50(中央に向かってプルドット)= 54

for(f=Math.random,a=[],i=30,j=k=f()*i|0;i--;a[j]='.',a[j+=29-k]='\n',j+=k+=f()>k/29?1:-1);console.log(a.join('-'))

ただし、行を30文字まで埋めることに対する10文字の報酬は悪い取引である可能性があることに気付きました。そう:

102文字-50(中央に向かってプルドット)= 52

for(f=Math.random,a=[],i=30,j=k=f()*i|0;i;i--,a[j]='.\n',j+=k+=f()>k/29?1:-1);console.log(a.join('-'))

単純化されたプル方向条件付きの@WallyWestへの称賛f()>k/29?1:-1、最初のドラフトでは2つのネストされた条件を使用しました。


1

ラケット227バイト(30文字で-10、ミッドラインへのシフトで-50 = 167)

各ステップで、ドットは中点から離れるよりも中線に向かって移動する可能性が2倍高くなります。

(let lp((r(random 1 31))(c 0)(g(λ(n)(make-string n #\space))))(set! r
(cond[(< r 1)1][(> r 30)30][else r]))(printf"~a~a~a~n"(g r)"*"(g(- 29 r)))
(when(< c 30)(lp(+ r(first(shuffle(if(> r 15)'(-1 -1 1)'(1 1 -1)))))(add1 c)g)))

ゴルフをしていない:

(define (f)
    (let loop ((r (random 1 31))
               (c 0)
               (g (λ (n) (make-string n #\space))))
      (set! r (cond
                [(< r 1) 1]
                [(> r 30) 30]
                [else r] ))
      (printf "~a~a~a~n" (g r) "*" (g (- 29 r)))
      (when (< c 30)
        (loop (+ r
                 (first
                  (shuffle
                   (if (> r 15)
                       '(-1 -1 1)
                       '(1 1 -1)))))
              (add1 c)
              g))))

テスト:

(println "012345678901234567890123456789")
(f)

出力:

"012345678901234567890123456789"
                       *       
                      *        
                       *       
                        *      
                         *     
                        *      
                       *       
                      *        
                     *         
                      *        
                     *         
                    *          
                     *         
                      *        
                     *         
                    *          
                   *           
                  *            
                 *             
                *              
               *               
                *              
                 *             
                *              
                 *             
                *              
                 *             
                *              
                 *             
                *              
               *               

いい解決策!ラケットは本当に面白いです。自分に50ボーナスポイントを与え、追加10を申請するかどうかを確認できます:
レゲエムフィン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.