ASCII 상수도


19

소개

다음 f A\/과 같은 문자의 그리드를 고려하십시오

f  f  f  
      A  
   A / \ 
\ /     A
    A \/ 
   /     
 \/         

어디:

  • f 아래로 물을 붓는 수도꼭지를 나타냅니다
  • A 정확히 절반은 왼쪽으로 가고 정확히 절반은 오른쪽으로갑니다.
  • \ 물의 흐름을 오른쪽으로 한 단위 씩 이동
  • / 물의 흐름을 한 단위 씩 왼쪽으로 이동
  • 이 조합 \/은 무한한 용량의 물통을 생성하여 그 위의 물 흐름을 수집합니다.
  • [space] 물이 지나갈 수있는 것보다 빈 공간입니다

이것으로부터 우리는 *수도꼭지에서 나오는 물통 ( )이 물마루로 들어가거나 격자 영역에서 떨어지는 경로를 상상할 수 있습니다.

f  f  f    <-- first second and third faucets
*  * *A* 
* *A*/ \*
\*/ *  *A  <-- a '*' is not drawn to the right of this A because it would be out of the 9×7 bounds
 * *A*\/   <-- upper trough
 **/ *   
 \/  *     <-- lower trough

3 개의 수도꼭지가 한 번에 같은 양의 물을 출력한다고 가정하면

  • 첫 번째 수도꼭지의 물은 모두 하단 통으로 이동합니다.
  • 두 번째 수도꼭지 물의 절반이 하단 트로프로 이동하고 나머지 절반이 하단 트로프 사이에서 분리되어 그리드에서 떨어집니다.
  • 세 번째 수도꼭지 물의 1/4은 하단 트로프로 가고, 1/4은 그리드 바닥에서 떨어지고, 1/4은 상단 트로프로 떨어지고, 1/4은 그리드에서 오른쪽으로 떨어집니다.

이것으로부터 우리는 (1 + 3/4 + 1/4 + 1/4) / 3 = 75%물이 물마루에 걸리고 (1/4 + 1/4 + 1/4) / 3 = 25%그리드에서 떨어 졌다는 것을 알 수 있습니다 .

도전 과제

이 ASCII 수류 설정과 관련하여 이러한 과제 중 일부 또는 전부를 완료 할 수 있습니다. 그것들은 모두 코드 골프이며, 각 도전에 대한 최단 답변이 승자입니다. 허용되는 답변은 전체 코드 길이가 타이 브레이커 인 가장 어려운 과제를 완수 한 사람입니다.

도전 과제 1
주어진 그리드에 물마루로 흐르는 물의 일부를 출력하는 프로그램을 작성하십시오. 위 예제의 결과는 간단합니다 0.75.

도전 과제 2
그리드가 주어 졌을 *때 위에서했던 것처럼 물이 흐르는 곳에서를 그리는 프로그램을 작성하십시오 . 공백 문자 이외의 것은 덮어 쓰지 말아야하며 격자 크기는 바뀌지 않아야합니다. 그래서 같은

 f
/A

물이 A의 양쪽으로 흐르지 만 물을 제거하지 않고 왼쪽 /으로 끌 수 없으며 2x2 격자를 더 크게 만들지 않으면 오른쪽으로 끌 수 없습니다.

도전 과제 3 (업데이트 됨)
두 개의 음이 아닌 정수, 총 T와 K를 유지하는 양 (T> = K)을 취하는 프로그램을 작성하십시오. f수도꼭지가 T 단위의 물을 부을 때 정확히 K가 물마루로 흘러 들어가도록 정확히 하나의 그리드를 생성하고 그립니다 . 특정 (T, K) 쌍에 대해 유한 그리드에서이를 수행 할 수없는 경우 '불가'를 출력하십시오.

