1. ホーム
  2. language-agnostic

[解決済み] コードゴルフ - π day

2023-02-08 08:47:04

質問

チャレンジ

SOでのコードゴルフのためのガイドライン

半径の円の表現を表示するための、文字数で最も短いコード R を使って * 文字を使用し、πの近似値が続きます。

入力は数字1つ。 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つのテストケースに合格したソリューションであれば、どのようなものでも受け入れられます。

の2倍で割ってπの近似値を与える。 * の文字数の2倍を .

近似式は少なくとも有効数字6桁まで正しくなければなりません。

先頭または末尾のゼロは許可されています。 3 , 3.000000 , 003 の入力は許可されます。 24 .

コード数には入出力(つまりプログラム全体)が含まれます。

テストケース

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

どのように解決するのですか?

dcでは、88と93 <ストライク 93 94 96 102 105 129 138 141 文字数

念のため、この時点では、私は 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