코드 골프-파이 데이


95

도전

SO의 코드 골프 가이드 라인

문자 수에 따른 가장 짧은 코드는 문자를 R사용하여 반경 원의 표현을 표시하고 *그 뒤에 근사값 π를 표시합니다.

입력은 단일 숫자 R입니다.

대부분의 컴퓨터의 비율은 거의 2 : 1 인 것처럼 보이므로 y홀수 인 라인 만 출력해야합니다 . 이것은 R이상 할 때 R-1라인 을 인쇄해야 함을 의미합니다 . R=13명확히하기 위한 새로운 테스트 케이스가 있습니다 .

예.

Input
    5
Output      Correct                          Incorrect

        3    *******                    4      *******
        1   *********                   2     *********
       -1   *********                   0    ***********
       -3    *******                   -2     *********
           2.56                        -4      *******
                                            3.44

편집 :의 홀수 값으로 인한 광범위한 혼란으로 인해 R아래 주어진 4 가지 테스트 사례를 통과하는 모든 솔루션이 허용됩니다.

π의 근사치는 *문자 수의 두 배를로 나눈 값 입니다.
근사는 6 개 이상의 유효 숫자로 정확해야합니다.
선행 또는 후행 0은 그래서 예를 들어 어떤의 허용됩니다 3, 3.000000, 003의 입력에 대해 수락 2하고 4.

코드 수에는 입력 / 출력 (즉, 전체 프로그램)이 포함됩니다.

테스트 케이스

Input
    2
Output
     *** 
     *** 
    3.0

Input
    4
Output
      *****  
     ******* 
     ******* 
      *****  
    3.0

Input
    8
Output
         *******     
      *************  
     *************** 
     *************** 
     *************** 
     *************** 
      *************  
         *******     
    3.125

Input
    10
Output
          *********      
       ***************   
      *****************  
     ******************* 
     ******************* 
     ******************* 
     ******************* 
      *****************  
       ***************   
          *********      
    3.16

보너스 테스트 케이스

Input
    13
Output

           *************       
        *******************    
       *********************   
      ***********************  
     ************************* 
     ************************* 
     ************************* 
     ************************* 
      ***********************  
       *********************   
        *******************    
           *************                                          
    2.98224852071

"입력"이 명령 줄에 있는지 아니면 stdin에 있는지 명확히 할 수 있습니다.
Greg Hewgill

1
@Greg Hewgill, 사용중인 언어에 가장 편리한 것을 선택하십시오. :)
John La Rooy

@Greg Hewgill, 일부 (즉, 극소수의) 프로그래밍 언어 구현에는 "명령 줄"개념이 없습니다.
Joey Adams

1
나는 y가 홀수 인 줄만 놓는 규칙을 따르는 답이 거의 없다는 것을 알았습니다. r의 홀수 값 (테스트 케이스에 표시되지 않음)이 주어지면 대부분은 y가 짝수 인 라인을 출력합니다!
MtnViewMark

6
규칙 남용 문제 : 4 개의 필수 테스트 사례 지원하여 다른 사람의 코드보다 짧은 코드를 만듭니다 .
Brian

답변:


15

dc에서 : 88 및 93 93 94 96102105129138141 자

혹시라도 저는 OpenBSD와이 시점에서 이식 할 수없는 확장을 사용하고 있습니다.

93 자 이는 FORTRAN 솔루션과 동일한 공식을 기반으로합니다 (테스트 케이스와 약간 다른 결과). 모든 Y에 대해 X ^ 2 = R ^ 2-Y ^ 2 계산

[rdPr1-d0<p]sp1?dsMdd*sRd2%--
[dd*lRr-vddlMr-32rlpxRR42r2*lpxRRAP4*2+lN+sN2+dlM>y]
dsyx5klNlR/p

88 자 반복적 인 솔루션. 테스트 케이스와 일치합니다. 모든 X 및 Y에 대해 X ^ 2 + Y ^ 2 <= R ^ 2인지 확인합니다.

