Случайный Уокер Принтер

24

Нарисуйте программу или функцию, которая будет записывать в STDOUT nраз (каждый за один шаг) строку, содержащую точку .в месте нахождения ходунка. Программа также должна записывать строку каждые sсекунды (или ждать sсекунды после каждой строки).

Случайное блуждание - это математическая формализация пути, который состоит из последовательности случайных шагов ( вики ), так что каждый новый шаг будет последним шагом плюс новое значение, поэтому любое tзначение шага является просто суммой всех случайных значений перед ИК плюс начальное значение.

Программа должна принимать 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
                     .
                    .
                      .
                        .
                          .
                           .
                            .
                          .
                         .
                          .
                           .
                            .
                           .
                          .
                           .
                           .
                         .
                         .
                          .
                            .
                           .
                          .
                           .
                           .
                           .
                         .
                          .
                         .
                          .
                          .

Соображения

  • Вы можете принять вход как любой разумный формат

  • Самый короткий код выигрывает

  • Это нормально, если ваша программа принимает только секунды как целые числа

Mutador
источник
2
Я полагаю, nэто количество шагов?
ASCIIThenANSI
Да, я уточнил это, спасибо.
Мутадор
Я думаю, что вы должны сказать, что диапазон есть 1 to 40, потому что количество пробелов всегда position-1.
геокавель
@geokavel, который кажется лучше, исправлено!
Мутадор
10
Нарисовать программу ??? ;-)
Цифровая травма

Ответы:

6

Пиф, 39

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

Принимает sв качестве первой строки ввода и nв качестве второй. Работает в командной строке, но не с онлайн-переводчиком. Моя первая программа Pyth! Гольф советы приветствуются.

Люк
источник
Добро пожаловать в Pyth! Единственный совет по игре в гольф, который я вижу, это то, что вы можете использовать Qи Eдля двух входов вместо fo hQи eQ, если вы переводите строки, разделять входы.
Исаак
13

Матлаб, 112

Основная идея состоит в том, чтобы создать список возможных следующих позиций и затем равномерно нарисовать одну из них. Если мы, например, находимся в позиции $ 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
flawr
источник
1
-1 использует MathJax в среде, не относящейся к MathJax;)
Конор О'Брайен,
2
Оо Вы знаете, уравнения, которые не написаны в латексе, просто не настолько надежны, они могут даже быть неверными! Лучше быть на безопасной стороне.
Flawr
3
Рисованные программы должны измеряться объемом чернил, а не байтов ...
Даррел Хоффман
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>.

Здесь может быть больше возможностей для игры в гольф, хотя, честно говоря, я удивлен, что зашел так далеко. (Давай, только 6 байт, чтобы побить ответ bash ...)

изменения

  • Сэкономили 8 байт, убрав ненужные скобки и расшифровав ARGV (на самом деле это короче)
  • Сохранено еще 12 байтов, удалив $sи $nи просто используя простые $ARGV[0]и$ARGV[1]
  • Сохранено еще 10 байтов, когда я понял, что могу использовать, $"и не нужно специально определять $uкак $undef.
  • Сохранено еще 5 байтов, переставляя троичный и как $xиспользуется и используя mapвместо for.
  • Сохранено 11 байтов за счет того, что они больше не принимают секунды как десятичные дроби (в спецификации испытаний сказано, что все в порядке).
  • Сохранено еще 5 байтов, используя sayвместо print.
ASCIIThenANSI
источник
6

Питон 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

Баш, 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

Руби, 84

def w(s,n)q=19;n.times{puts ' '*q+'.';sleep s;q+=rand(5)-2;q=[[q,0].max,39].min};end
gryzelda
источник
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))(я не могу также прокомментировать ваш ответ, но спасибо; не хочу копировать его полностью)
janrn
источник
В 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типу.

geokavel
источник
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
Nikolai97
источник
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
                  .
                .
               .
              .
               .
                .
               .
                .
                  .
                 .
Брэд Гилберт b2gills
источник
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)
  )

Тест

user81655
источник
3

к4, 61 знак

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

образец прогона:

  f[.1]30
                      .
                    .
                    .
                   .
                   .
                  .
                  .
                   .
                   .
                     .
                    .
                  .
                  .
                    .
                   .
                   .
                 .
                .
               .
               .
              .
            .
          .
         .
         .
          .
            .
              .
              .
                .
Аарон Дэвис
источник
3

Математика, 122 117 байт

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

Рекурсивная анонимная функция, принимает данные в указанном порядке. Возможно, будет дальше в гольф.

LegionMammal978
источник
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, по моим подсчетам, все еще дешевле сделать это таким образом.
Стив Экерт
@ 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);}

Практически прямой перевод моего ответа Bash .

Полная тестовая программа:

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;
}
Цифровая травма
источник