素数から四角リングを生成できますか?


33

どうやらそう!3つの簡単なステップで。

ステップ1

ましょうFnは)プライムカウント機能を(素数の数より少ないか等しい示すN)。

整数シーケンス sn)を次のように定義します。各正の整数nに対して

  • tnに初期化します。
  • 限りtはプライムでも1でもない、置き換えるトンをすることにより、FT)と反復します。
  • 反復回数はsn)です。

すべてのnについてfn)< nであるため、反復プロセスは終了することが保証されています。

たとえば、n = 25を考えます。t = 25 を初期化します。これは素数でも1でもないため、f(25)(9)を計算します。これがtの新しい値になります。これは素数でも1でもないため、f(9)は4です。f(4)は2です。これは素数なので、ここで停止します。3回の反復を行いました(25から9、次に4、次に2)。したがって、s(25)は3です。

シーケンスの最初の40の用語は次のとおりです。シーケンスはOEISにはありません。

0 0 0 1 0 1 0 2 2 2 0 1 0 2 2 2 0 1 0 3 3 3 0 3 3 3 3 3 0 3 0 1 1 1 1 1 0 2 2 2

ステップ2

奇数の正の整数Nが与えられた場合、有限シーケンスs(1)、s(2)、...、sN 2)を巻いて正方形の外向きらせんを形成することにより、N×N配列(行列)を構築します。たとえば、N = 5の場合、スパイラルは

s(21)   s(22)   s(23)   s(24)   s(25)
s(20)   s(7)    s(8)    s(9)    s(10)
s(19)   s(6)    s(1)    s(2)    s(11)
s(18)   s(5)    s(4)    s(3)    s(12)
s(17)   s(16)   s(15)   s(14)   s(13)

または、値を置き換えて、

 3       3       0       3       3
 3       0       2       2       2
 0       1       0       0       0
 1       0       1       0       1
 0       2       2       2       0

ステップ3

N×N配列を、灰色のカラーマップまたは好みの他のカラーマップのイメージとして表します。番号の順序が視覚的に明らかな色の順序に対応するように、マップは緩やかでなければなりません。以下のテストケースは、カラーマップの例を示しています。

チャレンジ

奇数の正の整数Nを指定すると、上記の画像が生成されます。

ルール

  • らせんは外側にある必要がありますが、時計回りまたは反時計回りにすることができ、右(上記の例のように)、左、下、または上に動き始めることができます。

  • 水平軸と垂直軸のスケールは同じである必要はありません。また、軸ラベル、カラーバー、および同様の要素はオプションです。スパイラルがはっきりと見える限り、画像は有効です。

  • 画像は、標準的な手段で出力できます。特に、画像を画面に表示したり、グラフィックファイルを作成したり、RGB値の配列を出力したりできます。ファイルまたは配列を出力する場合は、表示されたときの表示例を投稿してください。

  • 入力手段と形式は通常どおり柔軟です。プログラムまたは機能を提供することができます標準的な抜け穴は禁止されています。

  • バイト単位の最短コードが優先されます。

テストケース

次の画像(クリックすると最大解像度になります)は、Nのいくつかの値に対応しています。上の例のように、右回りの時計回りのスパイラルが使用されます。画像はいくつかの有効なカラーマップも示しています。

  • N = 301: ここに画像の説明を入力してください

  • N = 501: ここに画像の説明を入力してください

  • N = 701: ここに画像の説明を入力してください


の値の配列をs(n)変更せずにいくつかのプロット関数/パッケージimshowに渡すことができる場合(たとえば、matplotlibではこれを処理できると思います)、これは許容可能な出力形式ですか?
ディルナン

@dylnan確かに、画面に画像をプロットするか、有効なファイルを生成する限り。実際、私はあなたが言及したものに似たもので例を生成しました。値のスケーリングに注意してください。たとえば、Matlab(および場合によってはMatplotlib)imshowが行うように、1を超えるすべての値に同じ色が与えられている場合は受け入れられません
ルイスメンドー

いい視点ね。それがわからない場合imshow
ディルナン

1
@ kamoroso94参照してくださいここに
ルイスMendo

1
ええ、非常に明確
クリストファー

回答:


3

Dyalog APL、94バイト

'P2'
2⍴n←⎕
9
(⍪0){×≢⍵:(≢⍺)((⍉∘⌽⍺,↑)∇↓)⍵⋄⍺}2↓{⍵⌊1+⍵[+\p]}⍣≡9×~p←1=⊃+/(≠⍨,≠⍨,~⍴⍨(×⍨n)-2×≢)¨,\×⍳n

仮定する ⎕IO=0

n = 701の出力(.pgmから.pngに変換):

ここに画像の説明を入力してください