설명 (모든 과제에 적용)

  • 입력은 stdin, 파일 또는 그리드의 문자열 표현에 대한 함수 호출을 통해 이루어질 수 있습니다. 다른 입력을 실행하는 방법을 분명히하십시오.
  • 출력은 stdout으로 이동해야합니다.
  • \AA/와 것은 AA예상대로 또한 쓰루 있습니다.
  • w by h 그리드는 항상 줄 바꿈을 계산하지 않는 w * h 문자의 올바른 형식의 사각형입니다. 누락 된 후행 공백과 발생이 없습니다 *.
  • 격자 치수는 1 × 1 정도로 작고 임의로 클 수 있습니다. (이유 내에서 임의로 큰 int.maxValue 등은 허용되는 한계입니다. T와 K도 마찬가지입니다.)
  • f바로 위의 흐름이 흐릅니다.
  • 수도꼭지는 맨 위 줄뿐만 아니라 어디든지 될 수 있습니다.
  • A 항상 물을 붓는 양을 정확히 반으로 나눕니다.

참고 : 유사 /A하고 //완벽하게 유효합니다. 물 캐릭터들 사이에서 자유롭게 흐릅니다. (도전 2에는 그것을 그릴 공간이 충분하지 않습니다.)

설정에서

ff

/A

왼쪽 f스트림이 쏟아져 내려와 /왼쪽으로 이동합니다. 오른쪽 f스트림은, 아래로 부어 명중 A절반 잘 가고 절반은 사이 왼쪽으로 간다 A하고 /.

예 :

 ff
 **
*/A*
** *
** *

3
+1 멋진 도전. 챌린지 3의 경우 상단의 그리드는 3 f초 이기 때문에 올바른 답변이 아닙니다.
edc65

@ edc65 아, 잘 잡아!
Calvin 's Hobbies


2
두 번째 과제의 /A경우 물이에 떨어지는 경우 와 같이 입력을 처리하는 방법을 지정해야 합니다 A. 모든 문제에 \A대해 여물통 인지 명확히하는 것이 좋습니다 . 세 번째 도전 과제에 대해, 3 개의 유닛 A이 분할 되는 것으로 가정 해야하는지 1.5 / 1.5(따라서 입력은 실제로 단일 합리적인 수) 2 / 1, 어느 쪽이 2?
피터 테일러

1
@PeterTaylor 감사합니다. 나는 그 요점을 명확히했다. 나는 T와 K가 float 일 수 있다고 생각하지만 간단하게 정수로 유지하고 있습니다. (그러나 T = 3이 맞으면 A양쪽 모두 1.5가됩니다. float 정밀도가 문제가되지 않도록하는 것은 코더에 달려 있습니다.)
Calvin 's Hobbies

답변:


3

모든 과제 C # 690 바이트 (416 바이트 + 274 바이트)

1 & 2 C를 # 도전 579 446 416bytes

이것은 도전 1과 2를 수행해야하는 완전한 프로그램입니다. 빈 줄을받을 때까지 stdin에서 입력 줄을 읽습니다. Challenge 2의 결과를 인쇄 한 다음 Challenge 1의 결과를 인쇄합니다. .NET 10 진수 클래스를 사용하여 반올림 오류를 피하십시오.

using C=System.Console;class P{static void Main(){decimal u,t=0,f=0;string c,z="";for(decimal[]n=null,o;(c=C.ReadLine())!="";z+='\n'){int s=c.Length,i=s,e;o=n;n=new decimal[s];for(o=o??n;i-->0;n[i]+=(e&2)*u/2){e=c[i]%13;u=o[i]/(e<1?2:1);if(e%8<1)if(i>0)if(c[i-1]%7<3)t+=u;else n[i-1]+=u;if(e<2)if(i<s-1)if(c[i+1]%2>0)t+=u;else n[i+1]+=u;if(e>9){u++;f++;}}for(;++i<s;)z+=c[i]<33&n[i]>0?'*':c[i];}C.WriteLine(z+t/f);}}

덜 골프 :

using C=System.Console;
class P
{
    static void Main()
    {
        decimal u,t=0,f=0;
        string c,z="";

        for(decimal[]n=null,o;(c=C.ReadLine())!="";z+='\n')
        {
            int s=c.Length,i=s,e;
            o=n;
            n=new decimal[s];
            for(o=o??n;i-->0;n[i]+=(e&2)*u/2)
            {
                e=c[i]%13;
                u=o[i]/(e<1?2:1);

                if(e%8<1)
                    if(i>0)
                        if(c[i-1]%7<3)t+=u;
                        else n[i-1]+=u;
                if(e<2)
                    if(i<s-1)
                        if(c[i+1]%2>0)t+=u;
                        else n[i+1]+=u;
                if(e>9)
                {
                    u++;
                    f++;
                }
            }
            for(;++i<s;)
                z+=c[i]<33&n[i]>0?'*':c[i];
        }

        C.WriteLine(z+t/f);
    }
}

시운전 (내가 약속 한 후행 공백이 없음) :

f  f  f
      A
   A / \
\ /     A
    A \/
   /
 \/

f  f  f
*  * *A*
* *A*/ \*
\*/ *  *A
 * *A*\/
 **/ *
 \/  *
0.75

챌린지 3 C # 274 바이트

이 프로그램은 Challenge 3을 완료해야하는 완벽한 프로그램입니다. 필자는 입력 값을 읽지 않고 자신의 정수 파서를 작성하여 6 바이트를 절약했습니다. Split 을 보내고 ReadLine및 사용 long.Parse;

using C=System.Console;class P{static void Main(){long t=-1,f=t,k;for(;f<0;)for(f=t,t=0;(k=C.Read())>47;)t=t*10+k-48;var r="Impossible\n";for(k=t;k<t*f;)k*=2;if(f<1||(k/f)*f==k)for(r=" f \n";t>0&t<f;t-=(t/f)*f)r+=((t*=2)<f?" ":"A")+"A \n/ /\n";C.Write(r+(t<f?"":"AAA\n"));}}

덜 골프 :

using C=System.Console;
class P
{
    static void Main()
    {
        long t=-1,f=t,k;
        for(;f<0;)
            for(f=t,t=0;(k=C.Read())>47;)
                t=t*10+k-48;

        var r="Impossible\n";
        for(k=t;k<t*f;)
            k*=2;
        if(f<1||(k/f)*f==k)
            for(r=" f \n";t>0&t<f;t-=(t/f)*f)
                r+=((t*=2)<f?" ":"A")+"A \n/ /\n";
        C.Write(r+(t<f?"":"AAA\n"));
    }
}

시운전 (내가 약속하는 후행 공간이 부족함) :

32 17
 f
AA
/ /
 A
/ /
 A
/ /
 A
/ /
AA
/ /

3

우선 도전에 관한 질문이 있습니다. 나는 그 질문에 대해 언급 할만 큼 평판이 좋지 않기 때문에 여기에 쓰고 있습니다.

  • /A(A로 흐르는 물), //(오른쪽으로 흐르는 물 ) 의 행동 과이 원리의 변형은 무엇입니까? 물이 측면의 첫 번째 "자유 지점"으로 흐르거나 이웃의 "아래"로 흐르나요?

간단한 시도로 단순화 할 수 있습니다 (이 게시물을 편집하여 나중에 수행 할 것입니다).

편집 : 약간 작은 두 번째 버전. 나는 다른 접근 방식을 택했다. 상단과 측면에서 나오는 것을 확인하기 위해 각 셀을 찾는 대신 수도꼭지에서 시작하여 재귀와 함께 아래쪽으로 "흐름"한다.

자바 스크립트, 226 바이트 (챌린지 1)

function f(c){function h(b,a,d,e){b<c.length&&0<=a&&a<c[0].length&&("\\"==c[b][a]?"/"==e||"A"==e?g+=d:h(b,a+1,d,"\\"):"/"==c[b][a]?"\\"==e||"A"==e?g+=d:h(b,a-1,d,"/"):"A"==c[b][a]?"A"==e||"\\"==e||"/"==e?g+=d:(h(b,a-1,d/2,"A"),h(b,a+1,d/2,"A")):h(b+1,a,d,c[b][a]))}for(var g=0,m=0,k=0;k<c.length;k++)for(var l=0;l<c[k].length;l++)"f"==c[k][l]&&(h(k+1,l,1),m++);alert(g/m)};

자바 스크립트, 204 바이트 (챌린지 2)

