移点


16

您的程序必须打印出许多空格,后跟一个点和一个换行符。空格数是点的x位置,定义为0 <x <30

每条新线都是转弯。您的程序运行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
Victor Stafusa 2014年

我认为原始代码是正确的。
user2846289

是正确的,因为我先移印。因此,即使随机值超出了边界,也可以先更正然后打印。
reggaemuffin

@Kostronor但这意味着起始点位置不遵循均匀分布,第一个位置的位置可能是其他位置的两倍。也不要求OTOH均匀分布。
Victor Stafusa 2014年

似乎很难创建一个点跳得更多的程序。那么,为什么有限制其移动的奖励呢?
克里斯·拉普兰特

Answers:


18

APL,39 – 10 – 50 = –21

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

使用⎕IO←1和在Dyalog上进行了测试,⎕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时间的,它从值开始b并使每次迭代的结果成为下一个的accumulator()参数。第二个和下一个输入参数()以及最终结果将被忽略。事实证明,这比带有警卫的常规递归调用要短得多。

运行示例

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

apl是打高尔夫球的好语言(尽管我很难读懂);起来!
blabla999 2014年

@ blabla999 APL有许多常见的符号和一些奇怪的符号,但是一旦您学习了它们的功能,该语言就易于阅读和书写。当然,“打高尔夫球”语言的ASCII噪声要容易得多,但是我敢说它比普通语言要容易得多。语法非常规则,只有一个规则:表达式是从右到左执行的,因此可以从左到右读取它们:+/2×⍳9读为“两次的和:自然数最多为9”,但是以相反的方式执行。
Tobia 2014年

是我还是这里每行有31个字符?
Gusdor 2014年

通过将上面示例中的一行复制粘贴到编辑器中,并再次检查代码,我得到30。⎕←30↑...不管输入什么字符串,都将输出30个字符和换行符...
Tobia 2014年

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 graphics

我使用的转换矩阵为:

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

Mathematica graphics

但正如我所说,有趣的是 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 graphics

您会看到它在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 graphics

您可以看到它也在振荡...为什么?答案很简单:在区间中[1, 29],奇数比偶数更多:)

如果我们要求球出现在以下位置的概率,则振荡几乎消失了14 OR 15

Mathematica graphics

您还可以要求状态概率的极限(从Cesaro角度):

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

Mathematica graphics

哦,好吧,也许我应该为这样一个离题的答案投下反对票。放心吧。


2
这不是最短的,但确实很酷。
Kasra Rahjerdi 2014年

已投票,现在您的分数不再是2,222 ...
cormullion 2014年

@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来测试。


好的解决方案!但请不要对起点进行硬编码;)
reggaemuffin 2014年

1
@Kostronor-哎呀-我错过了,现在已经解决了。
Digital Trauma

2
通过更换节省焦炭{1..30}{P..m}
杰夫·里迪

如果o1RANDOM%30返回0怎么办?在下一次迭代中,也是吗?
user2846289

@VadimR-我认为边界条件现在已经确定。
Digital Trauma

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中操作);

通过将rnd值与p(rnd(0..29)-p)偏置,取符号(-1/0/1),然后通过(-1 |调整为(-1 / + 1),可以调整随机运动机会。 1),作为移动增量(有效计算:x sign <= 0 ifTrue:-1 ifFalse:1)。由于ST使用基于1的索引,因此我必须将所有字符串引用都调整+1(请欣赏-1 | 1位摆弄的hack ;-))。

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]

输出:(我之后手动添加了col-numbers和竖线;上面的代码不会生成它们)

 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:-1c表示下一个参数(46)是一个字符(点)。

至于边界检查,我对我忘记了这一点表示歉意。我现在将其添加到答案中,但要花费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程序员。)
Decent Dabbler 2014年

@fireeyedboy完成了,希望您能理解:)
user12205

