ASCII 낙서 : 상자에 레이저


31

때로는 낙서 할 때 사각형을 그리고 모서리 중 하나에서 대각선으로 시작한 다음 사각형의 한면을 칠 때마다 "반사"하여 선을 추적합니다. 직사각형의 다른 모서리에 닿을 때 까지이 작업을 계속합니다 (내 직사각형의 종횡비가 비이성적이지 않기를 바랍니다). 이것은 레이저의 경로를 상자로 추적하는 것과 같습니다. ASCII 아트를 사용하여 결과를 생성해야합니다.

예를 들어 width 5및 height 상자를 고려하십시오 3. 우리는 항상 왼쪽 상단에서 시작합니다. #마크 상자의 경계. 너비와 높이는 내부 치수를 나타냅니다.

#######    #######    #######    #######    #######    #######    #######
#\    #    #\    #    #\   \#    #\  /\#    #\  /\#    #\/ /\#    #\/\/\#
# \   #    # \  /#    # \  /#    # \/ /#    # \/ /#    #/\/ /#    #/\/\/#
#  \  #    #  \/ #    #  \/ #    # /\/ #    #\/\/ #    #\/\/ #    #\/\/\#
#######    #######    #######    #######    #######    #######    #######

도전

상자의 (양의) 너비와 높이가 주어지면 레이저 추적의 최종 결과를 생성해야합니다. STDIN (또는 가장 가까운 대안), 명령 줄 인수, 함수 인수를 통해 입력을 받고 STDOUT (또는 가장 가까운 대안)을 통해 또는 함수 반환 값 또는 인수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다.

편리한 목록, 문자열 또는 숫자 형식을 입력에 사용할 수 있습니다. 출력은 단일 문자열이어야합니다 (STDOUT으로 인쇄하지 않는 한 점진적으로 진행할 수 있음). 이것은 또한 높이를 먼저, 너비를 두 번째로 취할 수 있음을 의미합니다-답에 정확한 입력 형식을 지정하십시오.

출력 라인에 선행 또는 후행 공백이 없어야합니다. 선택적으로 단일 후행 줄 바꿈을 출력 할 수 있습니다.

당신은 공간을 사용합니다 /, \그리고 #정확히 같은 표시된 테스트 케이스를 재현.

테스트 사례

2 2
####
#\ #
# \#
####

3 2
#####
#\/\#
#/\/#
#####

6 3
########
#\    /#
# \  / #
#  \/  #
########

7 1
#########
#\/\/\/\#
#########

1 3
###
#\#
#/#
#\#
###

7 5
#########
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#########

22 6
########################
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
# /\  /\  /\  /\  /\  /#
#/  \/  \/  \/  \/  \/ #
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
########################

1
어쩌면 좋은 후속 조치 질문이 일단 진행되면 임의로 모양의 상자와 시작점 으로이 도전을하는 것입니다.
Sanchises

@ sanchises 나는 실제로 그것을 고려했지만 (아직 게시 할 수도 있음) 누군가가 명시 적 수식을 얻을 수 있기를 바랍니다. 또한 X교차로에 필요한 여러 출발점을 고려하고있었습니다 . 아마 다음 번에. ;)
Martin Ender


이것은 애니메이션 포인트에 적합합니다. "애니메이션 1 버스트 (한 번의 슬래시) 1 사이클 / 무한)"
Martijn

답변:


20

Pyth, 43 41 39 바이트

K*\#+2QKVvzp<*QXX*dyivzQN\\_hN\/Q\#\#)K

온라인으로 사용해보십시오 : Pyth Compiler / Executor . 높이 1 행, 폭 2 행의 순서로 숫자를 입력하십시오.

2 바이트 절약에 도움을 준 isaacg에게 감사드립니다.

설명:

내 솔루션은 레이저를 추적하지 않으며 gcd를 포함하는 간단한 패턴을 사용합니다. 경우 m, n상자의 크기이다하자 d = gcd(m, n). 패턴의 크기는 정확히 2*d x 2*d입니다.

예를 들어 반복 패턴 7 5

#########
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#########

이다

\/
/\

( gcd(7, 5) = 1패턴의 크기는 2 x 2)

그리고 반복되는 패턴 22 6

########################
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
# /\  /\  /\  /\  /\  /#
#/  \/  \/  \/  \/  \/ #
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
########################

이다

\  /
 \/ 
 /\
/  \

( gcd(22, 6) = 2패턴의 크기는 4 x 4)

내 솔루션은 각 줄에 대해 다음과 같은 작업을 수행합니다. 단순히 패턴의 한 줄을 생성하고 몇 번 반복하고 끝에서 잘라 상자에 맞도록 만듭니다.

K*\#+2QK   implicit: Q is the second input number (=width)
K          K = 
 *\#+2Q        "#" * (2 + Q)
       K   print K (first line)

Vvzp<*QXX*dyivzQN\\_hN\/Q\#\#)K  implicit: vz is the first input number (=height)
VQ                               for N in [0, 1, ..., vz-1]:
           ivzQ                             gcd(vz,Q)
          y                               2*gcd(vz,Q)
        *d                           string with 2*gcd(vz,Q) space chars
       X       N\\                   replace the Nth char with \
      X           _hN\/              replace the -(N+1)th char with /
    *Q                               repeat Q times
   <                   Q           only use the first Q chars
  p                     \#\#       print "#" + ... + "#"
                            )    end for
                             K   print K

때문에 X지원하는 문자열에 "할당"을 변경할 수 있습니다 m\ *d제거합니다 s.
isaacg

@isaacg 좋은 전화. 나는 짧은 *\ 대신 에 사용 하는 것에 대해 생각 m\ 했지만 같은 크기이므로 버립니다. 변수 d와 불필요한 것을 생각하지 않았습니다 s.
Jakube

11

C, 256 바이트

f(w,h){int i,j,x=1,y=1,v=1,u=1;char b[h+2][w+3];for(i=0;i<w+3;i++)for(j=0;j<h+2;j++)b[j][i]=!i||!j||i>w||j>h?i>w+1?0:35:32;while((x||y)&&(x<=w||y<=h))v=x&&w+1-x?v:(x-=v,-v),u=y&&h+1-y?u:(y-=u,-u),b[y][x]=v/u<0?47:92,x+=v,y+=u;for(i=0;i<h+2;i++)puts(b[i]);}

아마도 200 이하에서 이것을 얻을 수 있으며 나중에 설명을 추가 할 것입니다.하지만 몇 시간 안에 대신해야 할 서류 가있을 수 있습니다.


27
가짜 인터넷 포인트는 교육 학위 이상의 가치가 있습니다.
Adam Davis


5

J, 85 바이트

하자 g = gcd(w,h). 함수는 요소 채우기 w/g by h/g와 매트릭스 g by g갖는 타일 /의과 \'자신의 대각선 반대 대각선들. 결과 4D 배열은 2D 배열 (상자 내부)로 래블 된 다음에 둘러싸입니다 #. (숫자 0 1 2 3대신 숫자 가 사용 [space] / \ #되며 끝에 문자로 변경됩니다.)

내부 좌표의 직접 위치 기반 계산은 약간 더 짧은 솔루션을 산출 할 수 있습니다.

' \/#'echo@:{~3,.~3,.3,~3,,$[:,[:,"%.0 2 1 3|:((,:2*|.)@=@i.@+.){~[:(2&|@+/&:i.)/,%+.

용법:

   6 (' \/#'echo@:{~3,.~3,.3,~3,,$[:,[:,"%.0 2 1 3|:((,:2*|.)@=@i.@+.){~[:(2&|@+/&:i.)/,%+.) 22
########################
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
# /\  /\  /\  /\  /\  /#
#/  \/  \/  \/  \/  \/ #
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
########################

여기에서 온라인으로 사용해보십시오.


0

Desmos Calculator-추가 지식을 얻기 위해 비경쟁

온라인으로 사용해보십시오!

입력 :

h as height of box, with 0-indexing
w as width of box, with 0-indexing

중간체 :

Let b = gcd(h,w),
Let c = |b-h%2b| Or |b-mod(h,2b)|

약식 :

(|b-(x+y)%2b|-c)(|b-(x-y)%2b|-c)=0

출력 :

x as x position, 0-indexed, where the ball will land when released
y as y position, 0-indexed, where the ball will land when released

작동 방식 :

(|b-(x+y)%2b|-c)*(|b-(x-y)%2b|-c)=0
                ^ OR operation - |b-(x+y)%2b|-c=0 or |b-(x-y)%2b|-c=0
|b-(x+/-y)%2b|-c = 0
|b-(x+/-y)%2b| = c
|b-(x+/-y)%2b| = c means (b-(x+/-y))%2b = + or -c 
b-(x+/-y)%2b = +/- c -> b +/- c = (x+/-y)%2b -> (x+/-y) = n*2*b + b +/- c 
Where n is integer.  This will force patterns to repeat every 2b steps in x and y.  
Initial pattern n=0: (x +/- y) = b +/- c -> y = +/- x + b +/- c
In the x positive and y positive plane only, these correspond to lines of positive and 
negative slope, set at intercept b, offset by c on either side.

프로그램이 최종 기준을 충족하지 못합니다. ASCII 상자와 라인을 생성하므로 다른 사람들이 도전을 완수하는 데 도움이되는 정보를 비경쟁으로 제출하고 있습니다. c = 0 또는 c = b 일 때 Desmos가 작동하게하려면 Desmos가 [0, B 대신 (0, B)의 Mod (A, B) 범위를 갖는 것처럼 작은 오프셋 계수 0.01이 도입되었습니다. )

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