Tworzenie mapy spadającej piłki

16

Wprowadzenie

Dla tych, którzy nigdy wcześniej nie słyszeli o tej grze. Grasz piłką, która musi przetrwać tak długo, jak to możliwe. Odbywa się to poprzez przesunięcie w lewo lub w prawo, przejście do dziur. Ponieważ mapa porusza się w górę, musisz zejść w dół, aby przeżyć dłużej. Jeśli szukać dla obrazów, pewnie wiecie, który gra mi chodzi.

Zadanie

Biorąc pod uwagę dodatnią liczbę całkowitą n , wyprowadza spadającą mapę kuli n warstw. Pomiędzy warstwami znajdują się 4 nowe linie. Szerokość warstwy składa się z 25 znaków podkreślenia, z jednym otworem o długości 5. Oznacza to, że całkowita szerokość jest równa 30. Jest to losowo przesuwane po każdej warstwie. Przykład prawidłowej warstwy to:

_______________     __________

Otwór może znajdować się również na krawędziach, tak jakby warstwa była jak walec:

  _________________________   

Pamiętaj, że są 2 wiodące spacje i 3 końcowe spacje. Wykonanie pojedynczego otworu o szerokości 5.

Przypadki testowe

Dla n = 4 jest to poprawny wynik:

_______________     __________





______     ___________________





_______________________     __





  _________________________

Uwaga: otwory muszą być równomiernie rozmieszczone. Dozwolone są końcowe i / lub wiodące znaki nowej linii.

To jest , więc wygrywanie z najmniejszą ilością bajtów wygrywa!

Adnan
źródło
1
@DonMuesli Haha, które mogą przytrafić się każdemu: p
Adnan

Odpowiedzi:

7

Pyth, 19 bajtów

VQ.>+*\_25*d5O30*b4

Wypróbuj tutaj!

Wyjaśnienie

VQ.> + * \ _ 25 * d5O30 * b4 # Q = wejście

VQ # Powtórz Q razy
     * \ _ 25 # 25 podkreśla
          * d5 # 5 spacji
    + # konkatuj podkreślenia i spacje
  .> O25 # obróć ten łańcuch 0-29 razy
                * b4 # wydrukuj oddzielne znaki nowej linii
Denker
źródło
4

Ruby, 74 71 59

Podziękowania dla Alexa A. za przypomnienie mi, że bycie w zasadzie jedną linią oznacza, że ​​mogę używać mocnej lambdy

f=->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}}
Wartość tuszu
źródło
putsdodaje nowy wiersz na końcu (podczas gdy Ruby printnie), więc został zaktualizowany do 5nowego wiersza.
Wartość tuszu
Niech żyje timesfunkcja oszczędzania mi 3 bajty na forpętli: D
Value Ink
1
57 bajtów: ->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}} Spróbuj tutaj
Alex A.,
Nie musisz przypisywać lambda w ramach przesyłania, ponieważ nie wymagamy nazw funkcji.
Alex A.,
1
Możesz to zrobić (->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}})[input]lub po prostu określić, że musisz go przypisać, aby go wywołać. Jest to dość powszechne na stronie.
Alex A.,
3

Julia, 72 bajty

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

Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca ciąg znaków. Aby go wywołać, przypisz go do zmiennej.

Tworzymy ciąg 25 znaków podkreślenia, po których następuje 5 spacji, a następnie rozpieszczamy to na tablicę znaków. Przesuwamy go cyklicznie losową liczbę razy (od 1 do 30), łączymy z powrotem w łańcuch i przyczepiamy do 5 nowych linii. Ten proces powtarza się n razy, gdzie n jest wejściem. Powstała tablica jest łączona i zwracana.

Wypróbuj tutaj

Alex A.
źródło
3

PowerShell 65 bajtów

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

Uruchom pętlę dla n iteracji. Zdobądź losową liczbę i utwórz ciąg podkreślenia z 5 spacjami na końcu. Indeksuj do łańcucha jako tablicę, aby wyciągnąć, zaczynając od losowej lokalizacji. Negatywne indeksowanie zawija od końca. Dołącz ponownie i dodaj 5 nowych linii.

Edycja: Nie wiem, dlaczego myślałem, że potrzebuję parametru, -Maximumponieważ jest on pozycjonowany. Dzięki TimmyD ogoliłem trochę bajtów i zapomniałem uzyskać dane wejściowe, dzięki czemu wróciłem do 65.

