ファイを計算する(パイではない)


73

いいえ、私は意味しないϕ = 1.618...π = 3.14159...。私は機能を意味します

  • φ(x)は、にx比較的素数であるかそれ以下の整数の数ですx
  • π(x)は、以下の素数の数ですx
  • 「not pi」がπ̅(x)であり、それ以下の複合体の数になるように定義するとしましょうx

仕事

厳密に正の整数を指定してxφ(π̅(x))を計算しますます。スコアリングはバイト単位です。

各行は、入力(1〜100を含む)と、スペースで区切られた対応する出力で構成されます。

1 0 
2 0 
3 0 
4 1 
5 1 
6 1 
7 1 
8 2 
9 2 
10 4 
11 4 
12 2 
13 2 
14 6 
15 4 
16 6 
17 6 
18 4 
19 4 
20 10 
21 4 
22 12 
23 12 
24 6 
25 8 
26 8 
27 16 
28 6 
29 6 
30 18 
31 18 
32 8 
33 12 
34 10 
35 22 
36 8 
37 8 
38 20 
39 12 
40 18 
41 18 
42 12 
43 12 
44 28 
45 8 
46 30 
47 30 
48 16 
49 20 
50 16 
51 24 
52 12 
53 12 
54 36 
55 18 
56 24 
57 16 
58 40 
59 40 
60 12 
61 12 
62 42 
63 20 
64 24 
65 22 
66 46 
67 46 
68 16 
69 42 
70 20 
71 20 
72 32 
73 32 
74 24 
75 52 
76 18 
77 40 
78 24 
79 24 
80 36 
81 28 
82 58 
83 58 
84 16 
85 60 
86 30 
87 36 
88 32 
89 32 
90 48 
91 20 
92 66 
93 32 
94 44 
95 24 
96 70 
97 70 
98 24 
99 72 
100 36

このリンク使用して、入力に対して予想される出力を計算します。また、ここでpastebinの入力と出力のリストx <= 1000が提供されています。(このMinkolangプログラムで生成されます。)


リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

## Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

## Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


入力のサイズに制限はありますか?
リルトシアスト

4
この質問はユーザーPhiNotPiへのオマージュですか?
プリモ

24
@primoなぜあなたはそう思うだろうか?
メゴ

2
@primo:それは彼の名前からインスピレーションを得たものであり、間違いなくそれをしゃべりましたが、正確には彼へのオマージュではありませんでした。
エレンディアスターマン

1
@ edc65:はい、明らかにそうです、昨日見つけたように。
エレンディアスターマン

回答:


27

GS212の 10バイト

V@'◄l.1&‼l

ソースコードはCP437エンコーディングを使用します。オンラインでお試しください!

テスト走行

$ xxd -r -ps <<< 564027116c2e3126136c > phinotpi.gs2
$ wc -c phinotpi.gs2 
10 phinotpi.gs2
$ gs2 phinotpi.gs2 <<< 1000
552

使い方

V          Read an integer n from STDIN.
 @         Push a copy of n.
  '        Increment the copy of n.
   ◄l      Push 1 and call primes; push the list of all primes below n+1.
     .     Count the primes.
      1    Subtract the count from n.
       &   Decrement to account for 1 (neither prime nor composite).
        ‼l Push 3 and call primes; apply Euler's totient function.

25
ファイル名がプログラムよりも長いです。
フローリス

43

正規表現(.NET)、122 113バイト

^(?=((?=.*$(?<=^(\3+(.+.))(.*?(?>(.\4)?)))).)+(.*))((?=.*(?=\6$)(?<=(?!(.+.)\8*(?=\6$)(?<=^\8+))(.+?(?>\9?)))).)+

入力と出力が単項であり、出力が正規表現の主要な一致から取得されると仮定します。

