रैंडम वॉकर प्रिंटर


24

एक प्रोग्राम या फ़ंक्शन ड्रा करें जो STDOUT nएक स्ट्रिंग के लिए बार (प्रत्येक एक चरण के लिए) लिखेगा जिसमें .वॉकर के स्थान पर एक डॉट होता है । कार्यक्रम को प्रत्येक sसेकंड (या sप्रत्येक पंक्ति के बाद प्रतीक्षा सेकंड) एक पंक्ति लिखने की भी आवश्यकता है ।

एक यादृच्छिक चलना एक पथ का गणितीय औपचारिककरण है जिसमें यादृच्छिक चरणों ( विकी ) का उत्तराधिकार होता है , जैसे कि हर नया कदम अंतिम चरण प्लस एक नया मूल्य होगा, इसलिए कोई भी 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

हाँ, मैंने स्पष्ट किया है कि, धन्यवाद।
मुताडोर

मुझे लगता है कि आपको कहना चाहिए कि सीमा है 1 to 40, क्योंकि रिक्त स्थान की संख्या हमेशा होती है position-1
जियोकॉवेल

@geokavel जो बेहतर, निश्चित लगता है!
मटादोर

10
एक कार्यक्रम बनाएं ??? ;-)
डिजिटल ट्रॉमा

जवाबों:


6

अजगर, ३ ९

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

sइनपुट की पहली पंक्ति के nरूप में और दूसरी के रूप में लेता है । कमांड लाइन पर काम करता है लेकिन ऑनलाइन दुभाषिया के साथ नहीं। मेरा पहला पायथ कार्यक्रम! गोल्फ युक्तियाँ की सराहना की है।


Pyth में आपका स्वागत है! केवल गोल्फ टिप मैं देख सकता है कि आप उपयोग कर सकते हैं Qऔर Eबजाय के लिए दो आदानों के लिए hQऔर eQ, अगर आप आदानों अलग न्यू लाइन।
इसहाक

13

मटलब, ११२

मुख्य विचार संभावित अगले पदों की सूची तैयार कर रहा है और फिर उनमें से एक को समान रूप से चित्रित कर रहा है। यदि हम उदाहरण के लिए $ l = 1 $ पर हैं तो संभव कदम [-1,0,1,2,3]निश्चित रूप से होगा यदि हमने चुना -1कि यह अमान्य होगा और हमें उसी स्थिति में रहना होगा। यही कारण है कि हम अमान्य स्थितियों को वर्तमान स्थिति से बदल देते हैं [1,0,1,2,3], और फिर इस अद्यतन सूची से एक तत्व को यादृच्छिक रूप से चुनते हैं।

ओपी ने हमसे पूछा कि कार्यक्रम को ड्रा करें, इसलिए यहां हम जाते हैं:

यहाँ छवि विवरण दर्ज करें

प्रतिलेखन:

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 मैथजैक्स का उपयोग एक गैर-मैथजैक्स वातावरण में करता है;)
कॉनर ओ'ब्रायन

2
ओओ आप जानते हैं, लेटेक्स में जो समीकरण नहीं लिखे गए हैं, वे उतने विश्वसनीय नहीं हैं, वे सच भी नहीं हो सकते हैं! सुरक्षित पक्ष पर बेहतर होना चाहिए।
दोष

3
ड्रॉ प्रोग्राम को बाइट्स के बजाय स्याही की मात्रा में मापा जाना चाहिए ...
डारेल हॉफमैन

8

पर्ल, 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>

यहां अधिक गोल्फिंग क्षमता हो सकती है, हालांकि ईमानदारी से, मुझे आश्चर्य है कि इसे यह मिल गया है। (आइए, बैश जवाब को मात देने के लिए केवल 6 और बाइट्स ...)

परिवर्तन

  • अस्वस्थ कोष्ठकों को हटाकर और ARGV की वर्तनी को हटाकर 8 बाइट्स (यह वास्तव में इस तरह छोटा है)
  • को हटाने के द्वारा 12 और बाइट्स सहेजा $sऔर $nऔर सिर्फ सादा का उपयोग कर $ARGV[0]और$ARGV[1]
  • एक और 10 बाइट्स सहेजा जब मैं मैं इस्तेमाल कर सकते हैं एहसास हुआ $"और विशेष रूप से परिभाषित करने की आवश्यकता नहीं किया था $uके रूप में $undef
  • 5 अधिक बाइट्स को टर्नरी को पुन: व्यवस्थित करके सहेजा $xजाता है और इसका उपयोग कैसे किया जाता है और mapइसके बजाय कैसे उपयोग किया जाता है for
  • अब सेकंड्स को दशमलव के रूप में स्वीकार नहीं करने से 11 बाइट्स बचती हैं (चुनौती की कल्पना कहती है कि यह ठीक है।)
  • के sayबजाय का उपयोग करके एक और 5 बाइट्स बचाता है print

6

अजगर 2, 124 119 बाइट्स

@janrn और @Steve एकर्ट: मेरे पास आपके जवाब पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, लेकिन यहां अनिवार्य रूप से आपका संस्करण छोटा हो गया है। कार्य एक प्रोग्राम या फ़ंक्शन को आकर्षित करना है , इसलिए उपयोग करके 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

बैश, 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

रूबी, ,४

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

4

पायथन 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, पहला इनपुट चरणों की मात्रा है, दूसरा इनपुट चरणों के बीच का समय (फ्लोट या इंट स्वीकार करता है)। सुधार के लिए कोई सुझाव?

संपादित करता

  • अब का उपयोग करने के कारण 36 बाइट्स को बचाया print ' '*p+'.', @corsiKlause हो हो हो के लिए धन्यवाद
  • टैब इंडेंट्स को हटाकर एक और 19 बाइट्स नीचे, उन्हें एक जगह या ;जहां संभव हो , बदल दिया
  • 10 बाइट्स @Bruce_Forte विचार के साथ कम धन्यवाद p=max(1,min(p+r.randint(-2,2),40))(मैं आपके उत्तर पर भी टिप्पणी नहीं कर सकता, लेकिन धन्यवाद; इसे पूरी तरह से कॉपी नहीं करना चाहते)

पायथन में, आप सिर्फ ' '*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

लुआ, 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

पर्ल 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

जावास्क्रिप्ट (ईएस 6), 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

गणितज्ञ, 122 117 बाइट्स

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

पुनरावर्ती अनाम फ़ंक्शन, निर्दिष्ट क्रम में इनपुट लेता है। शायद आगे गोल्फ हो सकता है।


2

पायथन 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' पर चार तक प्रिंट करें, फिर एक '' प्रिंट करें। श्रेणी [-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, यह अभी भी यह इस तरह से करने के लिए, मेरी गिनती से सस्ता है।
स्टीव एकर्ट

@ p1xel: मैंने व्हॉट्सएप को लाइन में आंतरिक रूप से गिना, सिर्फ व्हाट्सएप का नेतृत्व या अनुगमन नहीं किया। क्या कोई अलग स्कोरिंग मानक है जिससे मैं अनजान हूँ?
स्टीव एकर्ट

1

सी फन, 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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.