떨어지는 볼 맵 만들기


16

소개

전에이 게임에 대해 들어 본 적이없는 사람들을 위해. 당신은 가능한 한 오래 생존 해야하는 공을 재생합니다. 이것은 왼쪽 또는 오른쪽으로 이동하여 구멍으로 이동하여 수행됩니다. 지도가 위쪽으로 이동하므로 더 오래 생존하려면 아래쪽으로 이동해야합니다. 이미지 를 검색 하면 내가 의미하는 게임을 알고있을 것입니다.

작업

양의 정수 n이 주어지면 n 레이어 의 떨어지는 볼 맵을 출력합니다 . 레이어 사이에는 개행이 4 개 있습니다. 레이어의 너비는 25 개의 밑줄 문자로 구성되며 길이 가 1 인 구멍은 5입니다. 즉, 총 너비는 30과 같습니다. 이는 각 레이어마다 무작위로 이동합니다. 유효한 레이어의 예는 다음과 같습니다.

_______________     __________

레이어가 원통처럼 마치 구멍이 가장자리에있을 수도 있습니다.

  _________________________   

선행 공백 2 개와 후행 공백 3 개가 있습니다. 너비 가 하나 인 구멍 만들기 5.

테스트 사례

들면 N = 4, 이것은 올바른 출력된다 :

_______________     __________





______     ___________________





_______________________     __





  _________________________

참고 : 구멍은 균일하게 분포 되어야합니다 . 후행 및 / 또는 선행 개행이 허용됩니다.

이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!


1
@DonMuesli Haha, 그것은 누구에게나 일어날 수 있습니다 : p
Adnan

답변:


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

Alex A.에게 감사합니다. 기본적으로 한 줄이되면 스테이 비 람다를 사용할 수 있다는 의미입니다.

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.

함수 이름을 지정할 필요가 없으므로 제출의 일부로 람다를 할당 할 필요가 없습니다.
Alex A.

1
(->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}})[input]호출하기 위해 할당해야한다고 지정하거나 지정할 수 있습니다 . 이것은 사이트에서 매우 일반적입니다.
Alex A.

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을 가지고 있다면 놀랄 것입니다. 다운로드로만 제공되었으며 OS와 함께 제공되지 않았습니다. 2.0은 표준으로 간주되어야합니다.
Matt

@TimmyD PowerShell 1.0 과 관련된 것이 아니라 그 점에 동의합니다 . 그것을 사용 하여이 사이트에 누군가가 있다면 그것은 나를 놀라게 할 것입니다. 3.0 이상의 기능을 사용했다면이를 강조 할 것입니다.
Matt


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

자바, 177140 바이트

i ++를 이동하는 -1 바이트

원본에 의미없는 공백을 남기고 나에게 -2 바이트

-34 바이트는 파란색으로 전혀 필요하지 않습니다.

왜냐하면, 나중에 알기 때문입니다.

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에는 String 'rotate'이 없으므로 다른 접근법을 사용해야했습니다. 구멍의 시작 색인을 나타내는 임의의 int 0-29를 생성했습니다 (OBO 가보다 >짧기 때문에 >=). 그런 다음 각 개별 문자는 논리에 의해 결정됩니다.

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

이것은 전체의 "래핑"특성을 처리합니다.


i ++를 내가 사용하는 마지막 위치에두면 바이트를 절약 할 수 있습니다.
Blue

똑똑한. 해 키지 만 똑똑하다. 똑똑하게도 내 스 니펫 ( s = "") 의 시작 부분에 의미없는 공백이 남습니다 . 둘 다 지금 수정되었습니다.
CAD97

char 배열을 제거하고 char 리터럴을 문자열 리터럴로 변경하고 내부 for 루프에서 s + =를 사용하여 번들을 더 많이 절약 할 수도 있습니다. 방금 테스트했습니다
Blue

Btw great answer
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

기본적으로 진행중인 것은 25 개의 밑줄과 5 개의 공백으로 구성된 문자열 'j'가 함수 "g"에 대한 인수로 제공된다는 것입니다. 그런 다음 임의 모듈을 가져 와서 사용자가 지정한 횟수만큼 범위에서 임의의 숫자를 선택 0 => 29하고 문자열 "j"를 여러 번 오른쪽으로 이동합니다. 그런 다음 각 반복 후에 결과가 인쇄되고 각 결과 사이에 4 개의 새로운 줄이 표시됩니다.


이것은 또한 사이에 개행을 인쇄합니까?
Adnan

@AandN 이제 그렇습니다. :)
R. Kap

실제로 네 줄 바꿈을 인쇄해야합니다 : p. 따라서로 변경 '\r'하면 '\r'*4작동해야합니다. 또한, 나는 당신이 바꿀 수 있다고 생각 range(a+1)range(a).
Adnan

@AandN 실제로,를 사용하면 range(a)실제로 a-1range(a+1)수를 인쇄하므로 사용자가 제공 한 정확한 줄 수를 인쇄하는 가장 좋은 방법입니다. 또한 각 결과 사이에 새로운 줄 4 개를 인쇄합니다.
R. Kap

흠, 그것은 이상합니다. 왜냐하면 이것을 테스트 g(5)하고 5 대신 6 개의 문자열을 인쇄 a+1하기 때문에 변경 하면 a해결할 수 있습니다.
Adnan

1

파이썬, 119103 바이트

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.