1?dsMdd*sRd2%--sY[0lM-[dd*lYd*+lRr(2*d5*32+PlN+sN1+dlM!<x]dsxxAPlY2+dsYlM>y]
dsyx5klNlR/p

실행하려면 dc pi.dc.

다음은 주석이 추가 된 이전 버전입니다.

# Routines to print '*' or ' '. If '*', increase the counter by 2
[lN2+sN42P]s1
[32P]s2
# do 1 row
# keeping I in the stack
[
 # X in the stack
 # Calculate X^2+Y^2 (leave a copy of X)
 dd*lYd*+ 
 #Calculate X^2+Y^2-R^2...
 lR-d
 # .. if <0, execute routine 1 (print '*')
 0>1
 # .. else execute routine 2 (print ' ')
 0!>2 
 # increment X..
 1+
 # and check if done with line (if not done, recurse)
 d lM!<x
]sx
# Routine to cycle for the columns
# Y is on the stack
[
  # push -X
  0lM- 

  # Do row
  lxx 
  # Print EOL
  10P
  # Increment Y and save it, leaving 2 copies
  lY 2+ dsY 
  # Check for stop condition
  lM >y
]sy
# main loop
# Push Input value
[Input:]n?
# Initialize registers
# M=rows
d sM
# Y=1-(M-(M%2))
dd2%-1r-sY
# R=M^2
d*sR
# N=0
0sN
[Output:]p
# Main routine
lyx
# Print value of PI, N/R
5klNlR/p

1
Linux dc에서는 작동하지 않지만 openbsd에서는 작동하는지 확인할 수 있습니다 . 대박!
John La Rooy

@Carlos, 네, (운영자는 확실히 편리합니다. 너무 나쁜 그것은 리눅스와 함께 제공되는 DC에서 구현되지 않은 남아
존 라 Rooy

@gnibbler- "bn (3) 큰 숫자 루틴을 사용한 dc 명령의 완전한 재 작성은 OpenBSD 3.5에서 처음 등장했습니다." 나는 그것을 몰랐다. 일부 멋진 새 연산자가 포함되어 있지만 "이동 불가능한 확장"으로 표시되어 있습니다.
Carlos Gutiérrez

그래, (연산자 혼자서 6 스트로크를 흘릴 수 있었다!
Dan Andreatta

119

C : 131 자

(Joey의 C ++ 솔루션 기반)

main(i,j,c,n){for(scanf("%d",&n),c=0,i|=-n;i<n;puts(""),i+=2)for(j=-n;++j<n;putchar(i*i+j*j<n*n?c++,42:32));printf("%g",2.*c/n/n);}

(변경을 i|=-n하는 i-=n홀수의 경우 지지체를 제거한다. 이것은 단지 130 문자 카운트를 감소)

원으로 :

      main(i,j,
   c,n){for(scanf(
  "%d",&n),c=0,i=1|
 -n;i<n;puts(""),i+=
 0x2)for(j=-n;++j<n;
 putchar(i*i+j*j<n*n
 ?c++,0x02a:0x020));
  printf("%g",2.*c/
   n/n);3.1415926;
      5358979;}

1
코드에 원을 추가하여 원으로 바꾸는 방법이 마음에 듭니다. +000이 더 좋을까요?
Potatoswatter

축하합니다, j * j ++는 정의되지 않은 동작입니다
sellibitze

1
그게 하나의 캐릭터가 아닐까요 ...?
Ponkadoodle

1
main()네 가지 int주장을 어떻게 받아들이 나요?
David R Tribble

2
@Load : 5.1.2.2.1 / 1 : 프로그램 시작시 호출되는 함수의 이름은 main. 그것은 정의되어야한다… 또는 다른 구현 정의 방식으로 정의되어야한다 . 구현이이 형식을 받아 들일 수 있기 때문입니다.
kennytm 2010 년

46

XSLT 1.0

재미로 여기 XSLT 버전이 있습니다. 실제로 코드 골프 자료는 아니지만 이상한 기능의 XSLT 방식으로 문제를 해결합니다. :)

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt" >
  <xsl:output method="html"/>

  <!-- Skip even lines -->
  <xsl:template match="s[@y mod 2=0]">
    <xsl:variable name="next">
      <!-- Just go to next line.-->
      <s R="{@R}" y="{@y+1}" x="{-@R}" area="{@area}"/>
    </xsl:variable>
    <xsl:apply-templates select="msxsl:node-set($next)"/>
  </xsl:template>

  <!-- End of the line?-->
  <xsl:template match="s[@x &gt; @R]">
    <xsl:variable name="next">
      <!-- Go to next line.-->
      <s R="{@R}" y="{@y+1}" x="{-@R}" area="{@area}"/>
    </xsl:variable><!-- Print LF-->&#10;<xsl:apply-templates 
      select="msxsl:node-set($next)"/>
  </xsl:template>

  <!-- Are we done? -->
  <xsl:template match="s[@y &gt; @R]">
    <!-- Print PI approximation -->
    <xsl:value-of select="2*@area div @R div @R"/>
  </xsl:template>

  <!-- Everything not matched above -->
  <xsl:template match="s">
    <!-- Inside the circle?-->
    <xsl:variable name="inside" select="@x*@x+@y*@y &lt; @R*@R"/>
    <!-- Print "*" or " "-->
    <xsl:choose>
      <xsl:when test="$inside">*</xsl:when>
      <xsl:otherwise>&#160;</xsl:otherwise>
    </xsl:choose>

    <xsl:variable name="next">
      <!-- Add 1 to area if we're inside the circle. Go to next column.-->
      <s R="{@R}" y="{@y}" x="{@x+1}" area="{@area+number($inside)}"/>
    </xsl:variable>
    <xsl:apply-templates select="msxsl:node-set($next)"/>
  </xsl:template>

  <!-- Begin here -->
  <xsl:template match="/R">
    <xsl:variable name="initial">
      <!-- Initial state-->
      <s R="{number()}" y="{-number()}" x="{-number()}" area="0"/>
    </xsl:variable>
    <pre>
      <xsl:apply-templates select="msxsl:node-set($initial)"/>
    </pre>
  </xsl:template>
</xsl:stylesheet>

테스트하려면 다른 이름으로 저장하고 pi.xsltIE에서 다음 XML 파일을 엽니 다.

<?xml version="1.0"?> 
<?xml-stylesheet href="pi.xslt" type="text/xsl" ?> 
<R> 
  10 
</R> 

42
나의 <eyes> </ eyes>! 고글, 그들은 <하지 않습니다 </ do>!
Jimmy

1
댕! D : 나는 당신이 고유성 내 하이퍼 솔루션을 구타 수도 두려워
조이 아담스

7
나는 당신이 "open ... IE"라고 말한 것을 믿을 수 없다
harpo

예, 예전에는 IE 만 있었고 XSLT가있는 XML은 모든 문제에 대한 해결책이었습니다. 좋은 옛날! :)
Danko Durbić 2010 년

XSL 버전 1.0 와우, 버전 2를 고대했던 기억이납니다.하지만 출시 될 무렵에는 이미 진행했습니다.
gradbot

35

Perl, 95 96 99 106 109 110 119 문자 :

$t+=$;=1|2*sqrt($r**2-($u-2*$_)**2),say$"x($r-$;/2).'*'x$;for 0..
($u=($r=<>)-1|1);say$t*2/$r**2

(개행은 제거 할 수 있으며 스크롤바를 피하기 위해서만 존재합니다)

예이! 서클 버전!

    $t+=$;=
 1|2*sqrt($r**
2-($u-2*$_)**2)
,say$"x($r-$;/2
).'*'x$;for 0..
($u=($r=<>)-1|1
 );$pi=~say$t*
    2/$r**2