10

MATLAB - 197 185 178 175 184 163の 162 148 142 140バイト

AnderとAndrasに感謝し、12バイトを削りました。2つを組み合わせてくれたLuisに感謝します。Remcoのおかげで16個、flawrのおかげで6個

function F(n)
p=@primes
s=@isprime
for a=2:n^2
c=0
if~s(a)
b=nnz(p(a))
while~s(b)
b=nnz(p(b))
c=c+1
end
end
d(a)=c
end
imagesc(d(spiral(n)))

N=301F(301))の結果:

ここに画像の説明を入力してください

説明:

function F(n)
p=@primes % Handle
s=@isprime % Handle
for a=2:n^2 % Loop over all numbers
    c=0 % Set initial count
    if~s(a) % If not a prime
        b=nnz(p(a)) % Count primes
        while~s(b) % Stop if b is a prime. Since the code starts at 2, it never reaches 1 anyway
            b=nnz(p(b)) % count again
            c=c+1 % increase count
        end
    end
    d(a)=c % store count
end
imagesc(d(spiral(n))) % plot

8

Wolfram言語(Mathematica)、124バイト

12バイトを節約してくれたMartin Enderに感謝します!

Image[#/Max@#]&[Array[(n=0;Max[4#2#2-Max[+##,3#2-#],4#
#-{+##,3#-#2}]+1//.x_?CompositeQ:>PrimePi[++n;x];n)&,{#,#},(1-#)/2]]&

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


生成される画像は次のとおりです。

スパイラル

私のこの答えから直接取られたスパイラル値の閉じた形式の公式。


5
#/2-.5バイトを保存します。
user202729

8
ハハ、それを自分に提案していますか?
ルイスメンドー

6
@ user202729動作しないようです。
user202729

18
私はあなたの内なる対話を中断するつもりはありませんでした:-P
ルイスメンドー

延期の定義pあなたがそれを必要とするまで、:...,{y,p=(1-#)/2,-p},{x,p,-p}
マーティン・エンダー

7

MATLAB:115の 114 110バイト

ライナー1つ(スクリプトの関数としてR2016b +で実行)115バイト

I=@(N)imagesc(arrayfun(@(x)s(x,0),spiral(N)));function k=s(n,k);if n>1&~isprime(n);k=s(nnz(primes(n)),k+1);end;end

flawrで提案されているように、関数を別のファイルに入れ、追加のファイルルールごとに1バイト追加する

ファイルではs.m、コード+ファイルの場合は64 + 1バイト

function k=s(n,k);if n>1&~isprime(n);k=s(nnz(primes(n)),k+1);end

定義するコマンドウィンドウI、45バイト

I=@(N)imagesc(arrayfun(@(x)s(x,0),spiral(N)))

合計:110バイト


これはwhile、他のMATLAB実装(gnoviceAdriaan)のようにループする代わりに再帰を使用します。スクリプトとして(R2016b以降で)実行すると、これはのIように実行できる関数を定義しますI(n)

構造化バージョン:

% Anonymous function for use, i.e. I(301)
% Uses arrayfun to avoid for loop, spiral to create spiral!
I=@(N)imagesc(arrayfun(@(x)s(x,0),spiral(N)));

% Function for recursively calculating the s(n) value
function k=s(n,k)
    % Condition for re-iterating. Otherwise return k unchanged
    if n>1 && ~isprime(n)
        % Increment k and re-iterate
        k = s( nnz(primes(n)), k+1 );
    end
end

例:

I(301)

プロット

ノート:

  • sもちろん、関数を匿名にすることも試みましたが、もちろんカウントを大幅に減らすことができます。ただし、2つの問題があります。

    1. MATLABにはブレーク条件を提供する三項演算子がないため、匿名関数を使用する場合、無限再帰を回避するのは困難です。ソートの三項演算子(以下を参照)を束縛すると、条件が2回必要になるため、バイト数もかかります。

    2. バイトを追加する再帰的(ここを参照)である場合、匿名関数をそれ自体に渡す必要があります。

    私がこれに最も近づいたのは、次の行を使用したことです。おそらく動作するように変更できます。

    % Condition, since we need to use it twice 
    c=@(n)n>1&&~isprime(n);
    % This uses a bodged ternary operator, multiplying the two possible outputs by
    % c(n) and ~c(n) and adding to return effectively only one of them
    % An attempt was made to use &&'s short-circuiting to avoid infinite recursion
    % but this doesn't seem to work!
    S=@(S,n,k)~c(n)*k+c(n)&&S(S,nnz(primes(n)),k+1);

6

MATLAB- 126 121 *バイト

私はアドリアーンよりもベクトル化されたアプローチを試み、より多くのバイトを削ることができました。単一行のソリューションは次のとおりです。

function t(n),M=1:n^2;c=0;i=1;s=@isprime;v=cumsum(s(M));while any(i),i=M>1&~s(M);c=c+i;M(i)=v(M(i));end;imagesc(c(spiral(n)))

そして、きれいにフォーマットされたソリューションは次のとおりです。

function t(n),
  M = 1:n^2;
  c = 0;
  i = 1;
  s = @isprime;
  v = cumsum(s(M));
  while any(i),         % *See below
    i = M > 1 & ~s(M);
    c = c+i;
    M(i) = v(M(i));
  end;
  imagesc(c(spiral(n)))

* 注:不要な反復のメトリッククラットンを許可する場合は、行 while any(i), 5バイトに変更for m=v, て保存できます。


いいね!cumsumベクトル化と回避に使用する方法が好きですnnz(primes(...)
ルイスメンドー

1
私が正しく理解していれば、必要以上の回数を繰り返すことは害になりません(速度を犠牲にして)。だから、置き換えることができますwhile any(i)によってfor m=M。コードの実行に数時間かかる場合、誰が気にしますか:-)
ルイスメンドー

2
@LuisMendo:もちろんです。必要以上にもう1 n^2回繰り返します。別の繰り返しが痛いのです。;)
ノービス

1
それは精神だ!あなたはまた、より高速な実行中のバージョンを維持することができますが、バイト数が短いのである
ルイスMendo

2

Python 3、299 265バイト

Jonathan FrechとNoOneIsHereからのフォーマットの提案のおかげで5バイト節約されました。一度だけ呼び出された関数定義を削除して、追加の34バイトを削除しました。

これは、Pythonがプライムネスを決定したり、配列をスパイラルしたりするコマンドを持っていないため、他のいくつかのものより少し長くなります。ただし、は約1分で比較的高速に実行されn = 700ます。

from pylab import*
def S(n):
 q=arange(n*n+1);t=ones_like(q)
 for i in q[2:]:t[2*i::i]=0
 c=lambda i:0 if t[i]else 1+c(sum(t[2:i]));S=[c(x)for x in q]
 t=r_[[[S[1]]]]
 while any(array(t.shape)<n):m=t.shape;i=multiply(*m)+1;t=vstack([S[i:i+m[0]],rot90(t)])
 return t

でテストする

n = 7
x = S(n)
imshow(x, interpolation='none')
colorbar()
show(block=False)


1
一つの迅速な事:あなたが間にスペースを削除することができますimportし、*
-NoOneIsHere

2

J、121バイト

load 'viewmat'
a=:3 :'viewmat{:@((p:inv@{.,>:@{:)^:(-.@((=1:)+.1&p:)@{.)^:_)@(,0:)"0(,1+(i.@#+>./)@{:)@|:@|.^:(+:<:y),.1'

関数を定義します:

a=:3 :'viewmat{:@((p:inv@{.,>:@{:)^:(-.@((=1:)+.1&p:)@{.)^:_)@(,0:)"0(,1+(i.@#+>./)@{:)@|:@|.^:(+:<:y),.1' | Full fuction
                                                                     (,1+(i.@#+>./)@{:)@|:@|.^:(+:<:y),.1  | Creates the number spiral
              {:@((p:inv@{.,>:@{:)^:(-.@((=1:)+.1&p:)@{.)^:_)@(,0:)"0                                      | Applies S(n) to each element
       viewmat                                                                                             | View the array as an image

2

R、231バイト

function(n){p=function(n)sum(!n%%2:n)<2;M=matrix(0,n,n);M[n^2%/%2+cumsum(c(1,head(rep(rep(c(1,-n,-1,n),l=2*n-1),rev(n-seq(n*2-1)%/%2)),-1)))]=sapply(1:(n^2),function(x){y=0;while(x>2&!p(x)){x=sum(sapply(2:x,p));y=y+1};y});image(M)}

やや少ないゴルフ:

function(n){
    p=function(n)sum(!n%%2:n)<2 #"is.prime" function
    M=matrix(0,n,n)             #empty matrix
    indices=n^2%/%2+cumsum(c(1,head(rep(rep(c(1,-n,-1,n),l=2*n-1),rev(n-seq(n*2-1)%/%2)),-1)))
    values=sapply(1:(n^2),function(x){
        y=0
        while(x>2&!p(x)){
            x=sum(sapply(2:x,p))
            y=y+1
            }
        y})
    M[indices]=values
    image(M) #Plotting
}

匿名関数。グラフィックウィンドウに出力します。スケールは赤スケールで、最も暗い色合いは0に等しく、より明快な色合いは値を増やします。

n = 101の結果:

n = 101

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