回答:
最初のバージョンは34シンボル長で、Dyalog APLでまだサポートされているような、元のシングルバイトAPL文字セットの文字に制限されています。
↑c/⍨n=+/¨c←,∘.,⍨v/⍨~v∊v∘.×v←1↓⍳n←⎕
説明:
n←⎕ ⍝ ask for a number, store as n
v←1↓⍳n ⍝ generate all integers from 2 to n
v∘.×v ⍝ compute the product table of any two such integers
v/⍨~v∊ ⍝ select those that don't appear in the product table
c←,∘.,⍨ ⍝ generate all possible pairs of these primes
n=+/¨c ⍝ check which pairs have a sum equal to n
↑c/⍨ ⍝ take the first that does
2番目のバージョンは22シンボル長です。これはπ
、素数をチェックする機能を利用するためですが、Unicodeを使用するNARS2000でのみ利用できるため、UCS-2のバイトカウントは44です。
2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
説明:
⎕ ⍝ ask for a number N
⍳ -1 ⍝ generate all naturals from 1 to N-1
(⍪,⌽) ⍝ arrange it into a table of all pairs of naturals with sum N
{∧/0π⍵} ⍝ check which pairs are made of all primes
2⍴(⌿⍨ ) ⍝ return the first pair that does
例
(⎕:数字を尋ねるプロンプトです)
2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
4
2 2
2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
6
3 3
2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
8
3 5
2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
124
11 113
¯2π⍳2πn
プライム発電機として動作しますか?
π
オペレーターは正確に何をしますか?
π
スイッチ⍺
:¯2πx
x番目の素数を計算し、x ¯1πx
より小さい最初の素数であり、xの0πx
素数性をテストし、x 1πx
より大きい最初2πx
の素数であり、xより小さい素数10πx
の数であり、xの約数の数で11πx
あり、合計であるxのすべての約数の、12πx
そして13πx
それぞれ、メビウスとトーティエント関数です。最後になりましたが、モナドπx
はxの素因数分解を返します。
n=input();k=m=1;p={0}
while{n-k,k}-p:m*=k*k;k+=1;p|={m%k*k}
print n-k,k
Ideoneでテストします。
ウィルソンの定理の帰結を使用します。
常に、変数mはk-1の階乗の2乗に等しくなります。kは値1から始まり、mは値0!²= 1から始まります。セットpは、0と、kの現在の値までのすべての素数で構成されます。
各反復で、最初にn-kとkの両方がpに属しているかどうかをチェックします。これは、{nk、k}とpのセットの差が空の場合にのみtrueです。そうである場合、条件は偽であり、ループが継続します。
k> 0で、{n-k、k}はn-kの正の値の条件を満たしていることに注意してください(Goldbachの予想が真であると仮定)。したがって、pの0は偽陽性になりません。
ループでは、kとmを更新します。mの新しい値はm×k²=(k-1)!²×k²= k!²であり、kの新しい値はk + 1なので、m =(k-1)!²はまだ前後に保持されます。更新。
次に、set unionを実行して、m%k×kの値をpに追加します。ウィルソンの定理の帰結により、kが素数であれば1×k = kが加算され、そうでなければ0×k = 0が加算されます。
ループが終了すると、n-kおよびkの最後の値を出力します。これらは合計nの素数になります。
~(,2>.-1%]zip{{.,2>\{\%!}+,},!}?
コマンドライン引数を受け入れます
echo "14" | ruby golfscript.rb goldbach.gs
-> [2 12]
入力番号のすべての関連パーティションを検索します:
(,2>.-1%]zip #If only zip were a one-character command! It is so often useful.
そして、次の値を持つ素数ではない最初のパーティションを見つけます:
{np,!}? #For each partition, filter down to elements that are not prime, and only accept if there are no such results (since [] is falsey).
複合チェックブロックnp
は次のとおりです。
{.,2>\{\%!}+,}
このブロックは、指定された数値を均等に分割するすべての数値に絞り込みます。そのような数がない場合(したがって、その数は素数です)、結果は[]
になり、GolfScriptでは偽になります。
a=scan();b=2:a;p=b[rowSums(!outer(b,b,`%%`))<2];q=p[(a-p)%in%p][1];cat(a,":",q,a-q)
インデント:
a=scan() #Take user input as a numeric
b=2:a
p=b[rowSums(!outer(b,b,`%%`))<2] #Find all primes from 2 to user input
q=p[(a-p)%in%p][1] #Check which a-p also belong to p and takes the first one
cat(a,":",q,a-q)
使用法:
> a=scan();b=2:a;p=b[rowSums(!outer(b,b,`%%`))<2];q=p[(a-p)%in%p][1];cat(a,":",q,a-q)
1: 72
2:
Read 1 item
72 : 5 67
後世のための112文字の古いソリューション
a=scan();b=2:a;p=b[rowSums(!outer(b,b,`%%`))<2];w=which(outer(p,p,`+`)==a,T);cat(a,":",p[w[1,1]],p[w[1,2]])
インデント:
a=scan()
b=2:a
p=b[rowSums(!outer(b,b,`%%`))<2]
w=which(outer(p,p,`+`)==a,T) #Find the index of valid combinations
cat(a,":",p[w[1,1]],p[w[1,2]]) #Prints the first valid combination
a=/^(xx+?)(?!(xx+)\2+$)x*(?=\1$)(?!(xx+)\3+$)/.exec("x".repeat(prompt()));alert(a[1].length+"+"+a[0].length)
これで、特別な機能(基本的な後方参照サポート、肯定的および否定的な先読み)の要件が低いGoldbach推測をテストする正規表現ができました。
これはString.prototype.repeat()
、EcmaScript第6版の提案の一部であるを使用しています。現在、このコードはFirefoxでのみ機能します。
正規表現で作業するときは、簡潔なコマンドを備えたより良い言語が本当に必要です...
a,b;i(x,y){return x>y?x%y?i(x,y+1):0:x>1;}main(){scanf("%i",&a);for(b=a/2;b-->1;)i(b,2)&&i(a-
b,2)&&printf("%i:%i+%i\n",a,b,a-b);}
int
関数の宣言を削除すると、8文字を削ることができますi
。あなたは削除することで、別の2つの文字を保存することができますif
し、別の二重のアンパサンドに追加することを:i(b,2)&&i(a-b,2)&&printf(...)
&&
。(引数の型のサイレンシングに慣れることは決してありません...)
(define(p n)(=(length(factor n))1))
(define(g n)(when(even? n)(for(i 3 n 2)
(and(p i)(p(- n i))(println n {: } i { }(- n i))))))
(g(int(read-line)))
実行するコードが含まれています。結果は過度に寛大です...
72: 5 67
72: 11 61
72: 13 59
72: 19 53
72: 29 43
72: 31 41
72: 41 31
72: 43 29
72: 53 19
72: 59 13
72: 61 11
72: 67 5
スコアと感触はresのソリューションと似ていますが、投稿するには十分に異なると思います。
i=n=input()
while not{i,n-i}<set(primes(n)):i-=1
print i,n-i
ハスケル、97C
g n=head[(a,b)|let q=p n,a<-q,b<-q,a+b==n]
p n=filter c[2..n]
c p=null[x|x<-[2..p-1],p`mod`x==0]
説明:
g
「ゴールドバッハ」関数です。を呼び出すg n
と、合計する素数のペアが得られますn
。p
は未満の素数のリストを生成する関数ですn
。c
を定義するために使用されるプライムチェッカー関数p
です。実行例:
*Main> g 4
(2,2)
*Main> g 6
(3,3)
*Main> g 8
(3,5)
*Main> g 10
(3,7)
*Main> g 12
(5,7)
*Main> map g [4,6..100]
[(2,2),(3,3),(3,5),(3,7),(5,7),(3,11),(3,13),(5,13),(3,17),(3,19),(5,19),(3,23),(5,23),(7,23),(3,29),(3,31),(5,31),(7,31),(3,37),(5,37),(3,41),(3,43),(5,43),(3,47),(5,47),(7,47),(3,53),(5,53),(7,53),(3,59),(3,61),(5,61),(7,61),(3,67),(5,67),(3,71),(3,73),(5,73),(7,73),(3,79),(5,79),(3,83),(5,83),(7,83),(3,89),(5,89),(7,89),(19,79),(3,97)]
これは、入力整数のすべての解を返します。
Select[Tuples[Prime@Range@PrimePi[n = Input[]], 2], Tr@# == n &]
たとえば、1298が入力されると…
{{7、1291}、{19、1279}、{61、1237}、{67、1231}、{97、1201}、{127、1171}、{181、1117}、{211、1087}、{ 229、1069}、{277、1021}、{307、991}、{331、967}、{379、919}、{421、877}、{439、859}、{487、811}、{541 757}、{547、751}、{571、727}、{607、691}、{691、607}、{727、571}、{751、547}、{757、541}、{811、487} 、{859、439}、{877、421}、{919、379}、{967、331}、{991、307}、{1021、277}、{1069、229}、{1087、211}、{ 1117、181}、{1171、127}、{1201、97}、{1231、67}、{1237、61}、{1279、19}、{1291、7}}
書かれているように、各ソリューションを2回返します。
Union[Sort/@ %]
{{7、1291}、{19、1279}、{61、1237}、{67、1231}、{97、1201}、{127、1171}、{181、1117}、{211、1087}、{ 229、1069}、{277、1021}、{307、991}、{331、967}、{379、919}、{421、877}、{439、859}、{487、811}、{541 757}、{547、751}、{571、727}、{607、691}}
julia> g(n)=collect(filter((x)->sum(x)==n,combinations(primes(n),2)))
g (generic function with 1 method)
julia> g(88)
4-element Array{Array{Int64,1},1}:
[5,83]
[17,71]
[29,59]
[41,47]
g(int(readline(STDIN)))
a=prompt();function b(n){for(i=2;i<n;i++)if(n%i<1)return;return 1}for(c=2,r=1;c<a&&r;c++)if(b(c)&&b(a-c))alert(a+": "+c+" + "+(a-c)),r=0
return;
の代わりにreturn 0;
古いバージョン(150文字):
p=lambda n:0 in[n % i for i in range(2,n)]
n=int(input())
[print('%d+%d'%(a, b))for b in range(2,n)for a in range(2,n)if not(a+b!=n or p(a) or p(b))]
新しいバージョン(ProgramFOXのおかげ):
p=lambda n:0 in[n%i for i in range(2,n)]
n=int(input())
[print('%d+%d'%(a,b))for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))]
4 2 + 2
10 7 + 3 5 + 5 3 + 7 など、すべての組み合わせを印刷します
|
そう、boolean型で安全に使用することができます(a+b!=n)|p(a)|p(b)
print([(a,b)for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))])
(合計がnであるタプルのリストを出力します)。8バイト節約します。
r=range(2,n)
して参照するとr
、さらにいくつか節約できます。
パーティーに少し遅れましたが、私はゴルフのスキルを練習しています。
この質問を見つける前に、実際にこれをコーディングしました!そのため、他のPythonソリューションが使用する美しいラムダは含まれていません。
import math
def p(n):
if n%2==0&n>2:return False
for i in range(3,n):
if n%i==0:return False
return True
X=int(input())
for i in range(2,X):
if p(i)&p(X-i):print i,X-i;break
「ユーザーにプロンプトを表示」は、すべてのJゴルファーの悩みの種です。私の苦労して稼いだすべてのキャラクターがあります!
p:(n,n)#:i.&n,+/~p:i.n=:".1!:1]1
説明:
".1!:1]1
- 1!:1
入力(ファイルハンドル1
)から文字列()を読み取り、それを数値(".
)に変換します。p:i.n=:
-この番号を変数に割り当てn
、最初のn
素数を取ります。+/~
- n
幅とn
高さのある追加テーブルを作成します。i.&n,
-テーブルを1つのリストに変換し、n
Goldbachの推測が真である場合に存在するの最初の出現のインデックスを見つけます。p:(n,n)#:
-インデックスから行と列を取得し、対応する素数を取得します。使用法:
p:(n,n)#:i.&n,+/~p:i.n=:".1!:1]1
666
5 661
p:(n,n)#:i.&n,+/~p:i.n=:".1!:1]1
1024
3 1021
プロンプトが要件ではなかった場合、25文字の動詞を次に示します。
(,~p:@#:]i.~&,+/~@:p:@i.)
_ÆRfÆR.ị
オンラインでお試しください!または、すべてのテストケースを確認します。
_ÆRfÆR.ị Main link. Argument: n (integer)
ÆR Prime range; yield all primes in [1, ..., n].
_ Subtract all primes from n.
fÆR Filter; intersect the list of differences with the prime range.
.ị At-index 0.5; yield the last and first element.
~=primes;n=ARGS[]|>int
(n-~n)∩~n|>extrema|>show
関数が受け入れられる場合、コードは32バイトに短縮できます。
~=primes
!n=(n-~n)∩~n|>extrema
~=primes
引数までのすべての素数のリストを返す組み込み素数関数のエイリアスを作成します。n=ARGS[]|>int
最初のコマンドライン引数を解析してnに保存します。
適切な素数のペアを見つけるために、まず、前述の素数範囲をで計算し~n
ます。次に、n-~n
これらの素数とnのすべての差を求めます。
∩
結果を素数範囲自体と交差()することにより、残りの素数pがn-pも素数になるようにします。
最後extrema
に、交差点で最低と最高の素数を取るため、それらの合計はnでなければなりません。
postgresqlの場合:
create function c(c int) returns table (n int, m int) as $$
with recursive i(n) as
(select 2 union all select n+1 from i where n<c),
p as (select * from i a where not exists
(select * from i b where a.n!=b.n and mod(a.n,b.n)=0))
select * from p a, p b where a.n+b.n=c
$$ language sql;
ただし、「再帰に左外部結合がない」、「再帰にサブクエリがない」などの目的がなければ、半分のスペースでそれを行うことができるはずです...
出力は次のとおりです。
postgres=# select c(10);
c
-------
(3,7)
(5,5)
(7,3)
(3 rows)
postgres=# select c(88);
c
---------
(5,83)
(17,71)
(29,59)
(41,47)
(47,41)
(59,29)
(71,17)
(83,5)
(8 rows)
@echo off&setLocal enableDelayedExpansion&for /L %%a in (2,1,%1)do (set/aa=%%a-1&set c=&for /L %%b in (2,1,!a!)do set/ab=%%a%%%%b&if !b!==0 set c=1
if !c! NEQ 1 set l=!l!%%a,)&for %%c in (!l!)do for %%d in (!l!)do set/ad=%%c+%%d&if !d!==%1 set o=%%c + %%d
echo !o!
きちんと設定-
@echo off
setLocal enableDelayedExpansion
for /L %%a in (2,1,%1) do (
set /a a=%%a-1
set c=
for /L %%b in (2,1,!a!) do (
set /a b=%%a%%%%b
if !b!==0 set c=1
)
if !c! NEQ 1 set l=!l!%%a,
)
for %%c in (!l!) do for %%d in (!l!) do (
set /a d=%%c+%%d
if !d!==%1 set o=%%c + %%d
)
echo !o!
WITH v(x,y,s)AS(SELECT LEVEL,LEVEL,0 FROM DUAL CONNECT BY LEVEL<=:1 UNION ALL SELECT x,y-1,s+SIGN(MOD(x,y))FROM v WHERE y>1),p AS(SELECT x FROM v WHERE x-s=2)SELECT a.x,b.x FROM p a,p b WHERE:1=a.x+b.x;
ゴルフをしていない
WITH v(x,y,s) AS
(
SELECT LEVEL,LEVEL,0 FROM DUAL CONNECT BY LEVEL<=:1
UNION ALL
SELECT x,y-1,s+SIGN(MOD(x,y))FROM v WHERE y>1
)
,p AS (SELECT x FROM v WHERE x-s=2)
SELECT a.x,b.x
FROM p a,p b
WHERE :1=a.x+b.x;