aa,我有点感觉你在那儿作弊。;-)但是其余的现在确实很清楚。谢谢!很好的解决方案!C是否也具有奇怪的行为,rand()%2因为它非常容易预测(奇数/偶数转弯)?我rand()%2在PHP解决方案中尝试了您的方法,它表现出了这种非常可预测的行为(与相反)rand(0,1)。由于PHP大量使用了C库(如果我是正确的话),我想知道您的C程序是否具有相同的“缺陷” 。
体面半瓶醋

@fireeyedboy我没有种子rand()函数。在C中,如果rand()未显式地播种,则每次总是使用相同的种子。这就是为什么它是可预测的。如果我必须播种,我可以花srand(time());14个字符
user12205

但是,它是否如此可预测以至于在以后的每次呼叫中也从奇数切换为偶数?PHP 声称 rand()不再需要添加种子srand(),但是仍然显示出这种奇怪的行为。
体面的达布尔2014年

4

爪哇:204 183 182 176 175字符- 10 - 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%。如果i是28,则将发生相反的情况。

第三,通过替换32末尾的'_'来查看输出更容易,我们看到每行包含30个字符和新行:

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

感谢@VadimR(现在为user2846289)指出了先前版本中的误解。

感谢@KevinCruijssen删除了6个字符,即使在最初发布此答案两年半之后也是如此。


但是i上车0是非法的,不是吗?
user2846289

@VadimR,对我i来说范围是[0-29]。这等效于[1-30]或[288-317],输出将相同。重要的是,区间[0-29]中有30个整数。
Victor Stafusa 2014年

“空格数是点的x位置,定义为0 <x <30”,即空格数(或从0开始的点位置)为1..29。i不能0。我了解这全是为了获得乐趣,但仍然很伤心。
user2846289

@VadimR,哦,谢谢。固定。这意味着该点永远不会位于最右边,但无论如何,这就是所指定的。
Victor Stafusa 2014年

抱歉,它没有解决任何问题。想象一下i1最初是get,在第一次迭代Math.random()0,然后iget 0。请不要误会我的意思,这与您的答案无关。而不是我无法阅读除C语言之外的大多数语言。然后对错误没有任何反应(除否决之外),我怎么知道它们是正确的还是错误的?
user2846289

3

Mathematica 157-10-50 = 97

开始使用1-30之间的随机数。点中所有剩余的列号都通过进行选择 RandomChoice[If[c > 15, {2, 1}, {1, 2}] -> {-1, 1}] + c,它表示为:“如果先前的列号大于15,则从集合{-1,1}中选择一个数,相对于-1的权重为2: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

dot


很好的使用RandomChoice[]
belisarius博士2014年

3

> <>,​​358-10 = 348

这不会在codegolf上获胜,但可以。(在具有此解释器的 Windows 7中,该实现器以不同于esolang页面定义的方式实现“ p”指令)

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<

这种语言的名称无法谷歌搜索,所以这是好奇的esolang文章


您能否用少于50个字符来编码-50的要求?
Victor Stafusa 2014年

1
@Victor可能,但是> <>是编写代码时的巨大痛苦(一种有趣的巨大痛苦),因此我需要稍作休息。
SirCxyrtyx

@SirCxyrtyx这让我发笑。打高尔夫球的先生。
Gusdor 2014年

3

PHP,118 113 112 111(-10奖励点= 101)

(第二次尝试,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个字节

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

一个很好的解决方案!
reggaemuffin 2014年

也是非常好的挑战!
jpjacobs 2014年

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循环全都可以在一行上,但更好的是for i in[0]*30:,仍然更好eval"..."*30
mbomb007 '16

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的种子。操作系统需要导入,但是?这是否涵盖了整个1-30范围?哦,等等... *重读页面顶部的不等式*
psion5mx 2014年

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 2014年

@Kostronor我刚刚看到了需求的编辑。看来我还没有得到50分。
aebabis 2014年

@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(' '))}
Michael M.