正規表現の内訳:

  • ^(?=((?=.*$(?<=^(\3+(.+.))(.*?(?>(.\4)?)))).)+(.*)) π̅(x)を計算し、2番目の部分でアサーションのためにキャプチャグループ6の残りの文字列をキャプチャします。

    • .*$ポインタを文字列の最後に設定し、整数xを一方向に持つようにします。
    • (?<=^(\3+(.+.))(.*?(?>(.\4)?))) 右から左に一致し、xから0にループすることで複合数をチェックします。
      • (.*?(?>(.\4)?))は、最初の反復で0から始まり、前の反復での数値から継続し、xまでループする「変数」です。最小の合成番号は4である(.\4)?ため、キャプチャグループ4が使用可能な場合、一致に失敗することはありません。
      • ^(\3+(.+.))上記の「変数」によって残されたもの(つまりx - "variable")が複合数であるかどうかをチェックします。
  • ((?=.*(?=\6$)(?<=(?!(.+.)\8*(?=\6$)(?<=^\8+))(.+?(?>\9?)))).)+で左から右への演算を制限することにより、φ(π̅(x))を計算し(?=\6$)ます。

    • .*(?=\6$)ポインタを位置π̅(x)に設定します。y =π̅(x)を示しましょう。
    • (?<=(?!(.+.)\8*(?=\6$)(?<=^\8+))(.+?(?>\9?))) 右から左に一致し、(y-1)から0にループすることで相対素数をチェックします
      • (.+?(?>\9?)) は、最初の反復で1から始まり、前の反復の数値から継続してyまでループする「変数」です。
      • (?!(.+.)\8*(?=\6$)(?<=^\8+))左から右 1に一致し、「変数」とyが相対素数であるかどうかをチェックします。
        • (.+.)\8*(?=\6$) 1より大きい「変数」の除数を選択します。副作用は、左側に整数yがあることです。
        • (?<=^\8+) 「変数」の約数がyの約数でもあるかどうかをチェックします。

1 .NETでは、先読みは方向を現在の方向に従うのではなくLTRに設定します。後読みは、方向を逆にするのではなく、方向をRTLに設定します。

RegexStormで正規表現をテストします

リビジョン2は、非キャプチャグループを削除し、条件付き構文の代わりにアトミックグループを使用します。


24
あなたは怒っています。
RK。

9
彼は私が思うザルゴのタッチを持っています。
curiousdannii

11
そして今、あなたは2つの問題を抱えています。(正規表現でこの種のことを行うことができるとはまったく知りませんでした...)
ダレルホフマン

21

J、15 14バイト

5 p:<:-_1 p:>:

これは暗黙の単項動詞です。J.jsでオンラインで試してください。

使い方

                Right argument: y
            >:  Increment y.
       _1 p:    Calculate the number of primes less than y+1.
    <:          Decrement y.
      -         Calculate the difference of the results to the left and right.
5 p:            Apply Euler's totient function to the difference.

14
説明できますか?:P
anOKsquirrel

23
説明を追加しました
デニス

5
私はそれがスマイリーの多くを持っているので、私はこれをupvotedていると言うことを約あったが、テキストは、これら:(を避けるために私に言った
Doddy

@デニス:あなたの最初の返事は私をかなり一生懸命笑わせてくれました、ありがとうございます!
Mehrdad

19

真剣に、27バイト

,;R`p`MΣ(-D;n;;╟@RZ`ig1=`MΣ

イェーイ、私はCJamを倒しました!オンラインで試す

説明(aスタックの最上部をb参照、2番目から2番目を参照):

,;       take input and duplicate it
R`p`MΣ   push sum([is_prime(i) for i in [1,...,a]]) (otherwise known as the pi function)
(-D      rotate stack right by 1, subtract top two elements, subtract 1, push
            (@ could be used instead of (, but I was hoping the unmatched paren would bother someone)
;n;;     dupe top, push a b times, dupe top twice (effectively getting a a+1 times)
╟        pop n, pop n elements and append to list, push
@        swap top two elements
RZ       push [1,...,a], zip a and b
`ig1=`   define a function:
  i        flatten list
  g1=      compute gcd(a,b), compare to 1 (totient function)
MΣ       perform the function a on each element of b, sum and push

注:この回答を投稿してから、pi関数とphi関数を真剣に追加しました。以下に、これらの機能に関する非競争的な答えを示します。

,;▓1-@-▒

説明(一部のコマンドは他のコマンドと重ならないようにシフトされています):

,    get input (hereafter referred to as x)
;    duplicate x
 ▓   calculate pi(x) (we'll call this p)
1-   calculate 1-p
@-   bring x back on top, calculate x-1-p (not pi(x))
  ▒  calculate phi(not pi(x))

1
@Dennisを真剣に打ち負かしました!
-TanMath

あなたの頭の上でこれを知っていた私に言わないでください...
DividedByZero

1
GJがCJam =を破って)
flawr

14

ジュリア、52 50バイト

x->count(i->gcd(i,p)<2,1:(p=x-endof(primes(x))-1))

これにより、整数を受け入れて整数を返す名前のない関数が作成されます。それを呼び出すには、名前を付けます、例えばf=x->...ます。

ゴルフをしていない:

function phinotpi(x::Integer)
    # The number of composites less than or equal to x is
    # x - the number of primes less than or equal to x -
    # 1, since 1 is not composite
    p = x - length(primes(x)) - 1

    # Return the number of integers i between 1 and p such
    # that gcd(i, p) = 1. This occurs when i is relatively
    # prime to p.
    count(i -> gcd(i, p) == 1, 1:p)
end

sum代わりに使用countして、数文字を保存します。少しイライラしますが、素数を数えるもう1つの方法はsum(isprime,1:x)、とまったく同じ長さendof(primes(x))です。
グレンO

1
@GlenO提案に感謝しますが、0 sumcount返す間、空のコレクションでは失敗します。したがってsum、の目的の結果は生成されませんx<4
アレックスA.

8

Mathematica、24バイト

EulerPhi[#-PrimePi@#-1]&

2
もちろん、 Mathematicaはに建てられたこのすべてを持っている...
拍手

@ConfusedMr_C明らかに:)しかし、明らかな理由で失格ではありませんでした。数学的なソフトウェアは、単純な組み合わせ作業でゴルフの言語を打つことはできません:)
yo '

@ConfusedMr_C PhiNotPi@#&:11バイト:P
LegionMammal978

8

Pyth、14バイト

JlftPTSQ/iLJJ1

デモンストレーション検証

単純なフィルターを使用して複合材料を計算し、その長さを取得してに保存しJます。次に、Jまでのすべての数値でgcdを取得し、J1に等しい結果の数をカウントします。


7

Minkolang 0.11、12バイト(非競合)

この答えは競争的ではありません。質問を投稿する前に、piとphiをビルトインとして実装しました。これは不公平な利点をもたらします。これは、言語に興味がある人にのみ投稿します。

nd9M-1-9$MN.

ここで試してみてください。

説明

n      Read in integer from input
d      Duplicate
9M     Pops off the top of stack as x and pushes pi(x)
-      Subtracts the top two elements on the stack (x - pi(x))
1-     Subtracts 1 (x-1 - pi(x))
9$M    Pops off the top of stack as x and pushes phi(x) (phi(x-1 - pi(x)))
N.     Outputs as integer and stops.

2
無効な回答を公開するのは良い考えだとは思わない
...-yeti

20
彼らが免責事項を持っている限り、私はそれに何か問題があるとは思わない。実際には、古いチャレンジではかなり一般的です。
デニス

4
@yeti:技術的には、無効ではありません。ここで使用される機能はすべて、チャレンジが投稿される前に実装されました。2つの特定の機能が実装されるまでチャレンジを投稿するのを遅らせたので、私は単に失格にしました(ちなみにサンプルリストの生成に使用していました)。
エレンディアスターマン

1
同じ。𝔼𝕊𝕄𝕚𝕟が更新され続けると、私はこれをたくさんします。
ママファンロール

6

CJam、28バイト

ri){mf1>},,_,f{){_@\%}h)=}1b

CJamインタープリターでこのフィドルを試してみるか、すべてのテストケースを一度に確認してください。

使い方

ri                            Read an integer N from STDIN.
  )                           Increment it. 
   {    },                    Filter; for each I in [0 ... N]:
    mf                          Push I's prime factorization.
      1>                        Discard the first prime.
                              If there are primes left, keep I.
          ,                   Count the kept integers. Result: C
           _,                 Push [0 ... C-1].
             f{          }    For each J in [0 ... C-1], push C and J; then:
               )                Increment J.
                {    }h         Do:
                 _                Push a copy of the topmost integer..
                  @               Rotate the integer below on top of it.
                   \%             Take that integer modulo the other integer.
                                If the residue is non-zero, repeat the loop.
                                This computes the GCD of C and J+1 using the
                                Euclidean algorithm.
                       )        Increment the 0 on the stack. This pushes 1.

                        =     Push 1 if the GCD is 1, 0 if not.
                          1b  Add all Booleans.

「すべてのケースを確認」リンクを試してみましたが、次のようになりました1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111。そうですか?
エレンディアスターマン

はい、左の列(入力)にコードを適用すると、右の列(出力)に等しいことを確認します。
デニス

5
dis1について説明できますか?
anOKsquirrel

9
@anOKsquirrel i haz dis1 2を説明
デニス

5
@デニスkthxbai
anOKsquirrel

5

Python、137 139

n=input()
print n,len([b for b in range(len([a for a in range(n)if not all(a%i for i in xrange(2,a))]))if all(b%i for i in xrange(2,b))])

2
私はあなたが間にスペースを削除することで2つのバイトを保存することができると思うrange(n) if])) if
DankMemes

3
Pythonのゴルフ能力が比較的低い場合(空白の要件などのため)、これは非常に印象的です!
フェリックスフー

@DankMemes、ヒントをありがとう!
wnnmaw

5

網膜、48バイト

.+
$*
M&`(..+)\1+$
.+
$*
(?!(..+)\1*$(?<=^\1+)).

オンラインでお試しください!

説明

.+
$*

入力を単項に変換します。

M&`(..+)\1+$

少なくとも2の係数の少なくとも2回の繰り返しで構成される文字列に一致できる頻度をカウントすることにより、入力よりも大きくない複合数をカウントします。

.+
$*

再び単項に変換します。

(?!(..+)\1*$(?<=^\1+)).

プレフィックスの因子でもあるその位置からサフィックスの因子(少なくとも2つの)を見つけることができない位置の数からカウントすることによりφを計算します(そのような因子を見つけた場合、これi <= nは因子を共有しますnしたがって、それと互いに素ではありません)。.最後には、私たちが(そのため私たちは、少なくとも2の要因を見つけることができません)がゼロにカウントしないことを保証します。


5

正規表現(.NET)、88 86バイト

^(?=((?=(..+)\2+$)?.)+)(?=(?<-2>.)*(.+))(?=(((?!(..+)\6*(?<=^\6+)\3$))?.)*\3)(?<-5>.)*

オンラインでお試しください!(Retinaプログラムとして。)

n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳の回答、つまり単項入力と同じI / Oを使用し、結果の長さの部分文字列に一致します。

バランスグループの一方または両方を前方参照に置き換えることにより、これをさらに短縮できる場合があります。

同じバイト数での代替:

^(?=((?=(..+)\2+$)?.)+)(?=(?<-2>.)*(.+))(?=(?((..+)\4*(?<=^\4+)\3$).|(.))*\3)(?<-5>.)*

前半にはいくつかの選択肢もあります。たとえば、正の数に正の先読みの代わりに負の先読みを使用したり、条件を使用したりします。

