プログラミングのお題スレ Part12
■ このスレッドは過去ログ倉庫に格納されています
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」 そのスレの流れを無視してよそのスレで出されたお題の答えだけ書かれても、そのスレの住人には邪魔なだけだと思う。 >>313 マ板で見かけた入社試験過去問か。 プログラマー脱落者として辞退します。 乱立して過疎ってる (特定言語専用(スレッド)) 形容詞句?の係りはこれな (こういうものの表しかたにも流儀が色々あって混在するとややこしい) 係り受けなんてどーでもいいよ 「特定言語」って具体的に何なんだ、って聞いてるだけじゃん 返答が『形容詞句?の係りはこれな』って人の話をわざと聞かない人間だろ かなりのサイコパスなんで『乱立して過疎ってるスレ』とやらに誘いこんでマウンティングしたいだけじゃねえの なぜなら、特定言語の具体的な名前を5時間経っても未だに出さない、 口を開いたかと思えば「係り受けはこうだから」 もう頭がおかしいだろこいつ 一つの言語を話題の軸に置いたスレッドは幾らでもあるだろ?この板には。 過疎ってるのも伸びてるのも全部特定言語専用スレな コマンドプロンプトとかSQLとかでワイルドカード使ったことないのかな? そもそもここが過疎だし、他スレなんかにここのコード書いても荒らしにしかならんので当然ながら反対 やりたい奴だけ勝手にやってろ >>313 一人が答えた時点で終了になるのに全員正解とは 幾らなんでも既存スレ無許可で乗っ取るのはやめてほしい。 でも逆にそちらで希望された場合には別スレにしなくてもいいのでは?リンクさえあれば >>313 答えた者が必ず正解するならAが常にあてずっぽうで正解できることになるな パスする意味も無い 言わんとすることは推測できるが、問題文としては明らかにおかしい 各自、論理的に正解が絞りきれた場合のみ解答し、そうで無ければ必ずパスするものとする。又、その論理に誤りはないものとする。みたいな条件が必要 Aは常に正解する Aは常に正しい 故にA is GOD >>313 は9月末あたりに話題になってた ttps://qiita.com/gorillab/items/fab2a6637f681221f687 ttps://qiita-image-store.s3.amazonaws.com/0/169376/80ea2cf1-37e7-60b0-3230-c7dc1d2d60cc.jpeg >>313 Ruby def indian_poker(a, b, c) x = [Set[1, 2], Set[1, 5], Set[4, 5]] winner, winners_num = case when x.include?(Set[b, c]) then [?A, a] when a == 3 || (b == 3 && Set[a, b, c] != Set[2, 3, 4]) || x.include?(Set[a, c]) || Set[b, c] == Set[2, 4] then [?B, b] else [?C, c] end '%s is %s' % [winner, %w[MIN MID MAX].zip([a, b, c].sort).find{|e| e.last == winners_num}.first] end arr = [*(1..5)].permutation(3){|i| puts '%p -> %s' % [i, indian_poker(*i)]}; # => [1, 2, 3] -> C is MAX [1, 2, 4] -> B is MID [1, 2, 5] -> B is MID ... 以下>>326 と同じ >>325 > 各自、論理的に正解が絞りきれた場合のみ解答し、そうで無ければ必ずパスするものとする。又、その論理に誤りはないものとする。みたいな条件が必要 流石にその程度は理解しようよ… >>333 書いてないことは何でもあり 論理パズルにするならちゃんとルールは全て掲示しないと駄目 お題 n^n^nの下2桁を求めよ(^はべき乗、nは1以上の整数) 1 => 1 2 => 16 (2^2^2 = 2^4 = 16) 3 => 87 (3^3^3 = 3^27 = 7625597484987) 4 => 96 11 => 11 13 => 53 100 => 0 777 => ?? >>336 777の出力は77になればいいのかな? その入力でこうなるの面白いな >>339 すまんコード修正したら97になったわ はやとちりだった >>326-327 そういうのはそれよりマシなコードを出してから言わないと単なる口先番長にしか見えないぞw >>336 Ruby def powmod(n, e, m) case e when 0 then 1 when :even?.to_proc then powmod(n * n % m, e >> 1, m) else n * powmod(n, e - 1, m) % m end end def kotae(n, m) index, cycle = (1..m).each_with_object([1]) do |i, a| x = (a.last * n % m) ind = a.index(x) ind.nil? ? a.push(x) : (break([ind, i - ind])) end x = n.times.reduce(1){|r, i| r *= n; r < index ? r : break} y = x.nil? ? index + (powmod(n, n, cycle) - index) % cycle : x powmod(n, y, m) end [0, 1, 2, 3, 4, 5, 10, 11, 13, 100, 777].each{|i| puts '%d -> %06d' % [i, kotae(i, 10**6)]} # =>0 -> 000000 1 -> 000001 2 -> 000016 3 -> 484987 4 -> 084096 5 -> 203125 10 -> 000000 11 -> 906611 13 -> 549053 100 -> 000000 777 -> 977097 >>341 自分で書いて自分でひどいコードと言うとるんやがww python def ans(num): _def calc(N): __n = (N ** 2) % 100 __p = [] __while n not in p: ___p.append(n) ___n = (n * N) % 100 __return p _loop = calc(num) _step = num**num % len(loop) _if len(loop) == 1: __print(loop[0]) _else: __print(loop[step-2]) for x in [0,1,2,3,4,5,10,11,13,777]: _ans(x) -> 0,1,16,87,96,25,0,11,53,97 >>343 ああ、それはすまん 俺もパッと書けと言われたらこれしか思いつかんわ >>343 わかった上で愚直にごり押しコード書いただけだよな 引数順列の列挙もドストレートで素敵w >>313 Squeak/Pharo Smalltalk | numOfCards indianPoker | numOfCards := 5. indianPoker := [:args | | cards names infer | cards := (1 to: numOfCards) asArray. names := (Character alphabet asUppercase first: args size) asArray collect: #asSymbol. infer := nil. (infer := [:dealts :limit | | turn possibilities lastAns answers | turn := 0. answers := OrderedCollection new. possibilities := dealts collect: [:dealt | cards asSet removeAll: dealts; add: dealt; yourself]. lastAns := nil -> #?. [lastAns value = #? and: [(turn := turn + 1) < limit]] whileTrue: [ | myCards others | myCards := possibilities atWrap: turn. turn > 1 ifTrue: [ (myCards copyWithout: (dealts atWrap: turn)) do: [:pCard | (infer value: (dealts copy atWrap: turn put: pCard; yourself) value: turn) value ~= #? ifTrue: [myCards remove: pCard]]]. others := dealts copyWithoutIndex: turn - 1 \\ 3 + 1. lastAns := (names atWrap: turn) -> (true caseOf: { [others min > myCards max] -> [#MIN]. [others max < myCards min] -> [#MAX]. [others max > myCards max and: [others min < myCards min]] -> [#MID] } otherwise: [#?]) ]. lastAns]) value: args value: Float infinity ]. indianPoker value: #(3 2 1). " #A->#MAX " indianPoker value: #(5 2 4). " #B->#MIN " indianPoker value: #(4 2 3). " #C->#MID " >>336 Squeak/Pharo Smalltalk | fn | fn := [:N | (Array new: 3 withAll: N) reduce: [:mex :n | mex \\ 100 = 0 ifTrue: [0] ifFalse: [n raisedTo: mex modulo: 100] ] ]. #(1 2 3 4 11 13 100 777) collect: fn "=> #(1 16 87 96 11 53 0 97) " お題 n次のヒルベルト曲線を描画せよ n=1 ■□■ ■□■ ■■■ n=3 ■□■■■■■□■■■■■□■ ■□■□□□■□■□□□■□■ ■■■□■■■□■■■□■■■ □□□□■□□□□□■□□□□ ■■■□■■■□■■■□■■■ ■□■□□□■□■□□□■□■ ■□■■■■■□■■■■■□■ ■□□□□□□□□□□□□□■ ■■■□■■■■■■■□■■■ □□■□■□□□□□■□■□□ ■■■□■■■□■■■□■■■ ■□□□□□■□■□□□□□■ ■□■■■□■□■□■■■□■ ■□■□■□■□■□■□■□■ ■■■□■■■□■■■□■■■ >>336 Perl5 use bignum (l=>GMP); for $i (1,2,3,4,11,13,100,777) { $j = $i % 100; $k = $j ** $j % 100; $p = $j ** $k % 100; printf "$i %02d\n", $p; } 実行例 $ time perl 12_338.pl 1 01 2 16 3 87 4 96 11 11 13 53 100 00 777 97 0.562 secs >>355 Ruby def hilbert_curve(n) return [[1, 0, 1], [1, 0, 1], [1, 1, 1]] if n == 1 hc = hilbert_curve(n - 1) [ *hc.transpose.reverse.zip(hc.reverse.transpose).map{|a, b| [*a, 0, *b]}, [1, *Array.new(2**(n + 1) - 3, 0), 1], *hc.zip(hc).map.with_index{|(a, b), i| [*a, 1/(i + 1), *b]} ] end [1, 3].each{|e| puts "n = #{e}", hilbert_curve(e).map{|a| a.join.gsub(/\d/, ?0 => ?□, ?1 => ?■)}.join($/)} # => n = 1 ■□■ ■□■ ■■■ n = 3 ■□■■■■■□■■■■■□■ ■□■□□□■□■□□□■□■ ■■■□■■■□■■■□■■■ □□□□■□□□□□■□□□□ ■■■□■■■□■■■□■■■ ■□■□□□■□■□□□■□■ ■□■■■■■□■■■■■□■ ■□□□□□□□□□□□□□■ ■■■□■■■■■■■□■■■ □□■□■□□□□□■□■□□ ■■■□■■■□■■■□■■■ ■□□□□□■□■□□□□□■ ■□■■■□■□■□■■■□■ ■□■□■□■□■□■□■□■ ■■■□■■■□■■■□■■■ >>336 Haskell 素直に書いた版。 何やってるかは分かりやすい。 main = mapM_ put $ zip list $ map f list put (x,y) = putStr (show x ++ ":") >> print y f x = (x ^ x ^ x) `mod` 100 list = [1,2,3,4,5,6,7,8] Haskell Perlの人のパクリ版(めちゃ速い) main = mapM_ put $ zip list $ map f list put (x,y) = putStr (show x ++ ":") >> print y f x = p where j = x `mod` 100 k = j ^ j `mod` 100 p = j ^ k `mod` 100 list = [1,2,3,4,11,13,100,777] 指数を100の剰余取ってるのってどういう根拠なの? >>360 use bignum (l=>GMP); for $i (10) { $j = $i % 100; $k = $j ** $j % 100; $p = $j ** $k % 100; printf "$i %02d\n", $p; } $i = 10; print ($i**$i)**$i; 実行結果 $ perl 12_338_1.pl 10 01 10000000000 ダメですね合いませんね。 単に左辺を%100すると一般性はありませんでした。サーせん。 ちゃんと循環性を見るとか、別の解法が要りますね ちなみに循環性を見るとこんな感じになってました use bignum (l=>GMP); use Tie::IxHash; use feature 'say'; for $i (0,1,2,3,4,5,10,11,13,777) { tie my %h,'Tie::IxHash'; $p = $i; for (1..100) { last if exists $h{$p} and $h{$p} > 10; $h{sprintf "%02d", $p % 100} = $_; $p = $p * $i % 100; } @a = keys %h; say "$i: ", scalar @a, ": @a", ": $p"; } 実行結果 1: 1: 01: 1 2: 21: 02 04 08 16 32 64 28 56 12 24 48 96 92 84 68 36 72 44 88 76 52: 48 3: 20: 03 09 27 81 43 29 87 61 83 49 47 41 23 69 07 21 63 89 67 01: 47 4: 10: 04 16 64 56 24 96 84 36 44 76: 16 5: 2: 05 25: 25 10: 2: 10 00: 0 11: 10: 11 21 31 41 51 61 71 81 91 01: 11 13: 20: 13 69 97 61 93 09 17 21 73 49 37 81 53 89 57 41 33 29 77 01: 37 777: 20: 77 29 33 41 57 89 53 81 37 49 73 21 17 09 93 61 97 69 13 01: 73 >>362 × 単に左辺を%100 ○ 単に右辺(指数)を%100 >>365 10については、そういわれてみればそうだね。 >>362 iが10で割り切れれば00って別で切り分ければ良いんじゃ無いかな。 >>367 10については、そいうやり方も考えられるけど 上記の循環の例の11,13,777は指数を%100しても解は合うが 他の数値も単に指数を%100して解が合うか、一般性は疑わしいので、 >>356 はちょっと勇み足だったかもしれないテヘペロ >>363 0〜99までとりあえず循環部分の周期は全て20の約数になるみたいだけど 数学雑魚の俺には理屈がわからなかった とりあえず、ざっくり100の剰余取るだけだと循環開始より小さい指数になったときにおかしくなりそう >>368 寧ろそれが成り立つ方がかなり特別なケースだぞ 多分数学的には証明されていることだろうと思うが、x ^ 100 とか x ^ 200 とか x ^ 300 って、 下3桁の結果が同じになるようだな。どうしてかはわからんが。多分考えて行くとその内わかる んだろう。後の事は数学が得意な人に任せた。 x^22 - x^2 が常に100で割り切れるのが理由だと思う なので巡回群の長さは高々20までになる もう少し分かりやすく書くと x^20 - 1 と x^21 - x が 100で割り切れる保証はない(実際大部分は割り切れない)が x^22 - x^2 は絶対に100で割り切れる(合同式を用いれば証明は簡明)ので 一般に2以上の自然数 n に対して x^(n+20) - x^n ≡ 0 mod 100が成り立つ(xは整数) よって一般に指数部の20の剰余を取っても問題ないと言える >>371 任意の整数 10n + r (-4 <= r <= 5)に対して (10n + r)^100 = r^100 mod 1000 なので mod 1000 で 0^100 = 0 5^100 = 625^25 = 625 (±1)^100 = 1 (±2)^100 = 24^10 = 376 (±3)^100 = 243^5 = 1 (±4)^100 = 376^2 = 376 となって 0, 1, 376, 625 は2乗しても下3桁は変わらないから 任意の整数は100n乗しても下3桁は常に同じだね これ以上はスレ違いってなら同意だけど問題自体は別に良かっただろ とりあえず>>336 の出題者は用意してあった解答を出そうか くそ問題かどうかはそれを見て判断する 既に回答がたくさん出てるのにクソ問題も何もねえだろ 回答の多さとクソさとの相関はないだろ 例えばQiitaでいいねが多ければクソじゃないということがないのと同じように そういうのはいいから出題者は早めに解答だしてくれ ボクがわからないからクソとか草生えるわ なんでお前の救い難い知的レベルに合わせてやらなければならいんだよ >>379 最近のQiitaのトレンド見てて いいねの数=内容の薄さ だと思うようになってきたわ 今回の問題はべき剰余の特殊な場合を求めるものだけど、工夫する余地もいくつかあり悪い問題ではないと思った。 というかなぜこれを悪い問題だと思ったんだ? 競技プログラミングなんかでよく見るタイプの問題なのにな。 a↑↑b mod n を一般化してみたらテトレーション計算より 最初に使うφ(n)の計算のほうが重かった 10**nなら2**n * 5**nなので高速に計算できますけども このスレは不特定言語スレだけど 高速性ならC/C++/Rast コンパクト性の追求ならSmallTalkとかRubyとか RADならJavaとかPythonとか定番固定化。 既にもうある程度少数特定言語スレになりつつあ る希ガス >>380 > なんでお前の救い難い知的レベルに合わせてやらなければならいんだよ 数学の素養のあるっぽいやつのよくやりがちなダメな考え方だな そういう(逆)選民思想を持っているならこのスレで出題するのはやめてくれ そもそも良問と思うものをけなされるお前自身がたのしくないだろ? いずれにせよ出題者がどこまで考えて出題したか(つまり良問か否か)はそいつ自らの解答を見れば一目瞭然だよ 論よりコード はよ出せ 問題の良さって問題じゃなく解答で決まるものなのか? 問題だけで問題の良さが確定しないのは初めて知ったわ も一回言うけどこの問題はプログラミングのお題としてはよく見るような問題だぞ。 揚げ足取りというか難癖付けてる奴はおかしいだろ。 それこそスレチだから黙ってろよ。 >>389 解答で決まるなんて誰もいっとらんがな(数学の前にやることあるんじゃ?w) 解答を見れば「どこまで考えて出題したか」が一目瞭然ということ どこまで考えて出された問題かで良問か否かが決まる もとより様々な状況で「結果的に良問」ということは実際あるしそれは否定する気は無いが、蓋然性は低い この程度のことで選民思想がどうのとか言い出すのはおかしいと思うよ。 冪剰余の計算は面白いテーマだし。 逆に悪問だと言ってる人がその根拠を示すべきだと思うんだけど。 >>392 「この程度(のレベル)」とか言ってる選民思想バリバリの奴が 自分は違うって体で何か主張したところでぜんぜん説得力ないんだがw ともあれ、回答が多い割に文句なしの正答が出てこないのがこのスレ的には異常事態だろ お題 and/or 出題者をクソだと疑う十分な根拠になりうる ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる