Принтер ходового принтера


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

Так, я уточнив це, дякую.
Мутадор

Я думаю, ви повинні сказати, що діапазон є 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, якщо ви переведете новий рядок, введені дані.
isaacg

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

1
-1 використовує MathJax у не-MathJax середовищі;)
Conor O'Brien

2
Оо Ви знаєте, рівняння, які не записуються в латексе, просто не такі надійні, вони можуть бути навіть неправдивими! Краще бути на безпечній стороні.
недолік

3
Намальовані програми слід вимірювати в обсязі чорнила, а не в байтах ...
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]

Потрібні секунди, щоб бути цілим числом.

Бігайте з perl <filename> <second delay> <number of steps>.

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

Зміни

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

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

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

Насправді так, не знав цього. Редагування зараз, спасибі
січень

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

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

k4, 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]&

Рекурсивна анонімна функція, приймає введення у визначеному порядку. Можливо, можна було б пограти в гольф далі.


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

C функція, 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.