Создание карты падающего шара


16

Вступление

Для тех, кто никогда не слышал об этой игре раньше. Вы играете в мяч, который должен выжить как можно дольше. Это сделано, перемещаясь налево или направо, идя к отверстиям. Поскольку карта движется вверх, вам нужно идти вниз, чтобы выжить дольше. Если поиск изображений, вы , вероятно , знаете , какую игру я имею в виду.

Задание

Учитывая положительное целое число n , выведите карту падающего шара из n слоев. Между слоями есть 4 новых строки. Ширина слоя состоит из 25 символов подчеркивания с одним отверстием длиной 5. Это означает, что общая ширина равна 30. Это случайное смещение после каждого слоя. Пример допустимого слоя:

_______________     __________

Отверстие также может быть по краям, как будто слой похож на цилиндр:

  _________________________   

Обратите внимание, что есть 2 пробела и 3 пробела. Делаем одно отверстие шириной 5.

Контрольные примеры

Для n = 4 это правильный вывод:

_______________     __________





______     ___________________





_______________________     __





  _________________________

Примечание: отверстия должны быть равномерно распределены. Трейлинг и / или ведущие новые строки разрешены.

Это , поэтому выигрывает представление с наименьшим количеством байтов!


1
@ ДонМюсли Ха-ха, это может случиться с кем угодно: р
Аднан

Ответы:


7

Pyth, 19 байт

VQ.>+*\_25*d5O30*b4

Попробуй это здесь!

объяснение

VQ.> + * \ _ 25 * d5O30 * b4 # Q = ввод

VQ # повторить Q раз
     * \ _ 25 # 25 подчеркиваний
          * d5 # 5 пробелов
    + # кончать подчеркивания и пробелы
  .> O25 # повернуть эту строку 0-29 раз
                * b4 # печатать разделительные строки

4

Руби, 74 71 59

Спасибо Алексу А. за напоминание о том, что, в сущности, одна строка означает, что я могу использовать стабильную лямбду

f=->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}}

putsдобавляет новую строку в конец (в то время как Ruby printнет), поэтому она была обновлена ​​до 5новой строки.
Value Ink

Все приветствуют timesфункцию, позволяющую мне сэкономить 3 байта в forцикле: D
Value Ink

1
57 байт: ->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}} попробуйте здесь
Alex A.

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

1
Вы можете сделать (->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}})[input]или просто указать, что вам нужно назначить его для вызова. Это довольно часто встречается на сайте.
Алекс А.

3

Юлия, 72 байта

n->join([join(circshift(["_"^25*" "^5...],rand(1:30)))"\n"^5 for i=1:n])

Это анонимная функция, которая принимает целое число и возвращает строку. Чтобы вызвать его, присвойте его переменной.

Мы создаем строку из 25 знаков подчеркивания, за которой следуют 5 пробелов, а затем разбиваем ее на массив символов. Мы циклически сдвигаем его случайное количество раз (от 1 до 30), соединяем его обратно в строку и добавляем 5 новых строк. Этот процесс повторяется n раз, где n - вход. Полученный массив соединяется и возвращается.

Попробуй здесь


3

PowerShell 65 байт

0..$args[0]|%{-join("_"*25+" "*5)[($r=Random 25)..($r-29)];,""*5}

Запустите цикл для n итераций. Получить случайное число и сделать строку подчеркивания с 5 пробелами в конце. Индексируйте строку как массив для извлечения, начиная со случайного места. Отрицательная индексация оборачивается с конца. Присоединитесь к этому снова и добавьте 5 новых строк.

Изменить: я не знаю, почему я думал, что мне нужен параметр, -Maximumпоскольку он позиционный. Благодаря TimmyD я побрил несколько байтов и забыл получить информацию, что привело меня к 65- летию .


@TimmyD Я был бы удивлен, если бы у кого-нибудь еще был 1.0 Он был доступен только для загрузки и не поставлялся с какой-либо ОС. 2.0 следует считать нормой.
Мэтт

@TimmyD Я согласен с этим, но не в том, что касается PowerShell 1.0 . Если кто-то использует этот сайт, это удивит меня. Если бы я использовал 3.0 или выше, я бы выделил это наверняка.
Мэтт


2

SpecBAS - 93 байта

1 a$="_"*25+" "*5: INPUT n: FOR i=1 TO n: r=1+INT(RND*30): ?a$(r TO)+a$( TO r-1)''''': NEXT i

Делает строку из 25 подчеркиваний + 5 пробелов, выбирает случайную начальную точку и склеивает строку в этой позиции и привязывает начало строки к концу.

Апостроф вызывает новую строку, поэтому 1 в конце строки и 4 пустых строки.


2

MATL , 23 байта

:"95l25X"5Z"h30YrYS10ct

Попробуйте онлайн!

объяснение

:"           % take input n implicitly. Repeat loop n times
  95l25X"    %   row vector with number 95 ('_') repeated 25 times
  5Z"        %   row vector of 5 blank spaces
  h          %   concatenate vertically
  30Yr       %   random number uniformly distributed on [1,2,...,30]
  YS         %   circularly shift
  10c        %   newline character. Includes another newline when printed
  t          %   duplicate
             % implicitly end loop and display stack contents

2

Java, 177 140 байт

-1 байт для Blue, перемещающего i ++

-2 байта для меня, оставляя бессмысленные пробелы в оригинале

-34 байта синему, чтобы понять, что мне вообще не нужен символ []

Потому что, вы знаете, Java.

n->{String s="";for(;n-->0;){int r=(int)(Math.random()*30);for(int i=0;i<30;){s+=i>r&i<r+6|r>24&i++<=r%25?" ":"_";}s+="\n\n\n\n";}return s;}

Слегка разгульный

Function<Integer, String> fallingBall = n -> {
    String s = "";
    for (;n-->0;) {
        int r = (int)(Math.random()*30);
        for (int i=0; i<30; i++) {
            s += i>r&i<r+6|r>24&i<=r%25?" ":"_";
        }
        s += "\n\n\n\n";
    }
    return s;
}

Поскольку в Java нет строкового «поворота», мне пришлось использовать другой подход. Я сгенерировал случайное целое число 0-29, которое представляет начальный индекс отверстия (OBO, потому что >короче >=). Каждый отдельный персонаж определяется логикой

l[index] = (index>random && index<random+6) || (random>24 && index<=random%25) ? ' ' : '_';

Это обрабатывает "оборачивающую" природу целого.


Поместив i ++ на последнее место, которое я использовал, вы можете сохранить байт.
Blue

Умный. Хак, но умный. Еще умнее я как-то оставляю бессмысленные пробелы в начале моего фрагмента ( s = ""). Оба исправлены сейчас.
CAD97

Вы также можете сэкономить больше, избавившись от массива char, заменив литералы char на строковые литералы, и используйте s + = во внутренней части цикла for. Я только что проверил
Blue

Кстати, отличный ответ
Blue

Вот что я получаю за то, что фокусируюсь на одном способе сделать это. -34 (!) Байта.
CAD97

1

Python 3,5 - 109 113 байтов (+4 для вывода 4 новых строк между каждым результатом):

def g(a,j='_'*25+' '*5):
 for l in range(a):import random;n=random.randrange(len(j)+1);print(j[-n:]+j[:-n]+'\r'*4)

Негольфированная форма:

# j is the starting string with the 25 underscores and then 5 spaces at the end
def g(a,j='_'*25+' '*5):
    import random #Import the random module
    for l in range(a): # Do the following as many times as provided by the user
        n=random.randrange(len(j)+1) Get a random number in the range 0-29
        print(j[-n:]+j[:-n]+'\r'*4) #Shift the string characters right "n" times and print out the results with 4 new lines in between

В основном происходит то, что в качестве аргумента функции «g» указана строка «j», состоящая из 25 символов подчеркивания и 5 пробелов. Затем случайный модуль импортируется, и столько раз, сколько указано пользователем, в диапазоне выбирается случайное число 0 => 29, и строка «j» смещается вправо столько раз. Затем результат распечатывается после каждой итерации, с 4 новыми строками между каждым результатом.


Это также печатает новые строки между?
Аднан

@AandN Теперь так и есть. :)
Р. Кап

Вам на самом деле нужно напечатать 4 строки: с. Так что переход '\r'на, '\r'*4вероятно, должен работать. Кроме того, я думаю, что вы можете изменить range(a+1)на range(a).
Аднан

@AandN На самом деле, использование на range(a)самом деле печатает a-1количество строк, так range(a+1)что это лучший способ распечатать точное количество строк, предоставленных пользователем. Кроме того, теперь он печатает 4 новые строки между каждым результатом.
Р. Кап

Хм, это странно, потому что я проверил это, g(5)и он печатает 6 строк вместо пяти, поэтому изменение a+1на a, вероятно, исправит это.
Аднан

1

Питон, 119 103 байта

import random
s='_'*20+' '*5
def f(n,a=random.randint(0,25)):[print(s[a:]+s[:a]+3*'\n')for _ in' '*n]

Ваше последнее обновление не работает, потому что вы указали случайное значение в качестве аргумента по умолчанию, поэтому функция всегда будет выводить одно и то же nвремя строки
Sp3000
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.