ASCII 아이스크림


15

양의 정수 N을받는 프로그램 또는 함수를 작성하고, 상단 절반은로 이루어진 반원 (이고 하단 반은 아래쪽을 가리키는 삼각형 인 NxN ASCII 아트 문자열을 인쇄하거나 반환합니다.V ' 패딩으로 사용되는 공백.

즉, ASCII 아이스크림 콘을 만듭니다 (N = 17의 출력).

      (((((      
    (((((((((    
  (((((((((((((  
  (((((((((((((  
 ((((((((((((((( 
 ((((((((((((((( 
(((((((((((((((((
(((((((((((((((((
VVVVVVVVVVVVVVVVV
 VVVVVVVVVVVVVVV 
  VVVVVVVVVVVVV  
   VVVVVVVVVVV   
    VVVVVVVVV    
     VVVVVVV     
      VVVVV      
       VVV       
        V        

N = 1에서 5까지의 출력은 다음과 같습니다. 홀수 N의 경우 삼각형은 항상 더 큰 반이어야합니다.

V

((
VV

(((
VVV
 V 

 (( 
((((
VVVV
 VV 

 ((( 
(((((
VVVVV
 VVV 
  V  

여기에 N = 101 페이스트 빈이 있습니다.

그리고 다음은 ungolfed Python 3 참조 구현입니다.

N = int(input())
ic = [[' '] * N for _ in range(N)]
for y in range(N//2):
    for x in range(N):
        if (x - (N - 1) / 2)**2 + (y - (N - 1) / 2)**2 < (N / 2)**2:
            ic[y][x] = '('
for y in range(N//2, N):
    for x in range(y - N//2, N - (y - N//2)):
        ic[y][x] = 'V'
for line in ic:
    print(''.join(line))

세부

  • stdin, 명령 행 또는 함수 인수로 입력하십시오. stdout 또는 이와 유사한 출력, 또는 함수를 작성하면 문자열을 반환 할 수 있습니다.
  • 원뿔 부분은 모든 N에 대한 참조 구현과 정확히 일치해야합니다.
  • 아이스크림 부분은 모든 N에 대해 반원 모양 인 한 참조 구현과 정확히 일치 할 필요 는 없습니다 . (따라서 반올림 오류로 인해 반원의 약간의 차이에 대해 걱정할 필요가 없습니다. .)
  • 불필요한 선행 공백은 없어야하지만 불필요한 후행 공백이있을 수 있습니다.
  • 출력에는 선택적으로 후행 줄 바꿈이 포함될 수 있습니다.
  • 선택적으로 어떤 다른 3 개 별개 사용할 수 있습니다 인쇄 가능한 ASCII 대신에 문자를 (, V그리고 공간.

채점

바이트 단위로 가장 짧은 제출 이깁니다. Tiebreaker는 가장 오래된 제출물로 이동합니다.


6
제목을 읽을 때 "IceCII ASCream"을 생각한 유일한 사람입니까?
Sp3000

15
@ Sp3000 Jeez, 그렇게 희망합니다 ...
Calvin 's Hobbies

답변:


7

CJam, 46 바이트

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

{:Z{Z{Z(2./:R-zYR<):P#YR-zP#+Z2./P#>SP?}/N}fY}

나는 이것이 현재 원래 사양을 정확하게 모방한다고 생각하며,이 답변을 생산하기 시작했을 때 필요했습니다. 수학을 원래 사양과 비교하여 정확도를 떨어 뜨리면 몇 바이트를 절약 할 수 있지만 1 ~ 2 바이트 이상을 절약 할 수있을 때까지 그대로 두겠습니다.

설명

{               "Begin block";
  :Z{             "For each y from 0 to input-1";
    Z{              "For each x from 0 to input-1";
      Z(2./:R         "Calculate the radius as (input-1)/2.0";
      -z              "Calculate the horizontal distance from the center";
      YR<):P          "Calculate the power to raise distances to: (y<radius)+1
                       (This results in Euclidean distance being calculated for
                        the ice cream and Manhattan distance being calculated
                        for the cone)";
      #               "Raise the horizontal distance to the determined power";
      YR-zP#          "Calculate the vertical distance from the center and
                       raise it to the determined power";
      +               "Add the horizontal and vertical distances";
      Z2./P#          "Calculate the solid distance threshold and raise it to
                       the determined power";
      >SP?            "If the solid threshold is exceeded, produce a space;
                       otherwise, produce the determined power digit
                       (This results in ice cream being represented by the
                        digit '2' and the cone by the digit '1')";
    }/              "End x loop";
    N               "Produce a new line";
  }fY             "End y loop";
}               "End block";

이 나타납니다 사용하기 2's와 1대신이야' (의와 V의?
Mark Reed

@MarkReed 허용됩니다. 세부 사항 섹션의 마지막 행.
Jakube

3

잉카 2 129 123 121 111 107

이것은 주로 파이썬 예제의 수식을 사용하지만 이중 반복 대신 jot-dots 및 iotas를 사용합니다. 이 i함수는 j함수에 대한 불러오는 함수에 대한 순환 테스트를 수행 합니다. 그리고 k함수 는 함수에 대한 삼각형 테스트를 수행합니다 l. c함수의 결과를 catenates j하고 l및 N × N으로 고쳐.

편집 : -6 2 맵을 1로 결합
편집 : -2 쓸모없는 라벨을 제거합니다.
편집 : 더 좋은 typescript.
편집 : -10 반복 식을 배열 방식으로 적용합니다.
편집 : -4 반복 표현을 함수로 분해 합니다.
편집 : 라인 별 주석.

q:y-(n-1)%2
i:[((n%2)^2)>+/(qx y)^2
j:(~[y%2)i.(~y)
k:2*[x>[|qy
l:(@1+~]y%2)k.(~y)
c:y y#((jn<y),ly){' (V' 

더 자세하게, 진입 점은 c하나의 인수를 내재적으로 명명 하는 함수입니다 y.

c:y y#((jn<y),ly){' (V' 
         n<y            } assign y to 'n'
        jn<y            } call j(y)
              ly        } call l(y)
      ((    ),  )       } catenate the results
      (         ){' (V' } map 0 1 2 to ' ' '(' 'V'
  y y#                  } reshape to NxN

j함수는 동일한 입력 값을 수신하는 y파라미터.

j:(~[y%2)i.(~y)
     y%2         } y divided by 2
    [            } floor
   ~             } iota. this generates the row indices 0..y/2
            ~y   } iota y. this generates the column indices 0..y
  (     )i.(  )  } jot-dot with the function i

여기서 요점은 이중 루프를 수행합니다. i왼쪽 및 오른쪽 배열 (0..n / 2 및 0..n)의 모든 요소 조합으로 함수를 호출합니다 . 따라서 i함수는 테이블 xy 인덱스로 수신 y하고 x 인덱스 로 수신 합니다 . 이름은 여기에서 약간 거꾸로되었습니다 :).

i:[((n%2)^2)>+/(qx y)^2
     n%2                 } n divided by 2
    (n%2)^2              } squared
                 x y     } make a 2-element array (x,y)
                qx y     } call q on this array

어디 q않습니다

q:y-(n-1)%2
     n-1    } n minus 1
         %2 } divided by 2
  y-        } y minus that

돌아가다 i

i:[((n%2)^2)>+/(qx y)^2
               (    )^2  } square the result from q(x,y)
             +/          } sum the two numbers
            >            } compare the left side (above) with the right (=> 0/1)
  [                      } floor

바닥은 필요하지 않습니다. 그러나 통역사에 버그가있는 것 같습니다.

l기능은 j점을 사용하여 기능 과 유사하게 작동합니다 .

l:(@1+~]y%2)k.(~y)
        y%2         } y divided by 2
       ]            } ceiling
      ~             } iota 0..ceil(y/2)-1
    1+              } add 1 => 1..ceil(y/2)
   @                } reverse => ceil(y/2)..1
               ~y   } iota y  0..y-1
  (        )k.(  )  } jot-dot using k

k함수는 2로 스케일 된 부울을 생성하므로 맵핑에서 나중에 값을 아이스크림 값과 구별 할 수 있습니다.

k:2*[x>[|qy
     x       } k's left arg
         qy  } y-(n-1)%2
        |    } abs
       [     } floor
     x       } left-hand-side again
      >      } compare 
    [        } floor (should be unnecessary)
  2*         } scale by 2

작동 중 ( trREPL의 프롬프트 인 탭 문자 제거 를 위해 파이프 연결 ) :

josh@Z1 ~/inca
$ ./inca2 <icecream | tr -d '\t'

c1
V

c2
((
VV

c3
(((
VVV
 V 

c4
 (( 
((((
VVVV
 VV 

c5
 ((( 
(((((
VVVVV
 VVV 
  V  

josh@Z1 ~/inca
$ 

2

파이썬 2, 193 (192)

문자열을 사용하지 않고 수학 만 사용합니다

N=input()
R=(N+1)/2;r=range(R)
s=lambda L,U:(10**U-10**L)/9
f=lambda N,m:s(0,N)+s(m,N-m)
g=lambda N,m:s(0,N)+s(m,N-m)*6
for i in r[1:]:print f(N,int(R-(2*R*i-i*i)**.5))
for i in r:print g(N,i)

s(L,U)폼의 반환 번호가 " U맨 오른쪽으로 -digits L제로 나머지 것들"
f(N,m)복귀의 내면 부와 N 자리수 2와의 m 차원의 경계 1양쪽
g(N,m)않는 같지만 사용 7'색상'을위한 콘의 질감과 더 밀접하게 일치하기 때문에

산출

N=8         N=9
11122111    112222211
12222221    122222221
22222222    222222222
22222222    222222222
77777777    777777777
17777771    177777771
11777711    117777711
11177111    111777111
            111171111

매우 독특한 방법 :)
Calvin 's Hobbies

아이스크림 만 볼 수 있다면 : P
Optimizer

2

펄 6, 175

많은 골프를 들이지 않고 매우 간단한 구현 / 불필요한 공백 / 문장 부호 제거 :

sub MAIN($d){my$r=($d/2).Int;for 1..$r ->$n
{my$y=$n-$r;my$h=sqrt($r*$r-$y*$y).Int;my$w=2*$h+$d%2;say
' 'x($r-$h)~'('x$w};for 1..($d-$r) ->$y {say ' 'x($y-1)~'V'x($d-2*$y+2)}}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.