function f(c){function e(b,a,d){b<c.length&&0<=a&&a<c[0].length&&("\\"==c[b][a]?"/"!=d&&"A"!=d&&e(b,a+1,"\\"):"/"==c[b][a]?"\\"!=d&&"A"!=d&&e(b,a-1,"/"):"A"==c[b][a]?"A"!=d&&"\\"!=d&&"/"!=d&&(e(b,a-1,"A"),e(b,a+1,"A")):(" "==c[b][a]&&(c[b][a]="*"),e(b+1,a,c[b][a])))}for(var g=0;g<c.length;g++)for(var h=0;h<c[g].length;h++)"f"==c[g][h]&&e(g+1,h)};

자바 스크립트, 238 바이트 (챌린지 1 + 2)

function f(c){function h(b,a,d,e){b<c.length&&0<=a&&a<c[0].length&&("\\"==c[b][a]?"/"==e||"A"==e?g+=d:h(b,a+1,d,"\\"):"/"==c[b][a]?"\\"==e||"A"==e?g+=d:h(b,a-1,d,"/"):"A"==c[b][a]?"A"==e||"\\"==e||"/"==e?g+=d:(h(b,a-1,d/2,"A"),h(b,a+1,d/2,"A")):(" "==c[b][a]&&(c[b][a]="*"),h(b+1,a,d,c[b][a])))}for(var g=0,m=0,k=0;k<c.length;k++)for(var l=0;l<c[k].length;l++)"f"==c[k][l]&&(h(k+1,l,1),m++);alert(g/m)};

사용하는 방법

지도의 2 차원 표현을 제공하십시오. 다음은 질문에 제공된 예입니다.

var input = [["f"," "," ","f"," "," ","f"," "," "],[" "," "," "," "," "," ","A"," "," "],[" "," "," ","A"," ","/"," ","\\"," "],["\\"," ","/"," "," "," "," "," ","A"],[" "," "," "," ","A"," ","\\","/"," "],[" "," "," ","/"," "," "," "," "," "],[" ","\\","/"," "," "," "," "," "," "]];
f(input);

산출

도전 과제 1 : 결과가 담긴 대화 상자 (경고)를 생성합니다 (위 예제의 경우 0.75).

도전 과제 2 :지도를 직접 수정합니다. 인쇄해야합니까? 그렇다면 console.log가 허용됩니까? 유효한 출력으로?

도전 1 + 2 : 두 위의 결합 분명 ...


마치 A슬래시 의 선을 껴안는 것처럼 캐릭터 사이에 물이 계속 흐릅니다 . 나는 그 질문에서 그것을 분명히했다.
Calvin 's Hobbies

질문 상태Output must go to stdout.
user80551

입력 형식으로 지정하여 행당 하나의 문자열 배열을 제공하지만 str[0]문자열로 색인 을 생성 할 수 있습니다 . 그것은 문자 배열 대신 문자열 배열입니다.
tomsmeding

1
고마워, 왜 내 마음에서 빠져 나왔는지 모르겠다. 가능한 빨리 코드를 업데이트하겠습니다. @tomsmeding 예, 그것은 도전 1의 대답에 작동합니다. 그러나 도전 2의 경우 입력을 직접 수정하고 str [i]를 사용하여 문자열의 문자를 수정할 수 없으므로 배열 배열을 사용합니다.
refreshfr

2

Python 3, 186 바이트 (Challenge 3)

VisualMelon의 답변 에서 그리드에 대한 아이디어를 얻었습니다 . 이 기능은 가능하면 (유한 크기의 그리드) 가능한 경우 임의의 큰 T 및 K에 대해 유효한 그리드를 표준 출력으로 인쇄해야합니다.

from fractions import*
def c(T,K):
 p=print;g=gcd(T,K);K//=g;T//=g
 if T&(T-1):p('Impossible')
 else:
  p(' f ')
  while T-1:
   T//=2;p('A/'[K<T]+'A \n///')
   if K>=T:K-=T
  p('AAA'*K)

사용하는 방법

c인수로 유지할 총액과 금액으로 함수를 호출하십시오 .

>>> c(24, 9)
 f 
/A 
///
AA 
///
AA 
///

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