宿題、チューリングの泥沼、条件不足等回避のため 出題者は自分で回答可能か確認してからお題を出すこと
お題 とあるゲームでは、10面ダイスによってスコアを次のように定める 1. x個のダイスを全部振る 2. 振ったダイスのうち、最大の出目をスコアとする 3. 出目がc以上のダイスが存在するなら、その全てのダイスを使って同じ試行を行い、スコアに加算する 例えばc=7の時、2個のダイスの結果が(10,7)→(8,3)→(2)ならスコアは10+8+2=20となる 最初に振るダイスの個数Nとc(≧2)が分かっている時、スコアの期待値を求めよ
サイコロの偏りをもっと明確にしたいなら、乱数エンジンを複数持つか、ランダムデバイスそのもので実行する。 ランダムデバイスは遅いことになってるのでMTに投げるんだけど。
一様乱数のサイコロは、現実では職人が作ったサイコロですなあ。
お題: 炭素原子C, 酸素原子O, 水素原子Hという三種類の原子をそれぞれいくつか組み合わせて、非イオンの分子を作る。C, O, Hの結合の手の本数は、それぞれ四本、二本、一本である。 ゼロ以上の整数p,q,rが与えられ、Cがp個、Oがq個、Hがr個あると仮定するとき、原子を余らせず、また、結合の手を余らせずに一つの連結された分子を作りたい。 C, O, Hをこの順でp+q+r個、並べたリストLについて、m番目の原子L[m]とn番目の原子L[n]の結合の個数をA[m,n]と書くとき、A[m,n]によってなる行列Aを一つ求めなさい。不可能な場合は「None.」と表示しなさい。 例) (p, q, r)=(0, 2, 0) → A=((0, 2), (2, 0)). (p, q, r)=(1, 2, 0) → A=((0, 2, 2), (2, 0, 0), (2, 0, 0)). (p, q, r)=(0, 1, 2) → A=((0, 1, 1), (1, 0, 0), (1, 0, 0)).
出題者は自分で解けることを確認してからお題にしてるのかね? 自明でない不可能な場合の例とか出してこないし怪しいもんだ
慣れない言語の勉強に使うのに丁度いいね 出題者が答えも貼っといてくれるとありがたい(´・ω・`)
良いプログラムは良い数式がないと作れないのでこのスレは過疎化する。
久々にこの板きたけど、宿題スレってなくなったんだね
解空間は、サイズ(p+q+r)×(p+q+r)の整数行列の集合になる。 結合の手の個数は有限だから、解行列の成分は上限がある。 よって行列の各成分についてしらみつぶし探索が可能。 自分自身とは結合しないので、A[k,k]=0(つまり、行列の対角成分はゼロ)。 ある行の和は、行番号に対応する原子の結合の手の個数になる。 ある列の和は、列番号に対応する原子の結合の手の個数になる。 連結条件のチェックが必要。
お題: xのn次式を簡潔に表現できる関数を書け(rationalじゃなくてもOK) a+bx+cx^2+dx^3+... を f x a b c d ... のように表現する (可変引数を処理する) 例えば (defun f (x &rest as) (reduce #'+ (loop for a in as for i from 0 collect (* a (expt x i))))) (loop for x from -5 to 5 do (print (f x 0 -1 0 1/3))) -110/3 -52/3 -6 -2/3 2/3 0 -2/3 2/3 6 52/3 110/3
>>13 良い数式が立てられないのでモンテカルロに酔っているオレ・・・。 >>9 複雑すぎます 非環状アルカン(CnH2n+2)の構造異性体を列挙せよ、という簡略化したお題を提案します >>14 存在することはするのですが、誰も近寄らなくなりました、キチガイが一匹しつこく居候しているので お題: 1 + 1 を計算させて 3 と出力させなさい
>>23 Perl5 $a = 1 + 1; print ~$a%10; 実行結果 $ perl 15_23.pl 3 ※64bit整数版で実行してね >>23 perl5 print ("1", "+", "1") 1+1 print $_ =()= ("1", "+", "1") 3 >>23 perl 1+1; print "3\n" >>23 ruby class Fixnum alias :add :+ def +(val) if self == 1 && val == 1 puts 3 2 else self.add(val) end end end 1 + 1 #=> "3\n" 1 + 1 + 1 #=> "3\n" 1 + 1 + 1 + 1 #=> "3\n" 1 + 1 - 1 + 1 #=> "3\n3\n" >>23 perl5 print qw(1 + 1) 1+1 print eval q(1 + 1) 2 print $_ =()= qw(1 + 1) 3 お題、東大入試 a^2 - a が、10,000 で割り切れるような奇数a を求めよ。 ただし、3 <= a <= 9,999 ヒント a^2 - a = a(a - 1) で、aは奇数、a-1 は偶数。 10,000 = 10^4 = 2^4 * 5^4 答え、625 東京大【整数マスターに俺はなる!#31】 VIDEO >>29 common lisp (loop for n from 3 to 10000 when (and (equal (mod n 2) 1) (equal 0 (mod (- (expt n 2) n) 10000))) collect n) (625) ・女体限定で、3次元の写真から3Dポリゴンモデルデータを自動作成 ・そのデータから胴体部の着衣部分を、裸モデルに修正 ・水着でついた脇乳の段差も修正 ・元写真の地肌色を使い、女体テンプレのテクスチャを作成 ・完成したモデルから胴体部だけ精密レンダリング ・元の写真に貼り付けて完成
プログラミングのお題スレ Part14 http://2chb.net/r/tech/1558168409/981-986 漏れは、前スレの981 ではないですが、この問題の応用で、 括弧のネストの深さの最大値を求めよ 括弧の対応が取れていない場合は、-1 を出力せよ。 2種類の括弧が順序通りに、閉じていないものも、-1 です ヒント : stack を使うと良いかも "" => 0 "( )" => 1 "{ ( { ( ) } ( ) ) } ( )" => 4 "} {" => -1 "( { ) }" => -1 自分でスタックするか再起にして自動で積ませるか、といったところか。
ideone バグっているのか? STDIN の1行目空だと ちゃんと標準入力としてプログラムに伝わっているけど リンク先の stdin 枠の中だと省略されているように見える stdout の 0 はその空を受け取ったもの
twitterやっていたようなので そこにバグフィックス要請とテストケース画像貼っておいた たぶんそのうち直るでしょう
>>38 大分前に作ったけど、コード紛失した。 アルゴリズムも忘れた。 ガーン。 年収n円の人が生活費と交遊費2種類だけで1年間の収入のすべてを消費するとして 税率がt1からt2に上がった時 税抜き価格ベースでの生活費が変動しないものと考えると 税抜き価格ベースでの交遊費の減少額はいくらになるか? (端数は切り上げとする) ex) 年収n=5,000,000 税率t1=8% 税率t2=10% 税抜き価格ベースでの生活費a 税抜き価格ベースでの交遊費x, y 5000000 = ( a + x ) * 1.08 5000000 = ( a + y ) * 1.10 上記の方程式を解いて x-y ≒ 84,176
>>42 wolfram Simplify[ x-y, {5000000 == (a+x)*1.08,5000000 == (a+y)*1.1} ] 84175.1 切り上げか Ceiling[ Simplify[ x-y, {5000000 ==(a+x)*1.08 == (a+y)*1.1} ] ] 84176
何も考えずにceiling(n/1.08-n/1.1)でいいんとちゃうけ?
>>32 Ruby f = -> str {s = +str.delete(?\ ); (0..).each{|i| s.gsub!(/{}|\(\)/, '') || (break s.size.zero? ? i : -1)}} ['', '( )', '{ ( { ( ) } ( ) ) } ( )', '} {', '( { ) }'].each{|e| puts '%p => %d' % [e, f[e]]} # => "" => 0 "( )" => 1 "{ ( { ( ) } ( ) ) } ( )" => 4 "} {" => -1 "( { ) }" => -1 >>45 ちょっと考えたらceiling(n/59.4)だったw お題: 数字が与えられるので、その数字を元の数より大きくなるように再構築せよ 大きくできなければ元の数字をそのまま出力せよ 例: in < 123 out > 231, 213, 321, 312 in < 921 out > 921
123を入力したときに132が出力されないのはなぜ?
https://ideone.com/pgG7pT from itertools import permutations #string = "123" string = "5672391" n = int(string) print filter(lambda m: m>n, map(lambda x: int("".join(x)), list(permutations(string, len(string))))) 「大きくできなければ元の数字をそのまま出力せよ」という条件が ことごとく無視されててワロタ あと、「133」みたいに同じ数字が複数含まれる場合はどうなるべきなんだろう
>>48 Perl5 sub next_permutation { defined $_[1] and (next_permutation(@_[1..$#_]) or ($_[0] lt $_[1]) and do { for (1..$#_) {$_[0] lt $_[$_] ? $i = $_ : last} @_[0, $i] = @_[$i, 0]; @_[1..$#_] = reverse @_[1..$#_]; 1 }) } #$v = '123'; $v = '5672391'; @a = sort split '', $v; do { $n = join '', @a; print "$n " if $n > $v; } while next_permutation @a; 実行結果 https://ideone.com/qeSGDm CPANなどにあるPermutation計算モジュールを使用しても良いけど、 言語処理系に標準で含まれるモジュールではなく別途インストールが必要なので、 昔書いたnext_permutation iteratorを使ってみた >>57 ごめんなさい print "$n " if $n > $v; ↓ print "$n " if $n >= $v; じゃないと「大きくできなければ元の数字をそのまま出力せよ」を満たさなかった…orz >>58 そうすると逆に 「元の数「より大きくなる」ように再構築せよ」 については、元の数値が余計に出力されるな…ゴメンねもう一工夫要るわ それにiteratorである必要ないわ >>48 Perl5、iteratorじゃなくpermutationを列挙する方法で書いてみた。これなら題意に合うはず。 sub permu { my ($l, $p, @r) = @_; defined $p ? map {[$p, @$_]} permu([], @$l, @r) : ([]) , @r ? permu([@$l, $p], @r) : () } #$v = '123'; #$v = '321'; $v = '5672391'; @a = split '', $v; @b = grep {$_ > $v} map{join('', @$_)} permu [], @a; print (@b ? "@b" : $v); 実行結果 https://ideone.com/1Lft75 少しメモリを食ってるだろうけど0.04sで解けた >>48 Squeak/Pharo Smalltalk | fn res | fn := [:input | (Array streamContents: [:ss | input permutationsDo: [:perm | perm > input ifTrue: [ss nextPut: perm copy]]] ) ifEmpty: [input] ]. fn value: '123'. "=> #('132' '213' '231' '321' '312') " fn value: '921'. "=> '921' " {#ms -> [res := fn value: '5672391'] timeToRun. #size -> res size}. "=> {#ms->6 . #size->2438} " >>56 で指摘したのに誰も反応してくれないので自分で書く >>54 は、「133」と入れると[313,331,313,331]みたいに結果がダブる >>62 C++のnext_permutationは、辞書順で次に来る順列が返るので、 最初の並びにnext_permutationを繰り返し適用すれば題意を満たす数列が得られる。 あと、自前で桁分割するより他言語のように文字列を使った方が楽だと思う。 >>48 @Mathematica rebuildLargerN[n_]:=n// IntegerDigits// Permutations// Map[FromDigits,#]&// Select[#,#>n&]&// If[#!={},#,{n}]&; In[1] := rebuildLargerN[123] Out[1] = {132, 213, 231, 312, 321} In[2] := rebuildLargerN[921] Out[2] = {921} >>63 オレのPerl5の>>60 も桁に重複があると出力はダブるよ。 ダブった出力で良いかあるいは1つに削減して出力するか 仕様は不定なので、ダブる可能性があってもそのまま出した。 ダブらせず1つだけ出力すにはsortしてuniqすればいいんだけど。 @b = grep {$_ > $v} map{join '', @$_} permu [], @a; ↓ %h = map{$_ => 1} sort grep {$_ > $v} map{join '', @$_} permu [], @a; @b = keys %h; あ、そうだった。文字列だと自分より大きいを表現するのがめんどくさいのでした。
>>70 そういえば、ソートする必要ないね。 書いてるときは保証できなかったから思いつきもしなかった。 >>73 seq 300|sort -R | perl -ne ' if ($. == 1){print ; $hold = $_} elsif ($_ > $hold) { print ; $hold = $_}' 140 145 231 246 248 270 272 281 298 299 300 >>73 要素粛清しながら見た目がそろっているというギャグかいな。 >>73 Squeak/Pharo Smalltalk | fn | fn := [:array | | memo | memo := array first. array reject: [:x | x < memo flag: (memo := x max: memo)] ]. fn value: (1 to: 300) asArray shuffled. "=> #(65 116 195 235 276 280 293 299 300) " >>73 しばらくお題がないとおちつかないな seq 300|sort -R | perl -ne ' if ($. == 1 or $_ > $hold) { print ; $hold = $_}' >>73 ss = -> a {a.reduce([]){|r, e| r.first.nil? ? [e] : r.last < e ? r + [e] : r}} p ss[[3,1,4,1,5,9,26,53,58,97,93,238]] # => [3, 4, 5, 9, 26, 53, 58, 97, 238] >>73 Perl5 use List::Util 'max'; @a = qw{3 1 4 1 5 9 26 53 58 97 93 238}; @b = grep {$n < $_ and $n = max($n, $_)} @a; print "@b\n"; 実行結果 ~ $ perl 15_73.pl 3 4 5 9 26 53 58 97 238 お題: 太陽系の各天体の位置を物理シミュレーションし、64日後の地球の位置を求めよ。
俺たちって計算能力でコペルニクスを超えられると思う? NASAのデータがあるから昔よりも楽だと思うけど。
>>73 Perl5、 >>80 よりこっちの方が若干スマート $n = -inf; @a = qw{0 3 1 4 1 5 9 26 53 58 97 93 238}; @b = grep {$n < $_ and ($n = $_), 1} @a; print "@b\n"; 実行結果 ~ $ perl 15_73.pl 0 3 4 5 9 26 53 58 97 238 >64 地球の位置といってもいろいろあります。 地球の赤道を天球上に投影した、「赤経、赤緯」、太陽の天球上の 通り道を天球上に投影した「黄経、黄緯」がありますし、それも、地球の中心を 原点とした、「地心赤経、赤緯」、「地心黄経、黄緯」および、観測地点を原点とした 「地表赤経、赤緯」、「地表黄経、黄緯」もありますので、どれにするかによって 計算式が違ってきます。 なお、JPLでは、太陽と月、および冥王星までの精密位置計算用のプログラムを 発表しています。 期間がながいものは、−4000(B.C.4001)〜4000(A.D.)まで、計算できるものが あります。 計算用のデータと、テスト用のFortranプログラムも附属しています。
Perlって読みにくいんだな {とか@とか$とか使いまくる言語ってマジ苦手
grep 内のboolian から最後の , 1 を取り除いたら 最初の0を拾わない 何というカオス
@b = grep {$n < $_ and {$n = $_}} @a; こうやりゃいいんだよ
この方がいいだろ @b = grep {$n < $_ and ($n = $_, 1)} @a;
お題: 与えられた数列の要素の中で他と被っていない最小のものを求めよ 被っていない要素が存在しないときは-1を出力すること 例: 1,1,1,1,2,2,2,3,3,4 -> 4 1,2,3,4,5,5,4,3,2,1 -> -1 3,1,4,1,5,9,2,6,5,3,5 -> 2
>>91 Perl5 use feature say; use List::Util min; for ([1,1,1,1,2,2,2,3,3,4], [1,2,3,4,5,5,4,3,2,1], [3,1,4,1,5,9,2,6,5,3,5]) { my %h; $h{$_}++ for @$_; @s = grep{1 == $h{$_}} keys %h; $" = ','; say "@$_ -> ", @s ? min @s : -1; } 実行例 ~ $ perl 15_91.pl 1,1,1,1,2,2,2,3,3,4 -> 4 1,2,3,4,5,5,4,3,2,1 -> -1 3,1,4,1,5,9,2,6,5,3,5 -> 2 >>91 Ruby f = -> a {a.sort.group_by{|e| a.count(e)}[1]&.min || -1} [ [1,1,1,1,2,2,2,3,3,4], [1,2,3,4,5,5,4,3,2,1], [3,1,4,1,5,9,2,6,5,3,5] ].each{|a| puts '%p => %s' % [a, f[a]]} # => [1, 1, 1, 1, 2, 2, 2, 3, 3, 4] => 4 [1, 2, 3, 4, 5, 5, 4, 3, 2, 1] => -1 [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] => 2 typo f = -> a {a.uniq.group_by{|e| a.count(e)}[1]&.min || -1}
>>91 ruby [ [1,1,1,1,2,2,2,3,3,4], [1,2,3,4,5,5,4,3,2,1], [3,1,4,1,5,9,2,6,5,3,5] ].each{|ar| print ar.join(','), " -> " while (m = ar.min) && ar.count( m ) != 1 ar.delete( m ) end puts m || -1 } 1,1,1,1,2,2,2,3,3,4 -> 4 1,2,3,4,5,5,4,3,2,1 -> -1 3,1,4,1,5,9,2,6,5,3,5 -> 2 >>91 Perl5 >>92 よりもう少しシンプルに use List::Util min; for ('1,1,1,1,2,2,2,3,3,4', '1,2,3,4,5,5,4,3,2,1', '3,1,4,1,5,9,2,6,5,3,5') { my %h; $h{$_}++ for split ','; $s = min grep{1 == $h{$_}} keys %h; $s //= -1; print "$_ -> $s\n"; } 実行結果 ~ $ perl 15_91.pl 1,1,1,1,2,2,2,3,3,4 -> 4 1,2,3,4,5,5,4,3,2,1 -> -1 3,1,4,1,5,9,2,6,5,3,5 -> 2 昔々Cで数独解くやつ普通に作ったことあるけど普通に作っても人間の感覚では一瞬にして答えが出ちゃうんだよな。ほとんどEnterキー押したらすぐ出る感じ。 そしてこれといって他にアルゴリズムは思い浮かばない。(誰もが思い付くであろう再起でマスに入れられる数を順番に入れてく方式ね)。 これ以上に「素早く」やる方法なんてあるんだろうか?
#include <map> template<class Container> std::int64_t MakeHoge(const Container& D) { std::map < Container::value_type, std::uint64_t> M; for (auto& o : D) { M[o]++; } for (auto& o : M) { if (o.second == 1) { return o.first; } } return -1; } 詰めまくってみた。C++。
#include <map> template<class Container> std::intmax_t MakeHoge3(const Container& D) { std::map < Container::value_type, std::uintmax_t> M; for (auto& o : D) { M[o]++; } for (auto& o : M) { if (o.second == 1) { return o.first; } } return -1; } しつこいけど、これ以上は無理ってくらい詰めた。
どうでもいいのですけど、MITライセンス。知ってますね。
お題: 論文「数独パズルの難易度判定」(大阪工業大学)を読んで、数独の難易度を判定するプログラムを作れ。
>>108 吸う毒難易度判定 初期値の与えられているマスが22以下:難問 22以上:簡単 >>91 Pharo/Squeak Smalltalk | fn | fn := [:arr | (arr asBag sortedElements detect: [:kv | kv value = 1] ifNone: [-1 -> 0]) key]. fn value: #(1 1 1 1 2 2 2 3 3 4). "=> 4 " fn value: #(1 2 3 4 5 5 4 3 2 1). "=> -1 " fn value: #(3 1 4 1 5 9 2 6 5 3 5). "=> 2 " >>91 Perl5 >>97 もう少しスマートに for ('1,1,1,1,2,2,2,3,3,4', '1,2,3,4,5,5,4,3,2,1', '3,1,4,1,5,9,2,6,5,3,5') { my %h; $h{$_}++ for eval; ($s) = sort grep{1 == $h{$_}} keys %h; $s //= -1; print "$_ -> $s\n"; } 実行結果 ~ $ perl 15_91_3.pl 1,1,1,1,2,2,2,3,3,4 -> 4 1,2,3,4,5,5,4,3,2,1 -> -1 3,1,4,1,5,9,2,6,5,3,5 -> 2 >>91 Ruby で # 数字の配列の配列。改行は削除 nums = <<"EOT".lines( chomp: true ).map{ |str| str.split( "," ).map( &:to_i ) } 1,1,1,1,2,2,2,3,3,4 1,2,3,4,5,5,4,3,2,1 3,1,4,1,5,9,2,6,5,3,5 EOT results = nums.each_with_object( [ ] ) do |ary, results| uniq_ary = ary.uniq # 重複排除 uniq_ary.sort! # ソート res = -1 uniq_ary.each do |num| if ary.count( num ) == 1 res = num; break end end results.push res end p results #=> [4, -1, 2] >>91 Ruby で、>>115 を修正した # 数字の配列の配列。改行は削除 nums = <<"EOT".lines( chomp: true ).map{ |str| str.split( "," ).map( &:to_i ) } 1,1,1,1,2,2,2,3,3,4 1,2,3,4,5,5,4,3,2,1 3,1,4,1,5,9,2,6,5,3,5 EOT def resolve( ary ) # 数字の出現回数を数える。Hash の初期値は、0 hash = ary.each_with_object( Hash.new( 0 ) ) { |num, hash| hash[ num ] += 1 } hash_2 = hash.select { |key, val| val == 1 } # 1回のもの # キーでソートして、最小の数字を返す number = Hash[ hash_2.sort ].keys.first number = -1 if number == nil number end p nums.map { |ary| resolve ary } #=> [4, -1, 2] >>118 の、resolve 関数を修正 # キーでソートして、最小の数字を返す >number = Hash[ hash_2.sort ].keys.first pair = Hash[ hash_2.sort ].first # [ key, value ] keys を使うと、ハッシュのキー配列が作られるため、処理が多くなるので、修正します def resolve( ary ) # 各数字の出現回数を数える。Hash の初期値は、0 hash = ary.each_with_object( Hash.new( 0 ) ) { |num, hash| hash[ num ] += 1 } hash_2 = hash.select { |key, val| val == 1 } # 1回のもの # キーでソートして、最小の数字を返す pair = Hash[ hash_2.sort ].first # [ key, value ] if pair == nil number = -1 else number = pair[ 0 ] # key end number end お題: 任意の2桁の自然数の各桁を、1桁になるまで掛け算する回数の最大回数とその数を示せ 15なら1x5=5と1回 93なら9x3=27, 2x7=14, 1x4=3と3回
>>120 最後1x4=3じゃなくて1x4=4だった >>120 Ruby 1桁以上に拡張してみた def colmul( val ) n = 0 while val >= 10 ans = 1 begin val, c = val.divmod( 10 ) ans *= c n += 1 end while val >= 10 val *= ans end [n, val] end [15,93, 77, 123].each{|n| puts "%5d %3d %d" % [n, *colmul( n )] } 実行結果 15 1 5 93 3 4 77 4 8 123 2 6 >>120 Squeak Smalltalk (Pharo では若干の修正が必要) | fn ans | fn := [:n | | count digits | count := 0. [(digits := n asString asArray collect: #digitValue) size > 1] whileTrue: [n := digits reduce: #*. count := count + 1]. count ]. ans := Set with: nil->0. fn value: 15. "=> 1 " fn value: 93. "=> 3 " fn value: 277777788888899. "=> 11 " (1 to: 9) do: [:i | (i to: 9) do: [:j | | kv m | kv := (m := i * 10 + j) -> (fn value: m). kv value = ans anyOne value ifTrue: [ans add: kv]. kv value > ans anyOne value ifTrue: [ans removeAll; add: kv] ] ]. ^ans asArray "=> {77->4} " >>120 python from operator import mul def kake(n, ls): __m = reduce(mul, map(lambda x:int(x), list(str(n)) ) ) __ls.append(m) __if len(str(m)) == 1: ____return __kake(m, ls) test = [0, 1, 9, 11, 15, 51, 52, 61, 66, 77, 93, 123, 277777788888899] for n in test: __ls = [] __kake(n, ls) __print "n="+str(n)+", "+"list="+str(ls)+", "+"len="+str(len(ls))+", "+"last="+str(ls[-1]) 実行結果 n=0, list=[0], len=1, last=0 n=1, list=[1], len=1, last=1 n=9, list=[9], len=1, last=9 n=11, list=[1], len=1, last=1 n=15, list=[5], len=1, last=5 n=51, list=[5], len=1, last=5 n=52, list=[10, 0], len=2, last=0 n=61, list=[6], len=1, last=6 n=66, list=[36, 18, 8], len=3, last=8 n=77, list=[49, 36, 18, 8], len=4, last=8 n=93, list=[27, 14, 4], len=3, last=4 n=123, list=[6], len=1, last=6 n=277777788888899, list=[4996238671872L, 438939648, 4478976, 338688, 27648, 2688, 768, 336, 54, 20, 0], len=11, last=0 >>120 Ruby f = -> n {[(1..).find{10 > n = n.divmod(10).reduce(:*)}, n]} (10..99).group_by{|i| f[i]}.max.tap{|m| m.last.each{|v| puts '%dは%d回で%dになる.' % [v, *m.first]}} # => 77は4回で8になる. >>120 Perl5 use List::Util reduce; for (qw{15 93 123 277777788888899}) { ($n, $i) = ($_, 0); while (1 < length $n) { $n = reduce {$a * $b} split '', $n; $i++; } print "$_ -> $i回で $nになる\n"; } 実行結果 ~ $ perl 15_120.pl 15 -> 1回で 5になる 93 -> 3回で 4になる 123 -> 1回で 6になる 277777788888899 -> 11回で 0になる 2x7x7x7x7x7x7x8x8x8x8x8x8x9x9=4996238671872 この段階で、掛け算14回じゃなくて1回になるの?
元のお題は2桁の自然数なのでそれよりも桁が多いならその場合のルールも決めないとダメだろうな。
> 2x7x7x7x7x7x7x8x8x8x8x8x8x9x9=4996238671872 を1回としても14回としても解き方はたいして変わらんからどっちでもいいと思う とりあえず回答例見たら1回としてるみたいだから1回の方でいいんじゃね
15=>(5 1) 93=>(4 3) 198=>(4 3) 468=>(8 3) 738=>(6 4) 793=>(4 4) 1748=>(6 3)
>>120 Perl5 use feature current_sub; use List::Util reduce; for (qw{15 93 123 277777788888899}) { $i = 0; $n = sub { return shift if 1 == @_; $i++, __SUB__->(split'', reduce {$a * $b } @_); }->(split''); print "$_ -> $i回で $nになる\n"; } 実行結果 ~ $ perl 15_120_2.pl 15 -> 1回で 5になる 93 -> 3回で 4になる 123 -> 1回で 6になる 277777788888899 -> 11回で 0になる お題: オカダンゴムシには進行中に壁にぶつかると左へ、次は右へ(あるいは右へ、次は左へ)と交互に曲がっていく習性がある。この行動は「交替性転向反応」といい、左右に交互に曲がる事で天敵から逃げられる確率を高めているといわれている(ウィキペディアより引用)。 何もない整数平面上にスタート地点(S)とゴール地点(G)が与えられる。仮想ダンゴムシ(@)の周辺に壁(#)をいくつか作って、スタート地点からゴール地点まで誘導せよ。 ただし、ダンゴムシは最初は右向きを向いていて、最初にぶつかったら左に曲がるものとする。 90度曲がって目の前にすぐに壁がある場合は同じ方へもう90度曲がるものとする。壁はいくつ作ってもよい。 例) S=(0, 0), G=(5, 2) →#={(6, 0)}. 例) S=(1, 2), G=(-1, 1) →#={(2, 2), (1, 3), (0, 2), (1, 0)}.
>>137 ダンゴムシは初手でどこに向いてるの?北?Y+?X+? ヒント: 最初、スタートとゴールを囲むように壁を仮設する。ぶつからない壁は要らない。
ダンゴムシはx軸方向です。y軸は数学と同じ上向きを仮定してます。
Y+がビジュアライズして上になるかはビジュアライザーの挙動次第なのでいいのだけど。 最初はX+向いてるのね。承知。
あ、もう一つあるんだ。 最初にダンゴムシが壁にぶつかったときは右と左どっち優先? //// # @# //// の時。 方向がX+の時に左へターンしたら無限ループする。 逆に、方向がY+の時右にターンしたら無限ループする。 どや?
> ただし、ダンゴムシは最初は右向きを向いていて、最初にぶつかったら左に曲がるものとする。
>>142 >90度曲がって目の前にすぐに壁がある場合は同じ方へもう90度曲がるものとする。 すみません。見落としていました。 大変申し訳ありません。
世界はクソにあふれている! 何てこった! この状況を! この状況を変えるためには、クソをせずに生きれる仕組みを! 皆様と一緒にクソをせずに生きれる仕組みを、実現して! 行きましょう!
それよりも交替性転換反応とやらが本当に生存確率を高めるのか 右にばかり曲がりたがる逃亡犯と左にしか曲がれない共産党員を例に シミュレーションを繰り返すプログラムを書いて?(゚∀゚)
FPSのレレレ撃ちでしょ ゲームで実験結果がでているからYoutubeにGo
あなた達は、実は自分で思っているほど ソフトウエアの開発が得意ではないということに まだ気がついてすら至っていない
>>151 そうだよね。ソフトクリーム作るのって大変だね。ちなみに英語ではジェラートだからね。 >>151 君は、実は自分で思っているほど日本語が得意ではないということにまだ気づいていない。 スタート地点に壁を作ってるみたい。アルゴリズムの詰めが甘いようだ。
>>160 表示の問題です。では済まないかい? 場所は保持してるよ? お題: 壁で囲まれた何もない有限の部屋(面積5m^3前後)の中に、四方向に距離センサーが付いた、丸い形のお掃除ロボット(直径20cm)がある。 各距離センサーは、ロボットからその方向にある障害物までの距離を常に教えてくれる。 ロボットはその場で右または左に5度単位で自転するか、もしくは前方向に5cm単位で前進できる。 部屋全体のおおよその形がわかるまで、ロボットを動かしなさい。 例) 正方形の部屋 例) 正三角形の部屋 例) 凹の形の部屋
直径20cmが入り込めない隙間は無視、もしくは壁と見なす。 スクリーンショットか動画を作れたら、30点加点する。
>>164 部屋の壁の構成が凹を基本としたヒルベルト曲線だったら「おおよその形」はそのロボットのAIは何と答えればいいの? >>160 一晩かんがえてみたんだけどね、ゆる〜くね。 スタートに壁作るなとは書いてないよね?? 4個目のスタート地点の壁を許しても、3個目の答えが間違えてるやん? [-1,1]の壁を1回透過しないとゴールにたどり着けないやん? まあ [*いしのなかにいる*] は許されないと思うけどw
>>171 あぁ、なるほど、先において起動させる前提なのか。 オレ、動的にターン制で考えてたわ。 動的ターン制って考えは思いつかんかった その考えなら>>155 でも問題ないな 部屋の形を表すビットマップ画像、もしくは一個以上の多角形でいいよ。
>>173 壁をいつ置くかの記述がなかった、設問の不備ということで、正解、にしときます。すみません。 >>182 振ったダイスが閾値超えてたら次の回を一回プラスしてる。 閾値C以上ならという判断。 俺のとあってるし多分いいんじゃね?わからんが でも>>5-6 の時点で出題者からの突っ込みがないのが気になる 出題者出てきてー >>186 そりゃよかった。 出題者に宿題解かされたかな?? お題:値が変更不可能でインデックスだけ参照できるシャッフルされた配列を何らかの方法でソートする。その際配列や値のコピーは取れない。 C++でいう、constの配列をなんとか整列してみましょう。 自分の答え。:https://ideone.com/4S932i >>189 Perl5 use List::Util shuffle; @a = shuffle 1..10; @ix = 0..$#a; print "@a\n"; @iy = sort{$a[$a] <=> $a[$b]} @ix; print "@a[@iy]\n"; 実行例 ~ $ perl 15_189.pl 5 2 4 8 3 10 6 9 1 7 1 2 3 4 5 6 7 8 9 10 激お題:自動プログラミングプログラムを作るか日本語で説明せよ。方法は各自の言語にゆだねる。 https://ideone.com/2UWc8g 自分は上記のようなものを作った。 4kb位のプログラムができるのに多分数年かかる。 コンパイラの通ったかというのを取れれば文章的に正しいやつは何かを残していく。 でも、コンパイラに投げる動作はわからないので入れてない。 >>190 perlわからないけど、参加してくれてありがとう。 コードが短くて羨ましい。 >>191 ナンジャそれは、お題でもなんでもない。 まず日本語の勉強をして出直してこい。 お題も人に解る様に出せないような人間はプログラマの素質はない。 >>193 どこが解りにくかったですか? テストコードは、言語で使える英数記号類を全探索するモノです。 >>195 お題と余談が書いてあるだけだぞ。 とりあえず、刮目して自動プログラミングプログラムを作ってください。 作れなさそうなら、概要を日本語で説明してください。 まず自動プログラミングプログラムってなんだよ お前の造語なんか知らんわ
「自動プログラミング」「プログラム」ですが何か。 DSLじゃないわ。
1文字ごとにカンマが入って空白or改行を使わないプログラミング言語ってなんだろう…? 4kb(この表記だとビットかバイトかわからん)が数年で行けるってどういう計算だろう…?
>>199 暗黙変数があるとオレ、フリーズしちゃうなぁ。 やったことない言語だけど、結果はあってると思う。 >>201 文字の列挙のリストには抜けがあるかもしれない。 C++は改行しなくても空白さえあればかける気がするけど。 なお、字数が増えれば増えるほど遅くなる。 とりあえず、実行してみればわかるけど、検索文字を総当たりしてるだけだからね。 んで、コンパイラに投げて通るかどうかのチェック入れないといけないんだ。 >>201 あぁ、指摘には感謝しておく。 4kbは大体4千字くらいか。 字数が増えれば増えるほど遅くなる、の遅くなり具合がわかってない気がする 使用する文字の種類を60とした場合、総当たりで毎秒10億個生成できても19年で10文字くらいだよ
>>205 うほ!そんな遅いんかいな。 オーダーよりパッションで作ったのでそこまで考えてない。 それが・・・現実・・・!!! >>206 そんなかんじだねぇ。 設問が悪い。 自動プログラミングプログラムの出力が不正でなければ良い→コンパイルエラーないしはランタイムエラーを出さない、で良いの? phpのソースを書き出せば問題ない。 ランダムな文字列を出力し続けても、文字空間が64文字であれば、5文字目以降、毎回1/1073741824で失敗するがそれ以外のケースで自分自身を表示する正しいプログラムになる。
>>200 自動プログラミングが何で数字の羅列なんだよ。 何処がプログラミングだよ。 こんな物どんなコンパイラを通したら意味を持ったプログラムになるんだよ。 >>209 エーっと、C/C++はポインタがあるので実行したマシン破壊する確率は高いな。 わざと文書的に正しければと書いてあるんだが、気づいてないな。 >>208 そうですなぁ。チェッカーがエラーを吐かないでよかった気がする。 とりあえず、絶不評なので>>191 は終了します。 お付き合いいただきありがとうございました。 ガチでやるなら遺伝的アルゴリズムで遊んだほうが面白そうな話題ではある。 総当たりは分が悪い。
ネットでプログラムとかコードとかの記事検索して予約語が含まれるセンテンスをコピペするプログラムとかどう?(゚∀゚)<これを自動プログラミングと呼べるかどうか知らんけど
>>212 最後まで何をやらせたいのかわからなかった。 >>214 そいつは小学生じゃなくて わりと高齢の池沼だと思う お題: 入力として任意の長さのバイト列(半角アルファベット)が与えられる。入力を左から読み取っていくとき、 読み込まれるバイトの状態遷移を表すデータまたは画像を出力せよ。ただし、初期状態は'^'、終了状態は'$'で 表すものとし、状態遷移図のノードには重複がないものとする。 例) "AKDAK" → ^: A. A: K. K: D$. D: A. $: .
mousukosikangaetekarasyutudasisiroyokusokotega
>>219 > 読み込まれるバイトの状態遷移を表すデータまたは画像 とは何か? >>222 D$は、Dに遷移するか、または、$に遷移するって意味じゃないかな ちゃうやろJK edgeの終端が二股は有効グラフではNGやで
お題 1億以下の同じ数字でできている数(1,22,777など)をすべて表示する
>>228 自然数を対象とします。なので0は対象外。 >>228 Ruby p (1...9).flat_map{|i| (1..9).map{|j| j * (10**i - 1) / 9}} # => [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 111, 222, 333, 444, 555, 666, 777, 888, 999, 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999, 11111, 22222, 33333, 44444, 55555, 66666, 77777, 88888, 99999, 111111, 222222, 333333, 444444, 555555, 666666, 777777, 888888, 999999, 1111111, 2222222, 3333333, 4444444, 5555555, 6666666, 7777777, 8888888, 9999999, 11111111, 22222222, 33333333, 44444444, 55555555, 66666666, 77777777, 88888888, 99999999] >>228 Google Sheets =ARRAYFORMULA(REPT(ROW(1:9), COLUMN(A:H))) >>228 同じ数字でできている数って?どういう意味? >>228 Pharo/Squeak Smalltalk (1 to: 8) gather: [:n | (1 to: 9) collect: [:m | (Array new: n withAll: m) polynomialEval: 10]] #(1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99 111 222 333 444 555 666 777 888 999 1111 2222 3333 4444 5555 6666 7777 8888 9999 11111 22222 33333 44444 55555 66666 77777 88888 99999 111111 222222 333333 444444 555555 666666 777777 888888 999999 1111111 2222222 3333333 4444444 5555555 6666666 7777777 8888888 9999999 11111111 22222222 33333333 44444444 55555555 66666666 77777777 88888888 99999999) 遅いけど perl5 for (1..100_000_000) { print if s{\A (.) \1* \z}{$& }x } 1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99 111 222 333 444 555 666 777 888 999 1111 2222 3333 4444 5555 6666 7777 8888 9999 11111 22222 33333 44444 55555 66666 77777 88888 99999 111111 222222 333333 444444 555555 666666 777777 888888 999999 1111111 2222222 3333333 4444444 5555555 6666666 7777777 8888888 9999999 11111111 22222222 33333333 44444444 55555555 66666666 77777777 88888888 99999999
>>91 Haskell main = mapM_ (print.only) [ [1,1,1,1,2,2,2,3,3,4], [1,2,3,4,5,5,4,3,2,1], [3,1,4,1,5,9,2,6,5,3,5] ] only ns = f [xs | xs <- (group.sort) ns, length xs == 1] where f [] = -1 f ([x]:_) = x ワンライナーも出来るけど、何やってるか読み取り辛い。 only ns = if lst == [] then -1 else (head.head) lst where lst = [xs | xs <- (group.sort) ns, length xs == 1] >>228 Perl5 @s = map{$a=$_; map{$_ x $a} 1..9} 1..8; print "@s"; 実行; ~ $ perl 15_228.pl 1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99 111 222 333 444 555 666 777 888 999 1111 2222 3333 4444 5555 6666 7777 8888 9999 11111 22222 33333 44444 55555 66666 77777 88888 99999 111111 222222 333333 444444 555555 666666 777777 888888 999999 1111111 2222222 3333333 4444444 5555555 6666666 7777777 8888888 9999999 11111111 22222222 33333333 44444444 55555555 66666666 77777777 88888888 99999999 a = 0 for i = 1, 8 do a = a * 10 + 1 for j = a, a * 9, a do print(j) end end >>228 Lua >>228 Haskell import Data.List main = (print.sort.concat) [[(sum.take a) [x * 10 ^ y | y <- [0..9]] | x <- [1..9]]| a <- [1..8]] お題 >>228 を求めることができる 特に最適化を施さないナイーブな実装(例えば>>238 )を書いて その実行にかかる時間(ミリ秒、秒等)を計測し出力してください なお遅い言語処理系で1億以下が無理な場合は1千万以下でも構いません time perl -e 'for (1..100_000_000) { print if s{\A (.) \1* \z}{$& }x }' 1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99 111 222 333 444 555 666 777 888 999 1111 2222 3333 4444 5555 6666 7777 8888 9999 11111 22222 33333 44444 55555 66666 77777 88888 99999 111111 222222 333333 444444 555555 666666 777777 888888 999999 1111111 2222222 3333333 4444444 5555555 6666666 7777777 8888888 9999999 11111111 22222222 33333333 44444444 55555555 66666666 77777777 88888888 99999999 real 1m30.031s user 1m29.046s sys 0m0.093s
>>245 Pharo/Squeak Smalltalk | time ans | time := [ans := (1 to: 100000000) select: [:n | n asString asSet size = 1]] timeToRun. ^{time. ans} "Core m3-8100Y => an Array(0:00:02:55.58 #(1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99 111 222 333 444 555 666 777 888 999 1111 2222 3333 4444 5555 6666 7777 8888 9999 11111 22222 33333 44444 55555 66666 77777 88888 99999 111111 222222 333333 444444 555555 666666 777777 888888 999999 1111111 2222222 3333333 4444444 5555555 6666666 7777777 8888888 9999999 11111111 22222222 33333333 44444444 55555555 66666666 77777777 88888888 99999999)) " >>245 Perl5、1千万以下、CPU: Core i5 M520@2.4GHz use Time::HiRes qw(gettimeofday tv_interval); $t0 = [gettimeofday]; for (1..1e8) { push @s, $_ if /^(.)\1*$/; } $elapse = tv_interval($t0, [gettimeofday]); printf "@s\n%.3f[s]\n", $elapse; 実行結果 ~ $ perl 15_245.pl 1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99 111 222 333 444 555 666 777 888 999 1111 2222 3333 4444 5555 6666 7777 8888 9999 11111 22222 33333 44444 55555 66666 77777 88888 99999 111111 222222 333333 444444 555555 666666 777777 888888 999999 1111111 2222222 3333333 4444444 5555555 6666666 7777777 8888888 9999999 49.732[s] >>120 Haskell main = map (\n -> f n 0) [15,93,77,123] f n a | n < 10 = (n,a) f n a = f (product [read [x] | x <- show n]) (a + 1) >>245 c99、 Core i5 M520@2.4GHz #include <time.h> #include <math.h> #include <stdio.h> int main() { int b = 1, n = 1; clock_t s = clock(); for (int e = 1; e <= 9; e++) { int j = pow(10, e) - pow(10, e - 1); for (int i = 1; i <= j; i++) { if (n == (n / b) * b) printf("%d ", n); n++; } b *= 10; b += 1; } clock_t e = clock(); printf("\n%.3f[s]\n", (double)(e - s)/1e6); } 実行結果 $ cc -std=c99 -O2 15_245.c -lm $ time ./a.out 1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99 111 222 333 444 555 666 777 888 999 1111 2222 3333 4444 5555 6666 7777 8888 9999 11111 22222 33333 44444 55555 66666 77777 88888 99999 111111 222222 333333 444444 555555 666666 777777 888888 999999 1111111 2222222 3333333 4444444 5555555 6666666 7777777 8888888 9999999 11111111 22222222 33333333 44444444 55555555 66666666 77777777 88888888 99999999 111111111 222222222 333333333 444444444 555555555 666666666 777777777 888888888 999999999 3.890[s] ぶー!!! ・・・これが・・・!!!・・・これこそが・・・!!! ・・・だ・・・!!!・・・だそく・・・!!!!
>>245 Haskell ナイーブな方 Atomコア(Celeron N3050@1.6GHz) 1億以下で約31秒 main = print [x | x <- [1..100000000], let (s:ss) = show x, all (== s) ss] time ./zorome real 0m31.426s user 0m31.123s sys 0m0.248s ナイーブな方は探すアルゴリズムで、最適化の方(>>244 )は数列を作るアルゴリズム。 (1から99999999までの(1桁から8桁までの)ゾロ目を作る) [ [[1],[1,10],[1,10,100]...], [[2],[2,20],[2,20,200]...], ..., [[9],[9,90],[9,90,900]...]] ] って言う数列を生成して、合計出してフラットにしてソートしてるだけだよ。 (他の言語のも多少の手順の違い(フラット化とソートしないで「合計出した時点で表示」を縦方向に繰り返したり)はあるけど、基本のアルゴリズムとしては同じ) お題: nバイトのデータxをビット列にして出力しなさい
>>257 Perl5 $n = 24; @a = map{int rand 255} 1..$n;; print "@a\n"; @b = map{sprintf'%08b', $_} @a; $" = ''; print "@b\n 実行例 ~ $ perl 15_257.pl 155 105 94 58 85 82 124 6 242 94 119 175 69 205 95 25 79 154 237 248 169 254 46 93 100110110110100101011110001110100101010101010010011111000000011011110010010111100111011110101111010001011100110101011111000110010100111110011010111011011111100010101001111111100010111001011101 >>259 rand 255 ⇒ 256 の方がヨカタ >>259 コピペミス print "@b\n ↓ print "@b\n"; >>120 >>125 みたいに、1桁になるまでの変化の様子もリストで渡すようにした。 Haskell main = mapM put [4,15,93,77,123,277777788888899] put x = (putStrLn.concat) [show x," -> ",show a, " loop and value is ",show n,". list = ",show l] where (l,a,n) = f [] 0 x f l a n| n < 10 = (reverse l,a,n) f l a n = f (m:l) (a + 1) m where m = product [read [x] | x <- show n] out: 4 -> 0 loop and value is 4. list = [] 15 -> 1 loop and value is 5. list = [5] 93 -> 3 loop and value is 4. list = [27,14,4] 77 -> 4 loop and value is 8. list = [49,36,18,8] 123 -> 1 loop and value is 6. list = [6] 277777788888899 -> 11 loop and value is 0. list = [4996238671872,438939648,4478976,338688,27648,2688,768,336,54,20,0]
>>257 Ruby n = 16 x = Array.new(n){rand(0x100)} b = n.times.reduce(0){|s, i| x[~i] * 0x100**i + s} puts "%p => %0#{n}b" % [x, b] # => [31, 95, 43, 108, 105, 54, 1, 122, 100, 48, 137, 121, 131, 188, 105, 244] => 11111010111110010101101101100011010010011011000000001011110100110010000110000100010010111100110000011101111000110100111110100 typo puts "%p => %0#{n * 8}b" % [x, b] # => [31, 95, 43, 108, 105, 54, 1, 122, 100, 48, 137, 121, 131, 188, 105, 244] => 00011111010111110010101101101100011010010011011000000001011110100110010000110000100010010111100110000011101111000110100111110 100
>>228 aa=$(echo ^{1..9}\\\{1,\\\}\$\\\| |sed -e "s/ //g; s/\\\|$//;"); seq 1 $((10**8)) |grep -e "$aa" 数学的な解き方わからず このx>=3の自然数解を見つける a>b、 (a^2 - b^2)^x + (2ab)^y = (a^2 + b^2)^z
a=2 b=1で 3^x + 4^y = 5^z は解無し
出てくる文字、a b x y z はすべて自然数、正の整数です
a > b > 0 なの? 0 > a なら意味ないんだけど 出題者が問題をそもそも理解してなさそう
すべて1以上の整数として、 x>=3、 a>b、 (a^2 - b^2)^x + (2ab)^y = (a^2 + b^2)^z を満たすものを見つける そこでa=2 b=1の場合は解無しがわかっていて 任意のa,bに対して、(a^2 - b^2)^2 + (2ab)^2 = (a^2 + b^2)^2 が成り立つことも判っています
指数2だと必ず成立するのはこれだからです 指数3以上で解けるのはどれか、あるかです ピタゴラス数は無数にある 中学校の数学で習う定理に、「三平方の定理」或いは「ピタゴラスの定理」と呼ばれるものがある。 a^2 + b^2 = c^2 を満たす正の整数の組 (a, b, c) のことを、ピタゴラス数と呼ぶ。 例えば、(3, 4, 5) や (5, 12, 13) などは有名なピタゴラス数である。 ピタゴラス数が無限個存在する 任意の原始的ピタゴラス数 が (|m^2 ? n^2|, 2mn, m^2 + n^2) の形で表せることを示す。 https://nue2004.info/knowledge/knowledge97.htm \ / .::::::::::::::::::::::::;;:;;::,ッ、::::::::: ) く 数 す \ l ,ッィrj,rf'"'"'" lミ::::::: く れ 学 ま Y ,!ミ::::::: ヽ な 野 な `ヽ、 | くミ:::::::: ノ い 郎 い |、__ ャー--_ニゞ `i::::,rく か は ``''ー- ゝ、'l  ゙̄´彑,ヾ }::;! ,ヘ.) ! 帰 ゙ソ """"´` 〉 L_ っ / i , /| て r ≡=- 〈´ ,,.._ i 't-'゙ | ,へ ,r┘ ,、yx=''" `ー{゙ _, -、 ; l レ' ヽr、⌒ヽ' ゙、`--─゙ /! `、 _,,、- ゙、 ー'' / ; `、 -''"_,,、-''" ゙、 /;;' ,' / 、\ -''" / `ー─''ぐ;;;;' ,' ノ // / ヾ_、=ニ゙
どう考えてもスレチだよなぁ 必要なのはプログラムじゃなく紙と鉛筆っぽいし
このスレは数学嫌いな奴多いなぁ べつにちょっとぐらいいいじゃないか
むしろこのスレは本当にコンピューター使わないと解けないような パズル問題とかの方が解答つかないことが多い
掛け算があるので加速的に左の解が増えるので追い付かなくなる予感。
(a^2 - b^2)^x + (2ab)^y=0 (a^2 + b^2)^z=0 の連立方程式解くとよさそうに見えるが。 解くのむずくて俺は無理。
>>285 何かの冗談? それじゃ明らかに解無しなんですが >>257 Ruby N = 10 X = Random.new.bytes(N) puts X.unpack('C*').map{|c| '%02X' % c}.join(' '), X.unpack('B*') 結果 82 30 D4 E1 07 32 27 3E A2 E5 10000010001100001101010011100001000001110011001000100111001111101010001011100101 自分で移項して解こうと思ったがキャパ超えててギブアップ。 >>286 解があることは証明されているのですか?数学ダメなんだよ。 >>288 (a^2 + b^2)^z=0 <=> a = 0 and b = 0 a > b はどこ行ったの? てか勝手に両辺=0にしちゃその時点で必要性満たしてないよね 数学ダメなのでセオリー知らないんだけど。マジ解らん。 正直すまんかった。
あと、ちょっとだけ。 >>289 俺はaとbをゼロには規定してないよ。 >>284 18行目の不等号逆じゃない? x=y=z=2の時に出力出るはずだけど。 (元のお題ではxは3以上) >>293 直しました。 大きな数で発見できているかな? 演算誤差ではないか 誤差で=になるレベルじゃない AとB出力してみ?
多倍長無いと証明には至らないな。 というわけで今回は抜けるわ。 乱文申し訳ない。
あ、doubleからstd::size_tになってたw
色々弄ってみたけど、これで凍結しておくわ。 すまんかった。
>>291 規程してないよって言ってるけど 貴方が提示した条件は a=0 and b=0 と同値ですよって指摘してるんですけど難しいですか私が言ってる事 >>301 正直言えば難しいね。手を出さなければよかったとちょっと思ってる。 すまんな。 >>277 なんでxだけ3以上なの? yとzは本当に1以上の整数として解いていいの? aとbは定数として扱うの? なんなの? x=y=z=2以外の解があるか? すべて自然数、変数 a>b、 (a^2 - b^2)^x + (2ab)^y = (a^2 + b^2)^z の解 答えしらず。 a=2 b=1だけはいまのところ他にないを証明可能
>>304 だからxだけ3以上でyとzは1以上の整数として計算していいか聞いてんだけど? で、もしそうだったとしてなんでxだけ3以上に仮定してんのかも合わせて聞いてんだけど答えろよ あーこりゃ致命的に頭悪い奴か 数学も日本語も通じないとは
日本数学会に提出する前に 大学の教授にみてもらわないと
お題: 平面上にいくつかの円 (内部も含む円) がある それが重なったり重ならなかったりしていて、最も重なっている箇所ではN個の円が重なっているとする このとき、各円の座標と半径が与えられた場合にNを返すプログラムを書け
それ円周率パイとネイピア数のe の積が N個の円の重なる唯一の x座標とy座標の円達を与えられて返すの辛くないか?
>>315 辛くねえよ どうやったら方程式解いて超越数が出てくんだよ ちょっとは考えてからレスしろ 例として313が N=4 で、それを与える円4つが (x-ePi-1)^2+(y-ePi)^2=1 (x-ePi+1)^2+(y-ePi)^2=1 (x-ePi )^2+(y-ePi-1)^2=1 (x-ePi )^2+(y-ePi+1)^2=1 だったら大変かもしれない?
>>273 これ解無しって言ってるけど自明じゃないよね ホントにあってんのか? >>306 横レスだが 騒ぐ前に元の>>272 の問題文を良く見なさい それで自分で判断できなければ数学的な問題に取り組むのは止めておいたほうが良い >>319 一連のやり取り見て出題者がそこら辺理解してなさそうだったから改めて確認しただけなんですけど >>272 を見ただけでは>>306 の全ての質問に答えられないことは明白なのに何いってんの? 数学の論理もわからねえくせに見当違いのお説教してんじゃねえよ 5chはペアプレイではなくマルチプレイということをお忘れなく。
>>318 省いててわかりずらいかもしれないがアウトライン。一般化はできないだろう解き方。 3^x + 4^y = 5^z の自然数解は(2,2,2)唯一つ mod 3で1 ≡ (-1)^z、 z偶数が必要 z=2wとおくと 3^x = (5^w + 2^y) (5^w - 2^y) 簡単な考察で右辺の後項が3の倍数ならば前項は3の倍数になりえないので後項=1、前項=3^xが必要 w偶数とすると結果2式をmod 3で比較して不成立、w奇数が必要 y>=3ならばmod 8で5 ≡ 3^x、任意のxで不成立 y=1ならば解なし かいてから考えたら間違ってるところがでてきた ここまではいいとして、これあってないな > y>=3ならばmod 8で5 ≡ 3^x、任意のxで不成立
いやあってた 5^2 ≡ 1 (mod 8)になってしまうとおもったら w奇数だから、5^3 ≡ 5 (mod 8)だった 5しかでない
>>314 あら既出だったのか Twitterで見つけてきたんだけど、その人もこのスレ見てたのかな それとも問題自体が有名な問題なのかな? 少なくとも自分はAOJで見た記憶がある たしか高校生向けのコンテストの問題だったはず…
>>313 座標と半径が与えられたら、ひたすらHypotするんだ!! これ、ゲーム技術だから覚えておくとよいよ。(偉そう 自作かとおもってたがWikipediaにほぼおなじのあった。解は指数2に限るという。 のってて解けてないとすると難問か ピタゴラスの定理 - Wikipedia Jesmanowicz 予想 1956年に Jesmanowicz が以下の予想を提出した。 (a, b, c) を原始ピタゴラス数、n を自然数とする。x, y, z が (an)^x + (bn)^y = (cn)^z で自然数解を持つには、x=y=z=2 であることが必要である。
Jesmanowicz予想で検索 KAKEN 研究期間 2011 ? 2012 不定方程式におけるTerai予想とJesmanowicz予想 まず始めに、Terai予想のケース(1)のP=q=r=2の場合(Jesmanowicz予想)について考察した。 藤田育嗣氏(日本大学)との共同研究で、Jesmanowicz予想を三つ組みa,b,cがある合同条件を満たす場合に証明した。 Pingzhi Yuan氏(華南師範大学)との共同研究では、申請者の以前の研究結果を大幅に拡張することが出来た。 次に、Terai予想のケース(1)の一般的な場合について考察した。 最近、Florian Luca氏(メキシコ自治国立大学モレリア数学研究所)が、以前の研究の多くを(本質的に)一般化する結果を与えた。 その手法は、Baker理論とそのp進版の理論が有効に用いられていた。しかし、その結果は、不完全な点があり、申請者はその部分を補う計算を行なった。 さらに、申請者はTerai予想の類似問題を提起した。それは、 2以上の自然数p,q,rに対して、a^p+b^q=c^rを満たすa,b,cに対して、 指数型ディオファントス方程式c^x+b^y=a^zは、q=r=2かつc=b+1のときに限り自然数解x,y,zを持ち、 そのときにただ一つの自然数解(x,y,z)=(1,1,p)を持つである。 申請者は、Terai予想で扱われている三つ組みa,b,cについて考察を行い、 Baker理論とそのp進版の理論を用いて、いくつかの場合に予想は成立することを証明した。 特に、後半の主張である"解の一意性"を証明した。 最後に、Terai予想では扱われない三つ組みについても研究結果を得た。 まず、Alain Togbe氏(Purdue大学)との共同研究を行い、氏の以前の連続整数に関する研究を広く拡張することが出来た。 また、申請者は、三つ組みがある線形回帰数列の項として与えられる場合に方程式の解を決定した。 それによって寺井伸浩氏(足利工業大学)によって提起されたフィボナッチ数列に関する予想を解決した。 https://kaken.nii.ac.jp/grant/KAKENHI-PROJECT-11J05674/ 完全解決してないが、結構解けてるらしい 早稲田大学整数論セミナーの予定 (2014年度 第5回) タイトル: 原始ピタゴラス数に関する Jesmanowicz 予想について アブストラクト: 1956 年, Jesmanowiczはピタゴラス数に関する指数型不定方程式 (m^2 - n^2)^x + (2mn)^y = (m^2 + n^2)^z は, ただ一つの正の整数解 (x; y; z) = (2; 2; 2) を持つことを予想した. ただし, m > n, gcd(m; n) = 1, m ≠ n mod 2 を満たす正の整数とする. Journal of Number Theory の論文 (2014 年) において, n = 2 とき Jesmanowicz 予想が成り立つことを証明した. これは, 与えられた n > 1 に対し m について何も仮定せず Jesmanowicz 予想が成り立つ最初の結果である. 最先端の楕円曲線や modular formの理論から導かれる一般化された Fermat 方程式に関する結果を用いて, m に何も条件を付けずに Jesmanowicz 予想が成り立つことを証明することができた. 本講演では, これをさらに拡張して, n=2 が奇素数の冪でかつ m > 72n のときJesmanowicz予想が成り立つことを証明できたので紹介する. これらの結果の系として, n=2 が 50 未満の奇数のとき Jesmanowicz 予想が成り立つことが容易に得られる. https://www.waseda.jp/sem-wnt/kako/pdf2014/20140516.pdf 置く場所の最大サイズ2000*2000くらいまでだとprocessingとかで半透明の円を重ね合わせれば一番濃いところが正解だから合ってるかどうかだいたい見て分かる rが小数で半径が0.0001から1億くらいまでまちまちだと面倒
>>327 ,331-332 俺とは問題の解釈が違うようだ? >>334 そいつらはいつものアホやからスルーしなはれ >>326 高校生レベル高いな まぁアルゴリズムとか高校生でもすごい子いるもんなー 競プロとかすごいもんなー 材料グループAと材料グループBがあるとする。 それぞれには、ランダムな固有値を持っており、 固有値の差が、ある数値以下の組み合わせのみ使用可能とする。 ただし、材料グループA、B内の材料は一度使うとなくなるため一度しか組み合わせれない。 それぞれのグループの材料が100ずつあったとして適切に組み合わせれば 全てがマッチングできる。ただ人組でもペアを間違えるとマッチングできない。 こういったことを実現するためには、どういった考え方でプログラミングすればいいでしょうか。
>>339 各グループの材料を固有値の昇順にソートして小さい方からペア作ってくのではダメなのか? A:大<->小 B:小<->大 のペアがましといえばまし。 真ん中がマッチしない可能性はある。
なるほど、とても簡単な問いだったのですね。 なんか難しい事ばかり考えていました。
diff のアルゴリズムがもうちょっと複雑なのにも対応できるやつじゃなかったか?
あー、差が以下か。 A:小<->大 B:小<->大 でいいわ。。。 俺もなんか難しいこと考えてた。そーりー。
必ずマッチングできない100ずつあったとした場合でも昇順ソートして同じ順位にいるもので、比較してマッチングできれば実施、できなければ上位を参照してマッチングできたら抜けて、できなければさらに上位とマッチングみたいなことをすれば良いのか。
あっ違う違う。 昇順にソートして組み合わせるとマッチングできないもの出てきます。 というのも差が最小の組み合わせではなくて、 差がある一定以下である事なので、昇順にソートして隣り合うものではダメです。 少し考えたのですが、全ての組み合わせを実施して、その計算結果、今回は差がある数値以下である数が多い組み合わせを採用するみたいなことになるんですかね
>>347 適切な解が存在するケースで、小さい順の付き合わせでダメになる具体例を示せる? ないですね。 ということは、やはり最小のマッチング以外はありえないということになるのですね。 材料在庫が変動していたとしても、その瞬間の最小の差のペアを作ることが 一番効率の良いマッチング方法になるということか、、、。
全てマッチングできるとは限らず最も多くマッチングできる組み合わせ を求める ならちょっと工夫必要そう
皆さんありがとう。 最も多くマッチングさせるときは、閾値に一番近い選択を行うことがシンプルということかな? >>350 コードありがとうございます。 プログラムを生業にしている者ではないのでC++の開発環境から構築になりますが、試してみます。 大したコードではないが、そこまで威力があるとは思わなかった。 動機なんてそんなもんか。
お題: ある会社の営業曜日(複数可)と営業時間が与えられる。今月1ヶ月の営業時間の合計を求め、今月のカレンダーの下に表示せよ。ただし、その会社は祝日・祭日を特別扱いしないものとする。
>>354 おぉ見るたびマッチング精度上がってる ありがとうございます! 参考にさせてもらいます そもそもeigenvalueじゃないのに固有値と言うのに違和感を覚える
わからんな 結晶や薄膜やらだと本当に固有値がある ヤツは「材料」って言っていて、その先に何を想定してるかこちらには伏せられたまま もしかすると高分子の製薬かもしれない 使うと無くなるんだろ?
>>357 あ・・・。そうだね、そうだね。 すっかり勘違いしていた。 >>362 やっぱり、最小のペアを選んでいくことがベストなのかな? できれば差は出来るだけ小さい方が良くて、結果みてると後者の方が良好な結果が出てる気がする 3倍早いだけだったらオーダーが変わらねーじゃん 円が一万個一億個一兆個だったらどうなんの
>>363 ランダム生成している数字が割と一様なのでそういう結果になるけど、 まばらに片寄っていたらどうすればいいかはその時しかわからんなぁ。 お題: 質問文とn個の項目からなるメニューを実装せよ。 質問文とn個の文字列が入力として与えられる。質問文とn個の項目をかっこよく表示し、ユーザーが一つ項目を選ぶまで待つ。選んだら、選んだ項目を出力する。
お題: マイ ドキュメントのフォルダ階層構造を表示せよ。
>>373 Perl5 sub f { map{$_[$_ + 1] - $_[$_]} 0..$#_-1; } @a = qw{3 1 4 1 5 9 2 6 5}; @b = f @a; print "@b\n"; 実行結果 ~ $ perl 15_373.pl -2 3 -3 4 4 -7 4 -1 >>373 Pharo/Squeak Smalltalk | fn | fn := [:xs | xs allButFirst - xs allButLast]. fn value: #(3 1 4 1 5 9 2 6 5). "=> #(-2 3 -3 4 4 -7 4 -1) " >>373 Ruby p [3, 1, 4, 1, 5, 9, 2, 6, 5].each_cons(2).map{|e| -e.reduce(:-)} # => [-2, 3, -3, 4, 4, -7, 4, -1] >>373 Pharo/Squeak Smalltalk #(3 1 4 1 5 9 2 6 5) overlappingPairsCollect: [:x :y | y - x] "=> #(-2 3 -3 4 4 -7 4 -1) " >>373 perl5 "3 1 4 1 5 9 2 6 5" =~ m/(\d) (?= \s? (\d) ) (?{push @diff, $2 -$1}) /xg; print "@diff"; -2 3 -3 4 4 -7 4 -1 >>373 ファイルからの読み込み派が居ない件。。。 Haskell main = readFile "count.txt" >>= return.read >>= \lst -> print $ zipWith (-) (tail lst) lst ― ファイルから読まない場合は ― main = print $ zipWith (-) (tail lst) lst where lst = [3,1,4,1,5,9,2,6,5] test.txt [3,1,4,1,5,9,2,6,5] out: [-2,3,-3,4,4,-7,4,-1] >>219 Perl5 $s = 'AKDAK'; @a = ('^', split'', $s); $o{$_} //= ++$i for @a; %e = map{$a[$_] => $a[$_+1]} 0..$#a-1; @p = sort{$o{$a} <=> $o{$b}} keys %o; $d{$p[-1]} = $p[-1].'$'; push @p, '$'; $e{'$'} = ''; print "'$s'\n→\n"; for (@p) { $v = $e{$_}; $r = $d{$v} // $v; print "$_: $r.\n"; } 実行結果 ~ $ perl 15_219.pl 'AKDAK' → ^: A. A: K. K: D$. D: A. $: . ほらまぁ 状態遷移を表形式で定型的に定義した方が 言葉の羅列やグラフもどきポンチ絵などで表現するより明確な場面 さまざまなとき
あいや、表じゃなくて図か。 そしたら、なんとなく依存関係などをややこしいグラフで表現して ひもつけたとか賜って解釈したような気にさせるとき 自分で考えなよ
>>373 javascript [3,1,4,1,5,9,2,6,5] .reduce((acc, n, i, arr) => [...acc, arr[i + 1] - n], []) .slice(0, -1) >>373 >>379 のブロック内で処理するのが分かりやすかったので、Haskellもprint以外の処理をリスト内包表記で完結するようにした。 main = print [y - x | let lst@(_:ls) = [3,1,4,1,5,9,2,6,5], (x,y) <- zip lst ls] 文字数としては >>383 より増えるが、読みやすさ優先。 Smalltalkはやりたいことだけ書けばいいのがいい
分かったよじゃあoverlappingPairsCollect実装するよ… const overlappingPairsCollect = (arr, cb) => { let head = arr.shift(); const overlappingPairs = []; for (const value of arr) { overlappingPairs.push([head, value]); head = value; } return overlappingPairs.map(([a, b]) => cb(a, b)); } overlappingPairsCollect([3,1,4,1,5,9,2,6,5], (a, b) => b - a); //=> [-2,3,-3,4,4,-7,4,-1]
ああ… forの前にif (!head) return overlappingPairs; のearly return入れ忘れた…
>>397 コード追加。MakeHogeで困ることあるかなぁ? あんまりユースケース見えてないから、不具合あったら教えて。 お題 スネークケースをアッパーキャメルケースに変換せよ アンダースコアを単語の区切りとみなし、単語の先頭は大文字に、先頭以外は小文字に変換すること また、単語を連結したときに数字が連続する場合はアンダースコアを残すこと (例) snake_case => SnakeCase ODAI00_99_TEST => Odai00_99Test x_0_x => X0X UpperCamelCase => Uppercamelcase
>>399 allButFirstとallButLastは簡単だけどjsは生き残ってるスクリプト言語にしては珍しく演算子使ったリスト同士の演算が用意されてないのでfnは>>377 みたいにキレイに書けない。 const allButFirst = arr => arr.slice(1); const allButLast = arr => arr.slice(0, -1); const fn = arr => allButLast(arr).reduce((acc, v, i) => (acc[i] -= v, acc), allButFirst(arr)); fn([3,1,4,1,5,9,2,6,5]); //=> [-2,3,-3,4,4,-7,4,-1] >>400 Perl5 use feature say; for (<DATA>) { say map{ucfirst lc} /((?:\d_\d|[^_\s])+)/g; } __DATA__ snake_case ODAI00_99_TEST x_0_x UpperCamelCase 実行結果 ~ $ perl 15_400.pl SnakeCase Odai00_99Test X0X Uppercamelcase >>402 その例ではいいけど Odai00_9_9Test ↓になっちまうな… Odai00_99test C++とJSとの違いは大雑把に言って、使う型を先に決めるか後で決めるか。という程度だと思う。 オレ、自分の幸福度を上げるために、80行位で問題とくようにしている。 というか、手癖でそれくらいになる。
>>400 JavaScript const fn = s => s.split`_` .map(([first, ...rest]) => [first.toUpperCase(), rest.join``.toLowerCase()].join``) .reduce((acc, word) => acc + (/[0-9]{2}/.test(acc[acc.length - 1] + word[0]) ? '_' : '') + word); fn('snake_case'); //=> "SnakeCase" fn('ODAI00_99_TEST'); //=> "Odai00_99Test" fn('x_0_x'); //=> "X0X" fn('UpperCamelCase'); //=> "Uppercamelcase" >>400 Squeak Smalltalk | fn | fn := [:str | | words | words := str asLowercase subStrings: '_'. words first capitalized , (words overlappingPairsCollect: [:x :y | ((x last isDigit and: [y first isDigit]) ifTrue: '_' ifFalse: '') , y capitalized ]) join ]. fn value: 'snake_case'. "=> 'SnakeCase' " fn value: 'ODAI00_99_TEST'. "=> 'Odai00_99Test' " fn value: 'x_0_x'. "=> 'X0X' " fn value: 'UpperCamelCase'. "=> 'Uppercamelcase' " fn value: 'Odai00_9_9Test'. "=> 'Odai00_9_9test' " >400 Ruby f = -> s {s.split(/(?<=\D)_|_(?=\D)/).map(&:capitalize).join} %w[ snake_case ODAI00_99_TEST x_0_x UpperCamelCase ].each{|s| puts '%s => %s' % [s, f[s]]} # => snake_case => SnakeCase ODAI00_99_TEST => Odai00_99Test x_0_x => X0X UpperCamelCase => Uppercamelcase
>>409 補足 puts f["Odai00_9_9Test'] # => Odai00_9_9test >>400 UpperCamelCaseはそのまま返すべきだろう。 (と言う事で、1文字目が大文字かつ全文に’_’が無い場合は、(恐らくUpperCamelCaseだろうと期待して)そのまま返すようにした) Haskell import Data.Char main = mapM_ (print.f) ["snake_case","ODAI00_99_TEST","x_0_x","UpperCamelCase","notupperCamelCase"] f [] = [] f lst@(x:_) | and [elem x ['A'..'Z'], (not.elem '_') lst] = lst f (x:xs) = toUpper x:map toLower a ++ f (map toLower $ f' a b) where (a,b) = span (/= '_') xs f' _ [] = [] f' [] (y:ys) = ys f' xs lst@('_':y:ys) |and [(isDigit.last) xs, isDigit y] = lst f' _ (_:ys) = ys out: "SnakeCase" "Odai00_99Test" "X0X" "UpperCamelCase" "Notuppercamelcase" >>400 Perl5、>>402-403 の修正、>>413 のように UpperCamelCase など_を含まない文字列はそのまま返す use feature say; for(<DATA>) { @a = split/(?<!\d)_|_(?!\d)|\s/; say 1 == @a ? @a : map{ucfirst lc} @a; } __DATA__ snake_case ODAI00_99_TEST x_0_x UpperCamelCase _local_vvar_ lavel_style_ OdAi00_9_9TeST 実行結果 ~ $ perl 15_400_fix.pl SnakeCase Odai00_99Test X0X UpperCamelCase LocalVvar LavelStyle Odai00_9_9Test >>414 ゴメン、実行結果貼り間違えた(下記のように最後のOdAi00_9_9TeSTはそのまま出る) ~ $ perl 15_400.pl SnakeCase Odai00_99Test X0X UpperCamelCase LocalVvar LavelStyle OdAi00_9_9TeST >>412 Perl5 @a = a..z; @x = map{$_-1} grep{$_&1} 1..@a; @b = @a[@x]; print "[@b]\n"; 実行結果 ~ $ perl 15_412.pl [a c e g i k m o q s u w y] >>412 common lisp (loop for i in '(1 2 3 4 5) for j from 1 when (eql 1 (mod j 2)) collect i) (1 3 5) >>412 Ruby p [1, 2, 3, 4, 5].each_slice(2).map(&:first) # => [1, 3, 5] >>412 JavaScript [1, 2, 3, 4, 5].filter((val, idx) => (idx + 1) % 2) //=> [1, 3, 5] >>373 J f =: 2 & (-~/\) f 3 1 4 1 5 9 2 6 5 _2 3 _3 4 4 _7 4 _1 >>412 J f =: _2 & ([/\) f 1 2 3 4 5 1 3 5 >>412 せめて、リストの中身は順番と関係無い内容の方が。。。 (例えば"abcde"とか) Haskell main = (print.oddlist) [1..5] oddlist xs = [x | (x,y) <- zip xs [1..], odd y] >>412 Tcl set x {1 2 3 4 5} set r {} foreach {a b} $x {set r [concat $r $a]} puts $r 実行結果 1 3 5 >>427 > foreach {a b} こんなオサレな書き方で二個処理できるのすごい tcl/tkで「tk部分ははいいがtclがクソ」みたいなのよく見た気がするんだけど、あれどういうとこが根拠なん?
お題: すべての人民は和平のために火急的に速やかに自己の復元を実現しなければならない。
>>412 Io a := list(1, 2, 3, 4, 5) a select(i, v, i isEven) println 実行結果 list(1, 3, 5) >>419 >>420 スレ違いだし、関数型言語だけが再利用性が高いとは言わないけど、 仮にoddlistがリストに対して良く使われる処理なら [1,2,3,4,5].oddlist() とか使いたいよね? 確かRubyはそう言う基本クラスにメソッド追加出来たと思うけど(うろ覚え)、 それをライブラリにして公開したいとする。 そうなると名前の競合とか起こり得るので import mylib [1,2,3,4,5].mylib.oddlist() としたいとか、ならないだろうか。 変数と関数は別が良いって思った。 (議論の流れになるなら、別スレに誘導してね) >>412 Python print([ i for i in range(1,6,2) ]) # [1, 3, 5] >>429 スレチだが教えてやる 数字が文字列として扱われて実行時にパースされるから馬鹿みたいに遅いことだ >>412 Python a~f print( ['a','b','c','d','e'][::2] ) # ['a', 'c', 'e'] >>436 Crypter. Crypt + er. それをゆうなら、encrypterの方が自然じゃん。
EnCrypterか。了解。 忘れたらごめんなさい。
EnCrypterはおかしい Encryperでいい
>>444 なんか癖になってるんだ。 小学校から英語やってるわけじゃないからなぁ・・・。 >>432 釈迦に説法は空しいし恥ずかしいのでやめよう どう考えてもおまいより>>419 のほうが力量が上 議論の余地は無いので安心していい >>426 Perl 5.30 # -*- coding: utf-8 -*- no warnings 'experimental::signatures'; use feature qw(say signatures); # lexical_subs); sub ReversibleHash_Encode($S, $C) { @a = unpack 'C*', $S; $l = @c = split '', $C; my $o; ++$o while $l**$o < 256; #my $o = 1 + log(256)/log $l; use integer; my sub _enc($i) { join '', reverse map{($i, $m) = ($i/$l, $i%$l); $c[$m]} 1..$o } %e = map{$_ => '%'._enc $_} 0..255; join '', map{$e{$_}} @a; } sub ReversibleHash_Decode($S, $C) { @s = $S =~ /(%\w+)/g; %d = map{$e{$_} => $_ } keys %e; pack 'C*', map{$d{$_}} @s; } say $t = ReversibleHash_Encode 'ウィキペディア', '0123456789'; say $s = ReversibleHash_Decode $t, '0123456789'; $Ch = "abcdefghijklnmopqrstuvwxyz0123456789"; say $t = ReversibleHash_Encode $s, $Ch; say $s = ReversibleHash_Decode $t, $Ch; 実行結果 ~ $ perl 15_426.pl %227%130%166%227%130%163%227%130%173%227%131%154%227%131%135%227%130%163%227%130%162 ウィキペディア %gl%dw%ew%gl%dw%et%gl%dw%e3%gl%dx%ek%gl%dx%d1%gl%dw%et%gl%dw%es ウィキペディア zipとunzip関数があるからそれで偶数と奇数に分ければいい
>>412 Prl5 (≦5.28)、配列の添字を0始まり以外にする$[ (array_base feature)を使用 $[ = 1; @a = a..z; @x = grep{$_ & 1} 1..@a; @b = @a[@x]; print "@b\n"; 実行結果 ~ $ perl 15_412_array_base.pl a c e g i k m o q s u w y ※5.12〜5.28では$[は非推奨になり、設定すると Use of assignment to $[ is deprecated at 15_412_2.pl line 1. というwarningが出ます、5.30からは$[の設定できなくなりました >>412 R 要素が 奇数個だとワーニングが出ちゃうけど a<-1:9 print(matrix(a,2)[1,]) >>449 実行はしてないが、成果については「GJ!!」だ! お題: 文字列が渡されるので文字vの左隣の文字を小文字、右隣の文字を大文字に変換しなさい
>>456 その場合はvに挟まれた文字をxに変換してください お題:1から100までの自然数がある。ランダムに30個抜き出せ。
>>460 Ruby p [*1..100].sample(30) # => [13, 29, 96, 79, 78, 17, 89, 88, 69, 51, 44, 16, 54, 62, 47, 19, 45, 26, 43, 40, 91, 32, 30, 86, 84, 85, 15, 6, 41, 95] >>460 Kotlin script println((1..100).toMutableList().apply {shuffle()}.slice(0..29).joinToString()) >>460 Perl5、※選択に重複がないようにした @a = 1..100; use List::Util shuffle; @b = (shuffle @a)[0..29]; print "@b\n"; 実行結果 ~ $ perl 15_460.pl 64 90 99 41 46 11 25 23 2 12 43 42 24 96 59 44 19 7 92 47 15 86 84 68 13 100 76 34 87 9 >>460 J (30?100) { >: i. 100 >>460 Pharo/Squeak Smalltalk (1 to: 100) asArray shuffled first: 30 プログラム言語標準の文字列(e.g. java.lang.String) が与えられ、ランレングス圧縮した結果をプログラム言語標準の文字列で返す関数を作成してください。ただし、入力に数字が入っていた場合のケースは考慮しなくても構いません。 テストケース(関数名 = f) f("あいうえお") -> "あいうえお" f("ああいいうう") -> "あ2い2う2" f("あいうあいう") -> "あいうあいう"
あうあうあー -> あうあうあー ああああ -> あ4
python に あ2い2う2 のようにカウンティング結果を含んだリストを返すライブラリが はいっていたな
>>467 haskellだよー join.map ((:).head <*> (bool "".show.length <*> (1 <).length)).group >>467 JavaScript const f = s => [...s] .reduce((acc, ch) => { const [lastCh, n = 1] = acc.pop() || []; if (!lastCh) return [[ch]]; if (lastCh == ch) { return [...acc, [lastCh, n + 1]]; } else { return [...acc, [lastCh, n == 1 ? '' : n], [ch]]; } }, []) .flat(Infinity) .join``; >>467 Perl5 use utf8; binmode STDOUT, ':encoding(utf-8)'; for (qw{あいうえお ああいいうう あいうあいう あうあうあー ああああ}) { my $s; while (/((.)\g-1*)/g) { $s .= $2; $s .= $l if 1 < ($l = length $1); } print "$s\n"; } 実行結果 ~ $ perl 15_467.pl あいうえお あ2い2う2 あいうあいう あうあうあー あ4 >>467 Perl5、しくった、お題は「関数を作れ」だった…orz use utf8; binmode STDOUT, ':encoding(utf-8)'; sub f { my $s; while (/((.)\g-1*)/g) { $s .= $2; $s .= $l if 1 < ($l = length $1); } $s } for (qw{あいうえお ああいいうう あいうあいう あうあうあー ああああ}) { print f($_)."\n"; } ~ $ perl 15_467_f.pl あいうえお あ2い2う2 あいうあいう あうあうあー あ4 >>467 Ruby f = -> s {s.gsub(/(.)\1+/){[$1, $&.size].join}} %w[あいうえお ああいいうう あいうあいう あうあうあー ああああ].each{|s| puts [s, f[s]].join(' => ')} # => あいうえお => あいうえお ああいいうう => あ2い2う2 あいうあいう => あいうあいう あうあうあー => あうあうあー ああああ => あ4 >>432 Ruby module Hoge refine Array do def oddlist select.with_index{|s, i| i.odd?} end end end class C1 p [0, 1, 2, 3, 4].oddlist rescue p$! # => #<NoMethodError: undefined method `oddlist' for []:Array> end class C2 using Hoge p [0, 1, 2, 3, 4].oddlist # => [1, 3] end むずかし過ぎワロタwww 俺にC++は絶対ムリwwwww
>>478 自分の福祉のために圧迫しない程度に冗長に書いてるけど、ショートコーディングももちろんできるよ。 記憶力と直感と若干の経験で書いている。 >>480 ウインドウズのアプリっぽいの一個位は作ったことあるよ。 >>483 bot(だと自分で思ってる)相手にレスしちゃう男の人なんて…… お題: 明日の東京都の天気を教えてくれる「お天気ねえさん」を実装せよ。 https://www.drk7.jp/weather/ ここのXMLデータを参考に、明日の東京都の天気を優しく説明してくれるような説明テキストを生成せよ。 例) 明日XX月YY日の東京都の天気は○○です。○○注意報が出ています。傘を忘れないでね。 ある種のデータは石油のように重要だから、データ自動生成は条件が揃えばお金儲けにつながる。まあ、とことんチャレンジしたまえ。
google の検索結果を 10 づつ合計 1000 件ダウンロードするプログラム
>>467 Lua マルチバイト文字には対応していない。 function f(s) local r,c="",1 for i=1,#s do if s:sub(i,i)==s:sub(i+1,i+1) then c=c+1 else r=r..s:sub(i,i) if c>1 then r=r..c c=1 end end end return(r) end print(f("aaabbc")) 実行結果 a3b2c >>467 perl5 デバッガが日本語で化けるんで英語だけ print("aabbccddd" =~ s{ (.) \1* }{ "$1" . length"$&" }xgre); a2b2c2d3 >>485 Perl5 (LWP::UserAgent、LWP::Protocol::https、XML::Simple のinstallしてあるPCで) # -*- coding: utf-8 -*- use utf8; use Data::Dump 'dump'; use Data::Dumper; binmode STDOUT, ':encoding(utf-8)'; use feature say; $pno = 13; # ex) 01:北海道, 13:東京, 20:長野, 47:沖縄 $url = "https://www.drk7.jp/weather/xml/$pno.xml "; require LWP::UserAgent; # with LWP::Protocol::https $ua = LWP::UserAgent->new; $ua->agent('Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko'); $xml = LWP::UserAgent->new->get($url)->content; use XML::Simple; my $xs = new XML::Simple; #(keyattr => ['area']); # (forcearray => ['info'], keyattr => ['pref']); my $data = $xs->XMLin($xml); say "$_: $data->{$_}" for qw{title link description pubDate author managingEditor}; $pref = $data->{pref}; say "都道府県: $pref->{id}"; %area = %{$pref->{area}}; for $region (keys %area) { $area = $area{$region}; printf "地域: $region (緯度=%s, 経度=%s)\n", @{$area->{geo}}{qw{lat long}}; for $info (@{$area->{info}}) { say " $info->{date} 天気:$info->{weather} (画像 $info->{img})"; $info->{$_} and say ' 'x9, $info->{$_} for qw{weather_detail wave}; %temp = %{$info->{temperature}}; say ' 'x6, " 気温[$temp{unit}]: ", join 'から', sort map{"$_->{content}°"} @{$temp{range}}; %rfc = %{$info->{rainfallchance}}; say ' 'x6, " 降水確率 : ", join ', ', map{"$_->{hour}時:$_->{content}$rfc{unit}"} @{$rfc{period}}; } } 実行結果(例) ~ $ perl 15_485.pl title: weather forecast xml link: http://www.drk7.jp/weather/xml/13.xml description: 気象庁の天気予報情報を XML で配信。1日1回 AM 6:00 ごろ更新。 pubDate: Thu, 19 Sep 2019 18:00:01 +0900 author: 気象庁 managingEditor: drk7.jp 都道府県: 東京都 地域: 伊豆諸島南部 (緯度=33.2419, 経度=139.8418) 2019/09/19 天気:くもり時々雨 (画像 ) 北東の風 やや強く くもり 夜のはじめ頃 雨 八丈島 では 夜遅く 雷を伴い 激しく 降る 波 3メートル うねり を伴う 気温[摂氏]: 21°から23° 降水確率 : 00-06時:0%, 06-12時:80%, 12-18時:50%, 18-24時:50% 2019/09/20 天気:くもり時々雨 (画像 ) 東の風 やや強く くもり 一時 雨 波 4メートル のち 3メートル ただし 三宅島 では 3メートル 気温[摂氏]: 20°から23° 降水確率 : 00-06時:50%, 06-12時:60%, 12-18時:60%, 18-24時:50% 2019/09/21 天気:くもり一時雨 (画像 ) 気温[摂氏]: 21°から26° 降水確率 : 00-06時:70%, 06-12時:70%, 12-18時:70%, 18-24時:70% 2019/09/22 天気:くもり一時雨 (画像 ) 気温[摂氏]: 23°から29° 降水確率 : 00-06時:50%, 06-12時:50%, 12-18時:50%, 18-24時:50% 2019/09/23 天気:くもり一時雨 (画像 ) 気温[摂氏]: 25°から29° 降水確率 : 00-06時:50%, 06-12時:50%, 12-18時:50%, 18-24時:50% …(後略 お題 以下の、列区切りが空白である入力文字列を、 最後の列の数値が、小さい順番で、行を並べ替えよ 答えは、上下が反転する a b c 44 x y 33 z 22 11
>>496 cat text a b c 44 x y 33 z 22 11 cat text | perl -pe 's/.*? \s? (\d+)/$1:$&/xgm' | sort -n | perl -pe 's/^\d+://' 11 z 22 x y 33 a b c 44 >>496 Ruby puts <<~EOS.each_line.sort_by{|s| s[/\S+\n?/].to_i} a b c 44 x y 33 z 22 11 EOS # => 11 z 22 x y 33 a b c 44 >>489 合法的? にやるにはどうすればいいの? >>500 初手でウエイト入れないで読みに行って、アクセス規制法に引っかかるのとかありそう。 鯖落としたら、怒られるからな。警察に。 >>496 J echo@>(/: {: @:(0&".) &.>) <;._2 stdin '' http://appmarketinglabo.net/osaka-bakurotalk/ Q、hamonさん、ここだけの面白い話は何かありますか? hamon: 絶対にこれをつくれば海外で10万DLされるという「超鉄板ジャンル」がある。 それは「3Dのリアルな人間をつかった実在のスポーツゲーム」、中身がクソでも10万DLはされる。 「ボクシングvs腕相撲」という実質もぐらたたきのようなゲームが30万DLいった。 「スキージャンプ アルティメイタム」というゲームが10万DLくらい。 マイナーなスポーツでもそのような結果なので、競技人口のベスト10のスポーツを調べてつくれば10万DLは固い。 普通につくるとコストがかかるが、UNITYでつくればストア上でモーションも売っているのでかなり稼げると思う。 お題: 同じ文字列がいくつあるか数えるプログラムを作成しなさい。 ※出力は出現回数順でソートされている必要はありません。 入力 Hoge Fuga Foo Fuga Foo Hoge Bar Fuga 出力 Hoge 2 Fuga 3 Foo 2 Bar 1
>>504 Perl5 $h{$_}++ for qw{Hoge Fuga Foo Fuga Foo Hoge Bar Fuga}; print "$_ $h{$_}\n" for keys %h; 実行結果 ~ $ perl 15_504.pl Fuga 3 Hoge 2 Bar 1 Foo 2 >>504 cat text Hoge Fuga Foo Fuga Foo Hoge Bar Fuga cat text | perl -ne '$dirs{ s/\R//r } += 1; END{for $key (keys %dirs) {printf "%-4s %s\n", $key, $dirs{$key} } }' Foo 2 Fuga 3 Bar 1 Hoge 2 うほっ。C++のunordered_mapはオーダー要求しないから、そこを使って最適化物故むとかやるんかいな。 VCとGCCと挙動違う。
>>496 Perl5 sub f {$_[0] =~ /(\d+)/; $1}; print sort{ f($a) <=> f($b) } <DATA>; __DATA__ a b c 44 x y 33 z 22 11 実行結果 ~ $ perl 15_496.pl 11 z 22 x y 33 a b c 44 >>504 Ruby a=readlines.map(&:chomp) a.uniq.each{|v| puts("#{v} #{a.count(v)}")} お題:正の整数が与えられるので、英語の序数に変換せよ 1 => 1st 23 => 23rd 12 => 12th
>>514 Perl5 %o = qw{1 st 2 nd 3 rd}; $o = $o{$_}//'th', print "$_$o\n" for 1..10,12,23; 実行 ~ $ perl 15_514.pl 1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10th 12th 23th >>514 Perl5、 >>515 はもう少しコンパクトに書けた %o = qw{1 st 2 nd 3 rd}; printf "$_%s\n", $o{$_}//'th' for 1..10,12,23; 1st 2nd 3rd 11th 12th 13th 21st 22nd 23rd 101st 102nd 103rd 111th 112th 113th 121st 122nd 123rd 皆さんここらへん大丈夫?
>>514 Perl5、>>519 で指摘された誤りの修正 テヘペロ %h = qw{1 st 2 nd 3 rd}; for (1..4,11,12,13,21,22,23,101,102,103,111,112,113,121,122,123) { /(\d?)(\d)$/; printf "$_ => $_%s\n", $1 eq 1 ? 'th' : $h{$2}//'th'; } 実行結果 ~ $ perl 15_514.pl 1 => 1st 2 => 2nd 3 => 3rd 4 => 4th 11 => 11th 12 => 12th 13 => 13th 21 => 21st 22 => 22nd 23 => 23rd 101 => 101st 102 => 102nd 103 => 103rd 111 => 111th 112 => 112th 113 => 113th 121 => 121st 122 => 122nd 123 => 123rd お題: 与えられた西暦年月日を年号年月日に変換しなさい。ただし、変換するのは大正時代から令和までとし、範囲外であればERRORを表示しなさい。
お題: YYYY/MM/DD形式で与えられた西暦年月日の文字列が正しい年月日を表しているかどうか判定せよ。
>>522 , >>521 の順に解いて下さい。 1970/01/05 1990/12/31 2019/04/28 2019/05/01 1920/02/29 >>522 Perl5 use Time::Piece; for (<DATA>) { chomp; my $t; eval {$t = Time::Piece->strptime($_, '%Y/%m/%d')}; $t //= 'Invalid'; print "$_: $t\n"; } __DATA__ 1970/01/05 1990/12/31 2019/04/28 2019/05/01 1920/02/29 0000/13/32 実行結果 1970/01/05: Mon Jan 5 00:00:00 1970 1990/12/31: Mon Dec 31 00:00:00 1990 2019/04/28: Sun Apr 28 00:00:00 2019 2019/05/01: Wed May 1 00:00:00 2019 1920/02/29: Sun Feb 29 00:00:00 1920 0000/13/32: Invalid >>524 Time::Piece->strptime は 1900/01/01 よりも前の日付だと 正しい西暦の年月日を入力しても parse結果が不定となってしまうということがさっき分かりました。 したがって残念ながら>>524 のcodeは>>522 の題意を満たしているとは 言いがたいものでした。ゴメンね〜 令和1年を令和元年にしないといけないという落とし穴があるようだ。
>>504 Ruby p $<.map(&:chomp).yield_self{|e| e.uniq.map{|v| [v, e.count(v)]}} # => [["Hoge", 2], ["Fuga", 3], ["Foo", 2], ["Bar", 1]] >>496 Squeak Smalltalk #('a b c 44' 'x y 33' 'z 22' '11') sortBy: [:x | x splitInteger last] ascending "=> an OrderedCollection('11' 'z 22' 'x y 33' 'a b c 44') " >>504 Pharo/Squeak Smalltalk 'Hoge Fuga Foo Fuga Foo Hoge Bar Fuga' lines asBag sortedElements "=> {'Bar'->1 . 'Foo'->2 . 'Fuga'->3 . 'Hoge'->2} " >>467 Pharo/Squeak Smalltalk | fn | fn := [:str | String streamContents: [:ss | (str as: RunArray) runsAndValuesDo: [:n :x | ss nextPut: x; nextPutAll: (n = 1 ifTrue: [''] ifFalse: [n asString]) ] ]]. fn value: 'あいうえお'. "=> 'あいうえお' " fn value: 'ああいいうう'. "=> 'あ2い2う2' " fn value: 'あいうあいう'. "=> 'あいうあいう' " >>514 Ruby suffixes = %w[th st nd rd] f = -> n {(-(-((n - 10) / 10 % 10) / 9)) * 41 / (n % 10 * 10 + 11) * (n % 10)} [ 1, 2, 3, 4, 11, 12, 13, 21, 22, 23, 101, 102, 103, 111, 112, 113, 121, 122, 123 ].each{|v| puts '%1$d => %1$d%2$s' % [v, suffixes[f[v]]]} # => 1 => 1st 2 => 2nd 3 => 3rd 4 => 4th 11 => 11th 12 => 12th 13 => 13th 21 => 21st 22 => 22nd 23 => 23rd 101 => 101st 102 => 102nd 103 => 103rd 111 => 111th 112 => 112th 113 => 113th 121 => 121st 122 => 122nd 123 => 123rd (dolist (n (list 1 2 3 11 12 13 21 22 23 101 102 103 111 112 113 121 122 123) ) (format t "~:R~%" n)) first second third eleventh twelfth thirteenth twenty-first twenty-second twenty-third one hundred first one hundred second one hundred third one hundred eleventh one hundred twelfth one hundred thirteenth one hundred twenty-first one hundred twenty-second one hundred twenty-third
>>534-535 ラムダ式. 任意の自然数 n に対して次の式は n の序数詞の末尾が th なら 0, st なら 1, nd なら 2, rd なら 3 を返す.(除算は切り捨て) (-(-((n - 10) / 10 % 10) / 9)) * 41 / (n % 10 * 10 + 11) * (n % 10) >>514 Lua function f(n) local r,x x=n%10 if n%100-x==10 or x<1 or x>3 then r="th" else r=({"st","nd","rd"})[x] end return n..r end >>514 JavaScript const f=n=>n+=[,'st','nd','rd'][n%100>>3 ^1&&n%10]||'th' 実行結果略 >>522 , >>521 JavaScript const isValid = seireki => { let check try { check = new Intl .DateTimeFormat('ja-JP', {year: 'numeric', month: '2-digit', day: '2-digit'}) .format(new Date(seireki)) } catch (e) { return false } return seireki === check ? true : false } const seirekiToWareki = seireki => { if (!isValid(seireki)) return 'ERROR' const wareki = new Intl .DateTimeFormat('ja-JP-u-ca-japanese', {era: 'long', year: 'numeric', month: 'numeric', day: 'numeric'}) .format(new Date(seireki)) .replace(/(正|和|成)1(年)/, '$1元$2') return ['大正', '昭和', '平成', '令和'].includes(wareki.slice(0, 2)) ? wareki : 'ERROR' } `1979/01/05 1990/12/31 2019/04/28 2019/05/01 1920/02/29 0000/13/32` .split`\n`.forEach(seireki => {console.log(seirekiToWareki(seireki))}) 実行結果: 昭和54年1月5日 平成2年12月31日 平成31年4月28日 令和元年5月1日 大正9年2月29日 ERROR >>521-523 Perl5 use Time::Piece; #use Data::Dump 'dump'; @fy = (['2019/05/01', '令和'], ['1989/01/08', '平成'], ['1926/12/25', '昭和'], ['1912/07/30', '大正']); $$_[0] = Time::Piece->strptime($$_[0], '%Y/%m/%d') for @fy; for (qw{1970/01/05 1990/12/31 2019/04/28 2019/05/01 1920/02/29 1912/07/29 2019/02/29}) { my ($t, $t0, $era, $nen); eval {$t = Time::Piece->strptime($_, '%Y/%m/%d')}; if ($t and $t->strftime('%Y/%m/%d') eq $_) { do {($t0, $era) = @$_, last if $$_[0] <= $t} for @fy; if ($t0) { $nen = ($y = $t->year - $t0->year, $y ? $y + 1 : '元').'年' if $t0; $t = "$era$nen".$t->mon.'月'.$t->mday.'日'; } else { $t = 'ERROR'; } } else { $t = 'Invalid'; } print "$_: $t\n"; } 実行結果 ~ $ perl 15_521.pl 1970/01/05: 昭和45年1月5日 1990/12/31: 平成2年12月31日 2019/04/28: 平成31年4月28日 2019/05/01: 令和元年5月1日 1920/02/29: 大正9年2月29日 1912/07/29: ERROR 2019/02/29: Invalid >>541 一行目のコメント #use Data::Dump 'dump'; はdebugの際に使ったstatementの消し忘れにつき、不要 >>541 $nen = ($y = $t->year - $t0->year, $y ? $y + 1 : '元').'年' if $t0; の「 if $t0」も削除し忘れだな、ゴメンチャイ 無駄に否定演算子で分かりにくくしている if (!arg_reverse) r = sd_journal_next_skip(j, 1 + after_cursor); else r = sd_journal_previous_skip(j, 1 + after_cursor);
>>521 Perl5 >>541 を少しコンパクトにしてみた use Time::Piece; @fy = (['2019/05/01','令和'],['1989/01/08','平成'],['1926/12/25','昭和'],['1912/07/30','大正']); $$_[0] = Time::Piece->strptime($$_[0], '%Y/%m/%d') for @fy; for (qw{1970/01/05 1990/12/31 2019/04/28 2019/05/01 1920/02/29 1912/07/29 2019/02/29}) { my ($t, $t0, $era, $nen); eval {$t = Time::Piece->strptime($_, '%Y/%m/%d')}; $s = 'Invalid'; if ($t and $t->strftime('%Y/%m/%d') eq $_) { do {($t0, $era) = @$_, last if $$_[0] <= $t} for @fy; $s = 'ERROR'; if ($t0) { $nen = ($y = $t->year - $t0->year, $y ? $y + 1 : '元').'年'; $s = "$era$nen" . $t->mon . '月' . $t->mday . '日'; } } print "$_: $s\n"; }