시작하지 않은 경우 긴 버전 :

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

# Read the radius from STDIN
my $radius = <>;

# Since we're only printing asterisks on lines where y is odd,
# the number of lines to be printed equals the size of the radius,
# or (radius + 1) if the radius is an odd number.
# Note: we're always printing an even number of lines.
my $maxline = ($radius - 1) | 1;

my $surface = 0;

# for ($_ = 0; $_ <= $maxline; $_++), if you wish
for (0 .. $maxline) {
    # First turn 0 ... N-1 into -(N/2) ... N/2 (= Y-coordinates),
    my $y = $maxline - 2*$_;

    # then use Pythagoras to see how many stars we need to print for this line.
    # Bitwise OR "casts" to int; and: 1 | int(2 * x) == 1 + 2 * int(x)
    my $stars = 1 | 2 * sqrt($radius**2-$y**2);
    $surface += $stars;    

    # $" = $LIST_SEPARATOR: default is a space,
    # Print indentation + stars 
    # (newline is printed automatically by say)
    say $" x ($radius - $stars/2) . '*' x $stars;
}

# Approximation of Pi based on surface area of circle:
say $surface*2/$radius**2;

6
즉 지금까지 내 평생 본 것 중 가장 읽을 수없는 코드
크리스 Marisic

13
나는 당신이 APL을 본 적이 없다고 생각합니다.
Peter Wone

5
@Chris Marisic : 태그 된 다른 질문 / 주제를 확인 했습니까 code-golf? :) 훨씬 더 읽을 수없는 예를 보았습니다.
BalusC

3
@Peter : 대부분과는 달리 APL을보고 작성했습니다. 특수 문자에 익숙해지는 데 몇 주가 걸리지 만 그 후에는 꽤 읽을 수 있습니다. 익숙해지기까지 수십 년이 지난 후에도 Perl은 여전히 ​​훨씬 더 나쁩니다.
제리 관

1
111 자,$r=<>;$t+=$n=1+2*int sqrt($r**2-($u-2*$_)**2),print$"x($r-$n/2).'*'x$n.$/for(0..($u=$r-1+$r%2));print$t*2/$r**2
Hasturkun

25

FORTRAN-101 자

$ f95 piday.f95 -o piday && echo 8 | ./piday


READ*,N
DO I=-N,N,2
M=(N*N-I*I)**.5
PRINT*,(' ',J=1,N-M),('*',J=0,M*2)
T=T+2*J
ENDDO
PRINT*,T/N/N
END


    READ*,N
  K=N/2*2;DO&
 I=1-K,N,2;M=&
(N*N-I*I)**.5;;
PRINT*,(' ',J=&
1,N-M),('*',J=&
0,M*2);T=T+2*J;
 ENDDO;PRINT*&
  ,T/N/N;END;
    !PI-DAY

잠시만 요, Fortran에서는 서식이 중요 했지만요? 1 열에 글자가 있습니다!
Joel

대부분의 사람들은 내가 본 것에서 여전히 Fortan77에 붙어 있습니다.
Joel

8
서클 버전이 데스 스타처럼 보이는 것이 마음에 듭니다.
mskfisher 2010

22

x86 머신 코드 : 127 바이트

인텔 어셈블러 : 490 자

    mov si,80h
    mov cl,[si]
    jcxz ret
    mov bx,10
    xor ax,ax
    xor bp,bp
    dec cx
  a:mul bx
    mov dl,[si+2]
    sub dl,48
    cmp dl,bl
    jae ret
    add ax,dx
    inc si
    loop a
    mov dl,al
    inc dl
    mov dh,al
    add dh,dh
    mov ch,dh
    mul al
    mov di,ax
  x:mov al,ch
    sub al,dl
    imul al
    mov si,ax
    mov cl,dh
  c:mov al,cl
    sub al,dl
    imul al
    add ax,si
    cmp ax,di
    mov al,32
    ja y
    or al,bl
    add bp,2
  y:int 29h
    dec cl
    jnz c
    mov al,bl
    int 29h
    mov al,13
    int 29h
    sub ch,2
    jnc x
    mov ax,bp
    cwd
    mov cl,7
  e:div di
    cmp cl,6
    jne z
    pusha
    mov al,46
    int 29h
    popa
  z:add al,48
    int 29h
    mov ax,bx
    mul dx
    jz ret
    dec cl
    jnz e
    ret

