떨어지는 볼 맵 만들기


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-1줄 range(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.