説明

バランスグループの基本的な理解があると仮定しますが、要するに、.NETのキャプチャグループはスタックであるため(キャプチャグループを再利用するたびに新しいキャプチャが先頭にプッシュさ(?<-x>...)れます)、スタックからキャプチャをポップしますx。それは物事を数えるのにとても役立ちます。

^                   # Only look at matches from the beginning of the input.
(?=                 # First, we'll compute the number of composites less than
                    # or equal to the input in group 2. This is done in a
                    # lookahead so that we don't actually advance the regex
                    # engine's position in the string.
  (                 #   Iterate through the input, one character at a time.
    (?=(..+)\2+$)?  #     Try to match the remainder of the input as a
                    #     composite number. If so the (..+) will add one
                    #     one capture onto stack 2. Otherwise, this lookahead
                    #     is simply skipped.
    .
  )+
)
(?=                 # It turns out to be more convienient to work with n minus
                    # the number of composites less than or equal to n, and to
                    # have that a single backreference instead of the depth of
                    # a stack.
  (?<-2>.)*         #   Match one character for each composite we found.
  (.+)              #   Capture the remainder of the input in group 3.
)
(?=                 # Now we compute the totient function. The basic idea is
                    # similar to how we computed the number of composites,
                    # but there are a few differences.
                    # a) Of course the regex is different. However, this one
                    #    is more easily expressed as a negative lookahead (i.e.
                    #    check that the values don't share a factor), so this
                    #    won't leave a capture on the corresponding stack. We
                    #    fix this by wrapping the lookahead itself in a group
                    #    and making the entire group optional.
                    # b) We only want to search up the number of composites,
                    #    not up to the input. We do this by asserting that we
                    #    can still match our backreference \3 from earlier.

  (                 #   Iterate through the input, one character at a time.
    ((?!            #     Try not to match a number that shares a factor with
                    #     the number of composites, and if so push a capture
                    #     onto stack 5.
      (..+)\6*      #     Look for a factor that's at least 2...
      (?<=^\6+)     #     Make sure we can reach back to the input with that
                    #     factor...
      \3$           #     ...and that we're exactly at the end of the number
                    #     of composites.
    ))?
    .
  )*
  \3                #   Match group 3 again to make sure that we didn't look
                    #   further than the number of composites.
)
(?<-5>.)*           # Finally, match one character for each coprime number we
                    # found in the last lookahead.


4

ゼリー、非競合

7 バイト この回答は、チャレンジより後の言語を使用しているため、競合していません。

ÆC_@’ÆṪ

使い方

ÆC_@’ÆṪ  Input: n

ÆC       Count the primes less than or equal to n.
    ’    Yield n - 1.
  _@     Subtract the count from n - 1.
     ÆṪ  Apply Euler's totient function.

3

オクターブ、52 51

@(b)nnz((d=[1:(c=b-1-nnz(primes(b)))])(gcd(d,c)<2))

編集:トーマスクワのおかげで1バイトを保存しました

説明:

@(b)                                            # Define anonymous func with parameter b
  nnz(                                          # Count elements in φ(c)
    (                                           #
      d = [1:                                   # Create d= array of 1 to π̅(b)
            ( c = b - 1 - nnz(primes(b)) )      # Calculate c=π̅(b) by subtracting the
                                                #  number of elements in the array of prime
          ]                                     #  numbers from the number of ints in 2:b
    )(gcd(d, c) < 2)                            # Calculate φ(c) by using gcd to filter
  )                                             # relative primes from d


3

SageMath 26バイト

euler_phi(n-1-prime_pi(n))

Sageの実装のおかげで、n=0とでもうまく動作しn=1ます。





2

MATL、9バイト(非競合)

言語が課題を後回しにしているため、この答えは非競合的です。

:Zp~sq_Zp

言語/コンパイラのバージョン(10.1.0)を使用します。

オンラインでお試しください!

説明

