Membuat peta bola jatuh

16

pengantar

Untuk yang belum pernah mendengar game ini sebelumnya. Anda memainkan bola yang harus bertahan selama mungkin. Ini dilakukan dengan bergerak ke kiri atau ke kanan, ke lubang. Karena peta bergerak ke atas, Anda harus turun untuk bertahan lebih lama. Jika Anda mencari gambar, Anda mungkin tahu game mana yang saya maksud.

Tugas

Diberikan bilangan bulat positif n , menghasilkan peta bola jatuh dari n lapisan. Di antara lapisan, ada 4 baris baru. Lebar lapisan terdiri dari 25 karakter garis bawah, dengan panjang satu lubang 5. Itu berarti bahwa lebar total sama dengan 30. Ini secara acak digeser setelah setiap lapisan. Contoh dari layer yang valid adalah:

_______________     __________

Lubangnya juga bisa di tepinya, seolah-olah lapisannya seperti silinder:

  _________________________   

Perhatikan bahwa ada 2 spasi utama dan 3 spasi tambahan. Membuat satu lubang lebar 5.

Uji kasus

Untuk n = 4, ini adalah output yang valid:

_______________     __________





______     ___________________





_______________________     __





  _________________________

Catatan: lubang harus didistribusikan secara seragam . Trailing dan / atau baris baru terkemuka diizinkan.

Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!

Adnan
sumber
1
@ DonMuesli Haha, itu bisa terjadi pada siapa pun: p
Adnan

Jawaban:

7

Pyth, 19 byte

VQ.>+*\_25*d5O30*b4

Coba di sini!

Penjelasan

VQ.> + * \ _ 25 * d5O30 * b4 # Q = input

VQ # Ulangi Q kali
     * \ _ 25 # 25 menggarisbawahi
          * d5 # 5 spasi
    + # mengkonsultasikan garis bawah dan spasi
  .> O25 # putar string ini 0-29 kali
                * b4 # cetak baris baru yang terpisah
Denker
sumber
4

Rubi, 74 71 59

Terima kasih kepada Alex A. untuk mengingatkan saya bahwa pada dasarnya satu baris berarti saya bisa menggunakan lambda yang stabby

f=->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}}
Nilai Tinta
sumber
putsmenambahkan baris baru ke akhir (sementara Ruby printtidak), jadi 5baris tersebut diperbarui ke baris baru.
Nilai Tinta
Semua memuji timesfungsi untuk menyelamatkan saya 3 byte selama forloop: D
Value Ink
1
57 byte: ->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}} Coba di sini
Alex A.
Anda tidak perlu menetapkan lambda sebagai bagian dari kiriman karena kami tidak memerlukan fungsi untuk dinamai.
Alex A.
1
Anda dapat melakukan (->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}})[input]atau hanya menentukan bahwa Anda perlu menetapkannya untuk menyebutnya. Ini sangat umum di situs.
Alex A.
3

Julia, 72 byte

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

Ini adalah fungsi anonim yang menerima integer dan mengembalikan string. Untuk menyebutnya, tetapkan ke variabel.

Kami membuat string dengan 25 garis bawah diikuti oleh 5 spasi, lalu memercikkannya ke dalam array karakter. Kami menggesernya secara acak beberapa kali secara acak (antara 1 dan 30), menggabungkannya kembali menjadi string, dan menempel pada 5 baris baru. Proses ini diulangi n kali, di mana n adalah input. Array yang dihasilkan bergabung dan dikembalikan.

Coba di sini

Alex A.
sumber
3

PowerShell 65 Bytes

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

Jalankan loop untuk n iterasi. Dapatkan nomor acak dan buat string garis bawah dengan 5 spasi di akhir. Indeks ke dalam string sebagai array untuk menarik mulai dari lokasi acak. Pengindeksan negatif membungkus dari akhir. Gabung kembali itu dan tambahkan 5 baris baru.

Sunting: Saya tidak tahu mengapa saya pikir saya perlu parameter untuk -Maximumkarena posisinya. Berkat TimmyD saya mencukur beberapa byte dan lupa untuk mendapatkan input sehingga mendorong saya kembali ke 65.

Mat
sumber
@ TimmyD Saya akan terkejut jika ada yang masih memiliki 1.0. Itu hanya tersedia sebagai unduhan dan tidak dikirimkan dengan OS apa pun. 2.0 harus dianggap sebagai norma.
Matt
@TimmyD Saya setuju dengan hal itu, tidak hanya mengenai PowerShell 1.0 . Jika ada orang di situs ini yang menggunakan itu akan mengejutkan saya. Jika saya menggunakan fitur 3.0 atau lebih tinggi saya pasti akan menyoroti itu.
Matt
3