이 버전은 보너스 테스트 케이스도 처리하며 133 바이트입니다.

    mov si,80h
    mov cl,[si]
    jcxz ret
    mov bx,10
    xor ax,ax
    xor bp,bp
    dec cx
  a:mul bx
    mov dl,[si+2]
    sub dl,48
    cmp dl,bl
    jae ret
    add ax,dx
    inc si
    loop a
    mov dl,al
    rcr dl,1
    adc dl,dh
    add dl,dl
    mov dh,dl
    add dh,dh
    dec dh
    mov ch,dh
    mul al
    mov di,ax
  x:mov al,ch
    sub al,dl
    imul al
    mov si,ax
    mov cl,dh
  c:mov al,cl
    sub al,dl
    imul al
    add ax,si
    cmp ax,di
    mov al,32
    jae y
    or al,bl
    add bp,2
  y:int 29h
    dec cl
    jnz c
    mov al,bl
    int 29h
    mov al,13
    int 29h
    sub ch,2
    jnc x
    mov ax,bp
    cwd
    mov cl,7
  e:div di
    cmp cl,6
    jne z
    pusha
    mov al,46
    int 29h
    popa
  z:add al,48
    int 29h
    mov ax,bx
    mul dx
    jz ret
    dec cl
    jnz e
    ret

12
저는 StackOverflow를 좋아합니다!
zengr 2010 년

2
일부 고급 언어는 이로 인해 생성되는 바이너리보다 문자 수가 더 짧다는 것이 흥미 롭습니다.
Colin Valliant

3
@Alcari : 상위 수준 언어에서 사용하는 라이브러리에 모든 코드를 포함하면 문자 수가 훨씬 더 많아집니다. 어셈블러에서 수행하는 printf("%f",a/b)것은 사소한 일 이 아니며 수행하는 단일 명령이 없으며 위의 구현에서는 0 <= a / b <10이고 작업이 나눗셈이고 a와 b가 정수라고 가정합니다.
Skizz

19

파이썬 : 101 개 104 107 110 문자

Nicholas Riley의 다른 Python 버전을 기반으로합니다.

r=input()
t=0
i=1
exec"n=1+int((2*i*r-i*i)**.5)*2;t+=2.*n/r/r;print' '*(r-n/2)+'*'*n;i+=2;"*r
print t

수학의 일부를 위해 AlcariTheMad에 대한 크레딧.


아, 홀수 번호는 중간이 0으로 색인되어 모든 것을 설명합니다.

보너스 Python : 115 자 (빠르게 함께 해킹 됨)

r=input()
t=0
i=1
while i<r*2:n=1+int((2*i*r-i*i)**.5)*2;t+=2.*n/r/r;print' '*(r-n/2)+'*'*n;i+=2+(r-i==2)*2
print t

와, 예, '+'는 -1 및, 어느 날보다 낫습니다. 이 :-) 옳은 일 거의 절대 없기 때문에 또 다른 기술은 내 마음을 넣어
니콜라스 라일리

나는 과거에 C를 사용했고 파이썬을 본 적이 없다. 이 104 개의 문자는 위의 C ++보다 더 읽기 쉽습니다. 놀랄 만한. 어쩌면 내가 파이썬 ... 배워야한다
딘 오히려

@Dean : Python의 주요 목표 중 하나는 읽고 쓰기가 쉬워지는 것입니다.
Colin Valliant

104 자 대답과 함께 exec를 사용하는 것에 대해 알고 있습니까? :)
John La Rooy

내 자신의 압축을 롤링해야합니다. zlib, 마샬링 등은 모두 실제 코드보다 크게 나왔습니다.
lunixbochs

12

파워 쉘, 119 113 109 자

($z=-($n=$args[($s=0)])..$n)|?{$_%2}|%{$l="";$i=$_
$z|%{$l+=" *"[$i*$i+$_*$_-lt$n*$n-and++$s]};$l};2*$s/$n/$n

그리고 여기에 더 예쁜 버전이 있습니다.

( $range = -( $R = $args[ ( $area = 0 ) ] ) .. $R ) | 
  where { $_ % 2 } |
  foreach {
    $line = ""
    $i = $_
    $range | foreach {
        $line += " *"[ $i*$i + $_*$_ -lt $R*$R -and ++$area ]
    }
    $line
 }
 2 * $area / $R / $R

@Thor : 아니길 바래요,하지만 이건 제가 쓴 것 중 가장 추악한
것임에 틀림 없어요

3
그 예쁜 버전 주셔서 감사합니다 =)
토르 Hovden

10

HyperTalk : 237 자

들여 쓰기가 필요하지도 계산되지도 않습니다. 명확성을 위해 추가되었습니다. 또한 HyperCard 2.2는 내가 사용한 ASCII가 아닌 관계 연산자를 허용합니다.

function P R
  put""into t
  put 0into c
  repeat with i=-R to R
    if i mod 2≠0then
      repeat with j=-R to R
        if i^2+j^2≤R^2then
          put"*"after t
          add 1to c
        else
          put" "after t
        end if
      end repeat
      put return after t
    end if
  end repeat
  return t&2*c/R/R
end P

HyperCard 2.2는 stdin / stdout을 지원하지 않으므로 대신 함수가 제공됩니다.


1
하이퍼 카드, 아담스 씨? 정말? 이것은 매우 예상치 못한 일입니다.
Kawa

1
@Kawa : 그것이 제가 그것을 게시 한 이유입니다. :) 또한, 코드 골프는 제가 미래에 HyperTalk 인터프리터를 작성하기로 결정한 경우에 대비하여 테스트 스위트를 구축하는 좋은 방법입니다.
Joey Adams

하! 저는 그것을보고 싶습니다, XD
Kawa

