타워가 균형을 잡을까요?


36

소개

ASCII 타워와 바람의 힘이 주어지면 타워가 균형을 잡을지 아니면 떨어질지를 결정하는 프로그램이나 함수를 작성하십시오.

예를 들어 첫 번째 타워는 균형을 유지하지만 두 번째 타워는 왼쪽으로 넘어갑니다.

  # #            # #
  ###            ### 
 ###            ### 
 # #            # # 
#####          ##### 
 ###            ### 
 ###              #

이것이 나의 첫 번째 도전이다. 나는 당신이 그것을 즐기시기 바랍니다.

지도

타워는로 표현 된 연결된 블록으로 구성되며 단단한 물체를# 형성 합니다 . 각 블록은 한 단위의 너비와 높이를 가진 정사각형이며 일정한 밀도를 갖습니다. 탑에 작용하는 두 가지 힘, 무게와 바람의 힘이 있습니다. 모든 힘은 각 블록에 개별적으로 작용하고 블록의 중심을 통과합니다.

  • 무게로 인해 각 블록에는 하나의 유닛에 작용하는 하향 힘이 있습니다.
  • 또한, 바람의 측면에 인접한 다른 블록이없는 각 블록 은 바람 의 방향으로 수평으로 작용하는 힘을 갖는다. 이 힘의 크기는 입력으로 제공됩니다.
  • 바람의 방향은 입력 어딘가에 ASCII 플래그로 표시됩니다. 바람이 0이 아닌 경우에만 입력에 플래그가 있습니다. 깃발은 어떤 힘에도 영향을 미치지 않습니다.

깃발은 아래에 표시된대로 정확하게 보입니다.

Flag design and corresponding wind direction:

 o~~        ~~o
 |~~        ~~|

--->        <---

명확히하기 위해 타워는 단단한 물체이며 부서지지 않으며 땅에 붙어 있지 않습니다. 그러나 프로그램은 각 블록의 힘을 개별적으로 계산하여 타워의 균형이 맞는지 확인해야합니다.

  o~~
  |~~
  # #              > > 
  ###              >## 
 ###              >##  
 # #              > >  
#####            >#### 
 ###              >##  
 ###              >##  

Wind force: 1    Wind direction: --->

바람이 오른쪽으로 불고 >있으며 위 오른쪽에 표시된 블록을 밀어 넣 습니다. 바람은 구멍 안쪽에 작용합니다.

타워의 왼쪽 하단에 좌표가 있다고 가정합니다 (0,0). 에서 타워의 왼쪽베이스 주위의 모멘트 (0,0)는 시계 방향으로 71 단위이므로 타워는 왼쪽으로 떨어지지 않습니다. (0,3)에서 타워의 오른쪽베이스 주위의 모멘트는 시계 방향으로 8 단위이므로 타워는 오른쪽으로 떨어집니다.

바람이 왼쪽으로 불어 오는 경우, 각각의 모멘트는 같은 지점에서 시계 방향으로 2 단위, 시계 반대 방향으로 61 단위이므로 타워는 균형을 잡습니다.

입력

  • 프로그램이나 함수는 10 진수와 줄 바꿈으로 구분 된 두 개의 입력을 가져야합니다.
  • 10 진수는 0보다 크며 예제와 같이 노출 된 각 블록에 바람이 가하는 힘을 나타냅니다.
  • 문자열은 타워를 위에서 아래로 나타내며 공백, #|o~문자 및 줄 바꿈을 포함 할 수 있습니다 . 선택적으로 후행 줄 바꾸기를 가정하거나 후행 공백으로 타워를 채워 사각형을 형성 할 수 있습니다.
  • 탑은 #맨 아래 줄에 적어도 하나가 있습니다 .
  • 숫자와 문자열을 순서대로 입력 할 수 있습니다.
  • 풍력의 크기가 0이 아닌 경우 입력 어딘가에지면 또는 타워에 연결된 플래그가 있습니다. 깃발은 위에 표시된 정확한 형태를 갖습니다.
  • #블록 구멍을 포함 할 수있는 접속 형상을 형성한다. 다시 말해, 하나의 블록 만 존재하지 않는 한 모든 블록은 다른 블록과 인접하게됩니다.

산출

  • 타워가 균형을 잡을지, 왼쪽을 향해 (시계 반대 방향), 오른쪽을 향해 (시계 방향) 떨어질지에 따라 문자 B, L또는 R.
  • 출력에는 선택적인 후행 줄 바꿈이있을 수 있습니다.

이것은 . 표준 규칙 및 허점이 적용됩니다.

B 테스트 사례 :

Wind: 1
    ~~o
    ~~|
      # #
      ###
     ###
     # #
    #####
     ###
     ###

Wind: 0
##
# ##
###

Wind: 1.7
o~~
|~~
#
##

Wind: 0.768
      o~~
      |~~
      # #
      ###
     ###
     # #
    #####
     ###
     ###

Wind: 0.1
#
#
#
#
#
# o~~
# |~~

Wind: 0
#

Wind: 0
############

Wind: 144
               o~~
############   |~~

Wind: 0
#######
 ##
 #
 ##

Wind: 0
                ############
           ############
       ############
    ############
   ############
 ############
############

Wind: 41
                 ############
            ############
        ############
     ############
    ############
  ############     ~~o
 ############      ~~|

L 테스트 사례 :

Wind: 0
#####
   #


Wind: 42
                 ############
            ############
        ############
     ############
    ############
  ############     ~~o
 ############      ~~|

Wind: 4
########
    ###
 ~~o# ##
 ~~|#  #

Wind: 3
########
    ###
 o~~# ##
 |~~   #

R 테스트 사례 :

Wind: 1
      o~~
      |~~
      # #
      ###
     ###
     # #
    #####
     ###
     ###

Wind: 2
o~~
|~~
#

Wind: 0.001
                 ############
            ############
        ############
     ############
    ############
  ############     o~~
 ############      |~~

Wind: 145
               o~~
############   |~~

Wind: 1
#
#
#
#
#
# o~~
# |~~

Wind: 0.26
#######
 ##
 #   o~~
 ##  |~~

참조 솔루션 (자바 스크립트)

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

function balanced(tower, wind) {
    var rows = tower.split('\n').reverse(); // Reverse so row index matches height of row.
    var height = rows.length;
    var leftEdge = rows[0].indexOf('#'); // Find bottom left corner of tower.
    var rightEdge = rows[0].lastIndexOf('#') + 1; // Find bottom right corner of tower.
    var leftMoment = 0, rightMoment = 0; // Moments around the bottoms corners of tower.
    wind *= tower.indexOf('~o')>-1 ? -1 : 1; // Find direction of the wind.

    // Sum the moments for each block in the tower.
    for (var i = height - 1; i >= 0; i--) {
        rows[i].split('').map(function(ch, index, arr) {
            if (ch=='#') {
                // If there's not a block toward the windward side of the current one.
                if ((wind < 0 && arr[index-1] != '#') || (wind > 0 && arr[index+1]!='#')) {
                    // Add moments from wind.
                    leftMoment += (i+0.5)*-wind;
                    rightMoment += (i+0.5)*-wind; 
                }

                leftMoment += leftEdge - (index + 0.5);
                rightMoment += rightEdge - (index + 0.5);
            }
        }, 0);
    }
    if (leftMoment > 0) return 'L';
    else if (rightMoment < 0) return 'R';
    else return 'B';
}

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

# Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


17
PPCG에 오신 것을 환영합니다. 이것은 훌륭하게 쓰여진 첫 번째 도전입니다! :)
Doorknob

답변:


2

자바 스크립트 (ES6), 239 바이트

참조 구현을 중단했습니다. 나는 for 루프를로 변경하고 if 문을 map사용 하여 단락 &&시키고 ||if 문을 사용하여 ,하나의 문장에 모든 것을 맞추기 위해 바이트를 절약 할 수있었습니다 .

(a,b)=>((c=a.split`
`.reverse(),d=c[f=g=0].indexOf`#`,e=c[0].lastIndexOf`#`+1),a.match`o~`&&(b*=-1),c.map((h,i)=>h.replace(/#/g,(j,k,l)=>(b>0&l[k-1]!='#'|b<0&l[k+1]!='#'&&(f+=(i+=0.5)*b,g+=i*b),f+=d-k-0.5,g+=e-k-0.5))),f>0?'L':g<0?'R':'B')

여전히 더 골프를 치는 것이 가능할 수도 있습니다. 제안은 환영합니다.


내 순진한 솔루션보다 훨씬 +1
Conor O'Brien

1

자바 스크립트 ES6, 297 293 바이트

기본적으로 주어진 구현의 압축 버전.

b=(n,e)=>{r=n.split`
`.reverse(),t=r.length,a=r[0].indexOf`#`,f=r[i=l=0].lastIndexOf`#`+1;e*=n.indexOf`~o`>-1?-1:1;for(d=t-1;d>=0;d--)r[d].split``.map((n,r,t)=>{(j="#")==n&&((0>e&&j!=t[r-1]||e>0&&j!=t[r+1])&&(i+=(d+.5)*-e,l+=(d+.5)*-e),i+=a-(r+.5),l+=f-(r+.5))},0);return i>0?"L":0>l?"R":"B"}

반 확장 :

b = (n, e) => {
    r = n.split `
`.reverse(), t = r.length, a = r[0].indexOf `#`, f = r[i = l = 0].lastIndexOf `#` + 1;
    e *= n.indexOf `~o` > -1 ? -1 : 1;
    for (d = t - 1; d >= 0; d--) r[d].split ``.map((n, r, t) => {
        (j = "#") == n && ((0 > e && j != t[r - 1] || e > 0 && j != t[r + 1]) && (i += (d + .5) * -e, l += (d + .5) * -e), i += a - (r + .5), l += f - (r + .5))
    }, 0);
    return i > 0 ? "L" : 0 > l ? "R" : "B"
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.