Pyth, 19 byte

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

Coba di sini

Terima kasih kepada FryAmTheEggman karena telah menangkap bug.

Mike Bufardeci
sumber
@AndN FryAmTheEggman benar, saya telah mengubahnya secara acak dengan 0-29 karakter, bukannya 0-25.
Mike Bufardeci
2

SpecBAS - 93 byte

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

Membuat string dengan 25 garis bawah + 5 spasi, mengambil titik awal acak dan menyambungkan string pada posisi itu dan memotong awal string hingga akhir.

Apostrof memaksa baris baru, jadi 1 di akhir string dan 4 baris kosong.

Brian
sumber
2

MATL , 23 byte

:"95l25X"5Z"h30YrYS10ct

Cobalah online!

Penjelasan

:"           % 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
sumber
2

Java, 177 140 byte

-1 byte ke Biru memindahkan i ++

-2 byte bagi saya meninggalkan spasi kosong yang tidak ada artinya dalam aslinya

-34 byte ke Blue untuk menyadari aku tidak butuh char [] sama sekali

Karena, Anda tahu, Jawa.

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

Sedikit tidak berbulu:

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

Karena Java tidak memiliki String 'rotate', saya harus mengambil pendekatan yang berbeda. Saya menghasilkan int 0-29 acak yang mewakili indeks awal lubang (OBO karena >lebih pendek dari >=). Setiap karakter individu kemudian ditentukan oleh logika

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

Ini menangani sifat "pembungkus" dari keseluruhan.

CAD97
sumber
Dengan meletakkan i ++ tempat terakhir yang digunakan, Anda dapat menyimpan byte.
Biru
Pintar. Hacky, tapi pintar. Lebih cerdas lagi adalah saya, entah bagaimana, meninggalkan spasi kosong yang tidak berarti di awal cuplikan saya ( s = ""). Keduanya sudah diperbaiki sekarang.
CAD97
Anda juga dapat menyimpan lebih banyak dengan menyingkirkan array char, mengubah literal char menjadi string literal, dan menggunakan s + = di dalam untuk loop. Saya baru saja mengujinya
Biru
Btw jawaban bagus
Biru
Itulah yang saya dapatkan untuk fokus pada satu cara untuk melakukannya. -34 (!) Byte.
CAD97
1

Python 3.5 - 109 113 byte (+4 untuk mencetak 4 baris baru di antara setiap hasil):

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)

Formulir Tidak Terkumpul:

# 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

Pada dasarnya apa yang terjadi adalah bahwa string 'j', yang terdiri dari 25 garis bawah diikuti oleh 5 spasi, diberikan sebagai argumen untuk fungsi "g". Kemudian, modul acak diimpor, dan, sebanyak yang ditentukan oleh pengguna, angka acak dipilih dalam kisaran 0 => 29, dan string, "j", bergeser ke kanan sebanyak itu. Hasilnya kemudian dicetak setelah setiap iterasi, dengan 4 baris baru di antara setiap hasil.

R. Kap
sumber
Apakah ini juga mencetak baris baru di antaranya?
Adnan
@AndN Sekarang ya. :)
R. Kap
Anda sebenarnya perlu mencetak 4 baris baru: hlm. Jadi mengubah '\r'ke '\r'*4mungkin harus bekerja. Juga, saya pikir Anda bisa berubah range(a+1)menjadi range(a).
Adnan
@AndN Sebenarnya, dengan menggunakan range(a)benar - benar mencetak a-1jumlah garis, jadi range(a+1)adalah cara terbaik untuk mencetak jumlah garis persis yang disediakan pengguna. Juga, sekarang mencetak 4 baris baru di antara setiap hasil.
R. Kap
Hmmm, itu aneh, karena saya menguji ini dengan g(5) dan mencetak 6 string bukannya lima, sehingga mengubah a+1ke amungkin akan memperbaikinya.
Adnan
1

Python, 119 103 byte

import random
s='_'*20+' '*5
def f(n,a=random.randint(0,25)):[print(s[a:]+s[:a]+3*'\n')for _ in' '*n]
DaveBensonPhillips
sumber
Update terbaru Anda tidak bekerja karena Anda telah menempatkan acak dalam argumen default, sehingga fungsi akan selalu output yang sama berturut-turut nkali
Sp3000