เครื่องพิมพ์วอล์คเกอร์แบบสุ่ม


24

วาดโปรแกรมหรือฟังก์ชั่นที่จะเขียนถึงSTDOUT nเวลา (แต่ละขั้นตอนสำหรับหนึ่งขั้น) สตริงที่มีจุด.ที่ตำแหน่งของวอล์คเกอร์ โปรแกรมจำเป็นต้องเขียนบรรทัดทุก ๆsวินาที (หรือรอsวินาทีหลังจากแต่ละบรรทัด)

การเดินแบบสุ่มเป็นการทำแบบแผนทางคณิตศาสตร์ของเส้นทางที่ประกอบด้วยการต่อเนื่องของขั้นตอนแบบสุ่ม ( wiki ) ดังนั้นทุกขั้นตอนใหม่จะเป็นขั้นตอนสุดท้ายบวกกับค่าใหม่ดังนั้นtค่าขั้นตอนใด ๆ จึงเป็นเพียงผลรวมของค่าสุ่มทั้งหมด ก่อน ir บวกค่าเริ่มต้น

โปรแกรมควรใช้ 2 อินพุตและจะใช้ช่องว่าง" "และจุด"."บนเอาต์พุตเท่านั้น ค่าเริ่มต้นของวอล์คเกอร์จะเป็น20เช่นนั้นผลลัพธ์ควรเป็นจุดหลัง 19 ช่องว่าง

                  . #19 spaces then a dot

ทุกขั้นตอนใหม่มูลค่าจะเป็นมูลค่าสุดท้ายของวอล์คเกอร์บวกหนึ่งในนั้น[-2-1,0,1,2](โอกาส 20% ในแต่ละครั้ง) หลังจากตำแหน่งใหม่ถูกพิมพ์โปรแกรมควรรอsวินาทีและไปที่ขั้นตอนถัดไป หากขั้นตอนนี้ใช้วอล์คเกอร์นอกช่วงที่1 to 40ควรจะถูกละเว้นและตำแหน่งวอล์คเกอร์ยังคงเหมือนเดิม จำนวนช่องว่างจะเป็นตัวเลขตั้งแต่ 0 ถึง 39 เสมอ

ตัวอย่าง

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

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

การพิจารณา

  • คุณสามารถนำเข้าเป็นรูปแบบที่เหมาะสม

  • รหัสที่สั้นที่สุดชนะ

  • ไม่เป็นไรถ้าโปรแกรมของคุณยอมรับจำนวนวินาทีเป็นจำนวนเต็มเท่านั้น


2
ฉันถือว่าnเป็นจำนวนขั้นตอนหรือไม่
ASCIIThenANSI

ใช่ฉันชี้แจงว่าขอบคุณ
Mutador

ฉันคิดว่าคุณควรจะพูดว่าช่วงนี้เป็นเพราะจำนวนของช่องว่างอยู่เสมอ1 to 40 position-1
geokavel

@geokavel ที่ดูเหมือนว่าดีกว่าคงที่!
Mutador

10
วาดโปรแกรม ??? ;-)
Digital Trauma

คำตอบ:


6

Pyth, 39

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

ใช้sเป็นบรรทัดแรกของอินพุตและnเป็นบรรทัดที่สอง ใช้งานได้บนบรรทัดคำสั่ง แต่ไม่ใช้ล่ามออนไลน์ โปรแกรม Pyth ครั้งแรกของฉัน! เคล็ดลับการเล่นกอล์ฟได้รับการชื่นชม


ยินดีต้อนรับสู่ Pyth! เคล็ดลับการเล่นกอล์ฟเดียวที่ฉันเห็นคือคุณสามารถใช้QและEสำหรับสองอินพุตแทนสำหรับhQและeQถ้าคุณขึ้นบรรทัดใหม่แยกอินพุต
isaacg

13

Matlab, 112