Matt
źródło
@ TimmyD Byłbym zaskoczony, gdyby ktoś nadal miał 1.0. Był dostępny tylko do pobrania i nie był dostarczany z żadnym systemem operacyjnym. 2.0 należy uznać za normę.
Matt
@ TimmyD Zgadzam się z tym punktem, po prostu nie dotyczy PowerShell 1.0 . Jeśli ktoś jest na tej stronie, używając tego, to mnie zaskoczy. Gdybym użył funkcji 3.0 lub wyższej, na pewno to zaznaczę.
Matt
3

Pyth, 19 bajtów

VQ.>r"5 25_"9O30*4b

Wypróbuj tutaj

Dzięki FryAmTheEggman za złapanie błędu.

Mike Bufardeci
źródło
@AandN FryAmTheEggman ma rację, zmieniłem go tak, aby był losowo przesuwany o 0-29 znaków zamiast 0-25.
Mike Bufardeci,
2

SpecBAS - 93 bajty

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

Robi ciąg 25 znaków podkreślenia + 5 spacji, wybiera losowy punkt początkowy i dzieli ciąg w tym miejscu i odmienia początek łańcucha do końca.

Apostrof wymusza nową linię, więc 1 na końcu łańcucha i 4 puste linie.

Brian
źródło
2

MATL , 23 bajty

:"95l25X"5Z"h30YrYS10ct

Wypróbuj online!

Wyjaśnienie

:"           % 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
Luis Mendo
źródło
2

Java, 177 140 bajtów

-1 bajt na niebieski przenoszący i ++

-2 bajty do mnie, pozostawiając bez znaczenia białe znaki w oryginale

-34 bajtów do Blue za uświadomienie sobie, że wcale nie potrzebuję char []

Ponieważ, wiesz, 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;}

Nieznacznie nie golfista:

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;
}

Ponieważ Java nie ma „rotacji” napisów, musiałem zastosować inne podejście. Wygenerowałem losowy int 0-29, który reprezentuje indeks początkowy dołka (OBO, ponieważ >jest krótszy niż >=). Każda indywidualna postać jest następnie ustalana przez logikę

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

To obsługuje „zawijanie” natury całości.

CAD97
źródło
Umieszczając i ++ na ostatnim miejscu używanym i, możesz zapisać bajt.
Blue
Mądry. Zuchwały, ale inteligentny. Mądrzejsze jest to, że ja w jakiś sposób zostawiam bezsensowne białe znaki na początku mojego snippet ( s = ""). Oba są teraz naprawione.
97 CAD
Możesz także zaoszczędzić sporo, pozbywając się tablicy char, zmienić literały char na literały łańcuchowe i użyć s + = wewnątrz pętli for. Właśnie to przetestowałem
Blue
Btw świetna odpowiedź
Blue
To właśnie dostaję za skupienie się na jednym ze sposobów, aby to zrobić. -34 (!) Bajtów.
97 CAD
1

Python 3.5 - 109 113 bajtów (+4 do drukowania 4 nowych wierszy między każdym wynikiem):

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)

Nieskluczona forma:

# 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

Zasadniczo chodzi o to, że ciąg „j”, składający się z 25 podkreślenia, po którym następuje 5 spacji, jest podawany jako argument funkcji „g”. Następnie moduł losowy jest importowany i tyle razy, ile określa użytkownik, w zakresie wybierana jest liczba losowa 0 => 29, a ciąg „j” jest przesuwany w prawo tyle razy. Wynik jest następnie drukowany po każdej iteracji, z 4 nowymi wierszami między każdym wynikiem.

R. Kap
źródło
Czy to również drukuje nowe linie pomiędzy?
Adnan
@AandN Teraz to robi. :)
R. Kap
W rzeczywistości musisz wydrukować 4 nowe linie: str. Więc zmiana '\r'na '\r'*4powinna prawdopodobnie działać. Także myślę, że można zmienić range(a+1)na range(a).
Adnan
@AnN Właściwie, użycie range(a)faktycznie drukuje a-1liczbę linii, więc range(a+1)jest to najlepszy sposób na wydrukowanie dokładnej liczby linii podanych przez użytkownika. Ponadto drukuje teraz 4 nowe linie między każdym wynikiem.
R. Kap
Hmmm, to dziwne, ponieważ przetestowałem to g(5)i drukuje 6 ciągów zamiast pięciu, więc zmiana a+1na ato prawdopodobnie to naprawi.
Adnan
1

Python, 119 103 bajtów

import random
s='_'*20+' '*5
def f(n,a=random.randint(0,25)):[print(s[a:]+s[:a]+3*'\n')for _ in' '*n]
DaveBensonPhillips
źródło
Twoja ostatnia aktualizacja nie działa, ponieważ umieściłeś losowy argument w domyślnym argumencie, więc funkcja zawsze będzie wyświetlać te same nczasy wierszy
Sp3000