:       % implicitly input a number "N" and produce array [1,2,...,N]
Zp      % true for entries that are prime
~       % negate. So it gives true for entries of [1,2,...,N] that are non-prime
s       % sum elements of array. So it gives number of non-primes
q       % subtract 1. Needed because number 1 is not prime, but not composite either
_       % unary minus
Zp      % with negative input, computes totient function of absolute value of input
        % implicit display

2

GAP、33バイト

n->Phi(n-Number([-2..n],IsPrime))

Number(l,p)はからいくつの要素がl満たされるかを数えますp。1が素数でも合成でもないという事実を補うために、nからnまでの素数の数を1だけ減算する必要があります。代わりにやっての-12バイトのために、私はこのようにすることにより、プライムと考えられている1つの以上の数の追加により、-2の代わりに1または2のリストを開始するIsPrime唯一の余分なバイトのために。


2

Python 3.5-130バイト

from math import*
def p(n,k,g):
 for i in range(1,n+1):k+=factorial(i-1)%i!=i-1
 for l in range(1,k):g+=gcd(k,l)<2      
 return g

関数をp(n、0,0)として渡すことが受け入れられない場合は、+ 3バイト。

これは、ウィルソンの定理を使用して数値が合成されているかどうかを確認し、階乗関数の数学モジュールを呼び出す必要があるという事実を利用しています。Python 3.5は、数学モジュールにgcd関数を追加しました。

コードの最初のループは、数値が合成されている場合はkを1増分し、それ以外の場合は0増分します。(ウィルソンの定理は1より大きい整数に対してのみ有効ですが、1を素数として扱うため、これを利用できます)。

次に、2番目のループは、コンポジットの数の範囲でループし、not piとlの値が互いに素である場合にのみgをインクリメントします。

gは、n以下の合成数の数以下の値の数です。



1

05AB1E11 8バイト

LDpÈÏg<Õ

オンラインでお試しください!

これは競合しない可能性があります-05AB1Eがいつ作成されたかはわかりません。

使い方

L             # this gets us the list of numbers [1 .. a]
 D            # duplicates this list
  p           # applies isPrime to each element of the list, vectorised.
   È          # is the element even? (does 05AB1E not have a logical not?)
    Ï         # push elements of the first list where the same index in the 
              # second list is 1
     g<       # finds the length and subtracts 1 (as the list contains 1)
              # this is the not pi function
       Õ      # euler totient function

1

Pyt、6 バイト

řṗ¬Ʃ⁻Ț

説明:

                Implicit input
ř               Push [1,2,...,input]
 ṗ              [is 1 prime?, is 2 prime?, ..., is input prime?]
  ¬             [is 1 not prime?, is 2 not prime?, ... is input not prime?]
   Ʃ            Number of non-primes (sums the array - booleans implicitly converted to ints)
    ⁻           Subtract one to remove the counting of '1'
     Ț          Euler's totient function


オンラインでお試しください!


1

APL NARS、38バイト、19文字

{⍵≤3:0⋄13π¯1+⍵-2π⍵}

13πはトーティエント関数であり、2πはカウント素数関数<=その引数です。テスト

  b←{⍵≤3:0⋄13π¯1+⍵-2π⍵}     
  (⍳12),¨b¨⍳12
1 0  2 0  3 0  4 1  5 1  6 1  7 1  8 2  9 2  10 4  11 4  12 2 
  (95..100),¨b¨(95..100)
95 24  96 70  97 70  98 24  99 72  100 36

1

Add ++、21バイト

L,RþPbL1_dRdVÞ%bLG!!+

オンラインでお試しください!

使い方

π¯(n)φ(n)π¯(n)φ(n)

π¯(n)

RþPbL1_

RþPþPbL1_x=π¯(n)

φ(n)

dRdVÞ%bLG!!+

xdRÞ%xxbL

n1nG!!

はい、本当に新しいLaTexを試してみたかったです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.