그 통역사를 쓰기로 결정했거나 기존 통역사에 참여하고 싶다면 알려 주시면 hypercard.org에 이에 대한 언급을 추가 할 수 있습니다. 어떻게 진행되는지 궁금합니다. :-)
uliwitness

10

C # : 209202201 자 :

using C=System.Console;class P{static void Main(string[]a){int r=int.Parse(a[0]),s=0,i,x,y;for(y=1-r;y<r;y+=2){for(x=1-r;x<r;s+=i)C.Write(" *"[i=x*x+++y*y<=r*r?1:0]);C.WriteLine();}C.Write(s*2d/r/r);}}

축소되지 않음 :

using C = System.Console;
class P {
  static void Main(string[] arg) {
    int r = int.Parse(arg[0]), sum = 0, inside, x, y;
    for (y = 1 - r; y < r; y += 2) {
      for (x = 1 - r; x < r; sum += inside)
        C.Write(" *"[inside = x * x++ + y * y <= r * r ? 1 : 0]);
      C.WriteLine();
    }
    C.Write(sum * 2d / r / r);
  }
}

나는 C #을 잘 모르지만 (대신 ) string[]a및 사용할 수 없어야 합니까? 1-r-1+r
케니 TM

@ 케니 : 당신이 맞습니다. :) 3 개의 문자를 절약하고 5 개의 문자를 더 제거했습니다.
Guffa

첫 번째 것을 발견하고 완전히 놓쳤습니다 -r+1.
Dykam

4
또한 더럽혀 x*xx+++y*y졌지만 한눈에 해부하는 것은 미친 짓입니다.
Dykam

나는 또 다른 바이트를 제거 할 자유를 얻었습니다 ;-)
Joey

10

하스켈 139 145 147 150 230 개 문자를 :

x True=' ';x _='*'
a n=unlines[[x$i^2+j^2>n^2|j<-[-n..n]]|i<-[1-n,3-n..n]]
b n=a n++show(sum[2|i<-a n,i=='*']/n/n)
main=readLn>>=putStrLn.b

홀수 처리 : 148 자 :

main=do{n<-readLn;let{z k|k<n^2='*';z _=' ';c=[[z$i^2+j^2|j<-[-n..n]]|i<-[1,3..n]];d=unlines$reverse c++c};putStrLn$d++show(sum[2|i<-d,i=='*']/n/n)}

150 자 : (C 버전 기준)

a n=unlines[concat[if i^2+j^2>n^2then" "else"*"|j<-[-n..n]]|i<-[1-n,3-n..n]]
main=do n<-read`fmap`getLine;putStr$a n;print$2*sum[1|i<-a n,i=='*']/n/n

230 자 :

main = do {r <-read`fmap`getLine; let {p = putStr; d = 2 / fromIntegral r ^ 2; lyn = let cmx = if x> r then p "\ n">> x 인 경우 m else 반환 * x + y * y <r * r then p "*">> c (m + d) (x + 1) else p "">> cm (x + 1) in if y> r then print n else cn (-r) >> = l (y + 2)}; l (1-r`mod`2-r) 0}

축소되지 않음 :

main = do r <-read`fmap` getLine
          let p = putStr
              d = 2 / fromIntegral r ^ 2
              lyn =하자 cmx = if x> r
                                  그런 다음 p "\ n">> m을 반환합니다.
                                  그렇지 않으면 x * x + y * y <r * r
                                       그런 다음 p "*">> c (m + d) (x + 1)
                                       그렇지 않으면 p "">> cm (x + 1)
                      y> r 인 경우
                         그런 다음 n을 인쇄하십시오.
                         그렇지 않으면 cn (-r) >> = l (y + 2)
          l (1-r`mod`2-r) 0

나는 그것이 명령형 버전 중 일부를 능가하기를 바라고 있었지만이 시점에서 더 이상 압축 할 수없는 것 같습니다.


이상의 "/ fromIntegral R ^ 2 * N 2 인쇄"다음 "D"치우는 대신 그것의 1을 첨가하여 2 잘려
스티브

몇 가지 Haskell 트릭을 통해 3 명의 캐릭터를 줄였습니다. Haskell에서는 종종 여러 줄 (줄 바꿈 대 세미콜론)에 비용이 들지 않으므로 코드 골프는 일반적으로 읽을 수 있습니다!
MtnViewMark

엄밀히 말하면 145 자 버전은 입력이 짝수 인 경우에만 작동합니다. 그러나 어느 쪽이든 아주 좋습니다.
Steve

I / O 라인을 줄였습니다. 함수 정의를 main = do {... let {...} ...} 블록에 밀어 넣어 몇 개의 문자를 더 저장할 수 있어야한다고 생각합니다.
comingstorm

@comingstorm : 좋아요! readLn에 대해 몰랐습니다. 이것은 많은 Haskell 코드 골프를 도울 것입니다. @Steve : 그래, 나는 여전히 그것을 고치는 가장 효율적인 방법을 찾으려고 노력하고 있습니다.
MtnViewMark 2010 년

10

Ruby, 96 자

(Guffa의 C # 솔루션 기반) :

r=gets.to_f
s=2*t=r*r
g=1-r..r
g.step(2){|y|g.step{|x|putc' * '[i=t<=>x*x+y*y];s+=i}
puts}
p s/t

109 자 (보너스) :

r=gets.to_i
g=-r..r
s=g.map{|i|(g.map{|j|i*i+j*j<r*r ?'*':' '}*''+"\n")*(i%2)}*''
puts s,2.0/r/r*s.count('*')

감사! 나는 :) ... 루비가 얼마나 읽을보고 당황 해요
믈라덴 Jablanović을