แนวคิดหลักคือการสร้างรายการของตำแหน่งต่อไปที่เป็นไปได้แล้ววาดหนึ่งในนั้น หากเราอยู่ที่ตำแหน่ง $ l = 1 $ ขั้นตอนที่เป็นไปได้[-1,0,1,2,3]แน่นอนถ้าเราเลือก-1ที่จะไม่ถูกต้องและเราจะต้องอยู่ในตำแหน่งเดียวกัน นั่นคือเหตุผลที่เราแทนที่ตำแหน่งที่ไม่ถูกต้องด้วยตำแหน่งปัจจุบัน[1,0,1,2,3]และจากนั้นเลือกองค์ประกอบจากรายการที่อัปเดตนี้แบบสุ่ม

OP ขอให้เราวาดรายการดังนั้นที่นี่เราไป:

ป้อนคำอธิบายรูปภาพที่นี่

การถอดความ:

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 ใช้ MathJax ในสภาพแวดล้อมที่ไม่ใช่ MathJax;)
Conor O'Brien

2
Oo คุณรู้ไหมว่าสมการที่ไม่เขียนด้วยลาเท็กซ์นั้นไม่น่าเชื่อถือเท่าที่ควรพวกเขาอาจจะไม่จริงก็ได้! ดีกว่าไปทางด้านความปลอดภัย
ข้อบกพร่อง

3
โปรแกรมวาดควรจะวัดปริมาณของหมึกมากกว่าไบต์ ...
Darrel ฮอฟแมน

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]

ต้องการวินาทีเป็นจำนวนเต็ม

perl <filename> <second delay> <number of steps>ทำงานด้วย

อาจมีความเป็นไปได้ในการเล่นกอล์ฟมากขึ้นที่นี่ถึงแม้ว่าจริงๆแล้วฉันรู้สึกประหลาดใจที่ได้รับสิ่งนี้ (Come on, มีเพียง 6 ไบต์เท่านั้นที่จะเอาชนะคำตอบ bash ... )

การเปลี่ยนแปลง

  • บันทึก 8 ไบต์ด้วยการลบวงเล็บที่ไม่จำเป็นและสะกด ARGV (สั้นกว่าจริง ๆ )
  • ที่บันทึกไว้ 12 ไบต์มากขึ้นโดยการลบ$sและ$nและเพียงแค่ใช้ธรรมดา$ARGV[0]และ$ARGV[1]
  • บันทึกอีก 10 ไบต์เมื่อฉันรู้ว่าฉันสามารถใช้งานได้$"และไม่จำเป็นต้องกำหนด$uเป็น$undefพิเศษ
  • ที่บันทึกไว้ 5 ไบต์มากขึ้นโดยการจัดเรียง ternary และวิธีการที่$xจะใช้และโดยใช้แทนmapfor
  • บันทึก 11 ไบต์โดยไม่ยอมรับวินาทีเป็นทศนิยมอีกต่อไป (สเป็คความท้าทายบอกว่าไม่เป็นไร)
  • ที่บันทึกไว้อีก 5 ไบต์โดยใช้แทนsayprint

6

Python 2, 124 119 ไบต์

@janrn และ @Steve Eckert: ฉันไม่มีชื่อเสียงพอที่จะให้ความเห็นคำตอบของคุณ แต่นี่เป็นเวอร์ชั่นที่สั้นลง ภารกิจคือการวาดโปรแกรมหรือฟังก์ชั่นดังนั้นโดยใช้f(s,x)คุณสามารถบันทึกได้บ้างเช่นกันคุณสามารถใช้max(0,min(x,39))เพื่อหลีกเลี่ยงifข้อเพิ่มเติม รับลงไปที่:

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
}

แก้ไข: หากขั้นตอนใช้วอล์คเกอร์นอกช่วงที่ 1 ถึง 40 ควรจะละเว้นเพียงแค่และตำแหน่งวอล์คเกอร์ยังคงจัดการเหมือนเดิมอย่างถูกต้อง

อินพุตจากตัวเลือกบรรทัดคำสั่ง เช่น:

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


4

Python 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)

