プログラミングのお題スレ Part12
■ このスレッドは過去ログ倉庫に格納されています
同じもの ttps://ideone.com/Dff2U9 >>214 Ruby require 'matrix' def hoge(a, b, c) rm, fm, im = Matrix[[1, 1], [1, 0]], Matrix[[1, 0], [0, 1]], Matrix[[b], [a]] (0..Float::INFINITY).each do |n| m = fm * im return m[1, 0] > c ? false : n if m[1, 0] >= c fm *= rm end end p hoge(0,1,88) #=> false p hoge(0,1,89) #=> 11 p hoge(0,1,90) #=> false C 初項の次第二項って書いてるのに、みんな何故0始まりなの。。。 #include <stdio.h> int fibin(int,int,int); int main(void) { for(int i = 0;i < 6;i++) printf("%d:%d\n",i,fibin(1,1,i)); return 0; } int fibin(int fst,int snd,int num) { int i = 2,fib = fst; if(fst == num) return 1; if(snd == num) return 2; while(fib != num) { fib = fst; fib += snd; if(fib <= num) i++; else return -1; fst = snd; snd = fib; } return i; } (A,B,C)が(0,0,0),(0,1,0),(0,1,1),(1,0,0),(1,0,1)の時はCが無限回、(1,1,1),(0,X,X),(X,0,X),(X,X,X)(2≦X)の時はCが2回出現することがあるが考慮した方が良いか? そういやa,bが0,0だと足しても0だからcも0じゃないと無限ループするかな。 した。見事にした。 足してゼロなら特別扱いして終わらせる処理がないとダメだったということだな。 今さら直す気は起きんが。 >>221 今まで投稿されてるコード見る限りは最初に見つけた時点で停止。 >>222 自然数って指示だから止まるはずだけど、関数の引数側でunsigned指定して(Javaとかだとuint)おいた方が良いかもね。 >>214 Squeak/Pharo Smalltalk | fibGen fn | fibGen := [:fst :snd | Generator on: [:g | | a b | a := fst. b := snd. g yield: a. [b := a+b. g yield: (a := b-a)] repeat ] ]. fn := [:A :B :C | | count fib last | count := 1. fib := fibGen value: A value: B. [(last := fib next) < C] whileTrue: [count := count + 1]. last = C ifTrue: [count] ifFalse: [false] ]. fn value: 1 value: 1 value: 89. "=> 11 " fn value: 1 value: 1 value: 90. "=> false " Haskell main = mapM_ (\x -> putStr (show x ++ ":") >> print (fibin 0 1 x)) [0..6] fibin 0 0 c | c /= 0 = Nothing fibin a b c = lookup c $ zip (take (10 + c) fib) [1..] where fib = a:b:(zipWith (+) fib (tail fib)) >>214 ruby https://ideone.com/Q6aVfo AとB足してゼロ問題に対しては fib = ->a, b {Enumerator.new {|y| loop {y << a; a, b = b, a + b; break if b == 0}}} お題 xy平面上の点がn+1個与えられる(各点のx座標は互いに異なる) 与えられた点をすべて通る関数 y=a[i]x^n+...+a[1]x+a[0] の係数a[i]を求めよ [入力] 点の個数(n+1) x[0] y[0] ... x[n] y[n] [出力] a[n] ... a[0] 2 0 1 1 3 => 2 1 (y=2x+1) 1 100 100 => 100 5 0 1 -1 5 2 2 4 -1 1 0 => -2/15 4/15 49/30 -83/30 1 【ラグランジュ補間】 Σ[i=1,n] )y[i]Π[k≠i](x-x[k])/ (x[i]-x[k]) この係数を計算するだけ。 こういう純数学的な処理は、お題としてはどうかな? 応用上、常に展開した係数を求めるのに意味がある とも限らんし、精度評価が重要だったりとか >>229 線形代数は偉大 import numpy as np N = int(input()) x, y = [], [] for i in range(N): _x, _y = map(float, input().split()) x.append(_x) y.append(_y) x = np.array(x) y = np.array(y) px = np.array([x**k for k in range(N)]) a = np.dot(y, np.linalg.inv(px)) print(a[::-1]) [1 x[0] x[0]^2...x[0]^n] [a[n]] =[y[0]] [1 x[1] x[1]^2... x[1]^n] [a[n-1]]=[y[1] [1 x[2] x[2]^2...x[2]^n] [a[n-2]]=[y[2]] ... [1 x[n] x[n]^2 .... x[n]^n] [a[0] ]=[y[n]] を解かせたというわけか... お題: 四則演算の文字列を受け取って計算結果を返す 1+2+3+4 => 10 4+5*6-2*3 => 28 5+12*(2+9/3)/((2+3)*5-7*3) => 20 >>229 Ruby s = ->a, b{a.zip(b).map{|i, j| i - j}} t = ->a, k{a.map{|i| i * k}} n = gets.to_i - 1 m = $<.read.split($/).map{|e| f[n, *e.split.map(&:to_r)]} (1..n+1).each do |r| (nonzero = m[r- 1..-1].find_index{|e| e[r].nonzero?} + r - 1) && next m[r - 1], m[nonzero] = m[nonzero], m[r - 1] m[r - 1] = t[m[r - 1], 1/m[r - 1][r]] [*[*(0..n)] - [r - 1]].each{|i| m[i] = s[m[i], t[m[r - 1], m[i][r]/m[r - 1][r]]]} end puts m.transpose[0].map{|i| i.denominator == 1 ? i.to_i : i} * ' ' 2 0 1 1 3 #=> 2 1 (y=2x+1) 3 1 1 1 1 5 4 2 1 8 9 3 1 #=> -1/2 11/2 -4 >>235 訂正 尚複数解存在する時は最も次数の小さいものを出力 2 0 1 1 3 #=> 2 1 3 1 1 5 2 8 3 #=> -1/2 11/2 -4 >>234 ruby -nle'puts [$_,eval($_)]*" => "' 1+2+3+4 => 10 4+5*6-2*3 => 28 5+12*(2+9/3)/((2+3)*5-7*3) => 20 >>235 訂正 s = ->a, b{a.zip(b).map{|i, j| i - j}} t = ->a, k{a.map{|i| i * k}} n = gets.to_i m = $<.read.split($/).map{|e| f[n + 1, *e.split.map(&:to_r)]} n.times do |r| (nonzero = m[r..-1].find_index{|e| e[r].nonzero?} + r) || next m[r], m[nonzero] = t[m[nonzero], 1/m[nonzero][r + 1]], m[r] [*[*(0..n + 1)] - [r]].each{|i| m[i] = s[m[i], t[m[r], m[i][r + 1]/m[r][r + 1]]]} end puts m.transpose[0].map{|i| i.denominator == 1 ? i.to_i : i} * ' ' >>229 Squeak Smalltalk | fn | fn := [:points | | xs ys fi gi | xs := points collect: #x. ys := points collect: #y. fi := [:x :i | ((1 to: xs size) copyWithout: i) inject: 1 into: [:prod :k | prod * (x - (xs at: k))]]. gi := [:i | (0 to: xs size - 1) collect: [:n | n = 0 ifTrue: [1] ifFalse: [ (Array streamContents: [:ss | (xs copyWithoutIndex: i) combinations: n atATimeDo: [:comb | ss nextPut: (comb negated reduce: #*)] ] ) sum ]] ]. (ys * ((1 to: xs size) collect: gi) / (xs collectWithIndex: fi)) sum ]. fn value: {0@1. 1@3}. "=> #(2 1) " fn value: {100@100}. "=> #(100) " fn value: {0@1. -1@5. 2@2. 4@ -1. 1@0}. "=> {(-2/15) . (4/15) . (49/30) . (-83/30) . 1} " >>229 Pharo Smalltalk w/PolyMath >>231 っぽく "Metacello new repository: 'github://PolyMathOrg/PolyMath:master/src'; baseline: 'PolyMath'; load" | fn | fn := [:points | | xs ys xp | xs := points collect: #x. ys := points collect: #y. xp := (PMMatrix rows: ((xs size - 1 to: 0 by: -1) collect: [:m | xs raisedTo: m])) transpose. (xp inverse * ys asPMVector) asArray ]. fn value: {0@1. 1@3}. "=> #(2 1) " fn value: {100@100}. "=> #(100) " fn value: {0@1. -1@5. 2@2. 4@ -1. 1@0}. "=> {(-2/15) . (4/15) . (49/30) . (-83/30) . 1} " お題 Windows bitmap画像(.bmp)は通常、下から上に向かって画像が記録されているが、 高さに負の値を指定することで、上から下へ向かって画像を記録することができる。 これを利用してbmp画像の上下を反転せよ。 どこが問題なのw 仕様に沿った解決法言っちゃってるじゃんw >>242 プログラムを作るのがお題だろう。 ここはプログラミングのお題スレなんだからこれでいいんだよ。 むしろ人がある程度プログラムの仕様を考えなければならないような数学問題みたいなやつがダメなお題。 >>241 Ruby in_fname = 'hoge.bmp' out_fname = 'hoge_ud.bmp' File.binwrite(out_fname, File.binread(in_fname).tap{|b| b[22, 4] = [-b[22, 4].unpack(?l).pop].pack(?l)) >>243 あなたがそういう問題しか好きじゃないか解けないだけでしょ スレ民の総意みたいな言い方しないで >>243 紙とえんぴつで解ける数学問題みたいなやつがプログラミングのお題としてダメなのは同意なんだけど>>241 は例えば 画像の上下を反転せよ。入力はbmpとする。 とかのほうが良かったんじゃないかな。 愚直に配列いじる奴を尻目に仕様を利用して華麗に解くやつが現れる。 これがいいんじゃないか。 >>245 スレ民の総意がどうであろうともこのスレはプログラミングのお題スレなんだからプログラミングのお題になってないのはスレチであることには代わりがない。 適切なスレに書くかまたはなければ新たにそれ用のスレを作って書けば良い。 >>246 それでもいいかも知れないが問題が簡略化されているために自分で仕様を調べるというプログラミングとは少し違う作業が発生するな。 更に仕様の盲点に気付くかというクイズ的な要素もある。 まあ式を実装するだけの数学問題と大差ないお題にしてしまうような要素は不要だったな >>245 >>244 じゃないけど、数学の問題は問題自体が分からないから手が出せない。 高卒でも分かるように噛み砕いて貰えれば書けるかもだが。 そう考えると、プログラミングの能力って言語覚えるより問題を理解する能力だよな。。。 噛み砕くとこうだな ファイルの22バイトめから保存されている4バイト長の整数値の符号を反転せよ。 ただし数値は下位バイトから順に格納されており、負数は2の補数表現を用いるものとする。 出力は反転した数値以外は元のファイルと同じ内容のファイルとする も要るか >>251 ごめん >>229-230 の方が分からないんだ。。。 >>243 >ここはプログラミングのお題スレなんだからこれでいいんだよ。 >むしろ人がある程度プログラムの仕様を考えなければならないような数学問題みたいなやつがダメなお題。 スレタイ『プログラマーは何を勉強すべきか?』 プログラマーは何を勉強すべきかということだが、最新のトレンドに適応した勉強が必要だ。 俺は今までこれだけ沢山勉強してきたという人も、実は最新のトレンドに適応していない可能性もある。 5、結論 以上の結果より導き出される京大英語で8割を超すための対策は、「ネイティブ英語とは何か」 を定義づけして学ぶことに尽きるだろう。 たとえば、「この料理はまずい」という英作文なら受験生に多いのが This dish tastes poor. しかし、これは評価されない。なぜなら、英語として正しくてもマナー違反。英検英語なら否定文にして、 This dish isn't good. これでマナーは改善された。 しかし、ネイティブなら I don't like this dish. と言うだろう。本当に不味い場合は、 Yuck! と叫ぶ。そういう違いだ。 問題は、 「受験英語の参考書や問題集で取り上げられている構文や表現が現実に使われている英語と違う」 という事実。それを指導している教師や講師も、外国生活がなく50年前の表現を気づかずに指導して いること。そのために、校内テストや模試で高得点や上位の順位をとっても落ちてしまうこと。 https://storys.jp/story/18159 「この料理はまずい」の時点でマナー違反なんだからそのまま訳すのが正しい 料理がまずいときの一言を答えさせたいならそう出題すればいいことだ そういう出題側の質とか意識してんのかなこいつ 数学のように、頭の中で正しいかどうかを、証明するような問題は、面倒くさい。 このスレでは、頭を使わず、単純な総当たり問題が好まれる その方が、プログラミング的な問題 お題: 自然数Nと、N個の「半角の小文字アルファベットと数字からなる1文字以上の文字列」が標準入力から順次与えられます。 文字列をNatural Sort*して標準出力から順次出力してください。 追加問題: お題1を正規表現を使わず実装してください。 *: "a120"と"a13"が与えられた場合、"a13","a120"の順番にソートするようにする。 また、今回は"a01"と"a1"が与えられた場合、連続する数字が少ない方を先にする、すなわち"a1","a01"の順になるようにするものとし、 "0"と"a"のどちらが先に来るかについては自由とします。 >>257 >数学のように、頭の中で正しいかどうかを、証明するような問題は、面倒くさい。 >このスレでは、頭を使わず、単純な総当たり問題が好まれる ならば、「チンポがシコシコする」という日本語表現は、文法的に正しいのか? チンポ「を」シコシコするのではなくて、チンポ「が」シコシコする。この場合、「チンポ」は主語となる。 オブジェクト指向で言う「集約」は2種類あって、全体(俺)と部分(チンポ)が繋がっている場合と、 全体(俺)と部分(チンボ)が別々になっている場合とが考えられる。けれども「チンボ」はそれ自体 が独立した生き物であり、所有者の意思とは無関係に、勃起して「シコシコする」。 例えば寝てる時にエロい夢みて朝起きてみたらチンコが勃起して射精してたとか。 違うか? 「胸がドキドキする」は良いが、「チンポがシコシコする」はダメな理由を、50字以内で述べろ! >>257 まあそうなんだけど、数学スレでガンガンプログラミング言語で答え出してる奴がいて正直羨ましい。 なぜそのスレで頑張らないのか。 二軍でヒーローになろうと思ってここで数学の問題出してるの? >>261 >なぜそのスレで頑張らないのか。 >二軍でヒーローになろうと思ってここで数学の問題出してるの? 俺はただパソコンに向かって独り言ブツブツ言って、チンポがシコシコしてるだけだが? >>258 How do I do a natural sort on an array? ttps://www.perlmonks.org/?node_id=68185 これを実装すんの? >>265 『チンポ』についての生態学は、俺にもよくわからん。 >>258 Ruby puts$<.readlines.sort_by{|a|[a.scan(/\d+|\D+/).map{|e|e.to_i(36)},a.size]} >>267 >>258 >また、今回は"a01"と"a1"が与えられた場合、連続する数字が少ない方を先にする、すなわち"a1","a01"の順になるようにするものとし、 >>268 問題無い # stdin a130 a12 a001 a01 a1 1 # stdout 1 a1 a01 a001 a12 a130 >>269 a001 a12 これ逆にならんとあかんのとちゃう? ソートの問題、 連続する数字はその連を数値として比較しつつ同じ数値のときは桁数少を前としているわけだよな つまり a01a a1b a01b をソートすると a01a a1b a01b >>258 Haskell main = concat $ map qsort grop grop = map filterlen [1..(maximum $ map length input)] filterlen n = filter (\x -> n == length x) input qsort [] = [] qsort (x:xs) = small ++ [x] ++ big where small = qsort [a |a <- xs, a <= x] big = qsort [a | a <- xs, a > x] input = ["a130","a12","a001","a01","a1","1"] input = ["a130","a12","a001","a01","a1","1"] >>274 >連続する数字はその連を数値として比較しつつ同じ数値のときは桁数少を前としているわけだよな 同じ数値のときじゃなくて全体が等しいときか >>275 input = ["01m30s","1m45s","02m03s"] 結果 ["1m45s","01m30s","02m03s"] あんまりnatural じゃない感じ お題 M行N列の領域をジグザグスキャンするときの順序を求めよ 3 3 => 1 2 6 3 5 7 4 8 9 4 2 => 1 2 3 5 4 6 7 8 3 5 => 01 02 06 07 12 03 05 08 11 13 04 09 10 14 15 1 8 => 1 2 3 4 5 6 7 8 >>278 そう? ナチュラルソートっての知らんけど、その結果見ても仕様通りと思うんだが。 >>267 を訂正 Ruby puts$<.readlines.sort_by{|a|a.scan(/(\D*)(\d+)/).map{|i,j|[i,j.to_i,j.size]}} # stdin a01b2 a1b0002 a130 a12 a001 a1 1 # stdout 1 a1 a1b0002 a01b2 a001 a12 a130 誰に何を文句言うわけでもないがナチュラルソートってのは一般に "01.25" < "1.5" "01m 25cm" < "1m 35cm" とか "Chapter 001 section 5" < "Chapter 1 section 6" となるような順序での整列 逆でもいいけど 問題の仕様はどうかしらんが単に用語の解説ね 今回の問題の仕様とは微妙に違うから回答にはならないけど echo -e "01m30s\n1m45s\n02m03s" | sort -V 01m30s 1m45s 02m03s ナチュラルソートならこうなるべきだな >>283-284 の仕様で Ruby args = [ '01.25', '1.5', '01m 25cm', '1m 35cm', 'Chapter 001 section 5', 'Chapter 1 section 6', '01m30s', '1m45s', '02m03s' ] nsort = lambda do |args| f = ->str{str.scan(/(?=.)(\D*)(\d+(\.\d+)?)/).flat_map{|a, b| b.empty? ? [a] : [a, b.to_r]}} g = ->str{str.scan(/\d+/).map(&:size)} args.sort do |str1, str2| comparison = f[str1] <=> f[str2] comparison.zero? ? g[str1] <=> g[str2] : comparison end end p nsort[args] #=>["01m30s", "1m45s", "01m 25cm", "1m 35cm", "01.25", "1.5", "02m03s", "Chapter 001 section 5", "Chapter 1 section 6"] >>265 『チンポ』については、自分でも良くわからない、何とも言えない不思議な生き物だ。 お題 1以上N以下の奇数を並べた数の桁数を求めよ 3 => 2 (13) 10 => 5 (13579) 9999 => 19445 (135...99979999) 123456789 => ? 31415926535897 => ? >>287 桁数というか奇数が何個かって話やね。 わざわざ分かりにくい仕様とか、コミュ障かと。 ん、ああ。 10とか100とかになったら個数と桁数は違うか。 悪かった。 >>290 問題の意味がわからん。何か例を書いてくれ。 134217728 が与えられたら 8^9 を返すとかそういう話かね? >>287 Haskell main = mapM_ print $ zip3 lst fosl fos oddstr [] = [] oddstr (x:xs) = show x:oddstr xs fo = map (\x-> filter (odd) [1..x]) lst foo f = map (f.concat.oddstr) fo fos = foo id fosl = foo length lst = [3,10,999,123456789,31415926535897] コードはすぐ出来たけど、計算が終わらないw 奇数が多すぎてバッファに残ってなさそうだから、ファイルにリダイレクトし直しかな。。。 >>287 スマホから直接一度も試さずに書くが、Kotlin だと理屈の上ではこれでできると思う。 nが最大値な。 println((1..n step 2).joinToString("").length) かといってこんなのメモリ食うだけ。 >>287 Ruby args = [0, 1, 2, 3, 10, 9999, 123456789, 31415926535897] floor_log10 = -> n {r = 1; (0..n).find{ r *= 10; r > n}} kotae = ->n{ x = floor_log10[n + 1] ((9*x - 1)*10**x + 10)/18 + (n-10**x+1)/2 * (x + 1) + (n < 8 ? n & 1 : 0) } args.each{|e| puts '%d => %d' % [e, kotae[e]]} # => 0 => 0 1 => 1 2 => 1 3 => 2 10 => 5 9999 => 19445 123456789 => 500000000 31415926535897 => 214355930195731 すまん。途中で誤爆した。 >>297 なんでこうなるの?? あと最後のn < 8 ? n & 1 : 0も数式で表わせる? >>287 Python3 print(len("".join(map(str, range(1, int(input())+1, 2))))) を実行したらフリーズしたので odd = range(1, int(input())+1, 2) keta = 0 for i in odd: keta += len(str(i)) print(keta) #============== 123456789 => 500000000 31415926535897 => 終わらん >>295 123456789の桁数は500000000ってのは分かった。 >>299 0からnまでの奇数を並べてできる数の桁数をf(n)とすると(n >= 0) p := [log10(n+1)] として n >= 10の時 f(n) = Σ[k は 0〜[(n-1)/2]]( (2k+1)の桁数 ) = 1*(0〜9までの奇数の数) + 2*(10〜99までの奇数の数) + ... + p*(10^(p-1)〜10^p-1までの奇数の数) + (p+1)*(10^p〜nまでの奇数の数) = 1*5 + Σ[k は 2〜p]45k*10^(k-2) + (p+1)*[(n - 10^p + 1)/2] = 45/100*Σ[k は 1〜p]k*10^k + 1/2 + (p+1)*[(n - 10^p + 1)/2] = ((9p - 1)10^p + 1)/18 + 1/2 + (p+1)*[(n - 10^p + 1)/2] = ((9p - 1)10^p + 10)/18 + (p+1)*[(n - 10^p + 1)/2] …… (*) n = 0, 2, 4, 8, 9 の時はちょうど (*) n = 1, 3, 5, 7 時は (*) + 1 なので f(n) = ((9p - 1)10^p + 10)/18 + (p+1)*[(n - 10^p + 1)/2] + (n < 8 ? n & 1 : 0) 末尾の項を無理やり数式にしたいなら [8/(n + 1)]((1 - (-1)^n)/2)(2^((5 - n)/2)([n/7] + 1)) とかにすればいいんじゃない意味ないけど >>287 Squeak/Pharo Smalltalk | fn | fn := [:N | | nDig | nDig := N log truncated. (1 to: nDig) inject: (1 to: N by: 2) size * (nDig + 1) into: [:tot :m | tot - ((10 raisedTo: m) / 2)] ]. #(3 10 9999 123456789 31415926535897) collect: fn "=> #(2 5 19445 500000000 214355930195731) " >>302 訂正 ((9p - 1)10^p + 10)/18 -> [((9p - 1)10^p + 10)/18] あと (n < 8 ? n & 1 : 0) は (1 - (-1)^n)/2*[3/([√n] + 1)] の方がより簡単か >>258 Kotlin https://paiza.io/projects/sjgIQuhZ44UZcdFZ2CwncQ 色々考えたが結局クラス作ってそこに数字列と文字列で切り分けて入れておいて比較時にそこ見るようにした。 入力の仕様は拡張されていて、最初に数字だけがあった場合はその後に続く単語がその個数あるとみなして 入力を行うが、最初に数字がない場合は無制限に読む。出力は入力した単語とソート後の単語を出す。 提案 回答は言語別に別スレで 2スレ位になるかな? 評価価値基準で別れていくんじゃないかと ここではコメントのみになるのかな。 スレ過疎りそうだし誰もわざわざ別スレに回答見に行かなそう 乱立して過疎ってる特定言語専用スレの活性化に寄与することを願いたいしコード例が増えることはそれぞれメリットあるんじゃないかと。 ここと相互リンクは必ず貼る。他の言語と比較しない 他を貶さないを基本ルールに。 >乱立して過疎ってる特定言語 具体的に何? 一番肝心のこと言ってないから説得力がまるで無い お題: A,B,Cの3人が1から5までの値が1つずつ書かれた5枚のカードを使ってインディアンポーカーを行う。 各々ランダムに1枚カードを引き、自分は値を見ず他の参加者に値が見えるように額にかざす。 この状態でA,B,Cの順に自分の値が今回引かれた3枚の中で最大(MAX)か,2番目に大きい(MID)か,最小(MIN)かを予想して答える。 AとBはパスしてもよいものとし、誰かが答えた時点で終了となる。 なお全員必ず正解するものとする。 各々の引いたカードの値を引数にとり、一回分のインディアンポーカーの結果を出力する関数indian_poker(a, b, c)を実装せよ。 期待動作例: indian_poker(3, 2, 1) // 「A is MAX」 indian_poker(5, 2, 4) // 「B is MIN」 indian_poker(4, 2, 3) // 「C is MID」 そのスレの流れを無視してよそのスレで出されたお題の答えだけ書かれても、そのスレの住人には邪魔なだけだと思う。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる