Створення карти падаючої кулі


16

Вступ

Для тих, хто раніше ніколи не чув про цю гру. Ви граєте в м'яч, якому потрібно вижити якомога довше. Це робиться, рухаючись вліво або вправо, переходячи до отворів. Оскільки карта рухається вгору, вам потрібно довше вижити. Якщо ви шукаєте зображення, ви, мабуть, знаєте, про яку гру я маю на увазі.

Завдання

Давши додатне ціле число n , виведіть падаючу карту кулі з n шарів. Між шарами є 4 нові рядки. Ширина шару складається з 25 символів підкреслення, з одним отвором довжиною 5. Це означає, що загальна ширина дорівнює 30. Це випадково зміщується після кожного шару. Приклад допустимого шару:

_______________     __________

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

  _________________________   

Зауважте, що є 2 провідні проміжки та 3 проміжки. Зробити єдиний отвір шириною 5.

Тестові справи

Для n = 4 це дійсний вихід:

_______________     __________





______     ___________________





_______________________     __





  _________________________

Примітка: отвори повинні бути рівномірно розподілені. Дозволені трейлінг та / або ведучі нових рядків.

Це , тому подання з найменшою кількістю байтів виграє!


1
@DonMuesli Ха-ха, це може трапитися з ким завгодно: p
Аднан

Відповіді:


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рядків.
Значення чорнила

Усі вітають timesфункцію, щоб зберегти 3 байти через forцикл: D
значення чорнила

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

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

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}

Запустіть цикл для п ітерацій. Отримайте випадкове число і складіть рядок підкреслення з 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 байт до синього, переміщуючи i ++

-2 байти для мене, залишаючи безглузді пробіли в оригіналі

-34 байт до Blue для того, щоб зрозуміти, що мені зовсім не потрібен char []

Тому що, знаєте, Ява.

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 немає рядка "обертатися", мені довелося застосувати інший підхід. Я створив випадковий int 0-29, який представляє початковий індекс отвору (OBO тому >, що коротший >=). Кожен окремий персонаж визначається логікою

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

Це справляється з "обгортковою" природою цілого.


Поставивши i ++ останнє місце, яке я використовую, ви можете зберегти байт.
Синій

Розумний. Хаккі, але розумні. Розумніша все-таки я якось залишає безглузді пробіли на початку мого фрагмента ( s = ""). Обидва виправлені зараз.
CAD97

Ви також можете зберегти купу ще більше, позбувшись масиву char, змінивши літералі char на строкові літерали та використовуючи s + = всередині для циклу. Я щойно тестував це
Blue

Btw чудова відповідь
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

В основному те, що відбувається, полягає в тому, що рядок 'j', що складається з 25 підкреслень, а потім 5 пробілів, задається як аргумент функції "g". Потім, імпортується випадковий модуль, і стільки разів, скільки вказано користувачем, в діапазоні вибирається випадкове число 0 => 29, а рядок "j" зміщується вправо стільки разів. Потім результат друкується після кожної ітерації, по 4 нові рядки між кожним результатом.


Це також друкує нові рядки між ними?
Аднан

@AandN Тепер так і є. :)
Р. Кап

Насправді потрібно надрукувати 4 нові рядки: p. Тож перехід '\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.