เมื่อเรียกสคริปต์ด้วยpython script.pyอินพุตแรกคือจำนวนของขั้นตอนที่สองป้อนเวลาระหว่างขั้นตอน (ยอมรับ float หรือ int) ข้อเสนอแนะสำหรับการปรับปรุง?

การแก้ไข

  • บันทึก 36 ไบต์เนื่องจากใช้แล้วในตอนนี้print ' '*p+'.'ขอบคุณ @corsiKlause Ho Ho Ho
  • ลงอีก 19 ไบต์โดยการเอาเยื้องแท็บแทนที่ด้วยพื้นที่หนึ่งหรือ;ที่เป็นไปได้
  • น้อยกว่า 10 ไบต์ด้วยความคิด @Bruce_Forte ด้วยp=max(1,min(p+r.randint(-2,2),40))(ฉันไม่สามารถแสดงความคิดเห็นในคำตอบของคุณได้เช่นกัน แต่ขอบคุณ; ไม่ต้องการคัดลอกทั้งหมด)

ใน Python คุณไม่สามารถไป' '*pทำซ้ำสตริงได้หรือไม่
corsiKa

จริงๆแล้วใช่ไม่รู้ด้วยซ้ำ การแก้ไขตอนนี้ขอบคุณ
janrn

4

การประมวลผล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);}}

การใช้งาน:

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

หมายเหตุ: 1000ไม่สามารถเปลี่ยนเป็น1e3สำหรับเหตุผลประเภท


3

Lua, 140 ไบต์

หมายเหตุ: โปรแกรมนี้ต้องการแพ็คเกจ 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 ไบต์

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
}

การใช้งาน:

$ 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 ไบต์

(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)

คำอธิบาย

(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)
  )

ทดสอบ



3

Mathematica, 122 117 ไบต์

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

ฟังก์ชั่นที่ไม่ระบุชื่อแบบเรียกซ้ำรับอินพุตตามลำดับที่ระบุ อาจจะเล่นกอล์ฟต่อไป


2

Python 3, 154 ไบต์

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)

สร้างสตริงของช่องว่างมากกว่าความยาวสูงสุดที่ต้องการจากนั้นพิมพ์สตริงนั้นจนถึงถ่านที่ดัชนี 'g' จากนั้นพิมพ์ '.' สิ้นสุดโดยการเพิ่ม g ด้วยค่าสุ่มในช่วง [-2: 2] และทำซ้ำ

หากใครสามารถช่วยฉันลงสนามบล็อกที่น่ากลัวฉันจะขอบคุณมัน


หากต้องการตีกอล์ฟทำไมไม่ใช้sys.argv?
ASCIIThenANSI

1
นอกจากนี้แทนwhile z:ทำไมไม่ใช้for i in range(1,z)?
ASCIIThenANSI

ฉันอยากรู้ว่าคุณรู้ได้อย่างไรว่านี่เป็น 154 ไบต์? bytesizematters.comให้การนับที่แตกต่างกัน (แม้ว่าคุณจะปิดการใช้งานการนับช่องว่าง)
p1xel

@ ASCIIThenANSI: อืม ... ตามเวลาที่ฉันเพิ่มในการโทรเริ่มต้นsys.argvและการนำเข้าฉันไม่เห็นวิธีที่ฉันสามารถบันทึกไบต์ใด ๆ ที่ทำเช่นนั้น และถึงแม้จะมีเส้นพิเศษเพื่อประกาศcลดลงcและzก็ยังถูกกว่าที่จะทำแบบนี้โดยการนับของฉัน
Steve Eckert

@ p1xel: ฉันนับ whitespaces ภายในบรรทัดไม่เพียงแค่นำหน้าหรือต่อท้าย whitespaces มีมาตรฐานการให้คะแนนที่แตกต่างจากที่ฉันไม่รู้หรือไม่
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);}

การแปลโดยตรงจากคำตอบของฉันค่อนข้างสวย

โปรแกรมทดสอบเต็มรูปแบบ:

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.