予約語を使用せずに最初の128個の素数を出力します


13

明らかな解決策は、単に文字列として印刷することですが、より短いコードを書くことは可能ですか?

要件:

  1. 入力は処理されず、出力は2 3 5 7 11 13 ...etcなどの形式である必要があります。
  2. その言語の予約語はまったく使用されていません
  3. この言語は、少なくとも構造化プログラミングを許可し、予約語を使用する必要があります(そうでない場合、ポイント2は意味がありません)。

最初はC / C ++のみを念頭に置いていましたが、不正行為を防止しようとしながら質問を拡張しました


1
残念ながら、Tclには予約語がありません。
ヨハネ

回答:


14

C、60文字

「キーワードなし」の制限はここでは重要ではありません。可能であれば、キーワードを追加しても改善されないだろうと確信しています。

n=2;main(m){n<720&&main(m<2?printf("%d ",n),n:n%m?m-1:n++);}

代替バージョン:
出力はそれほど良くありませんが、私はprintf悪用が好きです。

n=2;main(m){n<720&&main(m<2?printf("%*d",n,n):n%m?m-1:n++);}

両方のソリューションの秘trickは、2つのループ(再帰によって実装される)を1つにマージすることです。
n次の潜在的な素数、m次の潜在的な除数です。
各再帰呼び出しで、インクリメントnm前の値に設定中)またはデクリメントしますm


7

Python、108文字

Pythonはこの挑戦のために作られたものではありません。したいprint?それは予約されています。さて、私たちはどのように使用しstdoutますか?まあ、それは費用がかかりimportます...あなたはそれを推測し、予約しました。まあ...私はUnix上にいるので、ファイル記述子1を開くことができます。これはたまたまstdoutです。ハック!

男と反復?何もありませんeval。もちろんループはありませんが、deforで関数を定義することもできませんlambda。そして、怪我にin辱を加えるために、リストの理解さえ使用することはできません!私はいつもmap(p.__mod__,...)コードゴルフのようなものを使う言い訳を探しています...理解は常により良いです。今までです。

p=1
eval(compile("p+=1;open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p))));"*720,'','exec'))

さて、あなたはそれが文句を言うかもしれませんexec(私もしませんでした私は、キーワードを使用していないにもかかわらず、キーワードです)。さて、これはを使用しない117文字のソリューションです。evalexec'exec'

p=2
s="eval('('+s*(p<720)+')',open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p)))),{'p':p+1})";eval(s)

1
印刷には、使用することができます:)のpython3に予約されていない__import__が、それはつもりコスト文字だ
gnibbler

6

JavaScript(80文字)

eval((s=Array(719)).join("s[j=++n]?j:"+s.join("s[j+=n]=")+"r+=n+' ';"),r="",n=1)

Webブラウザーのコンソールで実行します。

プライムシーブを使用しましたが、非常に凝縮されていました。


4

C、183文字

#define q j*j<k?i%p[j++]||(i++,j=0):printf("%d\n",p[j=0,k++]=i++)
#define A q;q;q;q;q;q;q;q
#define B A;A;A;A;A;A;A;A
#define C B;B;B;B;B;B;B
main(){int i=2,j=0,k=0,p[999];C;C;C;C;C;}

さて、ここに簡単な最初の試みがあります。これは要件を満たす必要があると思います。私は単純な試行分割を使用して素数を見つけ、プリプロセッサを使用して構築された展開されたループを見つけて、十分な数になるまで繰り返します。繰り返しの数が調整され、正確に128個の素数が出力されるようになりました。


4

C、87文字

d;p(n){--d<2||n%d&&p(n);}r(n){p(d=n);d<2&&printf("%d\n",n);++n<720&&r(n);}main(){r(2);}

(私はそれをより機能的なスタイルで書き込もうとしましたが、returnある種の使用ができなかったため、その計画は殺されました。)


3

C、134文字

以下は、予約されているかどうかに関係なく、可能な限り単語を使用しないようにする代替ソリューションです。

main(i){i<9?main(2953216):i>4097?--i&4094?i/4096%(i%4096)?main(i):
main((i/4096-1)*4097):printf("%d\n",i>>12,main((i/4096-1)*4097)):0;}

すべてのそれは使用していますprintfし、main単一の引数で。


3

Mathematica 50文字

Mathematicaの「予約語」の解釈方法がわかりませんが、プレイしたいので、組み込み関数なしで素数を生成したり、素数性をテストしたりすることを意味します。

Fold[#2Cases[#/#2,1|_Rational]&,#,#]&@Range[2,719]

2

Haskell、72文字

main=putStrLn.unwords$take 128[show p|p<-[2..],all((>0).mod p)[2..p-1]]

確かに、Haskellではキーワードを避けることはそれほど難しくありません。


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