Tạo một bản đồ bóng rơi


16

Giới thiệu

Đối với những người chưa bao giờ nghe nói về trò chơi này trước đây. Bạn đang chơi một quả bóng cần tồn tại càng lâu càng tốt. Điều này được thực hiện bằng cách di chuyển sang trái hoặc phải, đi đến các lỗ. Vì bản đồ di chuyển lên trên, bạn cần đi xuống để tồn tại lâu hơn. Nếu bạn tìm kiếm hình ảnh, bạn có thể biết ý tôi là trò chơi nào.

Nhiệm vụ

Cho một số nguyên dương n , xuất ra một bản đồ bóng rơi của n lớp. Giữa các lớp, có 4 dòng mới. Chiều rộng của lớp được tạo thành từ 25 ký tự gạch dưới, với một lỗ có chiều dài 5. Điều đó có nghĩa là tổng chiều rộng bằng 30. Điều này được dịch chuyển ngẫu nhiên sau mỗi lớp. Một ví dụ về một lớp hợp lệ là:

_______________     __________

Lỗ cũng có thể ở các cạnh, như thể lớp giống như một hình trụ:

  _________________________   

Lưu ý rằng có 2 không gian hàng đầu và 3 không gian dấu. Tạo một lỗ đơn có chiều rộng 5.

Các trường hợp thử nghiệm

Với n = 4, đây là đầu ra hợp lệ:

_______________     __________





______     ___________________





_______________________     __





  _________________________

Lưu ý: các lỗ phải được phân bố đồng đều . Trailing và / hoặc hàng đầu mới được cho phép.

Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!


1
@DonMuesli Haha, điều đó có thể xảy ra với bất cứ ai: p
Adnan

Câu trả lời:


7

Bình thường, 19 byte

VQ.>+*\_25*d5O30*b4

Hãy thử nó ở đây!

Giải trình

VQ.> + * \ _ 25 * d5O30 * b4 # Q = đầu vào

VQ # Lặp lại Q lần
     * \ _ 25 # 25 gạch dưới
          * d5 # 5 dấu cách
    + # concat các dấu gạch dưới và dấu cách
  .> O25 # xoay chuỗi này 0-29 lần
                * b4 # in các dòng mới tách biệt

4

Ruby, 74 71 59

Cảm ơn Alex A. đã nhắc nhở tôi rằng về cơ bản là một dòng có nghĩa là tôi có thể sử dụng lambda cứng nhắc

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

putsthêm một dòng mới vào cuối (trong khi Ruby printthì không), vì vậy nó đã được cập nhật thành 5dòng mới.
Giá trị mực

Tất cả đều ca ngợi timeschức năng tiết kiệm cho tôi 3 byte trong forvòng lặp: D
Value Ink

1
57 byte: ->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}} Thử tại đây
Alex A.

Bạn không cần gán lambda như một phần của bài nộp vì chúng tôi không yêu cầu các chức năng được đặt tên.
Alex A.

1
Bạn có thể làm (->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}})[input]hoặc chỉ xác định rằng bạn cần gán nó để gọi nó. Điều này là khá phổ biến trên trang web.
Alex A.

3

Julia, 72 byte

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

Đây là một hàm ẩn danh chấp nhận một số nguyên và trả về một chuỗi. Để gọi nó, gán nó cho một biến.

Chúng tôi xây dựng một chuỗi gồm 25 dấu gạch dưới theo sau là 5 khoảng trắng, sau đó chia chuỗi đó thành một mảng các ký tự. Chúng tôi luân chuyển nó một số lần ngẫu nhiên (trong khoảng từ 1 đến 30), nối nó lại thành một chuỗi và giải quyết 5 dòng mới. Quá trình này được lặp lại n lần, trong đó n là đầu vào. Mảng kết quả được nối và trả về.

Hãy thử nó ở đây


3

PowerShell 65 byte

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

Chạy một vòng lặp cho n lần lặp. Lấy một số ngẫu nhiên và tạo một chuỗi gạch dưới có 5 dấu cách ở cuối. Lập chỉ mục vào chuỗi dưới dạng một mảng để kéo bắt đầu từ một vị trí ngẫu nhiên. Kết thúc chỉ mục tiêu cực từ cuối. Tham gia sao lưu một lần nữa và nối thêm 5 dòng mới.

Chỉnh sửa: Tôi không biết tại sao tôi nghĩ rằng tôi cần tham số -Maximumvì nó là vị trí. Nhờ TimmyD, tôi đã cạo một số byte và quên lấy đầu vào để điều đó đưa tôi trở lại 65.


@TimmyD Tôi sẽ rất ngạc nhiên nếu bất cứ ai vẫn có 1.0. Nó chỉ có sẵn dưới dạng tải xuống và không được gửi cùng với bất kỳ HĐH nào. 2.0 nên được coi là chuẩn mực.
Matt

