前記事の姉妹版として『フィボナッチ数列を求めるワンライナー各言語まとめ』記事を立ち上げたところ,制約条件のせいか,膨大かつ&エレガントなワンライナーが大集合.『素数一覧』も同じようなスタイルで仕切り直してみることにしました.
※ここでいう『ワンライナー(one-liner program)』はシェル芸のようなものとお考え下さい(本来は逆ですが).コードレビューが重要視されている開発現場などでは避けるべきでしょう.
条件
- $1<n<100$の$n$のうち素数のみを出力(逐次出力でもREPL戻り値表示でも可)
- 素数判定・生成および素因数分解を行う関数の類は使用不可
- ワンライナー実行は,一行分のキーボード入力ののち改行一回が基本
- (今回は)関数型・反復型などは問わず,セミコロン等による複文もOK
各言語での記述例
初版として,前記事の記事本体やコメント欄の記述例(+新規言語)のうち,最も短いと思われる記述および筆者が直接確認した実装・バージョンを載せています.ワンライナー実行がシェル経由などの場合は,そのための記述も合わせています.より短い表現&他言語版歓迎(順次差し替え・追加を行います).
J(9.0.2)
(-.*/~)2+i.98
julia(1.4.1)(∉は2文字換算)
100|>x->(r=2:x)[r.∉[r*r']]
Ruby(2.7.0/irb1.2.1)
(2...100).filter{|x|(2...x).all?{x%_1>0}}
bc(1.07.1)
for(n=2;n<101;n++){i=2;while(n%i)i+=1;if(n==i)n}
Scheme(Gauche0.9.11-p1)
(remove(.$ #/^(..+?)\1+$/ make-string)(iota 98 2))
calc(2.12.7.2)
for(n=2;n<101;n++){for(i=2;n%i;i++);if(n==i)print n}
JavaScript(Node.js10.19)
for(i=1;++i<98;){for(j=1;i%++j;);i==j&&console.log(i)}
IchigoJamBASIC(1.4.3web)
?2:?3:?5:?7:FORI=9TO97:IFI%2*I%3*I%5*I%7?I:NEXTELSENEXT
Haskell(GHC8.6.5)
(\n->filter(\x->all(\z->x`mod`z/=0)[2..x-1])[2..n-1])100
CommonLisp(CLISP2.49.92)
(do((i 1))((>(incf i)99))(format(=(gcd(!(1- i))i)1)"~D~%"i))
Python(3.8.5)
[x for x in range(2,100)if not[i for i in range(2,x)if x%i==0]]
Scala(2.11.12/Java16.0.1)
var n=2;while(n<100){var i=2;while(n%i!=0)i+=1;if(n==i)println(n);n+=1;}
Lua(5.3.3)
for n=2,99 do i=2while n%i~=0 do i=i+1 end if n==i then print(n," ")end end
Clojure(1.10.1)
((fn[n](filter(fn[x](not((set(map #(mod x %)(range 2 x)))0)))(range 2 n)))100)
Erlang(OTP24)
[X||X<-lists:seq(2,100),not lists:any(fun(Z)->X rem Z==0 end,lists:seq(2,X-1))].
C(gcc9.3.0+dash0.5.10)
echo 'i;main(n){for(;++n<98;)for(i=1;++i<n?n%i:!printf("%d ",n););}'|gcc -w -xc -&&./a.out
Scheme(GNUGuile3.0.7)
(filter(lambda(x)(not(member 0(map(lambda(z)(modulo x z))(cddr(iota x))))))(cddr(iota 100)))
CommonLisp(SBCL1.4.16)
(do((n 2(+ n 1)))((= n 100))(do((i 2(+ i 1)))((=(mod n i)0)(cond((= i n)(princ n)(terpri))))))
Scheme(Chibi-scheme0.10.0)
(do((n 2(+ n 1)))((= n 100))(do((i 2(+ i 1)))((=(modulo n i)0)(cond((= i n)(display n)(newline))))))
Rust(1.47.0+dash0.5.10)
echo 'fn main(){let mut n=2;while n<100{let mut i=2;while n%i!=0{i+=1};if n==i{print!("{} ",n)};n+=1;}}'|rustc -&&./rust_out
Kotlin(1.5.20)
fun p(l:List<Int>,n:Int):List<Int>{return if(n<99){p(l.filterNot{it>n&&it%n==0},n+1)}else{println(l);l}};p((2..99).toList(),2)
Vim(8.1)(:でコマンドラインモードに入ってから入力)
echo {g->g(g)}({g->{n,r->n<2?r :{g->g(g)}({g->{n,i->n==i?1 :n%i==0?0 :g(g)(n,i+1)}})(n,2)?g(g)(n-1,[n]+r) :g(g)(n-1,r)}})(99,[])
Excel(2021-06-25時点ベータ版)
=LAMBDA(g,g(g))(LAMBDA(g, LAMBDA(n,r,IF(n<2,r, IF(LAMBDA(g,g(g))(LAMBDA(g,LAMBDA(n,i,IF(n=i,TRUE,IF(MOD(n,i)=0,FALSE,g(g)(n,i+1))))))(n,2), g(g)(n-1,n&" "&r), g(g)(n-1, r))))))(99,"")
備考
更新履歴
- 2021-12-29:Scheme(Gauche)の記述例を変更(Twitterより)
- 2021-12-29:Python3の記述例を変更
- 2021-06-29:Cの記述例を変更(コメントより)
- 2021-06-28:Kotlinの記述例を追加
- 2021-06-25:Excel(ベータ版)の記述例を追加
- 2021-06-25:Vimの記述例を変更
- 2021-06-24:Rubyの記述例を変更(コメントより)
- 2021-06-24:LISP系言語の記述例を実装ごとに分割・変更(コメントより)
- 2021-06-24:JavaScriptの記述例を変更(コメントより)
- 2021-06-24:IchigoJamBASICの記述例を追加(コメントより)
- 2021-06-22:Jの記述例を変更(コメントより)
- 2021-06-21:Jの記述例を変更(コメントより)
- 2021-06-21:条件欄に素因数分解を行う関数の類不可の旨記載
- 2021-06-21:Vim,Lua,Common Lispの記述例を追加
- 2021-06-20:初版公開(J,Julia,bc,Ruby,calc,Haskell,Python,JavaScript,Scala,Clojure,Erlang,Scheme(iota/filter使用・未使用),C,Rust)