물이 채워진 그릇


19

그릇의 부피와 물의 부피를 입력으로 받아 원하는 부피의 물이 담긴 그릇의 ASCII 표현을 출력하거나 반환하는 프로그램이나 함수를 작성해야합니다.

그릇의 구조는 다음과 같습니다.

 \     /
  \___/

그릇에는 하나 이상의 _문자가 있습니다. 의 수 \의 및 /의도 긍정적 이들은 대칭으로 인해 동일하다.

그릇의 부피는 전체의 번호 _space사이 문자 \의와 /의 플러스의 모든 쌍에 대해 하나의 \/. 이것은 위 그릇의 부피가 10다음을 의미합니다 .

 \     /  =>  xxxxx x (the last one is for the \/ pair)
  \___/        xxx x (the last one is for the \/ pair)

두 개의 다른 보울의 부피가 동일 할 수 있습니다. 예를 들어 다음 두 그릇의 부피는 18입니다.

\       /
 \     /      \         /
  \___/        \_______/

우리는 그릇에 물을 부을 수 있습니다. 물은 ~그릇 안에 공백 대신 문자 행으로 표시됩니다 . 맨 아래 행에는 공백이 없으므로의를 포함 할 수 없습니다 ~. 이것은 우리의 예가 한 가지 방법으로 만 물로 채워질 수 있음을 의미합니다.

 \~~~~~/
  \___/

다른 그릇은 여러 가지 방법으로 채울 수 있습니다.

 \~~~~~/   \     /
  \   /     \~~~/
   \_/       \_/

그릇에 물 양은 그릇 행의 볼륨 아래~ 문자. 상기 예는 4, 6 and 2각각 물 부피를 갖는다.

입력

  • 두 개의 양의 정수, 보울의 부피와 물의 부피.
  • 두 숫자의 순서를 선택할 수 있습니다.
  • 두 정수는 공통리스트 형식 (목록, 튜플, 배열 등) 또는 두 개의 개별 정수로 입력 할 수 있습니다.
  • 입력 값에 대해 하나 이상의 유효한 보울 워터 구성이 보장됩니다.

산출

  • 보울과 수량이 입력과 일치하는 물이있는 보울의 ASCII 표현입니다.
  • 인쇄 대신 결과를 반환하도록 선택한 경우 단일 문자열 (또는 해당 언어의 가장 가까운 대안)로 반환해야합니다.
  • 후행 공백이 허용됩니다.
  • 불필요한 선행 공백은 허용되지 않습니다.
  • 올바른 구성이 여러 개인 경우 출력 할 구성을 자유롭게 선택할 수 있지만 그 중 하나만 출력 할 수 있습니다.

각 입력 정수 쌍 뒤에는 하나 이상의 가능한 출력이옵니다.

6 2
\~~~/
 \_/

10 4
\~~~~~/
 \___/

24 8
\        /
 \~~~~~~/
  \    /
   \__/

42 12 //either of the two output is correct
\           /
 \         /
  \~~~~~~~/
   \     /
    \   /
     \_/

\               /
 \~~~~~~~~~~~~~/
  \___________/

90 68
\~~~~~~~~~~~~~~~~~~~~~/
 \                   /
  \                 /
   \               /
    \_____________/

102 42
\                     /
 \                   /
  \~~~~~~~~~~~~~~~~~/
   \               /
    \             /
     \___________/

이것은 코드 골프이므로 가장 짧은 참가작이 승리합니다.

답변:


6

CJam, 72 70 69 바이트

q~:QW=3m*{:,2ff*),)ff+}%{::)1fbQ=}=~W%ee_,S*W'_t@,~'~t.{S\+.*"\/".+N}

CJam 통역사 에서 온라인으로 사용해보십시오 .

런타임 및 메모리 사용량은 O (scary) 이므로 마지막 세 가지 테스트 사례는 Java 인터프리터 (및 추가 힙 공간)를 사용하여 확인해야합니다.

예제 실행

$ time java -Xmx4G -jar cjam-0.6.5.jar bowl.cjam <<< '[42 102]'
\                     /
 \                   /
  \~~~~~~~~~~~~~~~~~/
   \               /
    \             /
     \___________/

real    0m40.669s
user    3m13.100s
sys     0m11.690s

작동 원리

q~:Q     e# Read from STIDN, evaluate and save the result in Q.
W=       e# Select the last element of Q (bowl volume B).
3m*      e# Push all vectors of {0,...,B-1} × {0,...,B-1} x {0,...,B-1}.

{        e# For each vector [X Y Z]:
  :,     e#   Push [[0 1 ... X-1] [0 1 ... Y-1] [0 1 ... Z-1]].
  2ff*   e#   Multiply each coordinate by 2.
  ),)    e#   Pop the last vector, compute its length and increment.
  ff+    e#   Add the result to each component of each vector.
}%       e# Result: [[Z Z+2 ... Z+2(X-1)] [Z Z+2 ... Z+2(Y-1)]]

{        e# Find:
  ::)    e#   Increment each coordinate (to account for the volume in "\/").
  1fb    e#   Sum the coordinate of both vectors.
  Q=     e#   Compare the result to Q (desired volumes).
}=       e# If they match, push the array and break.

~        e# Dump both vectors on the stack.
W%       e# Reverse the rightmost one (corresponds to the bowl volume).
ee       e# Enumerate its coordinates.
         e# [Z+2(Y-1) ... Z+2 Z] -> [[0 Z+2(Y-1)] ... [Y-2 Z+2] [Y-1 Z]].
_,S*     e# Compute the length (Y) and push a string of Y spaces.
W'_t     e# Replace the last space with an underscore.
@        e# Rotate the leftmost vector (corresponds to the water volume) on top.
,        e# Compute its length (X).
~'~t     e# Replace the space at index X from the right with a tilde.

.{       e# For each enumerates coordinate and the corresponding character:
  S\+    e#   Append the character to the string " ".
  .*     e#   Vectorized repetition: [1 2] " ~" -> [" " "~~"]
  "\/".+ e#   Append the first (second) solidus to the first (second) string.
  N      e#   Push a linefeed.
}

2

C, 231 229 바이트

조기 제출 :) 여기에는 더 많은 골프가 있습니다.

v,V,w,h,H,i,j;main(c,a)char**a;{V=atoi(a[1]);v=atoi(a[2]);for(;++H;)for(h=0;h++<H;){for(w=1;h*h+w*h-h<v;++w);if(H*H+w*H-H==V){for(;H--;){printf("%*s",++i,"\\");for(j=0;j++<w-1+2*H;)putchar(H?H==h?'~':32:95);puts("/");}exit(0);}}}

언 골프 드 :

int v,V,w,h,H,i,j;
int main(int c, char **a)
{
    V=atoi(a[1]); /* Volume of bowl */
    v=atoi(a[2]); /* Volume of water */

    for(;++H;) /* Make the bowl taller */
    {
        for(h=0;h++<H;) /* Make the water taller */
        {
            for(w=1;h*h+w*h-h<v;++w); /* Make the bowl wider until the water volume matches */
            if(H*H+w*H-H==V) /* if the bowl volume matches, then we're good */
            {
                for(;H--;) /* Print out the bowl, one line at a time */
                {
                    printf("%*s",++i,"\\"); /* Print the left edge */
                    /* Print the inside (either with air/water, the top of the water, or the bottom of the bowl */
                    for(j=0;j++<w-1+2*H;)
                        putchar(H?H==h?'~':32:95);
                    /* Print the right edge of the bowl */
                    puts("/");
                }
                exit(0); /* die, we're done */
            }
        }
    }
}

보울 용량과 일치하지만 보울을 충족시킬 수없는 보울을 만날 수 있습니까?
Vartan

At least one valid bowl-water configuration is guaranteed for the input values.- OP
콜 카메론

2

자바 스크립트 ES5, 364 바이트

이것은 내가 점심 식사 시간 동안 빨리 떠 올릴 수있는 것입니다.

출처

function V(x,v) { // calculate volume of bowl/water
    for(i=v,j=x;i--;j+=2) {
      v+=j; 
    }
    return v
}
function B(x,y,l) { // draw bowl/water
    for(s="",h=y,w = x+2*y;y--;s+="\n")
        for(i=w;i--;) {
            f= i>h-y-1 && w-i > h-y;
            s+=i==h-y-1?"/": 
                w-i == h-y? "\\":
                y==l-1 && f? "~" :
                !y && f?"_":" "
        }
    return s;
}
n=prompt().split(" ");
b=+n[0]; // bowl volume
w=+n[1]; // water volume
for(x=b;x;x--)  // loop through possible widths
  for(y=b;y;y--)  // loop through possible heights
    if(V(x,y)==b) // check if we found bowl volume
       for(y2=y;y2;y2--) { // check possible water heights
         v = V(x,y2-1);
         if(v==w){ // see if volume matches
          alert(B(x,y,y2));
          x=1;break;
         }
       }

골프 :

(축소기를 통해 압축, 점심 교대 종료 됨)

function V(f,r){for(i=r,j=f;i--;j+=2)r+=j;return r}function B(r,y,n){for(s="",h=y,w=r+2*y;y--;s+="\n")for(i=w;i--;)f=i>h-y-1&&w-i>h-y,s+=i==h-y-1?"/":w-i==h-y?"\\":y==n-1&&f?"~":!y&&f?"_":" ";return s}for(n=prompt().split(" "),b=+n[0],w=+n[1],x=b;x;x--)for(y=b;y;y--)if(V(x,y)==b)for(y2=y;y2;y2--)if(v=V(x,y2-1),v==w){alert(B(x,y,y2)),x=1;break}

2

펄, 227 172 바이트

-n 옵션으로 실행 :

/ /;for$h(1..$`){for$w(1..$`){for$l(1..($h*($w+$h)==$`)*$h){if($l*($w+$l)==$'){for(0..$h-1){print$"x$_."\\".($_<$h-1?$_==$h-$l-1?"~":$":"_")x($w+($h-$_-1)*2)."/
"}exit}}}}

골프를 치는 데 도움을 준 Dennis에게 감사합니다.

보울 볼륨을 높이 * (너비 + 높이)로 계산합니다. 여기서 너비는 _문자 수이고 높이는 \문자 수입니다 .

높이와 너비의 각 조합은 올바른 보울 볼륨을 찾을 때까지 중첩 된 루프 쌍에서 테스트 한 다음 가능한 수위 레벨에 대한 또 다른 루프를 수행하여 해당 너비로 올바른 물 볼륨이 가능한지 확인합니다.

a를 1, b로, c를 원하는 물량의 음수로 2 차 공식을 사용하여 수위를 계산하고 정수인지 확인하면 세 번째 루프를 제거 할 수 있지만 더 많은 바이트가 필요합니다 루프를하는 것보다 어쨌든 (183 바이트)입니다.

/ /;for$h(1..$`){for$w(1..$`){if($h*($w+$h)==$`){$l=(sqrt($w*$w+4*$')-$w)/2;if(int$l==$l){for(0..$h-1){print$"x$_."\\".($_<$h-1?$_==$h-$l-1?"~":$":"_")x($w+($h-$_-1)*2)."/
"}exit}}}}

2

파이썬 2, 162 바이트

V,W=input()
r=1
while r*r<V:a=V/r-r;k=1;exec"if(a+k)*k==W*(V%r<1):i=1;exec\"print' '*~-i+'\%s/'%(' _~'[(i==r)-(i==r-k)]*(a+2*(r-i)));i+=1;\"*r;r=V\nk+=1\n"*r;r+=1

조금 지저분하지만 여기에 첫 시도가 있습니다. 가능한 모든 행 수를 시도 r하여 기본 밑줄 수를 설정합니다 a = V/r-r. 그런 다음 가능한 모든 수위 높이를 시도 k하고 보울이 유효한지 확인하여 인쇄합니다.


1

파이썬 2.7, 284 270 260 바이트

def f(b,w,i=1,e='while s<%s:j+=2;s+=j'):
 while 1:
    i+=1;j=s=i;exec e%w
    if s==w:p=j;exec e%b
    if s==b:break
 h=(j-i)/2+1;t=w=i+(h-1)*2+1
 for j in range(h):r,s,t=((' '*(t-2),'_'*(i-1))[j==h-1],'~'*(t-2))[j==h-(p-i)/2-2],(w-t)/2,t-2;print" "*s+"\\"+r+"/"+" "*s

기본적으로 버킷과 물의 높이와 너비를 계산하여 인쇄합니다.

시작시 추악한 while 루프 부분을 제거하려고 열심히 시도했습니다 (버킷의 높이와 물을 가져와야하는 높이를 계산합니다. 지금, 코드의 모든 줄은 너비를 계산하기위한 것입니다. 신장). 아직도 시도 : P

다른 경우에 대해 테스트-

>>> execfile("buckets.py")
(6, 2)
\~~~/
 \_/

(10, 4)
\~~~~~/
 \___/

(24, 8)
\        /
 \~~~~~~/
  \    /
   \__/

(42, 12)
\           /
 \         /
  \~~~~~~~/
   \     /
    \   /
     \_/

(90, 68)
\~~~~~~~~~~~~~~~~~~~~~/
 \                   /
  \                 /
   \               /
    \_____________/

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