@TimmyD Tôi đồng ý với quan điểm đó, không liên quan đến PowerShell 1.0 . Nếu bất cứ ai trên trang web này sử dụng nó sẽ làm tôi ngạc nhiên. Nếu tôi sử dụng tính năng 3.0 trở lên, tôi chắc chắn sẽ làm nổi bật điều đó.
Matt

3

Bình thường, 19 byte

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

Hãy thử nó ở đây

Cảm ơn FryAmTheEggman vì đã bắt được một lỗi.


@AandN FryAmTheEggman đã đúng, tôi đã thay đổi nó để được thay đổi ngẫu nhiên bởi 0-29 ký tự thay vì 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

Tạo một chuỗi gồm 25 dấu gạch dưới + 5 dấu cách, chọn một điểm bắt đầu ngẫu nhiên và ghép chuỗi ở vị trí đó và xử lý bắt đầu chuỗi kết thúc.

Dấu nháy đơn buộc một dòng mới, vì vậy 1 ở cuối chuỗi và 4 dòng trống.


2

MATL , 23 byte

:"95l25X"5Z"h30YrYS10ct

Hãy thử trực tuyến!

Giải trình

:"           % 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 byte

-1 byte sang Blue di chuyển i ++

-2 byte với tôi để lại khoảng trắng vô nghĩa trong bản gốc

-34 byte thành Blue để nhận ra tôi hoàn toàn không cần char []

Bởi vì, bạn biết đấy, 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;}

Hơi vô dụng:

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

Vì Java không có Chuỗi 'xoay', tôi phải thực hiện một cách tiếp cận khác. Tôi đã tạo một số 0-29 ngẫu nhiên đại diện cho chỉ số bắt đầu của lỗ (OBO vì >ngắn hơn >=). Mỗi nhân vật sau đó được quyết định bởi logic

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

Điều này xử lý bản chất "bao bọc" của toàn bộ.


Bằng cách đặt i ++ là nơi cuối cùng tôi được sử dụng, bạn có thể lưu một byte.
Blue

Thông minh. Hacky, nhưng thông minh. Thông minh hơn vẫn là tôi bằng cách nào đó để lại khoảng trắng vô nghĩa ở đầu đoạn trích của tôi ( s = ""). Cả hai đều cố định bây giờ.
CAD97

Bạn cũng có thể tiết kiệm nhiều hơn bằng cách loại bỏ mảng char, thay đổi ký tự char thành chuỗi ký tự và sử dụng s + = trong vòng lặp bên trong cho vòng lặp. Tôi vừa thử nó
Blue

Btw câu trả lời tuyệt vời
Blue

Đó là những gì tôi nhận được khi tập trung vào một cách để làm điều đó. -34 (!) Byte.
CAD97

1

Python 3.5 - 109 113 byte (+4 để in ra 4 dòng mới giữa mỗi kết quả):

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)

Mẫu đơn:

# 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

Về cơ bản những gì đang diễn ra là một chuỗi 'j', bao gồm 25 dấu gạch dưới theo sau là 5 khoảng trắng, được đưa ra làm đối số cho hàm "g". Sau đó, mô-đun ngẫu nhiên được nhập và, bao nhiêu lần theo chỉ định của người dùng, một số ngẫu nhiên được chọn trong phạm vi 0 => 29và chuỗi, "j", được dịch chuyển sang phải nhiều lần. Kết quả sau đó được in ra sau mỗi lần lặp, với 4 dòng mới ở giữa mỗi kết quả.


Điều này cũng in các dòng mới ở giữa?
Ad Nam

@AandN Bây giờ thì có. :)
R. Kap

Bạn thực sự cần phải in 4 dòng mới: p. Vì vậy, thay đổi '\r'để '\r'*4có thể làm việc. Ngoài ra, tôi nghĩ bạn có thể thay đổi range(a+1)để range(a).
Ad Nam

@AandN Trên thực tế, sử dụng range(a)thực sự in ra a-1số dòng, vì vậy đây range(a+1)là cách tốt nhất để in ra số dòng chính xác mà người dùng cung cấp. Ngoài ra, bây giờ nó in 4 dòng mới ở giữa mỗi kết quả.
R. Kap

Hmmm, điều đó thật kỳ lạ, bởi vì tôi đã thử nghiệm điều này g(5)và nó in 6 chuỗi thay vì năm, vì vậy việc thay đổi a+1thành acó thể sẽ khắc phục điều đó.
Ad Nam

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]

Cập nhật mới nhất của bạn không hoạt động vì bạn đã đặt ngẫu nhiên trong một cuộc tranh luận mặc định, vì vậy chức năng sẽ luôn luôn xuất cùng hàng nlần
Sp3000
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.