p s대신 사용할 수도 있습니다. puts s:)
John La Rooy

1
거기에 좋은 신선한 아이디어 - 내가 좋아하는 당신은 2 개 개의 다른 스텝 크기로 g을 사용하고 있으며이 <=> 논리로 변환하는 코드를 피하기 위해 것을
존 라 Rooy

9

PHP : 117

dev-null-dweller 기반

for($y=1-$r=$argv[1];$y<$r;$y+=2,print"\n")for($x=1-$r;$x<$r;$x++)echo$r*$r>$x*$x+$y*$y&&$s++?'*':' ';echo$s*2/$r/$r;

8

너희들은 너무 열심히 생각하고있다.

switch (r) {
   case 1,2:
      echo "*"; break;
   case 3,4:
      echo " ***\n*****\n ***"; break;
   // etc.
}

8
문자 수는 손에서 약간 벗어납니다. 그렇지 않습니까? :)
John La Rooy

7
확장되지 않습니다. 유지할 수 없습니다!
spoulson 2010 년

가능한 한 많이 테스트 케이스 치트를 압축 해 보았지만 여전히 실제 솔루션보다 약간 더 큰 결과를
얻었습니다

5
+1, 항상 가장 분명한 일을 먼저합니다 ... 누군가가 그것을 좋아하지 않는다면, 사양이 충분히 명확하지 않다고 큰 소리로 불평합니다
Mizipzor

Brian은 테스트 케이스를 특수 케이스로 지정하는 데 약간의 진지한 시도를했습니다.이 답변이 마음에 들면 그의 답변도 찬성해야합니다.) stackoverflow.com/questions/2457995
John La Rooy

7

J : 47 , 46 , 45

다른 솔루션과 동일한 기본 아이디어, 즉 r ^ 2 <= x ^ 2 + y ^ 2 이지만 J의 배열 지향 표기법은 표현식을 단순화합니다.

c=:({&' *',&":2*+/@,%#*#)@:>_2{.\|@j./~@i:@<:

당신은 그것을 c 2또는c 8 또는 c 10

보너스 : 49

예를 들어 13, 홀수 입력을 처리하려면 단순히 출력의 다른 모든 행을 취하는 대신 홀수 값 x 좌표를 필터링해야합니다 (이제 인덱스는 짝수 또는 홀수에서 시작할 수 있기 때문입니다). 이 일반화 비용은 4 자입니다.

c=:*:({&' *'@],&":2%(%+/@,))]>(|@j./~2&|#])@i:@<:

축소 버전 :

c =: verb define
  pythag   =. y > | j./~ i:y-1    NB.  r^2 > x^2 + y^2
  squished =. _2 {.\ pythag       NB.  Odd rows only
  piApx    =. (2 * +/ , squished) %  y*y
  (squished { ' *') , ": piApx
)

J Forums의 Marshall Lochbam에 의한 개선 및 일반화 .


5

Python : 118 자

Perl 버전의 매우 간단한 포트입니다.

r=input()
u=r+r%2
t=0
for i in range(u):n=1+2*int((r*r-(u-1-2*i)**2)**.5);t+=n;print' '*(r-n/2-1),'*'*n
print 2.*t/r/r

python2의 경우 그냥 사용할 수 있습니다r=input()
John La Rooy

당신은 사이의 공간이 필요하지 않습니다 print' '
존 라 Rooy

좋습니다. 무섭습니다. 현재 Perl 버전보다 짧습니다. (이것은 일반적으로 매우 안전하지 않은이기 때문에 완전히 ... 내 마음의에서 "입력"을 넣어)
니콜라스 라일리

4

C ++ : 169 자

#include <iostream>
int main(){int i,j,c=0,n;std::cin>>n;for(i=-n;i<=n;i+=2,std::cout<<'\n')for(j=-n;j<=n;j++)std::cout<<(i*i+j*j<=n*n?c++,'*':' ');std::cout<<2.*c/n/n;}

축소되지 않음 :

#include <iostream>
int main()
{
    int i,j,c=0,n;
    std::cin>>n;
    for(i=-n;i<=n;i+=2,std::cout<<'\n')
        for(j=-n;j<=n;j++)
            std::cout<<(i*i+j*j<=n*n?c++,'*':' ');
    std::cout<<2.*c/n/n;
}

(예, std :: 대신 using namespace std 더 적은 문자 사용하는 사용)

여기의 출력은 원본 게시물의 테스트 케이스와 일치하지 않으므로 여기에 해당하는 것이 있습니다 (가독성을 위해 작성 됨). 참조 구현이라고 생각하세요 (Poita_가 괜찮다면) :

#include <iostream>
using namespace std;

int main()
{
    int i, j, c=0, n;
    cin >> n;
    for(i=-n; i<=n; i++) {
        if (i & 1) {
            for(j=-n; j<=n; j++) {
                if (i*i + j*j <= n*n) {
                    cout << '*';
                    c++;
                } else {
                    cout << ' ';
                }
            }
            cout << '\n';
        }
    }
    cout << 2.0 * c / n / n << '\n';
}

C ++ : 168 자 (출력이 정확하다고 생각 함)

#include <iostream>
int main(){int i,j,c=0,n;std::cin>>n;for(i=-n|1;i<=n;i+=2,std::cout<<"\n")for(j=-n;j<=n;j++)std::cout<<" *"[i*i+j*j<=n*n&&++c];std::cout<<2.*c/n/n;}

코드는 -n에서 n까지 반복되므로 예를 들어 4의 입력에 대해 테스트 케이스에 표시된대로 7이 아닌 9의 직경을 표시합니다.
Guffa 2010 년

귀하의 서클이 OP와 정확히 일치하는 것이 요구 사항 입니까?
Peter Alexander

3
#include <iostream.h>기본적으로 #include <iostream> -- using namespace std;이전 C ++ 컴파일러와의 호환성 을 위해 변경할 수 있습니다 .
Earlz

1
@Carlos, 나는 특정 비트를 작성하지 않았지만 이진 AND 연산자입니다. 마지막 비트가 설정되었는지 확인합니다. 이는 doing과 동일 i%2하지만 "더 빠릅니다". 어쨌든 컴파일러가 그렇게 할 것이기 때문에 정말 빠르지는 않습니다.
Peter Alexander

1
@Poita_ : 사실, i % 2와 i & 1은 음수와 다르게 작동합니다. (-1) & 1은 1이고, 이것이 우리가 여기서 원하는 것입니다. (-1) % 2는 내 시스템에서 -1이며 C99를 따릅니다. 따라서 if (i & 1)과 if (i % 2)가 동일한 작업을 수행하더라도 i가 음수이면 작동하지 않는 if (i % 2 == 1)에주의해야합니다.
Joey Adams

3

PHP : 126132138

(Guffa C # 솔루션 기반)

126 :

for($y=1-($r=$argv[1]);$y<$r;$y+=2,print"\n")for($x=1-$r;$x<$r;$s+=$i,++$x)echo($i=$x*$x+$y*$y<=$r*$r)?'*':' ';echo$s*2/$r/$r;

132 :

for($y=1-($r=$argv[1]);$y<$r;$y+=2){for($x=1-$r;$x<$r;@$s+=$i,++$x)echo($i=$x*$x+$y*$y<=$r*$r?1:0)?'*':' ';echo"\n";}echo$s*2/$r/$r;

138 :

for($y=1-($r=$argv[1]);$y<$r;$y+=2){for($x=1-$r;$x<$r;@$s+=$i){$t=$x;echo($i=$t*$x++ +$y*$y<=$r*$r?1:0)?'*':' ';}echo"\n";}echo$s*2/$r/$r;

현재 가득 참 :

for( $y = 1 - ( $r = $argv[1]); $y < $r; $y += 2, print "\n")
    for( $x = 1-$r; $x < $r; $s += $i, ++$x)
        echo( $i = $x*$x + $y*$y <= $r*$r) ? '*' : ' ';
echo $s*2 /$r /$r;

@처음 $s에는 없을 수 있지만 error_reporting이 0으로 설정된 경우에만 가능합니다 (알림 출력이 원을 엉망으로 만듭니다).


/ $ r은 echo에서 무엇을합니까? $ s * 2 / $ r / $ r;
davidosomething

OHH 디비전 ... 간격이 나를 쫓아
냈고,

3

루비 1.8.x, 93

r=$_.to_f
q=0
e=r-1
(p(('*'*(n=1|2*(r*r-e*e)**0.5)).center r+r)
q+=n+n
e-=2)while-r<e
p q/r/r

함께 실행 $ ruby -p piday


멋지지만 파이 근사치를 인쇄하지 않습니다
John La Rooy

1.9.1에서는 작동하지 않으며 원 주위에 큰 따옴표를 인쇄합니다.
Mladen Jablanović

골프 프로그램이 매우 다른 언어 수준에서 작동하지 않는 것은 정상입니다. 언어의 모든 버전에서 얼마나 많은 Perl 또는 Python cg가 작동합니까? 흥미로운 점은 Integer|Float1.9에서 더 이상 float를 강제하지 않기 때문 입니다.
DigitalRoss

3

APL : 59

이 함수는 숫자를 받아 두 개의 예상 항목을 반환합니다. 보너스 케이스에서 올바르게 작동합니다.

{⍪(⊂' *'[1+m]),q÷⍨2×+/,m←(2|v)⌿(q←⍵*2)>v∘.+v←2*⍨⍵-⍳1+2×⍵-1}

Dialect는 Dyalog APL이며 기본 인덱스 출처입니다. 스킬 레벨은 단서없는 초보자 이므로 APL 전문가가 10 자 이하로 낮추고 싶다면 내 손님이되어주세요!


Try APL 에서 온라인으로 시도 할 수 있습니다. 붙여넣고 그 뒤에 숫자를 입력하면됩니다.

   {⍪(⊂' *'[1+m]),q÷⍨2×+/,m←(2|v)⌿(q←⍵*2)>v∘.+v←2*⍨⍵-⍳1+2×⍵-1} 13
      *************
   *******************
  *********************
 ***********************
*************************
*************************
*************************
*************************
 ***********************
  *********************
   *******************
      *************
2.98225

APL은 모르지만 J 버전보다 예쁘게 보입니다.
ahala 2013-07-25

@ahala 맞아요. APL은 개념적으로나 미적으로나 아름답습니다. 나는 J를 배우기 시작했지만 임의의 ASCII 광기에 의해 꺼졌다. 좋은 영혼은 Node.js 용 오픈 소스 APL 인터프리터 (npm install apl)를 작성했습니다. 약간만 변경하여 위의 코드를 계산합니다 (모나 딕 없음 , 두 번째 문자 없음 ). Dyalog와 같은 모든 공급 업체 사이트에서 좋은 APL 문서를 찾을 수 있습니다.
Tobia 2013

2

그리고 떠들썩한 항목 : 181 개 186 190 문자

for((y=-(r=$1,r/2*2);y<=r;y+=2));do for((x=-r;x<=r;++x));do((x*x+y*y<r*r))&&{((++n));echo -n '*';}||echo -n " ";((x<r))||echo;done;done;((s=1000,p=n*2*s/r/r,a=p/s,b=p%s));echo $a.$b

예를 들어 실행 bash py.sh 13


2

Python : 148 자.

원래 게시물에 대한 회신에서 언급했듯이 규칙을 악용하고 테스트 케이스를 하드 코딩하려는 시도가 실패했습니다 (즉, 충분히 짧지 않음). 좀 더 장황한 언어로 악용하는 것이 더 쉬웠을 것입니다.

a=3.0,3.125,3.16
b="1","23","3677","47899"
r=input()
for i in b[r/3]+b[r/3][::-1]:q=1+2*int(i);print ' '*(int(b[r/3][-1])-int(i))+'*'*q
print a[r/5]

2

기원전 : 165 , 127 , 126 자

Python 버전을 기반으로합니다.

r=read()
for(i=-1;r*2>i+=2;scale=6){n=sqrt(2*i*r-i*i)
scale=0
n=1+n/1*2
j=r-n/2
t+=2*n
while(j--)" "
while(n--)"*"
"
"}
t/r/r

(마지막 줄 뒤의 새 줄은 여기서 생략 할 수 없습니다.)


1
127 자 : r = read (); for (i = 1; i <r * 2; scale = 6) {n = sqrt (2 * i r-i i); scale = 0; n = 1 + n / 1 * 2 ; i + = 2; j = rn / 2; t + = 2 * n; while (j--) ""; while (n-) "*"; ""}; t / r / r
Carlos Gutiérrez

여기서 유일한 문제는 0에 대해 실패하지만 현재 규칙에 따르면 괜찮습니다.
przemoc

2

JavaScript (SpiderMonkey)-118 자

이 버전은 stdin의 입력을 받아들이고 보너스 테스트 케이스를 통과합니다.

r=readline()
for(t=0,i=-r;i<r;i++)if(i%2){for(s='',j=-r;j<r;j++){t+=q=i*i+j*j<r*r
s+=q?'*':' '}print(s)}print(t*2/r/r)

용법: cat 10 | js thisfile.js - jsbin 미리보기 사용자가 브라우저에서보실 수 있습니다 인쇄 / readline에 별칭을 추가

자바 스크립트 : (213) 163


업데이트 됨

r=10;m=Math;a=Array;t=0;l=document;for(i=-r;i<r;i+=2){w=m.floor(m.sqrt(r*r-i*i)*2);t+=w*2;l.writeln(a(m.round(r-w/2)).join(' ')+a(w).join('*'));}l.writeln(t/(r*r))

아무도 브라우저에서 올바르게 렌더링해야한다고 말하지 않았습니다. 따라서 사전 태그를 제거하고 더 최적화했습니다. 출력을 보려면 생성 된 소스를 보거나 그에 따라 스타일 시트를 설정해야합니다. Pi는 이런 방식으로 덜 정확하지만 이제 사양에 맞습니다.


r=10;m=Math;a=Array;t=0;s='';for(i=-r;i<r;i++){w=m.floor((m.sqrt(m.pow(r,2)-m.pow(i,2)))*2);t+=w;if(i%2){z=a(m.round(r-w/2)).join(' ')+a(w).join('*');s+=z+'\n';}}document.write('<pre>'+(s+(t/m.pow(r,2)))+'</pre>')

축소되지 않음 :

r=10;
m=Math;
a=Array;
t=0;
s='';
for(i=-r;i<r;i++){
    w=m.floor((m.sqrt(m.pow(r,2)-m.pow(i,2)))*2);
    t+=w;
    if(i%2){
    z=a(m.round(r-w/2)).join(' ')+a(w).join('*');
    s+=z+'\n';
    }
}
document.write('<pre>'+(s+(t/m.pow(r,2)))+'</pre>');

1

자바 : 234

class C{public static void main(String[] a){int x,y,s=0,r=Integer.parseInt(a[0]);for(y=1-r;y<r;y+=2){for(x=1-r;x<r;++x){boolean b=x*x+y*y<=r*r;s+=b?1:0;System.out.print(b?'*':' ');}System.out.println();}System.out.println(s*2d/r/r);}}

축소되지 않음 :

class C{
    public static void main(String[] a){
        int x,y,s=0,r=Integer.parseInt(a[0]); 
        for(y=1-r;y<r;y+=2){
            for(x=1-r;x<r;++x) {
                boolean b=x*x+y*y<=r*r;
                s+=b?1:0;
                System.out.print(b?'*':' ');
            }
            System.out.println();
        }
        System.out.println(s*2d/r/r);
    }
}

아마 ~ 50 자 스칼라이 다시 작성 절약 할 수
rwyland

1

GAWK : 136 , 132 , 126 , 125 자

Python 버전을 기반으로합니다.

{r=$1
for(i=-1;r*2>i+=2;print""){n=1+int((2*i*r-i*i)**.5)*2
t+=2*n/r/r
printf"%*s",r-n/2,""
while(n--)printf"%c","*"}print t}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.