@Michael感谢您的提示。但是,无法在for工作中获取数组init 。必须使用一会儿。
aebabis 2014年

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 启动中部附近,整个事情往往停留在那里。

编辑2代码现在有资格获得-10奖励,因为它会打印29个字符的数组,后跟LF,每行总共30个字符。


因为它会打印一个29个字符的数组,后跟LF-应该是30个字符,后跟一个LF。
Victor Stafusa 2014年

@Victor啊,谢谢你的纠正,我误解了主帖。
托尼·埃利斯

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是点的索引。a是30个空格的数组。起点是随机的(均匀地从1到29)。在每次迭代中,我们随机将-1或+1 i与加权概率相加:i-1for -129-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

是的,您是对的,它可以是30(不过不多),我会更改它。
plannapus 2014年

1
现在已修复。现在的概率从1到0或从29至30去为0。现在的随机起始点是1和29之间
plannapus

提示:您可以通过更换节省2个字符s(1:29,1)s(29,1)
斯文·霍恩斯坦

@SvenHohenstein你是对的我总是忘了那个
plannapus 2014年

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在代码末尾应该有可能得到较小的代码。此外,您的输出使我有些怀疑,它倾向于居中,但您的代码似乎正确。
Victor Stafusa 2014年

当我编辑代码时,忘记更新输出。将r.Next(30)<p?-1:1;使它发生。不确定您可以使用这些if语句来减小大小。switch由于强制性break/ return而很大,并且最终else需要一个default:{}案例,而且时间也很长。
Gusdor 2014年

@Victor感谢您的输入。我做了一些编辑。
Gusdor 2014年

如果p为零,p+=r.Next(30)<p?-1:1;则将始终为1,因此不需要if(p==0)。同上p==29p永远不会是30,所以您可以摆脱else if
Victor Stafusa 2014年

@维克多·格兰德 做出这些改变。助教。
2014年

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个字符,给我留下了深刻的印象……
Yoda 2014年

现在减少了44个字符。这一定意味着上次是39岁。
Yoda 2014年

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的奖金,用于向中间位置的移动,并且我还在行的全部范围,这使我可以剃掉两个字节!

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

这不是将初始点位置的随机性限制为2种或3种可能性吗?那就是将点保持在中间的原因(因为运行次数非常短= 30),因此值-50?
user2846289

引用OP的文本:“您的程序从一个随机的x位置开始,并且每转一圈都会将该位置随机向左或向右移动1”我的代码最初定义为15+r()*2从15到16.9999999998左右的任何值。降低到17。x+=r()<.5?-1:1附加值将其设置为14到18,则抛出更多的随机性,因此从技术上讲是一个随机数,在要求的范围内...通过弯曲该规则,翻转(+1, -1)在大多数情况下会将其带回到中间...;)
WallyWest 2014年

好吧,在随机的事情上,你让我...这本来是'从所有可能的位置中随机出的位置',但它并没有给您太大的优势,因为50分显然不适用!请重新阅读有关此奖金的说明,固定的0.5%不能得到!
reggaemuffin

有效点,我将相应地重做分数...
WallyWest 2014年

@Kostonor代码已使用适当的解决方案进行了更新,相应地更新了分数!
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)}

欢迎提出意见和建议。


可悲的是,您的解决方案不合格,请将您的输出与其他解决方案的输出进行比较。将点移动一个字符。
reggaemuffin

@Kostronor哦!哦!我很抱歉!我忘了阅读问题的那一部分!我将尝试尽快开发新版本。感谢您指出!
Gaurang Tandon 2014年

@Kostronor程序已编辑。
Gaurang Tandon 2014年

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,我的初稿使用了两个嵌套的条件条件。


1

球拍227字节(-10表示30个字符,-50表示移至中线= 167)

在每个步骤中,点向中线移动的可能性是远离中线的可能性的两倍:

(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 :-)
reggaemuffin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.