プログラミングのお題スレ Part9 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>606 Ruby https://ideone.com/z4vm4F perlとjavascriptでも殆ど同じことができる 今日は七五三ということで 7,5,3,+,-,×,÷,(),^2を使った式(ただし7,5,3は一個しか使えない)で1から連続でいくつまで数を作れるか 1=3+5-7 2=5-3 3=3 4=(5-3)^2 5=5 6=(7-5)×3 … >>606 Ruby で、 unpacked = "Hello World!!".unpack("c*") p unpacked #=> [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 33] packed = unpacked.pack('c*') puts packed #=> Hello World!! >>616 特殊変数$$から1を作ってそれをもとに2, 4, 8, 16などを作る "%c"を繰り返したものをあらかじめ作っておき そこに上記の数字で作った"Hello World!!"の文字コードをsprintフォーマットする 標準出力を表す特殊変数$>に<<メソッドでできた文字列を出力する あとは 「"" << 文字コード」で「文字コード.chr」と同様の結果が得られるので適宜利用すると便利 >>614 ^2 は int sqr(int n){return n*n;} みたいな関数が使えるって意味だよね つまり、 x^2^2 とかは (x^2)^2 の意味で使うなら可能ってことだよね >>618 記号で1を作って、数値、文字コード、文字列としてくのか いろんな省略記法も知らないとできないな 解説ありがとう >>614 5と3を繋げて53にするようなこともしていいの? 計算部は書いたけど、元の表記で何算してるか表記するのが面倒だ。 あと、遅い・・・。 >>614 https://ideone.com/k7hAtB C++。 それとなく書いてみたけど、誤差でまくり。割り算鬼門すぎる。 多分バグってる。あと、題意理解してない可能性が微レ存。 あ、そうだ。 カッコの処理がバグバグだったからカッコ使わなかった。 うーむ・・・。なんていうか。。。 ギブアップだ。Orz >>625 「題意理解してない可能性が微レ存」どころじゃねえだろこれww 整数の範囲でも有理数の範囲でも答えが変わらないからつまらん 一旦非整数を経由しないと作れないのがないとやっぱり... (3^2)^2 = 3^4 ((3^2)^2)^2 = 3^8 だから、3^(2*3) とかやっちゃダメだろ あと、 3×5÷7 = 15÷7 ≠ 2 >>631 あー、俺がタコでした。 まぁ、前段は表示系の問題だと思うお。 後者は割り算が全部悪い。 浮動小数で比較したくないんだよなぁ。悩ましい。 有理数の法則がよくわかってないし、デカイ。 ままならんなー。 (a/b) + (c/d) = (ad + bc) / bd (a/b) - (c/d) = (ad - bc) / bd (a/b) * (c/d) = ac / bd (a/b) / (c/d) = ad / bc (a/b) = (c/d) <===> ad = bc 分子 : 整数 分母 : 0以外の整数 紙とペンで考えてみたところ 0以外の任意の整数なら3,5,7で表わせるから問題として不適なのでは? >>637 3,5,7は1回までって回数制限があるから 表せる数は限られるよ。 ああ、本当だ。17はどうやっても作れないね しかしこれをどうやってコードで計算すんだろう ^2があるから全探査はできないし 自分は「+または-」をいくつ使うかで場合分けして一個一個可能性を消していったんだけれども 独自有理数クラス 演算回数を1回ずつ増やしていって、 出来た値に対応するフラグをセット 数値をstd::multisetで保持 演算n回目のmultisetをstd::setで保持 ABC4D -E3FG ----- 77777 A〜G は、1〜9 の異なる数字。 ただし、3, 4 ではない >>645 Ruby f = ->a, b, c, d, e, f, g{10000*a + 1000*b + 100*c + d - (1000*e + 10*f + g) == 78037} [1, 2, 5, 6, 7, 8, 9].permutation{|a| puts "%d%d%d4%d - %d3%d%d == 77777" % a if f[*a]} #=>87142 - 9365 == 77777 >>647 何も、そこまで作り込まなくても良いだろw 色々な覆面算に対応するため、汎用的に書いたのか 500, 100, 50, 10, 5, 1円のすべての種類の硬貨を、1枚以上使って、 合計15枚で750円にする時、10円硬貨は何枚になるか? A〜E の5人のランナーが走った結果、 完走したのは、1着とべべの2人で、残りの3人は、途中で棄権した ここで、完走した2人は、必ず真実を言い、 棄権した3人は、必ず嘘をつくものとする (つまり、事実に対して、真偽値を取る) A: D は棄権した B: A は、べべだった C: E は棄権した D: C は、べべだった E: B は完走した A〜Eがこのように答えた時、1着は誰か? 先に答えやそれに至る式がわかっててコードに書き直すだけになっちゃうから 数学的に道筋立てて答えが出せるものはあんまりおもしろくないんだよな アルゴリズムとは、数式の完全コピー 最初に、数式を考えて、その数式が間違っていれば、 撃墜モードでは、そこを突かれて撃墜される 結局、数式の証明が大事。 証明に、勘違いが無いかどうか お題 1から99を表示する お題:1から999を出力する ただし0を含む数は除く >>658 1000.times{|i|p i unless i.to_s[?0]} >>658 GNU Smalltalk 1 to: 999 do: [:n | (n asString includes: $0) ifFalse: [n displayNl]] >>658 F# let () = seq { 1..999 } |> Seq.iter (printfn "%d") >>658 https://ideone.com/unKY2z C++。ほかの言語だと一行で書けるんだけどなぁ。 まぁ過去に比べれば大分短くなったけど。 >>658 文字も数もその場に合わせて適当に解釈してくれる言語だと楽だね。 perl だとこれでできる。 for(1..999){print"$_\n"unless(/0/)} >>658 @Mathematica nListWithoutZero[n_]:=n// Range[1,#]&// Map[ToString,#]&// StringCases[#,RegularExpression["^(?!.*0).*$"]]&// Flatten; In[1] := nListWithoutZero[999] Out[1] = (略) >>658 rust https://ideone.com/NFrvi7 fn main() { println!("{:?}", (1..1000).filter(|i| !i.to_string().contains("0")).collect::<Vec<_>>()) } >>658 Kotlin で文字列変換してやる場合 fun main(args: Array<String>) { for (i in 1..999) if (! i.toString().contains('0', false)) println(i) } 数値のままやる場合 fun main(args: Array<String>) { for (i in 1..999) if (i % 10 != 0 && (i < 10 || i / 10 % 10 != 0) && (i < 100 || i / 100 % 10 != 0)) println(i) } http://rio2016.2ch.net/test/read.cgi/math/1510671832/722 お題: n^2-1 = m^5 を満たす自然数 n, m は存在するか? 存在するという人と存在しないという人の両方が存在します >>670 (n, m) = (1, 0) 揚げ足取りはおいておいて、プログラミングで説く問題じゃないよね >>658 python 今回は必要ないかもだけど桁数増えた場合を考え再帰で https://ideone.com/WC8Ksm >>671 まあ自明な解はさておき、その他は見つからないのが不思議です >>673 カタラン予想ですでに存在しないことが証明されているのに何が不思議なのかね >>673 その問題は数学的に解くものではないかな? まあ、コンピュータなら力業でかなりの値を n, m に入れて計算して確認できるけどさ。 >>658 #!/bin/sh seq 999|grep -v 0 >>658 Kotlin数値判定版。こんな風にも書けるなと後で気づいた。 fun f(n: Int): Boolean { var m = n; while (m != 0) { if (m % 10 == 0) return false m = m / 10 } return true } fun main(args: Array<String>) { (1..999).filter(::f).forEach(::println) } 存在するしないをプログラミングで証明するのはお題として良くない log 2 を2進数表記した時の小数点第 n 位から n + 9 位までを求めよ. (1 ≦ n ≦ 10^10) cf. log 2 = 0.10110001... *Sample input* 1 11 10000 31415926 314159265 *Sample output* 1011000101 1100100001 0010110110 1001010110 0111101001 >>680 c++で書いたけど小数第100億位を計算するのに5時間くらいかかりそうorz ライブラリを使えばほとんど何も書かなくて良いけど どこから書くことを求められてるの? >>679 「良くない」じゃなくて「出来ない」でしょ >>684 と思ったけど、普通に全桁計算したら終わらないな Σ { 1 / (2^i × i) } を使って10^10項位までを42bitくらいだけ計算すれば出来るかな? 1/nの周期性を考えないと計算量的に無理? 10^10が微妙に32bitを越えてるのがイヤだねえ >>687 ダメだ ざっと計算量を見積もったらとても5時間じゃ終わらない >>375 xxx@xxx-VirtualBox:~/casl$ casl -s -e -i stdlib.casl -i bigint.casl fact.casl 1 1 2 6 24 120 720 5040 40320 362880 途 中 省 略 1405006117752879898543142606244511569936384000000000 60415263063373835637355132068513997507264512000000000 2658271574788448768043625811014615890319638528000000000 119622220865480194561963161495657715064383733760000000000 5502622159812088949850305428800254892961651752960000000000 258623241511168180642964355153611979969197632389120000000000 12413915592536072670862289047373375038521486354677760000000000 608281864034267560872252163321295376887552831379210240000000000 30414093201713378043612608166064768844377641568960512000000000000 暇つぶしに書いてみたけど足算掛算割算しかできない 引算は難しすぎるんで諦めた バイナリ法で最適化した結果なんとか1時間あれば10^10位は計算できるようになったがまだ縮められるかな >>680 指数関数のマクローリン展開で試してみたのですが、これは収束が遅すぎますね、それに収束半径を超えてるし… なにか収束の早いよい方法はないものか… 対数関数のマクローリン展開? そりゃ無理だ log 0 が定義されてない >>689 CASLで書いたの? ソースコードは? >>680 log 2 = Σ_[i=1, 2, ...] { 1 / (2^i × i) } 冪剰余 でいける気がしてきた しばらく暇がない 時間が空いたら アセンブラ & C++ & OpenMP でやってみる >>650 (setq aaa '(1 5 10 50 100 500)) (setq ddd 750) (setq jjj 15) (defun bbb (ccc iii) (if (= iii 0) ccc (let (eee) (dolist (fff ccc) (dolist (ggg aaa) (when (<= (+ (apply #'+ fff) ggg) ddd) (push (cons ggg fff) eee)))) (bbb (remove-duplicates (mapcar (lambda (x) (sort (copy-seq x) #'<)) eee) :test 'equal) (1- iii))))) (let* ((kkk (bbb '((0)) jjj)) (lll (mapcar (lambda (x) (remove 0 x)) kkk))) (remove-if-not (lambda (x) (and (= (apply #'+ x) ddd) (= (length x) jjj) (= (length (remove-duplicates x)) (length aaa)) )) lll)) ((1 1 1 1 1 5 5 5 10 10 10 50 50 100 500)) >>650 (setq aaa '(A B C D E)) (defun fff (ddd) (if (null (cdar ddd)) ddd (let (eee) (dolist (jjj ddd) (let ((bbb (car jjj)) (ccc (cdr jjj))) (setq eee (append (mapcar (lambda (x) (cons (cons x bbb) (remove x ccc))) ccc) eee)))) (fff eee)))) (defun iii (kkk) (if (< kkk 2) #'identity #'not)) (let* ((ggg (fff (list (cons nil aaa)))) (hhh (mapcar (lambda (x) (car x)) ggg))) (remove-if-not (lambda (x) (and (funcall (iii (position 'A x)) (> (position 'D x) 1)) (funcall (iii (position 'B x)) (= (position 'A x) 1)) (funcall (iii (position 'C x)) (> (position 'E x) 1)) (funcall (iii (position 'D x)) (= (position 'C x) 1)) (funcall (iii (position 'E x)) (< (position 'B x) 2)))) hhh)) ((D C B E A) (D C E B A) (D C A E B) (D C E A B) (D C A B E) (D C B A E)) >>694 いやいや https://ja.wikipedia.org/wiki/%E5%AF%BE%E6%95%B0 log(1-x) = - Σ((1/n)x^n) に x = -1 を機械的に代入しました、収束半径外ですが、この値は正しいらしい。 >>695 うんCASL 全部で1200行かあ xxx@xxx-VirtualBox:~/casl$ wc -l stdlib.casl bigint.casl fact.casl 274 stdlib.casl 851 bigint.casl 76 fact.casl 1201 合計 ソースはこういうのが延々続いててずっと眺めてるとゲシュタルト崩壊起こして 何が何だか分からなくなるよ ld gr5,0,gr1 ld gr6,1,gr1 lad gr4,4,gr1 addl gr4,gr0 st gr4,0,gr1 st gr6,1,gr1 ld gr4,=1 st gr4,2,gr1 st gr0,3,gr1 ld gr6,gr1 ld gr1,0,gr1 st gr5,0,gr1 st gr6,1,gr1 xor gr4,gr4 st gr4,2,gr1 lad gr2,-4,gr2 subl gr2,gr0 st gr2,3,gr1 ld gr0,gr3 >>699 他だ単に対数って言えば log x のこと これをマクローリン展開は無理 log (1-x) のマクローリン展開ならそう書かないと通じない 収束半径の外じゃなくて、収束半径丁度でしょ -log (1-x) のマクローリン展開に、 x = 1/2 を入れると >>696 になる 理解はしてないが、出てきたので貼っとく。 指数対数関数等の超越関数の多倍精度計算 本論文では、 指数対数関数の高精度計算として Taylor 展開に BSA 法を使って高速化する方法提案する。 約 1000 桁以下の精度の計算では、 Taylor 展開を使った計算が Sasaki and Kanada[5] によって、様々な計算 法を比較して最も高速であることが示されているので、 計算時間が問題となるのは、 1000 桁以上の精度の 計算である。 ここで提案した Taylor 展開に BSA 法を適用して高速化した方法と Sasaki and Kanda によっ て提案された方法を 1000 桁を超えた精度で比較し、 その高速性を示した。 211 階乗計算例 10000! の計算を行う。 この計算では、 BSA 法を使うだけでなく、 1600 桁以上の数値に対しては FFT を利用して乗算を行っている。 計算方法 計算時間(msec) BSA 47 従来の方法 3578 このほか、 三角関数、逆三角関数、双曲線関数など簡単な規則で各項の係数が表現でき、 多くの関数がこの 行列の乗算形式に変形できます。Taylor 展開の係数が簡単な規則で表現できない $\tan x$ が例外的に表現できないだけである。 3 まとめ 指数関数や対数関数の Taylor 展開に BSA 法を適用することによって、 BSA を使わない従来の方法に比べ40 %程度の高速化ができた。 対数関数に対しては、 5000 桁程度の精度で最も高速な計算方法として知られた Sasaki and Kanada の方法を超えることを示した。 http://www.kurims.kyoto-u.ac.jp/ ~kyodo/kokyuroku/contents/pdf/1456-24.pdf >>702 たしかに 収束半径は |x < 1| なのでは? とりあえず理解はできた計算方法として、logxの近似値などをaとおいたとき、 logx = a + log(x/e^a)という変形を用いる方法だ。 aが近似値だと、x≒e^aなので良いらしい。 >>705 収束半径は1 収束半径は、収束するエリアと収束しないエリアの境目となる円の半径 収束半径丁度の時は収束する場合もあるししない場合もある >>706 計算する項が少なければ良いわけではなく、 各項の計算時間も重要 exp(x)は、(exp(x/k))^k (kは2ベキ)、とするといいらしい。 k=2なら、括弧内を計算したやつ同士の掛け算。 >>701 なるほどありがとう 怖いもの見たさがあった >>689 えへへ、調べさせてもらったよw 後半は 42! から 50! までの値だね この範囲なら、多数桁×ワンレジスタの計算で済みますね 多数桁×多数桁を実装すれば思いっきり褒めてあげるよ、えへへ:−) >>711 ほい xxx@xxx-VirtualBox:~/casl$ casl -s -e -i stdlib.casl -i bigint.casl bimul.casl 350306543997676425792 153864088327713953064 53899597027434699691252340823058767026688 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる