Máy in Walker ngẫu nhiên


24

Vẽ một chương trình hoặc hàm sẽ ghi theo STDOUT nthời gian (mỗi lần cho một bước) một chuỗi chứa một dấu chấm .tại vị trí của khung tập đi. Chương trình cũng cần viết một dòng mỗi sgiây (hoặc đợi svài giây sau mỗi dòng).

Bước ngẫu nhiên là một hình thức toán học của một con đường bao gồm một chuỗi các bước ngẫu nhiên ( wiki ), sao cho mỗi bước mới sẽ là bước cuối cùng cộng với một giá trị mới, vì vậy, bất kỳ tgiá trị bước nào cũng chỉ là tổng của tất cả các giá trị ngẫu nhiên trước ir cộng với giá trị ban đầu.

Chương trình sẽ lấy 2 đầu vào và sẽ chỉ sử dụng khoảng trắng " "và dấu chấm "."trên đầu ra. Giá trị bắt đầu của khung tập đi sẽ 20sao cho đầu ra phải là một dấu chấm sau 19 khoảng trắng.

                  . #19 spaces then a dot

Mỗi bước mới, giá trị sẽ là giá trị cuối cùng của khung tập đi cộng với một trong số này [-2-1,0,1,2](20% cơ hội mỗi cái). Sau khi vị trí mới được in, chương trình sẽ đợi svài giây và chuyển sang bước tiếp theo. Nếu bước đưa người đi bộ vượt ra ngoài phạm vi 1 to 40thì chỉ nên bỏ qua và vị trí của người đi bộ vẫn giữ nguyên. Số lượng khoảng trắng sẽ luôn là một số từ 0 đến 39.

Thí dụ

#input
Mywalk(s = 0.1, n = 30)

#output
                     .
                    .
                      .
                        .
                          .
                           .
                            .
                          .
                         .
                          .
                           .
                            .
                           .
                          .
                           .
                           .
                         .
                         .
                          .
                            .
                           .
                          .
                           .
                           .
                           .
                         .
                          .
                         .
                          .
                          .

Cân nhắc

  • Bạn có thể lấy đầu vào là bất kỳ định dạng hợp lý

  • Mã ngắn nhất sẽ thắng

  • Không sao nếu chương trình của bạn chỉ chấp nhận giây là số nguyên


2
Tôi giả sử nlà số bước?
ASCIIThenANSI

Vâng, tôi đã làm rõ điều đó, cảm ơn.
Mutador

Tôi nghĩ bạn nên nói rằng phạm vi là 1 to 40bởi vì số lượng không gian luôn luôn position-1.
geokavel

@geokavel có vẻ tốt hơn, đã sửa!
Mutador

10
Vẽ chương trình ??? ;-)
Chấn thương kỹ thuật số

Câu trả lời:


6

Bình dương, 39

J19VEK+.d0QW<.d0K)+*d=JhtS[Z39-+O5J2)\.

Lấy slàm dòng đầu tiên và nlà dòng thứ hai. Hoạt động trên dòng lệnh nhưng không phải với trình thông dịch trực tuyến. Chương trình Pyth đầu tiên của tôi từ trước đến giờ! Lời khuyên chơi golf được đánh giá cao.


Chào mừng đến với Pyth! Mẹo chơi gôn duy nhất tôi có thể thấy là bạn có thể sử dụng QEcho hai đầu vào thay vì hQeQ, nếu bạn mới tách dòng đầu vào.
isaacg

13

Matlab, 112

Ý tưởng cốt lõi là tạo ra một danh sách các vị trí tiếp theo có thể và sau đó thống nhất vẽ một trong số chúng. Nếu chúng ta ví dụ ở vị trí $ l = 1 $ thì các bước có thể sẽ là [-1,0,1,2,3]Tất nhiên nếu chúng ta chọn -1điều đó sẽ không hợp lệ và chúng ta sẽ phải ở cùng một vị trí. Đó là lý do tại sao chúng tôi thay thế các vị trí không hợp lệ bằng vị trí hiện tại [1,0,1,2,3]và sau đó chọn ngẫu nhiên một yếu tố từ danh sách cập nhật này.

OP yêu cầu chúng tôi vẽ chương trình, vì vậy chúng tôi đi đây:

nhập mô tả hình ảnh ở đây

Phiên âm:

function c(n,s);
l=19;                             %initialize position
for k=1:n;                          
    disp([ones(1,l)*32,'.']);     %print the line
    z=(-2:2)+l;                   %get vector of possible next steps (for l=1 we get [-1,0,1,2,3])
    z(z<0)=l;                     %prune invalids: here we just replace the the invalid positions with the current position
    z(z>39)=l;                    %   this ensures the same behaivour as staying in the same spot when going outside of the range
    l=z(randi(5));                %draw random sample of those
    pause(s);
end

1
-1 sử dụng MathJax trong môi trường không phải MathJax;)
Conor O'Brien

2
Oo Bạn biết đấy, các phương trình không được viết bằng latex hoàn toàn không đáng tin, thậm chí chúng có thể không đúng! Tốt hơn nên ở bên an toàn.
flawr

3
Các chương trình được vẽ nên được đo bằng khối lượng mực, thay vì byte ...
Darrel Hoffman

8

Perl, 136 128 116 106 101 90 86

$p=19;map{say$"x$p.".";sleep $ARGV[0];$x=rand(5)+$p-2;$p=$x>0&&$x<40?$x:$p}1..$ARGV[1]

Yêu cầu giây là một số nguyên.

Chạy với perl <filename> <second delay> <number of steps>.

Có thể có nhiều tiềm năng chơi gôn ở đây, mặc dù thành thật mà nói, tôi ngạc nhiên khi nó đã đi xa đến thế. (Thôi nào, chỉ còn 6 byte nữa để đánh bại câu trả lời bash ...)

Thay đổi

  • Đã lưu 8 byte bằng cách xóa các dấu ngoặc đơn không cần thiết và đánh vần ARGV (nó thực sự ngắn hơn theo cách đó)
  • Tiết kiệm được 12 byte bằng cách loại bỏ $s$nvà chỉ bằng cách sử dụng đơn giản $ARGV[0]$ARGV[1]
  • Đã lưu thêm 10 byte khi tôi nhận ra mình có thể sử dụng $"và không cần xác định cụ thể $u$undef.
  • Đã lưu thêm 5 byte bằng cách sắp xếp lại ternary và cách $xsử dụng và sử dụng mapthay vì for.
  • Đã lưu 11 byte bằng cách không còn chấp nhận giây dưới dạng số thập phân (thông số thách thức cho biết nó ổn.)
  • Đã lưu thêm 5 byte bằng cách sử dụng saythay vì print.

6

Python 2, 124 119 byte

@janrn và @Steve Eckert: Tôi không đủ uy tín để nhận xét câu trả lời của bạn nhưng về cơ bản đây là phiên bản của bạn được rút ngắn. Nhiệm vụ là vẽ một chương trình hoặc một hàm , vì vậy bằng cách sử dụng, f(s,x)bạn có thể tiết kiệm được một số bit, cũng như bạn có thể sử dụng max(0,min(x,39))để tránh một ifmệnh đề phụ . Có nó xuống:

import time,random as r
def f(s,x):
 n=19
 while x:print' '*n+'.';time.sleep(s);n=max(0,min(n+r.randint(-2,2),39));x-=1

5

Bash, 81

for((s=20;i++<$1;t=s,s+=RANDOM%5-2,s=s<0|s>39?t:s)){
printf %${s}s.\\n
sleep $2
}

Chỉnh sửa: Nếu bước đưa người đi bộ vượt ra ngoài phạm vi từ 1 đến 40 thì chỉ cần bỏ qua và vị trí của người đi bộ vẫn được xử lý chính xác.

Đầu vào từ các tùy chọn dòng lệnh. Ví dụ:

$ ./randwalk.sh 5 0.5
                    .
                     .
                    .
                  .
                 .
$ 

4

Ruby, 84

def w(s,n)q=19;n.times{puts ' '*q+'.';sleep s;q+=rand(5)-2;q=[[q,0].max,39].min};end

4

Con trăn 2.7, 198 162 143 133

import time,random as r;p=20;s=0;d=input();w=input()
while s<d:
 print' '*p+'.';s+=1;p=max(1,min(p+r.randint(-2,2),40));time.sleep(w)

Khi gọi tập lệnh với python script.py, đầu vào đầu tiên là số lượng bước, đầu vào thứ hai thời gian giữa các bước (chấp nhận float hoặc int). Bất kỳ đề xuất để cải thiện?

Chỉnh sửa

  • đã lưu 36 byte do hiện đang sử dụng print ' '*p+'.', nhờ @corsiKlause Ho Ho Ho
  • giảm 19 byte khác bằng cách xóa thụt lề tab, thay thế chúng bằng một khoảng trắng hoặc ;khi có thể
  • Giảm 10 byte nhờ ý tưởng @Bruce_Forte với p=max(1,min(p+r.randint(-2,2),40))(Tôi cũng không thể nhận xét về câu trả lời của bạn, nhưng cảm ơn; không muốn sao chép hoàn toàn)

Trong Python, bạn không thể ' '*plặp lại chuỗi sao?
corsiKa

Thật ra là có, không biết điều đó. Chỉnh sửa ngay bây giờ, cảm ơn
janrn

4

Chế biến, 150 147

void w(int n,int s){int x=20,i,y,c=0;for(;c<n;c++){x+=y=int(random(5)-2);if(x>40||x<0)x-=y;for(i=1;i<x;i++)print(" ");println(".");delay(s*1000);}}

Sử dụng:

void setup() {
    w(10,1);
}

Lưu ý: 1000không thể thay đổi thành 1e3vì lý do loại.


3

Lua, 140 byte

Lưu ý: Chương trình này yêu cầu gói LuaSocket.

require"socket"p=19 for i=1,arg[2]+0 do print((" "):rep(p)..".")p=p+math.random(-2,2)p=p<0 and 0 or p>39 and 39 or p socket.sleep(arg[1])end

3

Perl 6 , 92 byte

my (\n,\s)=@*ARGS;$/=19;for (-2..2).roll(n) {put ' 'x($/+=(40>$/+$_>=0??$_!!0)),'.';sleep s} # 92
my (\n,\s)=@*ARGS;
$/=19;
for (-2..2).roll(n) {
  put ' 'x($/+=(40>$/+$_>=0??$_!!0)),'.';
  sleep s
}

Sử dụng:

$ perl6 -e 'my (\n,\s)=@*ARGS;$/=19;for (-2..2).roll(n) {put " "x($/+=(40>$/+$_>=0??$_!!0)),".",;sleep s}' 10 0.001
                  .
                .
               .
              .
               .
                .
               .
                .
                  .
                 .

3

JavaScript (ES6), 125 byte

(s,n)=>(t=setTimeout)(c=`console.log(" ".repeat(p)+".");p+=m=Math.random()*5|0;p-=p>41|p<2?m:2;--i&&t(c,d)`,d=s*1e3,p=19,i=n)

Giải trình

(s,n)=>
  (t=setTimeout)(                     // set inital timeout
    c=`                               // c = code for timeout to execute
      console.log(" ".repeat(p)+"."); // print the current line
      p+=m=Math.random()*5|0;         // move walker 0 - 4 positions to the right
      p-=p>41|p<2?                    // if walker was moved out of bounds (2 - 41 instead
                                      //     of 0 - 39 because the random move of 0 - 4 to
                                      //     the right has not had the 2 subtracted yet)
        m:                            // undo the move
        2;                            // else subtract 2 to make the move -2 to 2
      --i&&t(c,d)                     // while we have steps remaining schedule next one
    `,
    d=s*1e3,                          // d = milliseconds to wait between steps
    p=19,                             // p = position of walker (0 indexed)
    i=n                               // i = steps remaining (needed to make n global)
  )

Kiểm tra


3

k4, 61 ký tự

f:{y{-1((y:1|40&y+-2+*1?5)#" "),".";."\\sleep ",$x;y}[x]\20;}

chạy mẫu:

  f[.1]30
                      .
                    .
                    .
                   .
                   .
                  .
                  .
                   .
                   .
                     .
                    .
                  .
                  .
                    .
                   .
                   .
                 .
                .
               .
               .
              .
            .
          .
         .
         .
          .
            .
              .
              .
                .

3

Toán học, 122 117 byte

$RecursionLimit=∞;If[#2>0,Print[Indent[a=Min[#3+RandomInteger@{-2,2},39]~Max~0],"."];Pause@#;#0[#,#2-1,a]]&[##,19]&

Hàm ẩn đệ quy, nhận đầu vào theo thứ tự được chỉ định. Có lẽ có thể được chơi golf hơn nữa.


2

Python 3, 154 byte

import time
from random import*
w=int(input())
z=int(input())
g=19
c=6
s=" "
while c:
    c-=1
    s+=s
while z:
    z-=1
    if -1<g<40:
        print(s[:g]+'.')
    time.sleep(w)
    g+=randint(-2,2)

Tạo một chuỗi các khoảng trắng lớn hơn độ dài yêu cầu tối đa, sau đó in chuỗi đó CHỈ lên char ở chỉ mục 'g', sau đó in một '.'. Kết thúc bằng cách tăng g theo một giá trị ngẫu nhiên trong phạm vi [-2: 2] và lặp lại.

Nếu bất cứ ai có thể giúp tôi đánh bại khối đầu vào khủng khiếp đó, tôi sẽ đánh giá cao nó.


Để golf đầu vào, tại sao không sử dụng sys.argv?
ASCIIThenANSI

1
Ngoài ra, thay vì while z:, tại sao không sử dụng for i in range(1,z)?
ASCIIThenANSI

Tôi tò mò, làm thế nào bạn biết rằng đây là 154 byte? byteizematters.com đưa ra một số đếm khác nhau (ngay cả khi bạn tắt tính năng đếm khoảng trắng)
p1xel

@ASCIIThenANSI: Hmm ... vào thời điểm tôi thêm vào cuộc gọi ban đầu sys.argvvà nhập, tôi không thể thấy làm thế nào tôi có thể lưu bất kỳ byte nào làm điều đó. Và ngay cả với các dòng bổ sung để khai báo csau đó giảm dần cz, vẫn còn rẻ hơn để làm theo cách này, theo tính của tôi.
Steve Eckert

@ p1xel: Tôi đã tính các khoảng trắng bên trong đường thẳng, chỉ không dẫn đầu hoặc theo dõi các khoảng trắng. Có một tiêu chuẩn chấm điểm khác nhau mà tôi không biết?
Steve Eckert

1

C funtion, 114

s=20,i,t;w(int n,float f){for(;i++<n;t=s,s+=rand()%5-2,s=s<0||s>39?t:s,usleep((int)(f*1e6)))printf("%*c.\n",s,0);}

Khá nhiều bản dịch trực tiếp câu trả lời bash của tôi .

Chương trình kiểm tra đầy đủ:

s=20,i,t;w(int n,float f){for(;i++<n;t=s,s+=rand()%5-2,s=s<0||s>39?t:s,usleep((int)(f*1e6)))printf("%*c.\n",s,0);}

int main (int argc, char **argv) {
  w(10, 0.2);
  return 0;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.