1 :
デフォルトの名無しさん :
2013/01/03(木) 14:46:14.42 プログラミングの練習に誰かが面白いお題を提案するスレ 取り敢えず初心者はここで練習しよう
3 :
デフォルトの名無しさん :2013/01/03(木) 16:06:11.28
言語は?
アイちゃん語
オセロ 自動販売機のシミュレート 簡単なファイル検索ソフト
自動販売機のシミュレート ⇒ユニットごとの制御(冷却、加温、電磁コイル、ディスプレイ、音声等) ユニットのエラーセンサも実装すること
つり銭制御も大切
組み込みかよ
注意書きが遅いけど京都大学霊長類研究所は正月休みなのか? 正月の間もアイちゃんの世話は必要だろ
自動販売機 ・お金を受け取る ・お金か確認する ・お金が足りているか確認する ・商品を排出する ・お釣りを計算する ・お金を返金する ・商品を補充する とりあえずこんなもんか
これも必要かな ・在庫切れの商品のランプを消灯する ・現在の投入金額によって購入可能な商品のランプを点す ・つり銭を補充する ・つり銭切れの場合販売中止にする
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
Juicesで読むのやめた
2階建エレベーター
役や点数などローカルルール等が柔軟に設定できる通信対戦型麻雀
20 :
デフォルトの名無しさん :2013/01/15(火) 01:52:36.77
結局誰も作らない
21 :
デフォルトの名無しさん :2013/01/15(火) 01:58:49.47
そうだね
22 :
デフォルトの名無しさん :2013/01/15(火) 02:03:58.90
シンプルな2chブラウザ、オープンソースで
ルービックキューブ
24 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/01/24(木) 07:17:48.62
こっちのスレは初心者向けということでいいな? ○×ゲーム
組み込み系はやったことないから分からん
お金はCompositeパターンか
28 :
25 :2013/01/26(土) 21:51:10.27
今改めて見るとBufferedReaderクローズし忘れてました。短いソースなんで問題ないと思うけど。
というか、お題を読む限りGUIで作れって方針ぽいですね。
>>24 AIの方針ってどうすればいいですかね?
プレイヤーが負けか引き分けのみってのもどうかなと考えています。
商品の在庫管理は必須だろjk
○×ゲーム難しい・・・
31 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/01/27(日) 07:06:31.50
ヒント。if ((a[0][0]=='O' && a[0][1]=='O' && a[0][2]=='O') || ...) {Oの勝ち}
それヒントじゃなくてただのマルバツゲームのルールじゃん。 アルゴリズムじゃない。ただのルール。 AI考える上でどういう思考パターンにすべきかって質問でしょ?
>>31 まさかこんな人が業務用プログラムを組んでるって事はないだろうな...(心配)
>>31 勝利判定するのに8通りもダラダラこんな記述するなんてスマートじゃないよね
×も考慮したら16通りも記述しないといけないし良い方法ないかな
・盤面をa[3][3]じゃなくてa[9]としてアクセス ・あらかじめ作った勝利パターンの9bit値群とand取る
インデックスをベタ書きで配列化しておくのも ifを8通り記述するのも ハードコーディングしてる点では同じだわな インデックスのパターンを予めループで生成するのも 直接ループで判定するのも大して変わらない気もする
>>37 どっちもべた書きしたほうがマシだな
ボードの大きさが変わるなら話は変わるけど
ボードの大きさが変わる。。。 チップサイズとrowsとcolsからwidth、heightを定義すればguiはいけそうだ サイズ変わってもAIが機能するってのは少々難しそうですな
>>37 2つ目は、board[][] がメモリ上で連続した配列である必要があるけど、boardを不連続にする必要は
特にないし、どちらの勝利判定もボードサイズやプレイヤ数(○×に加えて△とか♪とか)の変化に
対応できるね。
41 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/01/29(火) 22:10:41.57
バカにも分かるようにヒント出したのだが。○×はみんなできたな? 次のお題。ペット育成ゲーム
重大なヒント出したと思ってる馬鹿が何か言ってるが
43 :
デフォルトの名無しさん :2013/01/29(火) 22:18:51.47
たまごっちみたいな?
44 :
デフォルトの名無しさん :2013/01/29(火) 22:44:28.49
>>42 馬鹿と言われて悔しいならお題を解いてみろ
46 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/01/29(火) 23:15:33.30
ヒント:ペット育成ゲームの作り方でググれ
47 :
デフォルトの名無しさん :2013/03/09(土) 14:39:09.28
○×ゲームのプログラムまだか
パスワードジェネレーターつくったった from random import sample import string LENGTH = 16 arrowed_letters = string.letters + string.digits + '_' print ''.join(sample(arrowed_letters, LENGTH))
49 :
デフォルトの名無しさん :2013/04/21(日) 19:59:21.43
test
51 :
デフォルトの名無しさん :2013/08/11(日) 21:05:42.60
どう書くorgがエラーで放置とか恥ずかしいからどうにかしろ
52 :
デフォルトの名無しさん :2013/08/13(火) 23:58:49.23
お題:nの階乗の末尾の連続した0の個数を求める。
>>53 dc
?[5/dd0<a+]dsaxp
100!→24個
>>53 Squeak Smalltalk 。思考停止系で
(n factorial asString reversed findFirst: [:chr | chr ~= $0]) - 1
56 :
デフォルトの名無しさん :2013/11/22(金) 23:26:46.34
>>53 common lisp
(defun fact-zero (x)
(let ((retval 0) (dim 1) (d 0))
(loop (if (equal (setf d (floor x (expt 5 dim))) 0)
(return retval))
(incf retval d) (incf dim))))
(fact-zero 100) -> 24
>>53 Io
f := method(n,
r:=0
for(i, 1, n log(5) floor, r = r + (n / (5 ** i)) floor)
)
Io> f(100)
==> 24
Io> f(12345678)
==> 3086416
>>53 Clojure
(->> n bigint inc (range 1N) (reduce *) str (re-find #"0*$") count)
>>53 java/C/C++
int f(int n){
int z,i,t;
for(z=0,i=5;(t=n/i)>0;i*=5,z+=t);
return z;
}
>>53 Lua
function f(n)
r=0
while n>0 do
n=math.floor(n/5)
r=r+n
end
return r
end
> =f(100)
24
>> 53 Haskell import Numeric import Data.Char main = print $ f 100 f n = (`div` 4) $ (n -) $ sum $ map digitToInt $ showIntAtBase 5 intToDigit n "" 24
>>53 @Mathematica
tailZerosInFactorial[n_]:=Factorial[n]//
IntegerDigits//
Reverse//
TakeWhile[#,#==0&]&//
Length;
In := tailZerosInFactorial[100]
Out = 24
>>53 python3
def f(n):
i = 0
#xs = range(1, n+1)
len_xs = n
while len_xs > 0:
#xs = map(lambda x: x / 5, filter(lambda x: x % 5 == 0, xs))
len_xs //= 5
i += len_xs
return i
print(f(100))
|番兵|__ ( ・ω・) <ステンバーイ ○={=}〇, |:::::::::\, ', ´ 、、、、し 、、、(((.@)
>>53 HSP
n=25
mes fact_zero(n)
stop
#defcfunc fact_zero int x
if x<5 : return 0
return x/5+fact_zero(x/5)
>>53 J
f=:3 :'+/5=,q:>:i.y'
f 100
24
>>62 の真似
(%&4@- [:+/5#.inv]) 1234567
308638
お題:文字列をランダムに並べ替える。 ただし、どの文字も元と同じ位置ではないこと。
>>68 極端な例だけど aaaaa とかどうするの?
>>69 なるほど。たにかに、並べ替えても見た目は同じになってしまいますね。
結果として見た目が同じでも、ちゃんと並べ替えの操作がおこなわれていれば
okとしましょう。
>>68 Squeak Smalltalk
| string shuffled |
string := 'abc'.
string size < 2 ifTrue: [^string].
[ shuffled := (1 to: string size) asArray shuffled.
shuffled noneSatisfy: [:each | (shuffled indexOf: each) = each]
] whileFalse.
^shuffled inject: '' into: [:acc :idx | acc, (string at: idx)] "=> 'cab' "
>>68 @Mathematica
randomizeString[str_]:=Module[{checkPair,regulatedRandomNumber,char,len},
checkPair[lst1_,lst2_]:=MapThread[List,{lst1,lst2}]//
Map[Not[#[[1]]==#[[2]]]&,#]&//
Apply[And,#]&;
regulatedRandomNumber[n_]:=Module[{rn},
rn=RandomChoice[Permutations[Range[n]]];
If[checkPair[Range[n],rn],
rn,
regulatedRandomNumber[n]]
];
char=Characters[str];
len=char//
Length;
regulatedRandomNumber[len]//
MapThread[List,{#,char}]&//
Map[#[[1]]->#[[2]]&,#]&//
ReplacePart[char,#]&//
StringJoin
];
In : = randomizeString["abc"]
Out = bac
お題: 00:00〜23:59までのデジタル時計のゾロ目を羅列せよ。表示形式は問わない。
>>72 げ、shuffle関数ってムーブするんか。ワザワザ選んで使ったというのに。
std::random_shuffleというベタな関数があるのでそっちに置き換えてください。
何が言いたいのかよくわからんがrandom_shuffleよりshuffleを積極的に使っていった方がいい
>>74 @Mathematica
pickRepdigit[]:=Module[{repdigitQ},
repdigitQ[str_]:=Module[{char},
char=Characters[str];
char[[1]]==char[[2]]==char[[4]]==char[[5]]
];
Table[DatePlus[{2000,1,1,0,0},{i,"Minute"}],{i,0,24*60-1}]//
Map[DateString[#,{"Hour",":","Minute"}]&,#]&//
Select[#,repdigitQ]&
];
In := pickRepdigit[]
Out = {"00:00", "11:11", "22:22"}
79 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/11/23(土) 21:06:56.85
>>68 #include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
void shuf(char *first, char *last) {
for (char *p = first + 1; p != last; ++p) {
int m = p - first;
int n = rand() % m;
swap(*p, *(first + n));
}
}
int main(void) { char buf[256];
cout << "input: "; cin.getline(buf, 256);
shuf(buf, buf + strlen(buf));
cout << buf << endl;
return 0; }
>>76 いや、ランダムオブジェクトをムーブしちゃうんで二周目エラーになるんじゃないかなーと。
>>78 いや、お察しの通り俺の出題が曖昧でした。
狙いはまさにそれですw
>>68 java
import java.util.Random;
public class Test{
void shuffle(char[] s,Random r){
for(int i=s.length-1;i>0;i--){
int j=r.nextInt(i);
char exchange=s[i];
s[i]=s[j];
s[j]=exchange;
}
}
public static void main(String args) {
Test t=new Test();
char[] abc="abcdefg".toCharArray();
Random r=new Random();
t.shuffle(abc,r);
System.out.println(abc);
}
}
83 :
82 :2013/11/23(土) 21:15:01.31
すんませんバグありましたString args →String[] args
>>74 Squeak Smalltalk
('00:00' asTime asSeconds to: '23:59' asTime asSeconds by: 1 minute asSeconds)
collect: [:secs | (Time fromSeconds: secs) print24 first: 5]
thenSelect: [:print24first5 | print24first5 asSet size = 2]
"=> #('00:00' '11:11' '22:22') "
>>74 Clojure
手抜き
(map #(format "%d%d:%d%d" % % % %) (range 3))
>>88 え、そうなの?なんか引数に&&ついてたからてっきり・・・。
このへんの仕様はまだよくわかってないんだよね。勉強不足ぅ〜。
検証ありがとう。
>>81 Squeak Smalltalk
('00:00' asTime asSeconds to: '23:59' asTime asSeconds by: 1 minute asSeconds)
collect: [:secs | (Time fromSeconds: secs) print24 first: 5]
thenSelect: [:print24first5 |
(print24first5 first = $0
ifTrue: [print24first5 allButFirst]
ifFalse: [print24first5]
) asSet size = 2]
"=> #('00:00' '01:11' '02:22' '03:33' '04:44' '05:55' '11:11' '22:22') "
91 :
77 :2013/11/23(土) 21:31:27.56
>>74 ,78,81
@Mathematica
pickRepdigit[]:=Module[{repdigitQ},
repdigitQ[str_]:=Module[{char},
char=Characters[str];
Which[
Length[char]==4,char[[1]]==char[[3]]==char[[4]],
Length[char]==5,char[[1]]==char[[2]]==char[[4]]==char[[5]],
True,{}]
];
Table[DatePlus[{2000,1,1,0,0},{i,"Minute"}],{i,0,24*60-1}]//
Map[DateString[#,{"HourShort",":","Minute"}]&,#]&//
Select[#,repdigitQ]&
];
In := pickRepdigit[]
Out := {"0:00", "1:11", "2:22", "3:33", "4:44", "5:55", "11:11", "22:22"}
やっぱ出題者は自分で書いたのをideone.comとかの出力付きでまず出すべきだよ。
なんか宿題やってる感あるよなー。
コードはなくとも入力出力例は欲しい
コードも欲しい。宿題やらされ、むちゃぶり、齟齬が防げる。
>>93 ドラえもんに頼っているのび太君はフィクションでは科学者になったが、
実際は多分ダメ人間になってしまうと思う。
原作じゃ科学者になってないしな
答え(出力)の例を書いてもらうのが良いと思う。 前スレのタイル塗り問題の時みたいに。 解答も大事だけど、どちらかというとコードを書く方が主旨だから、 出題と同時に答えを書いても問題ないと思うんだけど。 言語指定があると宿題感が強いけど、 フリースタイルだからまだ良いかなと思う。
>>96 アレはドラえもんが壊れたから科学者になれたんだよ。ちゃんと乳離れできたって意味で。
まー、宿題をこんなところでやってるようじゃ社会人になってからPGとしては産廃だろうね。
それを容認するのかどうか。でも個人的にはあんまりいい感じはしないね。
100 :
デフォルトの名無しさん :2013/11/23(土) 21:49:43.03
のび太君は田代みたいにお風呂のノゾキ魔になって最終的に薬物中毒で投獄されるだろう。
>>68 HSP
s="hoge"
l=strlen(s)
repeat l-1
r=rnd(l-1-cnt)+cnt+1
a=peek(s, cnt)
b=peek(s, r)
poke s, cnt, b
poke s, r, a
loop
mes s
102 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/11/23(土) 22:28:17.18
お題:ローマ数字電卓を作れ。入力する数字は半角のみとする。 ? I+IV V ? II+II IV
103 :
74 :2013/11/23(土) 22:29:32.28
>>92 $ ruby -v -e "('00'..'23').each {|hh| ('00'..'59').each {|mm| puts hh + ':' + mm if /0(\d)\1\1|(\d)\2\2\2/ =~ hh + mm}}"
ruby 1.8.6
00:00
01:11
02:22
03:33
04:44
05:55
11:11
22:22
お題:アナログ時計の長針と短針が重なる時刻を求めよ。
お題:厚さ0.7mmの紙を百回折ると厚さは最大でどのくらいになるか?
106 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/11/23(土) 23:09:27.34
お題:鏡に写ったアナログ時計の時刻から元の時刻を求めるプログラム。 ? 11:00 01:00
お題:「Merry Christmas」と表示するだけのプログラム。
お題:以下のそれぞれの当たり判定を行う関数。 (1)円と円。中心と半径が与えられる。 (2)線分と線分。端点座標が与えられる。 (3)点と三角形。点は位置座標が、三角形は頂点座標が与えられる。
片山博文MZコスモとやらがうざいんだが、みんな非表示にしてるの?
追記:(4)円と線分 (5)円と三角形 (6)点と多角形
>>68 (defun str-random (s)
(let ((retval (copy-seq s)) (num (length s)) buf pos)
(dotimes (i (1- num))
(setf pos (+ i (random (- num i)))
buf (elt retval i)
(elt retval i) (elt retval pos)
(elt retval pos) buf))
retval))
(str-random "12345") -> "31254"
書き忘れたけど、
>>112 の言語はcommon lispね
このスレはクールダウンが必要だ。
>>99 の言い分が強すぎた。
>>99 をやっつけろー。
>>108 == trueと? true : falseはいらない
>>115 採点ありがとう。後者はたしかにいらないね。
前者はマイルールでワザとやってるんだけど一般的じゃないのかなぁ。
true比較なんて完全に可読性の好みでしかないからリーダブルコーディングスレあたりでやればいいんでね
>>102 手元のruby v1.8.6で確認。肝心のローマ数字→整数処理はどっかのサイトを参考にした。ほぼ丸パク。
def rcs2i(rcs)
c2i = {'M' => 1000, 'D' => 500, 'C' => 100, 'L' => 50, 'X' => 10, 'V' => 5, 'I' => 1}
maxn = 0
rcs.upcase.reverse.scan(/./).inject(0) {|sum, c|
n = c2i[c]
if n >= maxn
maxn = n
sum += n
else
sum -= n
end
}
end
def roman2arabic(roman)
return roman.gsub(/([IVXLCDM]+)/) { rcs2i($1).to_s }
end
def f102(roman)
arabic = roman2arabic(roman)
puts roman
puts '=' + arabic
puts '=' + eval(arabic).to_s
end
f102("XXIV+XI")
120 :
118 :2013/11/24(日) 01:26:26.77
あら?よく読んだら結果もローマ数字表記か(ヽ´ω`)
>>102 Squeak Smalltalk
| exp ops tokens |
exp := 'I+IV'.
ops := '+-*/()'.
tokens := (exp findTokens: ops keep: ops) collect: [:tok |
(tok noneSatisfy: #isLetter) ifTrue: [tok] ifFalse: [tok romanNumber asString]].
tokens replaceAll: '/' with: '//'.
(Compiler evaluate: tokens asStringWithCr) printStringRoman "=> 'V' "
122 :
sage :2013/11/24(日) 03:37:13.70
>>112 「どの文字も元と同じ位置ではないこと」という条件を満たせていないみたい。
テストを書いてみました。
ideone.com/zJYz7K
>>119 bool isA();
bool isB();
だったとして、
bool isC() {return isA() == true && isB() == true;}
とか書いちゃうの?w
んで、
bool isD() {return isC() == true;}
とか際限なく書くとかww
元を糺せば、このiD()のisC()呼び出しをインラインに展開したとして
bool isD() {return (isA() == true && isB() == true) == true;}
のような意味のないことをやっているのが分からんのかな。
そんなに自信がないならいっそ、isA() == true == true == true == true == true 位書いておけばいいんじゃね?w
可読性とか好みの話だったのに意味とか自信とか言い出す辺り日本語の読解力に難があると見える
>>122 ご指摘ありがとうございます。入れ替える数値がずれてました。
(defun str-random (s)
(let ((retval (copy-seq s)) (num (length s)) buf pos)
(dotimes (i (1- num))
(setf pos (+ 1 i (random (- num i 1)))
buf (elt retval i)
(elt retval i) (elt retval pos)
(elt retval pos) buf))
retval))
>>106 C
#include <stdio.h>
#include <stdlib.h>
int main()
{
int h, m;
scanf("%d:%d", &h, &m);//11:00
h = abs(h - 12) % 12;
m = abs(m - 60) % 12;
printf("%s%d:%s%d", (h / 10 == 0) ? "0" : "", h, (m / 10 == 0) ? "0" : "", m);// 01:00
return 0;
}
>>126 不正解。2:30→9:30とならなければいけない。
%s%dの代わりに%02d使えよ
129 :
128 :2013/11/24(日) 10:10:57.56
ああ、理解しました。すんません
よくわかる解説: 2:10は2:00から10分進んでいる。 時計の針が進むと鏡の世界では針が戻ったように見える。 2:10は鏡の世界では10:00から10分戻ったように見える。
>>106 J
f =: 12 60 & ([ #: 720 - #.)
f 11 0
1 0
f 9 30
2 30
f 9 23
2 37
>>104 J
12 60 60 #:(i.11)*12*60*60%11
0 0 0
1 5 27.2727
2 10 54.5455
3 16 21.8182
4 21 49.0909
5 27 16.3636
6 32 43.6364
7 38 10.9091
8 43 38.1818
9 49 5.45455
10 54 32.7273
>>108 は不正解。
>>104 のよくわかる解説:
0:00から1時間経つと1:00になる。
この間、長針は一回転し、短針は1/12だけ進む。
よって長針と短針の相対角速度は360*11÷12度/時となる。
0:00から相対角変位が360になるたびに長針と短針が重なる。
>>106 common lisp
(defun rev-clock(h m)
(let ((ah (floor (/ (- 2 (+ (* h 1/6) (/ m 360))) 1/6)))
(am (- 60 m)))
(if (eql am 60) (setf am 0))
(format t "~2,'0D:~2,'0D" ah am)))
(rev-clock 2 30) -> 09:30
>> 104 common lisp 分以下の端数は四捨五入するとして (defun clock-cross () (dotimes (i 11) (format t "~2,'0D:~2,'0D~%" i (round (float (* (/ i 11) 60)))))) (clock-cross) -> 00:00 01:05 02:11 03:16 04:22 05:27 06:33 07:38 08:44 09:49 10:55
>>133 で、そうなる時刻で秒単位で割り切れるのは0:00以外にはない。
お題:自分の身長と体重から地球の重さを概算するプログラム
それコーディングの問題なの?
お題:A0サイズの用紙の面積は1uである。辺の比は1:√2である。 B0サイズの用紙の長辺はA0の対角線の長さであり、短辺はA1の対角線の長さである。 A、Bに続く数字が大きくなるたびに用紙の面積は半分になる。 A0からA10、B0からB10の用紙サイズをmm単位で求める。
IQ問題集からしょうもない問題もってきてるだけだろw
>>142 | x delta | Squeak Smalltalk 。Aだけ
x := 1.
[(delta := -2 * x * x + 1 * x / 2) abs > (1/1e1000)] whileTrue: [x := x + delta].
^x * 2s1000
>>139 の関連
C0〜C10
…
Z0〜Z10
も求めっろ
スモールトーク知らないけど、STDOUTにprint文当たりで出力すればいいんじゃないかな。
>>145 ideone には対応してないんで、出力はっとく。
1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727
3501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147
0109559971605970274534596862014728517418640889198609552329230484308714321450839762603627995251407989
6872533965463318088296406206152583523950547457502877599617298355752203375318570113543746034084988471
6038689997069900481503054402779031645424782306849293691862158057846311159666871301301561856898723723
5288509264861249497715421833420428568606014682472077143585487415565706967765372022648544701585880162
0758474922657226002085584466521458398893944370926591800311388246468157082630100594858704003186480342
1948972782906410450726368813137398552561173220402450912277002269411275736272804957381089675040183698
6836845072579936472906076299694138047565482372899718032680247442062926912485905218100445984215059112
0249441341728531478105803603371077309182869314710171111683916581726889419758716582152128229518488472s1000
>>142 common lisp
(defun multi-sqrt (x num)
(let* ((base x) (int (floor (sqrt x)))(sq int))
(loop (if (and (<= (* sq sq) base)
(<= base (* (1+ sq) (1+ sq))))
(progn
(when (< (expt 10 num) sq)(return))
(setf sq (* sq 10) base (* base 100)))
(incf sq)))
(format t "~D.~A" int
(subseq (write-to-string sq)
(length (write-to-string int))))))
1. (multi-sqrt 2 10) -> 1.4142135620
2. (multi-sqrt 2 1000) -> 1.414213562373095048801688724209698078...8229518488472
>>149 1.の結果張り間違えた。
1. (multi-sqrt 2 10) -> 1.4142135623
>>148 こちらでもいろいろと試してみたんですが、この ideone で使われている
GNU Smalltalk って Smalltalk 処理系は、どうも駄目な子らしくて、
今回の Squeak Smalltalk のコードはまともに動かせられないみたいです。
>>151 なるほど。それは余計なことしてしまったね。
しかし、多倍長演算羨ましいなー。
C++はいま策定中だからね。
>>142 bc
scale=10; sqrt(2)
1.4142135623
scale=1000; sqrt(2)
1.414213562373095048801688724209698078569671875376948073176679737990\
...
71111683916581726889419758716582152128229518488472
もう授業では開平法を習わないのかな?
>>139 Io
f := method(
g := method(n, (n + 0.2) floor)
for(i, 0, 10,
writeln("[A", i, " ", g(c), " ", g(2 sqrt * c),
"] [B", i, " ", g((3 / 2) sqrt * c), " ", g(3 sqrt * c), "]")
)
)
Io> f
[A0 841 1189] [B0 1030 1456]
[A1 594 841] [B1 728 1030]
[A2 420 594] [B2 515 728]
[A3 297 420] [B3 364 515]
[A4 210 297] [B4 257 364]
[A5 148 210] [B5 182 257]
[A6 105 148] [B6 128 182]
[A7 74 105] [B7 91 128]
[A8 52 74] [B8 64 91]
[A9 37 52] [B9 45 64]
[A10 26 37] [B10 32 45]
間違えました。訂正します。
>>155 >>139 Io
f := method(
g := method(n, (n + 0.2) floor)
for(i, 0, 10,
c := 2 ** (- 1 / 4 - i / 2) * 1000
writeln("[A", i, " ", g(c), " ", g(2 sqrt * c),
"] [B", i, " ", g((3 / 2) sqrt * c), " ", g(3 sqrt * c), "]")
)
)
>>139 ttp://ideone.com/5EMGUD --
[A0:841 1189], [B0:1030 1456]
[A1:594 841], [B1:728 1030]
[A2:420 594], [B2:515 728]
[A3:297 420], [B3:364 515]
[A4:210 297], [B4:257 364]
[A5:148 210], [B5:182 257]
[A6:105 148], [B6:128 182]
[A7:74 105], [B7:91 128]
[A8:52 74], [B8:64 91]
[A9:37 52], [B9:45 64]
[A10:26 37], [B10:32 45]
>>139 Squeak Smalltalk
| size next seriesA seriesB |
size := 1000 / 2 sqrt sqrt.
next := [:n | size := size * 2 sqrt / 2].
seriesA := {size := (1@2 sqrt) * size}, ((1 to: 10) collect: next).
seriesB := {size := seriesA second r @ seriesA first r}, ((1 to: 10) collect: next).
^(seriesA, seriesB + 0.2) floor
=> {
841@1189 . 594@841 . 420@594 . 297@420 . 210@297 . 148@210 . 105@148 . 74@105 . 52@74 . 37@52 . 26@37 .
1030@1456 . 728@1030 . 515@728 . 364@515 . 257@364 . 182@257 . 128@182 . 91@128 . 64@91 . 45@64 . 32@45}
お題:値が奇数のデータだけ昇順にソートする。 例 37,61,86,9,81,50 -> 9,37,86,61,81,50
>>159 Haskell
{-# LANGUAGE TupleSections #-}
import Control.Monad
import Data.List
f xs = fst $ foldr g ([], reverse $ sort $ filter odd xs) $ map (mfilter even . Just) xs
g x (r, yys@(y:ys)) = maybe (y : r, ys) ((, yys) . (: r)) x
g _ (r, _) = (r, [])
>>159 @Mathematica
sortOdd[lst_]:=Module[{even,odd,sortedodd},
{even,odd}=lst//
MapIndexed[{#1,#2[[1]]}&,#]&//
{Select[#,EvenQ[#[[1]]]&],Select[#,OddQ[#[[1]]]&]}&;
sortedodd=odd//
{Map[#[[1]]&,#],Map[#[[2]]&,#]}&//
Map[Sort,#]&//
MapThread[List,#]&;
{even,sortedodd}//
Flatten[#,1]&//
Sort[#,#1[[2]]<#2[[2]]&]&//
Map[#[[1]]&,#]&
];
In := sortOdd[{37,61,86,9,81,50}]
Out = {9,37,86,61,81,50}
>>159 Squeak Smalltalk
| data evens odds |
data := #(37 61 86 9 81 50).
evens := (data select: #even) readStream.
odds := (data select: #odd) sort readStream.
^data collect: [:each | each odd ifTrue: [odds next] ifFalse: [evens next]]
=> #(9 37 86 61 81 50)
>>159 ruby 1.8.6
a = [37,61,86,9,81,50]
odds = a.dup.reject!{|n| n % 2 == 1}
p a.sort.map {|n| n % 2 == 1 ? n : odds.shift}
164 :
163 :2013/11/26(火) 20:17:40.94
アッw 変数名w
たとえば [5,4,4,3,2,1] でできる?
168 :
160 :2013/11/26(火) 21:22:51.19
>>159 Haskell
訂正
{-# LANGUAGE TupleSections #-}
import Control.Monad
import Data.List
main = print $ f [4,8,18,10,2,6]
f xs = fst $ foldr g ([], reverse $ sort $ filter odd xs) $ map (mfilter even . Just) xs
where
g x (r, yys@(y:ys)) = maybe (y : r, ys) ((, yys) . (: r)) x
g (Just x) (r, []) = (x : r, [])
>>159 ; Common Lisp
(loop with r
with l = '(37 61 86 9 81 50)
with odds = (sort (remove-if #'evenp l) #'<)
for i in l
do (push (if (oddp i) (pop odds) i) r)
finally (return (nreverse r)))
>>166 ruby 1.8.6 デバッグついでにちょっと整理しといた
a, eos = [5,4,4,3,2,1], [[], []]
a.each {|n| eos[n % 2] << n}
eos[1].sort!
p a
p a.map {|n| eos[n % 2].shift}
>>159 Squeak Smalltalk 別解。
>>170 をヒントに。
| buffer |
buffer := {SortedCollection new. OrderedCollection new}.
^#(5 4 4 4 3 2 1)
do: [:x | (buffer atWrap: x) add: x];
collect: [:x | (buffer atWrap: x) removeFirst]
=> #(1 4 4 4 3 2 5)
>>159 J
( /:~@:{`[`]}~ [:I.2|]) 37 61 86 9 81 50
9 37 86 61 81 50
173 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/11/26(火) 23:01:30.11
お題:あるCUIプログラムの標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する。
>>173 Io
File standardInput foreach(asCharacter do(if(isLowercase,asUppercase, ..)print))
>>173 ; Common Lisp
(loop do (write-char (char-upcase (read-char))))
>>173 C言語ってこれでいいんだっけ?
#include <stdio.h>
#include <ctype.h>
int main(){
int ch = EOF;
while ((ch = getchar()) != EOF){
ch = toupper(ch);
putc(ch, stdout);
}
return 0;
}
>>159 c
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
int main() {
int a[] = {37,61,86,9,81,50}, *oes = malloc(sizeof a);
int i, *o, *e, len = sizeof a / sizeof *a;
for (i = 0; i < len; i++) printf("%2d ", a[i]); puts("");
for (i = 0, o = oes, e = oes + len - 1; i < len; i++) {
a[i] % 2 ? (*o++ = a[i]) : (*e-- = a[i]);
}
qsort(oes, o - oes, sizeof (int), cmp);
for (i = 0, o = oes, e = oes + len - 1; i < len; i++) {
printf("%2d ", a[i] % 2 ? *o++ : *e--);
}
return 0;
}
>>173 Io
File standardInput foreach(asCharacter asUppercase print)
小文字かどうかのチェックはいらなかった
>>159 Clojure
ideone.com/g6IkwE
再帰に手を出すと敗北感が
>>173 Squeak Smalltalk
| process |
process := (Smalltalk at: #OSProcess) thisOSProcess.
[process stdOut nextPut: process stdIn next asUppercase] repeat
182 :
デフォルトの名無しさん :2013/11/27(水) 04:55:26.05
僕はジャーヴァのプログラマです いいですか int main() { while(1) { static const char wwwwwww[] = "wwwwwwwwww"; char* java = new char[9999999]; } }
|._番兵|._ ( ・ω・) んもー ○={=}〇, |:::::::::\, ', ´ガリガリガリガリ 、、、、し 、、、(((.@)wwwww[] = "wwwwwwwwww";
>>173 perl -pe 'tr/a-z/A-Z/'
>>159 R
a <- c(37,61,86,9,81,50)
b <- a %% 2 == 1
a[b] <- sort(a[b])
cat(a)
9 37 86 61 81 50
>>176 はEOFを受け取ったときエラー。
(ただし sbcl --script FILE だとなぜか正常終了)。
あと、
>>176 や
>>177 は「一文字ずつ読み込んで一文字ずつ出力」を意図してい
るのだろうけれど、そうだとすると不十分。改行が来るまで何も表示されない。
(他の言語は知らないので未確認。CLはSBCLで確認。CLISP、Clozure CLではす
ぐに出力された)。
確認用の入力生成スクリプト(test173.bash):
#!/bin/bash
input=(H e l l o , ' ' w o r l d !);
for c in "${input[@]}"; do printf '%s' "$c"; sleep 0.3; done;
echo
使用例:
$ bash test173.bash | sbcl --script upcase-stdin.lisp
>> 173 import System.Exit import System.IO import Control.Monad import Data.Char main :: IO () main = forever $ hIsEOF stdin >>= flip when exitSuccess >> ((>>) (hFlush stdout) . putChar =<< fmap toUpper getChar) bash test173.bash | ./upperstdin HELLO, WORLD!
>>173 Haskell 訂正
import System.Exit
import System.IO
import Control.Monad
import Data.Char
main :: IO ()
main = forever $ hIsEOF stdin >>= flip when exitSuccess >> ((>> hFlush stdout) . putChar =<< fmap toUpper getChar)
bash test173.bash | ./upperstdin
HELLO, WORLD!
>>173 GNU sed version 4.1.5
echo katayama | sed 's/\(.*\)/\U\1/'
GNU Awk 3.1.6
echo katayama | awk '{ print toupper($0) }'
tr (GNU coreutils) 6.10
echo katayama | tr a-z A-Z
>>189 入力から改行を取除いてしまうバグが入ってるよ。
あと、もし
>>186 で指摘した件(一文字ずつ逐次表示されない)の「訂正」という
のならばそれは解決していないけれど、単に一文字ずつの入出力をやめて行毎
の入出力に仕様変更したってこと?
「標準入力から一文字ずつ読み込んで、大文字化して、それを直ぐに表示」と
いう仕様でよければ、
>>177 の putc(ch, stdout); の後に fflush(stdout); を
書き足すだけで良いと思う。
>>189 それから、なぜかEOFを削除しようとしてるみたいだけど、
>>186 の「EOFを受け
取ったときエラー」ってのは
>>176 (Common Cisp)のことで、
>>177 (C)とは関係
ないよ。そういう処理は不要。
そもそも
>>186 の言い方がまずかったか。あれで誤解させたかもしれない。
正しくは「(
>>176 は)ストリームが終端に達したときEOFエラーを生ずる」です。
>>186 の言い方だと「EOF *文字* を受け取ったらエラー」だと思うわな、普通。
>>193 参考:
d.hatena.ne.jp/katona/20070802/p4
> EOFは文脈によって3つの意味がある
> 1)EOFマクロ(#define EOF)
> 2)ファイルの終端(End Of File)
> 3)MS-DOSファイルのEOFコード
>>186 で言いたかったのは 2) の「EOF」。
>>192-194 ご指摘ありがとう。
元々の問題が標準入力から少量のバッファに読みながら出力という問題なので、
別にバッファの数が1でも1024でも少量だろうという話です。
改行を削除してるのは俺のミスです。いや、Stdinが改行見ないとバッファリングやめないのでもしかして必要ないかなー??
と思った次第です。完全に目算違いでした。
テキストファイル突っ込んだ時のこと失念してました。コンソールで開発してたもんで邪魔に見えました。
同様にgetcharの仕様って\n取らないとバッファリングとブロッキングやめないと思うのでgetcharの出番は無いと思います。
昔からブロッキングのないgetcharがあったらゲーム開発もはかどったんだと思うんですがねぇ。fgetsはブロッキングしないはずです。
ちなみにウインドウズですがハローワールドのプログラムをeof付きでパイプしてみたんですよ。
そしたら、コンソールに-1がゴミとして現れましてねそれを削除しています。
今思ったらputchでEOF出力してもEOF変換サれてない気がします。
言い訳が長くなりました。すみません。
ちょっとこれから多少実験してみます。
http://ideone.com/cioPLo 懺悔タイムです。
全力でごめんなさい。色々認識不足でした。
そもそも、パイプの場合stdinに文字列が詰まってるのでgetcharはブロッキングしませんね。完全に勘違いしてました。
というわけで、
>>192-194 はご指摘ありがとう。そして、ごめんなさい。
それと、EOFの処理はいらなかったですね。
で、なんだかんだで2種類出来上がってしまいました。
ちょうどいいのでもっと罵ってくだしあ!!!!!!Orz
あれ?もしかして、ブロッキングするのって、関数の仕様じゃなくてstdinの仕様? 俺、余計なことしてコケるタイプだな。
お題:チャンパーノウン定数を表示せよ。 表示された文字列中に"991"を一つだけ含むこと。
>>198 はC言語では大変なので今日はこのへんで。
皆様おやすみなさい!
>>198 ; Common Lisp
(loop for i upfrom 1
for s = (princ-to-string i)
for champernowne = (concatenate 'string "0." s) then (concatenate 'string champernowne s)
until (search "991" champernowne
:test #'equal
:start2 (- (length champernowne) (length s) 2))
finally (print champernowne))
>>198 Squeak Smalltalk
| digits |
digits := String new.
1 to: Float infinity do: [:n |
digits := digits, n asString.
(digits includesSubString: '991') ifTrue: [^'0.', digits]]
>>200 なん・・・だと・・・。俺のパターン認識甘すぎ。
>>198 Clojure
(->> (iterate inc 1) (map #(->> % range rest (apply str))) (filter #(re-find #"991" %)) first (str "0."))
205 :
デフォルトの名無しさん :2013/11/28(木) 01:15:39.22
Lispのコンパイラの導入方法がいまいちわからんのだが誰か教えてエロい人
CommonLisp?
207 :
デフォルトの名無しさん :2013/11/28(木) 01:27:53.82
208 :
デフォルトの名無しさん :2013/11/28(木) 01:31:29.78
あ、スレチかな?
>>208 【入門】Common Lisp その10【質問よろず】
toro.2ch.net/test/read.cgi/tech/1361341876/
>>198 sh
s= i=1; while echo $s | grep -qv 991; do s=$s$i; i=`expr $i + 1`; done; echo 0.$s
211 :
デフォルトの名無しさん :2013/11/28(木) 01:48:11.36
>>198 Prolog
'お題:チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。' :-
'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(1,'0.').
'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N,A) :-
count(sub_atom(A,_,3,_,'991'),2),!,fail.
'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N,A) :-
atom_number(B,N),
atom_concat(A,B,C),
'表示された文字列中に"991"を一つだけ含むこと。'(N,C).
'表示された文字列中に"991"を一つだけ含むこと。'(N,_チャンパーノウン定数) :-
'文字列中に"991"を一つだけ含むこと。'(_チャンパーノウン定数),
writef('%t\n',[_チャンパーノウン定数]).
'表示された文字列中に"991"を一つだけ含むこと。'(N,C) :-
N_2 is N + 1,
チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N_2,C,_チャンパーノウン定数).
'文字列中に"991"を一つだけ含むこと。'(_チャンパーノウン定数) :-
count(sub_atom(_チャンパーノウン定数,_,3,_,'991'),1).
count(P,N) :- findall(1,P,L),length(L,Count).
213 :
212 :2013/11/28(木) 07:07:05.55
>>198 4行目の末尾に改行が入ってしまった。これは改行なしで '(1,'0.1'). と
続かなくてはいけない。下の方にもう一箇所似たような誤りがある。
>>198 Haskell
main = putStrLn $ "0." ++ (show $ f 1000)
f :: Integer -> Integer
f 0 = 0
f n = 10 ^ (floor $ logBase 10 (fromIntegral n) + 1) * (f (n - 1)) + n
>>198 Haskell ミスった
main = putStrLn $ "0." ++ (show $ f 100)
f :: Integer -> Integer
f 0 = 0
f n = 10 ^ (floor $ logBase 10 (fromIntegral n) + 1) * (f (n - 1)) + n
>>198 HSP
result="0."
repeat ,1
result+=str(cnt)
q=instr(result, p, "991")
if q>=0 {
count++
if count>=2 {
poke result, p+q+2, 0
break
}
p+=q+1
}
loop
mes result
217 :
198 :2013/11/28(木) 19:59:52.93
$ ruby -v -e "puts '0.'+(1..100).to_a.join"
ruby 1.8.6
0.123456789101112131415161718192021222324252627282930313233343536373839404142434
44546474849505152535455565758596061626364656667686970717273747576777879808182838
4858687888990919293949596979899100
解説:
任意精度のライブラリの使用と、"991"の検出は不要。
この二つは引っ掛けのつもりなので笑って許していただきたい。
どの言語でも簡単に書けて、出力結果も長くならないようにした。
その点でまんまと引っかかってくれた
>>199 さんはMVP。
あっさり両方突破した
>>200 がネタバレのようにもなってしまったので、
それ以降のひとは多分あえて"991"の検索を入れて趣向を凝らしてみてくれたと判断。
みんなが文字列を前提にしてる中での
>>214 さんの活躍も光る。
Haskellまったく読めないが、見事に演算でアプローチしている。多分。
>>217 ???
出力には "991" が1回含まれているのが条件なだけだから
許容範囲は広いんじゃないの?
チャンパーウノンの定理で最初に991が発見される条件って厳密に決まってると言っていいと思うの。
例外があるなら途中の桁から計算始めるとかだね。
>>218 これでもいいもんね。
(loop for i upfrom 1
for s = (princ-to-string i)
for champernowne = (concatenate 'string "0." s)
then (concatenate 'string champernowne s)
and previous-champernowne = champernowne
for first-911 = (search "991" champernowne :test #'equal)
for second-911 = (search "991" champernowne :from-end t :test #'equal)
until (and first-911
(/= first-911 second-911))
finally (print previous-champernowne))
222 :
221 :2013/11/28(木) 20:55:03.52
「一つだけ含むこと」となるとあの位置でしかないからね。
あとは
>>220 のように解釈するくらいしか。
1回目の 991 と2回目の 991 の間ならどこで切ってもおkでしょ
そこは数学は無駄が嫌いって言うことじゃないかと。
226 :
198 :2013/11/28(木) 21:09:25.87
>>224 もちろん。
出力結果がチャンパーノウン定数であって、
991が一個だけであれば正解。それだけ。
どこまで出すかは回答者の気分で。
そういう意味では
>>218 さんの言ってる通り問題としてはユルユル。
>>198 @Mathematica
champernowneConstant[pattstr_]:=Module[{joinedNumber,lst,n},
joinedNumber[n_]:=Range[1,n]//
Map[ToString,#]&//
StringJoin;
lst={};n=1;While[StringFreeQ[joinedNumber[n],pattstr],
lst=Append[lst,joinedNumber[n+1]];n++];
Last[lst]//
StringJoin["0.",#]&
];
In := champernowneConstant["991"]
Out = 0.1234567891011121314151617181920212223242526272829303132333
435363738394041424344454647484950515253545556575859606162636
465666768697071727374757677787980818283848586878889909192939
49596979899100
お題: 任意の数の自然数を与えた時、それらの自然数を四則演算した結果が、 期待した自然数になる式を全て列挙するコードを作成しなさい。 ただし、式中の乗除算は加減算より先に計算するものとする。 また数の並びは変更出来ず、括弧は使わないものとする。 例: 1 5 3 6 : 10 -> 1 * 5 / 3 * 6 1 + 5 * 3 - 6 1 5 3 6 7 : 10 -> 1 + 5 + 3 - 6 + 7
>>228 @Mathematica
buildArithmetic[lst_]:=Module[{arithmeticQ},
arithmeticQ[lstx_,opx_]:=Module[{val},
val=Riffle[Map[ToString,lstx[[1]]],opx]//
StringJoin//
ToExpression;
val==lstx[[2]]
];
{" + "," - "," * "," / "}//
Tuples[#,Length[lst[[1]]]-1]&//
Select[#,arithmeticQ[lst,#]&]&//
Map[Riffle[Map[ToString,lst[[1]]],#]&,#]&//
Map[StringJoin,#]&
];
In := buildArithmetic[{{1, 5, 3, 6}, 10}]
Out = {"1 + 5 * 3 - 6", "1 * 5 / 3 * 6"}
In := buildArithmetic[{{1, 5, 3, 6, 7}, 10}]
Out = {"1 + 5 + 3 - 6 + 7"}
>>228 ttp://ideone.com/biIc7g とりあえず作ったは作ったんだが1/2が0になるなどの不具合がある。
仕様がよくわからないのでよくわからない。
ideonで2つ目のstdinに数字を突っ込む方法がよくわからない。
気が向いたらバグフィックスする。疲れた〜。
>>228 ruby 1.8.6
パターンの羅列が面倒。Array#productは1.8.7から。
計算部分もグダグダ。forcalcが恥ずかしい。
def arbitrary_decimal(orgs, digit, i)
(0...digit).inject([]) {|a, n|
orgs_i = i % orgs.size
i /= orgs.size
a.insert(0, orgs[orgs_i])
}
end
def arbitrary_decimals(orgs, digit)
(0...orgs.size ** digit).inject([]) {|a, i| a << arbitrary_decimal(orgs, digit, i)}
end
def f228(s)
nums, targets = s.split(':').map{|x| x.split}
targets.each{|target|
arbitrary_decimals(%w(+ - * /), nums.size - 1).each {|ops|
s = nums.zip(ops).join + '==' + target
forcalc = s.gsub(/(\/\d+)(\*\d+)/, '\2\1').gsub(/(\d+)/,'\1.0')
puts s if eval(forcalc)
}
}
end
f228('1 5 3 6 : 10 ')
f228('1 5 3 6 7 : 10 ')
>>228 Squeak Smalltalk
| fourArithOps |
fourArithOps := [:assoc |
| results expr0 |
results := OrderedCollection new.
expr0 := assoc key allButLast collectWithIndex: [:num :idx | num asString, '{', idx, '}'].
expr0 := '(', (expr0 concatenation as: String), assoc key last, ')=', assoc value.
#(')+(' ')-(' '*' '/') asDigitsToPower: assoc key size - 1 do: [:ops |
| expr |
(Compiler evaluate: (expr := expr0 format: ops))
ifTrue: [results add: (expr copyWithoutAll: '()')]].
results asArray].
fourArithOps value: #(1 5 3 6) -> 10. "=> #('1+5*3-6=10' '1*5/3*6=10') "
fourArithOps value: #(1 5 3 6 7) -> 10. "=> #('1+5+3-6+7=10') "
233 :
デフォルトの名無しさん :2013/11/29(金) 23:55:56.93
>>228 with Python
自然数には 0 を含まないものとする
//@@
import itertools as it
from fractions import Fraction
r1 = Fraction(1,1) # rational 1 number
givenNums=(1,5,3,6)
targetNum=10
strGivenNums=[str(k) for k in givenNums]
N=len(givenNums)-1
for strOperators in it.product(*['+-*/']*(N)):
strAt="r1*"+strGivenNums[0]+"".join(strOperators[k]+strGivenNums[k+1] for k in range(N))
if eval(strAt) == targetNum:
print strAt[3:]
//@@@
1+5*3-6
1*5/3*6
234 :
デフォルトの名無しさん :2013/11/29(金) 23:59:47.69
ごめん。Indent が消えた //@@ import itertools as it from fractions import Fraction r1 = Fraction(1,1) # rational 1 number givenNums=(1,5,3,6) targetNum=10 strGivenNums=[str(k) for k in givenNums] N=len(givenNums)-1 for strOperators in it.product(*['+-*/']*(N)): strAt="r1*"+strGivenNums[0]+"".join(strOperators[k]+strGivenNums[k+1] for k in range(N)) if eval(strAt) == targetNum: print strAt[3:] //@@@ 1+5*3-6 1*5/3*6
>>228 Haskell
import Data.List
main :: IO ()
main = mapM_ (print . find4A) ["1 5 3 6 : 10", "1 5 3 6 7 : 10"]
find4A :: String -> [String]
find4A s = (flip (map . (!!)) =<< elemIndices y . map expr) $ conbo [x1] opPlusDigitList
where
conbo as [] = as
conbo as (n:t) = conbo [a ++ b | a <- as, b <- n] t
opPlusDigitList = map (\x -> [op ++ x | op <- ops]) $ xs
(xs0, y0) = break (==':') s
x1:xs = words xs0
y = read $ tail y0 :: Double
ops = [" + ", " - ", " * ", " / "]
expr :: String -> Double
expr s = go id (map read xxs) yys
where
(xxs, yys) = partition (`notElem` ["+", "-", "*", "/"]) $ words s
go f [x1] _ = f x1
go f (x1:xs) ("*":ys) = go (f . (x1 *)) xs ys
go f (x1:x2:xs) ("/":ys) = go id ((f x1 / x2) : xs) ys
go f (x1:xs) ("+":ys) = go ((f x1) +) xs ys
go f (x1:xs) ("-":ys) = go ((f x1) -) xs ys
go _ _ _ = -1
236 :
235 :2013/11/30(土) 12:01:08.70
割り算のところでミスってた
237 :
235 :2013/11/30(土) 12:08:19.85
>>228 Haskell
import Data.List
main :: IO ()
main = mapM_ (print . find4A) ["1 5 3 6 : 10", "1 5 3 6 7 : 10"]
find4A :: String -> [String]
find4A s = (flip (map . (!!)) =<< elemIndices y . map expr) $ conbo [x1] opPlusDigitList
where
conbo as [] = as
conbo as (n:t) = conbo [a ++ b | a <- as, b <- n] t
opPlusDigitList = map (\x -> [op ++ x | op <- ops]) $ xs
(xs0, y0) = break (==':') s
x1:xs = words xs0
y = read $ tail y0 :: Double
ops = [" + ", " - ", " * ", " / "]
expr :: String -> Double
expr s = go id (map read xxs) yys
where
(xxs, yys) = partition (`notElem` ["+", "-", "*", "/"]) $ words s
go f [x1] _ = f x1
go f (x1:x2:xs) ("*":ys) = go f ((x1 * x2) : xs) ys
go f (x1:x2:xs) ("/":ys) = go f ((x1 / x2) : xs) ys
go f (x1:xs) ("+":ys) = go (f . (x1 +)) xs ys
go f (x1:xs) ("-":ys) = go (f . (x1 -)) xs ys
go _ _ _ = -1
多分0以外なら大丈夫
["1 + 5 * 3 - 6","1 * 5 / 3 * 6"]
["1 + 5 + 3 - 6 - 7"]
238 :
235 :2013/11/30(土) 12:12:54.24
やっぱ解けてないじゃん
239 :
235 :2013/11/30(土) 12:23:48.16
>>228 Haskell
import Data.List
main :: IO ()
main = mapM_ (print . find4A) ["1 5 3 6 : 10", "1 5 3 6 7 : 10"]
find4A :: String -> [String]
find4A s = (flip (map . (!!)) =<< elemIndices y . map expr) $ conbo [x1] opPlusDigitList
where
conbo as [] = as
conbo as (n:t) = conbo [a ++ b | a <- as, b <- n] t
opPlusDigitList = map (\x -> [op ++ x | op <- ops]) $ xs
(xs0, y0) = break (==':') s
x1:xs = words xs0
y = read $ tail y0 :: Double
ops = [" + ", " - ", " * ", " / "]
expr :: String -> Double
expr s = go id (map read xxs) yys
where
(xxs, yys) = partition (`notElem` ["+", "-", "*", "/"]) $ words s
go f [x1] _ = f x1
go f (x1:x2:xs) ("*":ys) = go f ((x1 * x2) : xs) ys
go f (x1:x2:xs) ("/":ys) = go f ((x1 / x2) : xs) ys
go f (x1:xs) ("+":ys) = go (f . (x1 +)) xs ys
go f (x1:x2:xs) ("-":ys) = go (f . (x1 + )) ((-x2):xs) ys
go _ _ _ = -1
スレ汚しすみませんでした
240 :
235 :2013/11/30(土) 12:38:26.89
fいらんかった
>>228 ruby 1.8.6 ちょっとだけ整理した。
require 'rational'
def f228(s)
nums, targets = s.split(':').map{|x| x.split}
search, replace = '1023', '-+*/'
rationals = nums.map{|num| num.gsub(/(\d+)/, 'Rational(\1,1)')}
targets.each {|target|
(0...replace.size ** (nums.size - 1)).each {|i|
ops = i.to_s(replace.size).rjust(nums.size - 1, '0').tr(search, replace).scan(/./)
s = nums.zip(ops).join + '==' + target
forcalc = rationals.zip(ops).join + '==' + target
puts s if eval(forcalc)
}
}
end
f228('1 5 3 6 : 10 ')
f228('1 5 3 6 7 : 10 ')
242 :
235 :2013/11/30(土) 14:36:37.83
244 :
230 :2013/11/30(土) 18:21:10.60
>>244 ちょっともう我慢できないから聞くけど、
変数名の頭を大文字にするのってどういう文化?
C++触るまえに何触ってたの?
あとこの、
typedef std::vector<double> DB;
typedef std::vector<int> IB;
Bってなに?バッファ?
もしよかったらおしえてくんろ。
246 :
244 :2013/11/30(土) 18:50:23.99
>>245 それは申し訳ない。
基本的に独学なので特定のコーディング規約に触ったことはない。
アッパーキャメルなのは個人的な趣味だ。
ちなみにC/C++の前はポケコンのBasicを触っていた。もう10年前くらいの話だ。
IB => intbuffer
DB => doublebuffer
巨大なライブラリ使ってるわけではないので推測で判断できそうなものは省略している。
あと、コーディングスピードが結構成果を左右するタイプなのでそこで深い思考はしてない。
ところで、俺そんなにうざいですか?KYだとはよく言われます。
>>246 1mmもうざくないよ。疑問を尋ねただけ。
Bのバッファ説が正解しており嬉しいよ。
あと、ひょっとしたらBASIC触ってたのかなこの人とも思ってたから、
それも正解しておりニンマリだわ。お手数おかけしてどうもすんまそん。
>>247 それは良かった。素養が悪いのは今後の課題です。
個人的に1ソース200行に抑えられれば制御できるのでその範囲で書いてます。
超えるとかなり大変です。えへへっ。
|._番兵|_ ( ・ω・) <ステンバーイ ○={=}〇, |:::::::::\, ', ´ 、、、、し 、、、(((.@)ull null null null
250 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/11/30(土) 23:17:51.51
お題:国民の休日を区別して明記した万年カレンダー。
※注記:未来のカレンダーについては現行法に従うものとする
お題:入力補完ができるメニュー選択型UI。
片山以外のお題キボン
うむ片山以外のお題はマトモで関心する。
明治時代の休日なんて知るかよ
ローマの休日
コンソールで入力補完や進行状況を表示させるには、'\r'を使うといい。 '\r'は出力位置、キャレットを行の最初に移動させる制御文字。
明治どころかハッピーマンデー? なにそれおいしいの?
>>255 変体かなや草書体が読めないのに、歴史教科書を読んだだけ
で昔の事を理解したつもりになってるのはおかしくないか?
過去のことに永遠にアクセスできないなんて悲しいよ。
>>251 >>259 春分の日(_年,_月,_日) :-
'「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'
(_年,_月,_日),!.
263 :
262 :2013/12/01(日) 10:15:20.89
% 訂正。最後の(_年,_月,_日). の前の改行はなしです。 春分の日(_年,_月,_日) :- '「春分の日」および「秋分の日」の日付は、前年2月1日の官報で発表される。'(_年,_月,_日),!.
264 :
デフォルトの名無しさん :2013/12/01(日) 11:41:53.00
265 :
デフォルトの名無しさん :2013/12/01(日) 11:44:01.96
【回答値】 問題 I:: [ 0. 0.39215686 0.29411765 0.19607843 0.11764706] 問題 II:: [ 0. 0. 0.91584527 0.08040343 0.0037513 ] video では下の答えになっています。特に問題IIで計算誤差以上に値が異なりますが、 上の私の計算の方が正しいと思います。 問題 I:: [0, 0.39, 0.30, 0.19, 0.12] 問題 II:: [0, 0, 0.94, 0.055, 0.005]
>>264 python3
ns = [4,6,8,12,20]
f = lambda n: lambda x, k: x/n if k <= n else 0
fs = [f(n) for n in ns]
def g(ks):
xs = [1]*len(ns)
for k in ks:
ys = [f(x,k) for (f,x) in zip(fs, xs)]
sum_ys = sum(ys)
xs = [y/sum_ys for y in ys]
return xs
print(g([6]))
print(g([4,8,7,7,2,6]))
>>250 レベルが高すぎたので修正。
お題:与えられた年の国民の休日の名称とその日付を列挙するプログラム。
※注記:未来のカレンダーについては現行法に従うものとする。
片山以外のお題キボン
引数の順序逆にしたい
>>264 Squeak Smalltalk
| dices normalizeFor probabilitiesOf |
dices := #(4 6 8 12 20).
normalizeFor := [:arr | arr / arr sum].
probabilitiesOf := [:kk | dices collect: [:dice | dice < kk ifTrue: [0] ifFalse: [1s5 / dice]]].
normalizeFor value: (probabilitiesOf value: 6).
"=> {0.00000s5 . 0.39215s5 . 0.29411s5 . 0.19607s5 . 0.11764s5} "
normalizeFor value: ((#(4 8 7 7 2 6) collect: probabilitiesOf) reduce: #*)
"=> {0.00000s5 . 0.00000s5 . 0.91584s5 . 0.08040s5 . 0.00375s5} "
fはこっちの方がいいか f [] = [] f xs = let zs = foldr p ([1,1..]) xs in map (/ sum zs) zs
お題:与えられた文字列が回文かどうかチェックせよ。 半角アルファベット文字のみを判定の対象とする。大文字小文字の区別はしない。 判定対象文字列のサイズがゼロの場合の判定結果はどちらでもよい。 回答例: #include <stdio.h> int is_palindrome(const char *cs) { const char *head = cs, *tail = cs + strlen(cs) - 1, *p, *q; for (p = head, q = tail; p < q; p++, q--) { while (!isalpha(*p) && p <= tail) p++; while (!isalpha(*q) && head <= q) q--; if (tolower(*p) != tolower(*q)) return 0; } return 1; } void check_palindrome(const char *cs) { printf("\"%s\" %s a palindrome.\n", cs, is_palindrome(cs) ? "is" : "is NOT"); } int main() { check_palindrome("boo"); check_palindrome("A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal-Panama!"); check_palindrome("A tin mug for a jar of gum, Nita."); check_palindrome("A Toyota! Race fast, safe car! A Toyota!"); return 0; } 出力例: "boo" is NOT a palindrome. "A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal-Panama!" is a palindrome. "A tin mug for a jar of gum, Nita." is a palindrome. "A Toyota! Race fast, safe car! A Toyota!" is a palindrome.
回分ってなんだっけ? 逆から読んでも同じやつだけだっけ? 同じ単語が混じってたら回分?
あぁ、とりあえず逆から同じように読めればいいのね。
最後の回文旨いことで来てるなー。 C言語の解答出てるからC++で書くと移植になっちゃうなぁ。 なんか面白い解法無いもんか。
>>277 Squeak Smalltalk
| isPalindrome |
isPalindrome := [:str | (str select: #isLetter) asLowercase in: [:letters | letters reversed = letters]].
isPalindrome value: 'boo'. "=> false "
isPalindrome value: 'A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal-Panama!'. "=> true "
お題:線分(x0,y0)〜(x1,y1),(x2,y2)〜(x3,y3)の交点を求める。
交点なしと表示する
大成功!q >o< p
>>277 J
f =: (-: |.)@((toupper ~: ]) # ])@tolower
f 'boo'
0
f 'A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal-Panama!'
1
f 'A tin mug for a jar of gum, Nita.'
1
f 'A Toyota! Race fast, safe car! A Toyota!'
1
>>277 perl -e '$_ = $ARGV[0]; tr/A-Z/a-z/; s/\s+//g; print "palindrome\n" if (substr($_, 0, length($_)/2) eq reverse(substr($_, -length($_)/2, length($_)/2)))'
これでいいのかな
おっと length の $_ は省略可か
>>286 お題を出すなら、入出力例を添えろと何度言ったら…
>>286 Squeak Smalltalk
| A B C D V0 V1 crossProd P |
V0 := (B := -3.0@ -3.0) - (A :=
[email protected] ).
V1 := (D :=
[email protected] ) - (C := 0.0@ -2.0).
(crossProd := V0 crossProduct: V1) abs < Float epsilon ifTrue: [^'交点なし'].
P := (C - A crossProduct: V1) / crossProd * V0 + A.
^((P onLineFrom: A to: B within: Float epsilon) and: [P onLineFrom: C to: D within: Float epsilon])
ifTrue: [P] ifFalse: ['交点なし']
"=> -1.0@ -1.0 "
>>277 Lua
function f(s)
s = s:gsub("%W", ""):upper()
return s == s:reverse()
end
299 :
298 :2013/12/02(月) 15:29:47.29
あ、線分だったか、ま、いっか
300 :
298 :2013/12/02(月) 17:34:00.56
>>277 ruby 1.8.6
普通に書いたら
>>297 さんとほぼ同じになっちゃうので少しグネッて一行で書いた。
def f277(s)
s.downcase.gsub(/[^a-z]/, '').inject(0){|b, x| x == x.reverse}
end
お題 : 6面のサイコロを振る試行を繰り返すことで、 円周率の値を、有効数字3桁程度の精度で予想しなさい。 またその時に出たそれぞれの目の回数を表示しなさい。 解答例 : pi: 3.14472 1: 133393 16.7% 2: 133271 16.7% 3: 133270 16.7% 4: 133290 16.7% 5: 132931 16.6% 6: 133845 16.7%
303 :
298 :2013/12/02(月) 23:55:42.93
お題:ふたつの自然数の公約数をすべて求める。 例 201312, 12222 -> 1, 2, 3, 6, 9, 18
>>302 Squeak Smalltalk
| dice M N max bag rand count |
dice := 6. M := 4. N := 1e5.
max := (dice raisedTo: M) - 1.
bag := Bag new.
rand := [((1 to: M) inject: 0.0 into: [:acc :idx | acc * dice + ((bag add: dice atRandom) - 1)]) / max].
count := 0.
N timesRepeat: [(rand value raisedTo: 2) + (rand value raisedTo: 2) < 1 ifTrue: [count := count + 1]].
^{#pi -> (count / N * 4.0). bag sortedElements}
"=> {#pi->3.14896 . {1->133302 . 2->133594 . 3->133354 . 4->133025 . 5->133377 . 6->133348}} "
>>305 Squeak Smalltalk
| factorsOf commonFactorsOf |
factorsOf := [:n | (1 to: n) select: [:m | n isDivisibleBy: m]].
commonFactorsOf := [:a :b | ((factorsOf value: a) intersection: (factorsOf value: b)) asSortedArray].
commonFactorsOf value: 201312 value: 12222 "=> #(1 2 3 6 9 18) "
>>305 ; Common Lisp
(defun all-common-denominators (&rest integers)
(loop with gcd = (apply #'gcd integers)
for i from 1 to gcd
when (zerop (mod gcd i))
collect i))
(all-common-denominators 201312 12222)
>>302 さいころからどうやって円周率に結びつけるの?
310 :
デフォルトの名無しさん :2013/12/03(火) 15:53:19.41
>>305 ruby 1.8.6
def common_divisors(m, n)
(1..m).inject([]){|a, i| m % i == 0 ? a << i : a}.inject([]){|a, i| n % i == 0 ? a << i : a}
end
p common_divisors(201312, 12222)
>>305 ruby 1.8.6 可変長引数版。
def common_divisors(*args)
n = args.shift
a = args.size < 1 ? (1..n).to_a : common_divisors(*args)
a.delete_if {|i| n % i != 0}
end
p common_divisors(201312, 12222, 27)
↓
[1, 3, 9]
>>305 >>307 はちょっとあれなので
>>313 を参考に Squeak Smalltalk 別解
#(201312 12222 27) in: [:xs | xs sort inject: (1 to: xs first) into: [:acc :x | acc select: [:n | x isDivisibleBy: n]]]
"=> #(1 3 9) "
>>315 横槍いれるけどSqueakよりPharoの方がよくね
>>317 そう? Pharo使うくらいならVisualWorks使うなぁ…
Squeakは、その節操のなさが好き。良し悪しはともかく。
>>305 Clojure
(->> [n m] (map #(filter (fn [x] (zero? (mod % x))) (range 1 (/ % 2)))) (map set) (apply clojure.set/intersection))
>>318 Visual Worksってええの?
補完が出来ないとかクリックで派生Class作れないとか(偏見)
古臭い感じがするけど。
>>320 補完は AutoComplete パーセル入れればできるでしょ。
「クリックで派生Class作」るってPharoでどうやるの?
>>321 Refactoringメニューでgenerate subclass的なメニューを押すと作れるよ。
他にもTestClass生成したりsuper class生成したりRefactoringとは
到底思えない便利機能が色々有るよ。
あと聞かれた内容に関係ないけど、
Pharoは文字列を選択してClassを検索したり
Selectorを検索したりできる。
他にも検索機能が充実しててそれが便利で
Squeakから移っちゃった。
>>305 Scala
List(n, m) map(x => (1 to x / 2) filter(x % _ == 0)) reduceLeft((x, y) => x intersect y)
>>305 c++
#include <iostream>
#include <vector>
#include <algorithm>
std::vector<int> *common_divisors(const std::vector<int> *nums) {
if (!nums) return 0;
int min = *std::min_element(nums->begin(), nums->end());
std::vector<int> *cds = new std::vector<int>();
for (int i = 1; i <= min; i++) {
std::vector<int>::const_iterator it;
for (it = nums->begin(); it != nums->end(); it++) {
if (*it % i) break;
}
if (it == nums->end()) cds->push_back(i);
}
return cds;
}
void p(std::vector<int> *is) {
std::cout << "[";
for (int i = 0; i < is->size(); i++) {
if (0 < i) std::cout << ", ";
std::cout << is->at(i);
}
std::cout << "]" << std::endl;
}
>>324 の続き
int main() {
std::vector<int> nums;
nums.push_back(201312);
nums.push_back(12222);
nums.push_back(27);
std::vector<int> *cds = common_divisors(&nums);
p(&nums);
p(cds);
return 0;
}
↓
[201312, 12222, 27]
[1, 3, 9]
>>305 HSP
#module
#defcfunc gcd2 int a, int b, \
local x, local y, local z
if a<0 : return b
if b<0 : return a
x=a : y=b
repeat
z=x\y
if z=0 : break
x=y
y=z
loop
return y
#deffunc calc array arr, int n, \
local arr_num
repeat n, 1
if (n\cnt)=0 {
arr(arr_num)=cnt
arr_num++
}
loop
return arr_num
#define global ctype gcd4(%1=-1,%2=-1,%3=-1,%4=-1) gcd2(gcd2(%1,%2),gcd2(%3,%4))
#global
calc result, gcd4(201312,12222,27)
repeat stat
mes result(cnt)
loop
>>305 Octave
function z = f(a, b)
c = gcd(a, b);
d = 1:c;
z = d(mod(c, d) == 0);
endfunction
> f(201312,12222)
ans =
1 2 3 6 9 18
> f(96,96)
ans =
1 2 3 4 6 8 12 16 24 32 48 96
>>322 なるほど。Pharoの開発には他言語の近代的なIDEで育った若い人たちが
Squeakに比べておおく参加しているので、よく使う機能が前面に押し出されており
これからSmalltalkを始める人にはわかりやすくてよいかもしれませんね。
>>302 サイコロを複数回振って細かくて平らな乱数を作る方法がわからないので無理
>>305 Haskell
commonDivsors ys = [x | x <- [1 .. mininimum ys], all (==0) $ map (`mod` x) ys]
f a b = commonDivisors [a, b]
f 201312 12222
[1,2,3,6,9,18]
f 96 96
[1,2,3,4,6,8,12,16,24,32,48,96]
>>305 Haskell ミス修正
commonDivisors ys = [x | x <- [1 .. minimum ys], all (==0) $ map (`mod` x) ys]
f a b = commonDivisors [a, b]
>>302 HSP
#include "hspmath.as"
#module dice_mod
#defcfunc dice local r
r=rnd(6)+1
g_count@(r)++
g_total@++
return r
#defcfunc dice_rnd int n, local ret
repeat n
ret=ret*6+dice()-1
loop
return ret
#global
#const DICE_NUM 10
#const PLOT_NUM 1000000
randomize
repeat PLOT_NUM
x=pow(6, -DICE_NUM)*dice_rnd(DICE_NUM)
y=pow(6, -DICE_NUM)*dice_rnd(DICE_NUM)
if x*x+y*y<=1.0 : inside++
await
loop
mes strf("pi=%.6f", 4.0*inside/PLOT_NUM)
repeat 6, 1
mes strf("%d %d %.4f%%", cnt, g_count(cnt), 100.0*g_count(cnt)/g_total)
loop
>>305 J
f =: 1+[:I.0=(|~1+i.)@(+./)
f 201312 12222
1 2 3 6 9 18
f 201312 12222 27
1 3 9
>>305 Io
Range
gcd := method(a, b, if(b == 0, a, gcd(b, a % b)))
f := method(a, b, c := gcd(a, b); 1 to(c) select(i, c % i == 0))
Io> f(201312,12222)
==> list(1, 2, 3, 6, 9, 18)
f =: 1+[:I.0=(|~1+i.)@(+./) (+./) gcd @関数の合成 1+i.4 -> 1 2 3 4 ~で引数を逆にする 1 2 3 4 | 4 -> 0 0 1 0 I.0= index of 0 [: 多分一旦値を取り出す 1+ 0 1 3 -> 1 2 4
あ、~は f g a = f a (g a)ってことか
>>305 @Mathematica
commonDivisors[n1_,n2_]:=Module[{commonDivisorQ},
commonDivisorQ[nx_,n1x_,n2x_]:=Module[{},
{n1x,n2x}//
Map[Mod[#,nx]==0&,#]&//
Apply[And,#]&
];
Range[1,GCD[n1,n2]]//
Select[#,commonDivisorQ[#,n1,n2]&]&
];
In := commonDivisors[201312, 12222]
Out = {1, 2, 3, 6, 9, 18}
>>305 Haskell まあ素直にgcdを使うべきだったのは確かだけど
main :: IO ()
main = print $ f 201312 12222
commonDivisors :: [Integer] -> [Integer]
commonDivisors ys = let z = foldl1 gcd ys in [x | x <- [1 .. z], z `mod` x == 0]
f a b = commonDivisors [a, b]
最近効率を無視するのが楽しいから困る
Cはよくわからんけどポインタから文字列の長さを引いたりできないのか
intのために使うメモリの節約とか意地とか見栄そういうの?
>>343 うん
まあいいお題とは思ったんだ意気消沈して焼け酎をあおっている‥
>>305 Objective Caml version 3.08.1
はるか昔に準備しておいてずっと放置していたocamlに挑戦。
関数型言語に馴染みがまったく無いのでどうもヘンな感じだ。
let rec range a b = if a > b then [] else a :: range (a+1) b;;
let rec gcd n m = if m = 0 then n else gcd m (n mod m);;
let cds n m = List.filter (fun i -> n mod i = 0 && m mod i = 0) (range 1 (gcd n m));;
cds 201312 12222;;
↓
- : int list = [1; 2; 3; 6; 9; 18]
>>305 では「ふたつの」と指定してありますが、
「任意の数の」に変えたらコードはどう変化しますか?
お題:任意の数の自然数の公約数をすべて求める。
例
201312, 12222 -> 1, 2, 3, 6, 9, 18
201312, 12222, 27 -> 1, 3, 9
201312, 12222, 27, 3 -> 1, 3
>>349 HSP
#module
#defcfunc gcd int a, int b, local x, local y, local z
x=a
y=b
repeat
z=x\y
if z=0 : break
x=y
y=z
loop
return y
#deffunc calc array result, array value, int value_num, local t, local result_num
t=value(0)
repeat value_num-1, 1
t=gcd(value(cnt), t)
loop
repeat t, 1
if (t\cnt)=0 {
result(result_num)=cnt
result_num++
}
loop
return result_num
#global
value=201312, 12222, 27
calc result, value, length(value)
repeat stat
mes result(cnt)
loop
351 :
339 :2013/12/05(木) 12:25:22.98
>>349 @Mathematica
commonDivisors2[nlst_]:=Module[{commonDivisorQ},
commonDivisorQ[nx_,nlstx_]:=Module[{},
nlst//
Map[Mod[#,nx]==0&,#]&//
Apply[And,#]&
];
nlst//
Apply[GCD,#]&//
Range[1,#]&//
Select[#,commonDivisorQ[#,nlst]&]&
];
In := commonDivisors2[{201312,12222,27}]
Out = {1,3,9}
In := commonDivisors2[{201312,12222,27,3}]
Out = {1,3}
>>349 Haskell
main :: IO ()
main = print $ commonDivisors [201312, 12222, 27]
commonDivisors :: [Integer] -> [Integer]
commonDivisors ys = let z = foldl1 gcd ys in [x | x <- [1 .. z], z `mod` x == 0]
>>355 >配列の長さを関数に渡したり-1で止めたりってやめた方がいいんですかね
両方とも一般的な手法だから、良いんじゃないかな。
データに0が含まれないと判っていれば、「0で止める」だけなので。
なるほど
>>349 ruby 1.8.6
require 'rational'
def ds(n)
(1..n).select {|i| n % i == 0}
end
def gcd(*nums)
nums.inject(0) {|r, n| r.gcd(n)}
end
def cds(*nums)
ds(gcd(*nums))
end
>>349 Objective Caml version 3.08.1
let rec range a b = if a > b then [] else a::range (a + 1) b;;
let rec gcd2 a b = if a = 0 then b else if b = 0 then a else if a > b then gcd2 b (a mod b) else gcd2 a (b mod a);;
let gcd nums = List.fold_left gcd2 0 nums;;
let ds n = List.filter (fun i -> n mod i = 0) (range 1 n);;
let cds nums = ds (gcd nums);;
>>342 c
#include <stdio.h>
char *SEARCH(char *s, char *p) {
if (!p || *p == '\0') return s;
if (!s || *s == '\0') return 0;
return *s == *p ? SEARCH(s + 1, p + 1) - 1 : SEARCH(s + 1, p);
}
void check(char *s, char *p) {
printf("%s|%s|%s\n", s, p, SEARCH(s, p));
}
int main() {
check("12345", "23");
check("12345", "");
check("12345", 0);
check("12345", "5");
check("12345", "1");
return 0;
}
360 :
359 :2013/12/05(木) 20:17:41.06
ゴメン、まったく解けてなかったw
361 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/12/05(木) 23:34:00.68
>>342 char *SEARCH(char *s, char *p) {
if (!*s) return NULL;
if (!*p) return s;
if (*s == *p && SEARCH(s + 1, p + 1) == s + 1) return s;
return SEARCH(s + 1, p);
}
>>349 Clojure
(->> [201312 12222 27 9] (map #(filter (fn [x] (zero? (mod % x))) (range 1 %))) (map set) (apply clojure.set/intersection))
Scala
List(201312, 12222, 27) map(x => 1 to x filter(x % _ == 0)) reduceLeft((x, y) => x intersect y)
今見たら
>>319 も
>>323 も間違えてるじゃないか
お題:偶数の目が奇数の目より二倍でやすいイカサマさいころの実装と、 それを実際に10万回ふって出た目の数を集計し出力するコード。 出力例 1: 11103 2: 22287 3: 11114 4: 22170 5: 11089 6: 22237 余力があれば、任意の目の数と出やすさに対応できるコードにしてください。
diceって複数形だったのか
>>365 @Mathematica
spuriousDiceCounter[n_]:=Module[{spuriousDice},
spuriousDice[]:=RandomChoice[{1,2,2,3,4,4,5,6,6}];
Table[spuriousDice[],{i,n}]//
Tally//
Sort[#,#1[[1]]<#2[[1]]&]&//
Map[{ToString[#[[1]]]<>" : "<>ToString[#[[2]]]}&,#]&//
Grid
];
In := spuriousDiceCounter[100000]
Out = 1 : 10865
2 : 22420
3 : 11291
4 : 22187
5 : 11019
6 : 22218
>>365 Squeak Smalltalk
| probDist thresholds bag dice randGen |
probDist := #(1 2 1 2 1 2).
probDist := probDist / probDist sum.
thresholds := probDist inject: #(0) into: [:acc :prob | acc, {acc last + prob}].
randGen := Random new.
dice := [ | rnd | rnd := randGen next. thresholds findLast: [:thre | thre < rnd]].
bag := Bag new.
1e5 timesRepeat: [bag add: dice value].
^bag sortedElements "=> {1->10906 . 2->22107 . 3->11161 . 4->22417 . 5->11119 . 6->22290} "
>>302 Haskell 修正
http://ideone.com/sPeMI1 >>365 import qualified Data.IntMap as I
import System.Random
main :: IO ()
main = do
rd <- fmap (take 100000) rollIkasamaDice
let im = foldr (I.update ((Just $!) . succ)) im0 rd
im0 = I.fromList $ zip [1..6] [0,0..]
print im
rollIkasamaDice :: IO [Int]
rollIkasamaDice = do
gen <- getStdGen
let rs = filter (/=0) $ map f $ randomRs (1, 12) gen
f x | x `elem` [8, 10, 12] = x - 6
| x `elem` [7, 9, 11] = 0
| otherwise = x
return $ rs
fromList [(1,11230),(2,22116),(3,11021),(4,22235),(5,11150),(6,22248)]
多分他の場合には簡単に対応できない
>>365 > 余力があれば、任意の目の数と出やすさに対応できるコードにしてください。
たとえば、目の数の平方根に比例した出方をする四面のイカサマさいころの場合とか
>>365 ; Common Lisp
(defun roll-dice ()
(let ((n (1+ (random 9))))
(if (<= n 6)
n
(* 2 (- n 6)))))
(loop with a = (make-array 6 :initial-element 0)
repeat 1e5
do (incf (elt a (1- (roll-dice))))
finally (loop for i upfrom 1
for n across a
do (format t "~a: ~a~%" i n)))
1: 11137
2: 22280
3: 11152
4: 22207
5: 11218
6: 22006
あ9でよかったか
376 :
373 :2013/12/06(金) 18:02:52.62
実行したら全然合ってなかった
377 :
373 :2013/12/06(金) 18:05:44.97
考えれば当たり前だけど
378 :
368 :2013/12/06(金) 18:07:06.65
>>365 ,371
@Mathematica サイコロ作り直し版
spuriousDiceCounter[diceweight_,n_]:=Module[{spuriousDice},
spuriousDice[diceweightx_]:=Module[{dice,weight},
dice=diceweightx//
Map[#[[1]]&,#]&;
weight=diceweightx//
Map[#[[2]]&,#]&;
RandomChoice[weight->dice]
];
Table[spuriousDice[diceweight],{i,n}]//
Tally//
Sort[#,#1[[1]]<#2[[1]]&]&//
Map[{ToString[#[[1]]]<>" : "<>ToString[#[[2]]]}&,#]&//
Grid
];
In := spuriousDiceCounter[{{1,Sqrt[1]},{2,Sqrt[2]},{3,Sqrt[3]},{4,Sqrt[4]}},100000]
Out = 1 : 16501
2 : 23022
3 : 28008
4 : 32469
Haskellの標準ライブラリでは分布指定とかrandomChoiceみたいなのはないのか 乱数勉強するなら解析? 離散? 統計?
整数にこだわらず最初から[0..1]のDoubleを確率で区切ればいいのか
>>365 Haskell
http://ideone.com/LxO5Uh fromList [(1,11201),(2,22006),(3,11115),(4,22412),(5,11043),(6,22223)]
>>371 Haskell
http://ideone.com/AC3xEU fromList [(1,16321),(2,23232),(3,27827),(4,32620)]
よく考えれば色んなサイコロに対応できるコードになってるなよかったよかった
>>365 HSP
#module
#defcfunc rndf
return (double(rnd(1024))/1024+double(rnd(1024)))/1024
#deffunc fake_dice_init array r, local s
s=0.0
repeat 6
s+=r(cnt)
loop
repeat 6
s_r(cnt)=double(r(cnt))/s
if cnt : s_r(cnt)+=s_r(cnt-1)
loop
return
#defcfunc fake_dice local r, local ret
r=rndf()
repeat 6
if r<s_r(cnt) : ret=cnt+1 : break
loop
return ret
#global
randomize
r=1.0, 2.0, 1.0, 2.0, 1.0, 2.0
fake_dice_init r
repeat 100000
x=fake_dice()
count(x)++
loop
repeat 6, 1
mes strf("%d: %d", cnt, count(cnt))
loop
>>365 ruby 1.8.6 厳密に言うと正しくない箇所があるかも。
class Dice
def initialize(waits)
@scale = waits.inject([]) {|r, w| r << (r.last||0) + w}
end
def next
x = rand * @scale.last
@scale.each_index {|i| return i if x < @scale[i]}
end
end
def f365(labels, waits, n_times)
d = Dice.new(waits)
m = (1..n_times).inject(Hash.new(0)){|h, i| h[d.next] += 1; h}
labels.each_index{|i| puts "#{labels[i]}: #{m[i]}"}
end
f365(('1'..'6').to_a, [1,2,1,2,1,2], 100000)
f365(('sqrt1'..'sqrt4').to_a, (1..4).map{|i|Math.sqrt i}, 100000)
↓
1: 10997
2: 22468
3: 11065
4: 22109
5: 11099
6: 22262
sqrt1: 16047
sqrt2: 23121
sqrt3: 28288
sqrt4: 32544
>>365 Haskell これで最終にしよう
http://codepad.org/WfNEfmTG fromList [(1,11094),(2,22366),(3,11148),(4,22113),(5,11133),(6,22146)]
fromList [(1,16469),(2,22947),(3,28054),(4,32530)]
fromList [(1,10937),(2,11007),(3,11150),(4,11349),(5,11141),(6,11109),(7,11164),(8,11105),(9,11038)]
メモ:空letは通る
>>387 厳密じゃなくてもweightだろうな。
スリープソートみたいなことやってると思ってた rubyとsmalltalkは高尚すぎて読めない
>>390 良い事を教えてあげようか?
俺の顔はいまスイカの断面よりも真っ赤だ…。
その比喩はちょっとわかりにくい 頭の断面が真っ赤なのかと思ったわー そして季節外れだし、今ならサンタクロースの服とかだろーねー 知らんわ
>>365 J
/:~(~.,.#/.~)(?100000#9){1 2 2 3 4 4 5 6 6
1 11152
2 22416
3 10971
4 22224
5 11006
6 22231
>>365 ,371 Objective Caml version 3.08.1
Random.self_init ();;
type entry = {label:string; level:float; mutable freq:int};;
let f365 labels weights n_times =
let levels = List.tl (List.rev (List.fold_left (fun a w -> List.hd a +. w::a) [0.0] weights)) in
let entries = List.rev (List.fold_left2 (fun a la le -> {label = la; level = le; freq = 0}::a) [] labels levels) in
let maxlevel = (List.hd (List.rev entries)).level in
let find arg es = List.find (fun {level = le} -> arg < le) es in
let countup e = e.freq <- (e.freq + 1) in
for i = 1 to n_times do
countup (find (Random.float maxlevel) entries)
done;
List.iter (fun e -> Printf.printf "%s: %d\n" e.label e.freq) entries
;;
f365 ["1";"2";"3";"4";"5";"6"] [1.0;2.0;1.0;2.0;1.0;2.0] 100000;;
f365 ["sqrt1";"sqrt2";"sqrt3";"sqrt4";] [sqrt 1.0;sqrt 2.0;sqrt 3.0;sqrt 4.0] 100000;;
↓
1: 11075
2: 22202
3: 11261
4: 22159
5: 11255
6: 22048
sqrt1: 16182
sqrt2: 22881
sqrt3: 28099
sqrt4: 32838
>>365 偶数の目が奇数の目より二倍でやすいイカサマさいころ(_イカサマさいころの目) :-
_乱数値 is random(9),
nth0(_乱数値,[1,2,3,4,5,6,2,4,6],_イカサマさいころの目),!.
偶数の目が奇数の目より二倍でやすいイカサマさいころを実際に10万回ふって出た目の数を集計し出力する :-
偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し([],[],[],[],[],[],[],Ln,_1,_2,_3,_4,_5,_6),
length(Ln,100000),
出力する(_1,_2,_3,_4,_5,_6).
偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し(Ln,_1,_2,_3,_4,_5,_6,Ln,_1,_2,_3,_4,_5,_6).
偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し(Ln_1,LL_1,Ln,LL) :-
偶数の目が奇数の目より二倍でやすいイカサマさいころ(_イカサマさいころの目),
出た目の数を集計し(_イカサマさいころの目,LL_1,LL_2),
偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し([_|Ln_1],LL_2,Ln,LL).
出た目の数を集計し(_イカサマさいころの目,LL_1,LL_2) :-
length([_|LL0],_イカサマさいころの目),
append(LL0,[L|LL2],LL_1),
append(LL0,[[_|L]|LL2],LL_2),!.
出力する(_1,_2,_3,_4,_5,_6) :-
forall((nth1(_nth1,[_1,_2,_3,_4,_5,_6],L),length(L,_集計値)),
writef('%t: %t\n',[_nth1,_集計値]).
お題:一辺の長さがmの正三角形がある。ひとつの頂点に 長さnの糸がつながっている。まず糸をすべて正三角形に巻きつける。 糸をピンと張った状態でほどいていき、そのまま逆向きにすべてを 巻きつけた時の糸の先端の軌跡の長さを求める。小数点以下四捨五入。 例 m=100, n=200, -> 1466
>>400 Squeak Smalltalk
| m n pi len |
m := 100.
n := 200.
pi := Float pi.
len := 2 * pi * n * (5 / 12).
[(n := n - m) > 0] whileTrue: [len := len + (2 * pi * n * (1 / 3))].
^(len * 2) rounded "=> 1466 "
>>400 Haskell
import Data.Function
main :: IO ()
main = print $ f 200 100
f :: Double -> Double -> Double
f n m = ((+) `on` sum ) =<< tail $ zipWith arcLength ((2 * pi / 3) : repeat (5 * pi / 3)) $ takeWhile (> 0) $ iterate (+ (- m)) n
arcLength :: Num a => a -> a -> a
arcLength angle radius = angle * radius
>>400 Haskell
import Data.Function
main :: IO ()
main = print $ f 200 100
f :: Double -> Double -> Double
f n m = ((+) `on` sum ) =<< tail $ zipWith (*) ((2 * pi / 3) : repeat (5 * pi / 3)) $ takeWhile (> 0) $ iterate (+ (- m)) n
arcLength いらねえ
>>400 ruby 1.8.6
考え方が良く分からなかったので、
折り返すとき1/2回転、それ以外1/3回転として考えた。
def rsts(x, y)
d, m = y.divmod(x)
rs = (1..d).inject([m]){|a, i|a << a.last + x}.delete_if{|r| r == 0}
rs = rs + rs.reverse
ts = Array.new(rs.size, 2 * Math::PI / 3)
ts[rs.size / 2] = 2 * Math::PI / 2 # 折り返し
[rs, ts]
end
def f400(n, m)
rs, ts = rsts(n, m)
rs.zip(ts).inject(0){|sum, (r, t)| sum += r * t}.round
end
p f400(100, 200)
>>400 HSP
#module
#defcfunc calc2 double m, double n
if n<=0.0 : return 0.0
return calc2(m, n-m)+2.0*M_PI*n/3
#defcfunc calc double m, double n
return (calc2(m, n)+2.0*M_PI*n/12)*2
#global
mes strf("%.0f", calc(100, 200))
>>400 ruby 1.8.6 良く考えたら半分計算して二倍でよかった。
def rsts(x, y)
d, m = y.divmod(x)
rs = (1..d).inject([m]){|a, i|a << a.last + x}.delete_if{|r| r == 0}
[rs, Array.new(rs.size - 1, 2 * Math::PI / 3) << 2 * Math::PI * 5 / 12]
end
def f400(n, m)
rs, ts = rsts(n, m)
(rs.zip(ts).inject(0){|sum, (r, t)| sum += r * t} * 2).round
end
p f400(100, 200)
>>400 仕上げは、一辺に沿っていていいのかな。
そうでないと何処まで戻せばよいかわからない。
>>403 は角度逆だったな糸の長さが短いから解けてたwwwwww
俺ってケアレスミス多すぎでスレ汚しまくりだよなあ これからはお題だけ拾って書き込むのは控えるわwwwwwwwwwwwwwwwwwwwwwww
書き込んでから気付くんだよなぁ、不思議とw
>>400 Io
f:=method(m,n,((1 atan*4)*(((((n-m)/m)floor)*n/3+n%m)*2+n*10/6))round)
Io> f(100,50)
==> 471
Io> f(100,250)
==> 2147
Io> f(100,920)
==> 20358
>>159 HSP
#module
#deffunc swap var a, var b, local c
c=a : a=b : b=c
return
#deffunc odd_sort array data, local odd_data, local odd_num, local h, local is_changed, local odd_index
foreach data
if data(cnt) & 1 : odd_data(odd_num)=data(cnt) : odd_num++
loop
h=odd_num*10/13
repeat
is_changed=0
repeat odd_num-h
if odd_data(cnt)>odd_data(cnt+h) {
swap odd_data(cnt), odd_data(cnt+h)
is_changed=1
}
loop
if h>1 : h=h*10/13 : else : if is_changed=0 : break
loop
foreach data
if data(cnt) & 1 : data(cnt)=odd_data(odd_index) : odd_index++
loop
return
#global
data=37,61,86,9,81,50
odd_sort data
foreach data
mes data(cnt)
loop
お題:この書き込みをネットから読み込むプログラム。
>>419 ruby 1.8.6
require 'net/http'
puts Net::HTTP.get('toro.2ch.net', '/tech/dat/1357191974.dat').split("\n")[418]
>>419 R
cat(readLines(a)[419])
aには
>>420 さんと同じurlがはいっているのですが、リテラルとしてかくと
「リンクは禁止です」というエラーになって書き込みできませんでした。
>>424 ninjaのレベルが低いんだろう。
URLをURLとして認識されないように途中で切って、文字列値として連結するように書けばおk
426 :
424 :2013/12/08(日) 16:17:20.41
>>419 java 1.6
import java.util.*;
import java.io.*;
import java.net.*;
public class Odai419 {
public static void main(String[] args) throws Exception {
URL url = new URL("
http://toro.2ch.net/tech/dat/1357191974.dat ");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream()));
List<String> lines = new ArrayList<String>();
for (String line = null; (line = in.readLine()) != null; ) {
lines.add(line);
}
System.out.println(lines.get(418));
}
}
この書き込みをネットから「書き込む」プログラム だったら解けなかったな。
>>428 書き込むのはやめといたほうがいいw
運営にボット扱いされたら、フシアナ処理されるからw
俺それで一回リモホさらされて焦ったことあるw
>>428 へー、そんなことあるんだ。
あぶない、あぶない。
>>416 それよくわかる。プログラミングでも、いったん寝かせて(忘れるくらいの期間)熟成させないといけないらしい
|._番兵|_ ( ・ω・) <ステンバーイ ○={=}〇, |:::::::::\, ', ´ 、、、、し 、、、(((.@)cp udp tcp udp
>>68 c++
#include <iostream>
#include <vector>
#include <algorithm>
char *shuffle68(char *cs) {
int len = strlen(cs);
if (len <= 1) return cs;
std::vector<int> is;
for (int i = 0; i < len; i++) is.push_back(i);
std::random_shuffle(is.begin(), is.end());
std::vector<int>::iterator it = is.begin();
if (3 <= is.size() && is.size() % 2) {
int i = *it++, j = *it++, k = *it++;
char csj = cs[j], csk = cs[k];
cs[j] = cs[i];cs[k] = csj;cs[i] = csk;
}
for (;it != is.end();) {
int i = *it++, j = *it++;
char csj = cs[j];
cs[j] = cs[i];cs[i] = csj;
}
return cs;
}
>>433 のつづき
void check(const char *cs) {
char *_cs = strdup(cs);
std::cout << cs << std::endl;
std::cout << shuffle68(_cs) << std::endl;
free(_cs);
}
int main() {
std::srand(unsigned(std::time(0)));
check("");
check("1");
check("12");
check("123456789");
return 0;
}
お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は 元のデータの順に)表示する。
>>434 echo 112223334445556667778889991101121133114411551166117711881199220223224422552266227722882299330334335533663377338833994404454466447744884499
550556557755885599660667668866997707787799880889990100
>>435 echo 112223334445556667778889991101121133114411551166117711881199220223224422552266227722882299330334335533663377338833994404454466447744884499550556557755885599660667668866997707787799880889990100
お題:入力された手牌が最短で何向聴かとその役は何かを出力する。役なしの場合は役なしと表示する。
>>435 Squeak Smalltalk
| champernowne |
champernowne := (1 to: 100) inject: '0.' into: [:acc :n | acc, n].
^((1 to: 100) collect: [:n | (champernowne findString: n asString) -> n]) sort collect: #value
=> #(1 12 2 23 3 34 4 45 5 56 6 67 7 78 8 89 9 91 10 11 21 13 31 14 41 15 51 16 61 17
71 18 81 19 92 20 22 32 24 42 25 52 26 62 27 72 28 82 29 93 30 33 43 35 53 36 63 37
73 38 83 39 94 40 44 54 46 64 47 74 48 84 49 95 50 55 65 57 75 58 85 59 96 60 66 76
68 86 69 97 70 77 87 79 98 80 88 99 90 100)
>>435 ruby 1.8.6
s = (1..100).to_a.join
p (1..100).inject(Array.new(s.size){[]}) {|a, n| a[s.index(n.to_s)] << n; a}.flatten
↓
[1, 12, 2, 23, 3, 34, 4, 45, 5, 56, 6, 67, 7, 78, 8, 89, 9, 91, 10, 11, 21, 13,
31, 14, 41, 15, 51, 16, 61, 17, 71, 18, 81, 19, 92, 20, 22, 32, 24, 42, 25, 52,
26, 62, 27, 72, 28, 82, 29, 93, 30, 33, 43, 35, 53, 36, 63, 37, 73, 38, 83, 39,
94, 40, 44, 54, 46, 64, 47, 74, 48, 84, 49, 95, 50, 55, 65, 57, 75, 58, 85, 59,
96, 60, 66, 76, 68, 86, 69, 97, 70, 77, 87, 79, 98, 80, 88, 99, 90, 100]
>>435 HSP
sdim buf
repeat 100
buf+=str(cnt+1)
loop
repeat 100
p=instr(buf, 0, str(cnt+1))
addr(cnt)=(p<<8)|(cnt+1)
loop
for i, 0, 100-1
for j, 0, 100-1-i
if addr(j)>addr(j+1) {
t=addr(j)
addr(j)=addr(j+1)
addr(j+1)=t
}
next
next
repeat 100
mes addr(cnt)&$ff
loop
>>435 c
#include <stdio.h>
int midnum435(int l, int r) {
while (10 <= r) r /= 10;
return (l % 10) * 10 + r;
}
int main() {
int i = 0, a, b, c;
char printed[101] = {0};
for (i = 1; i <= 100; i++) {
a = i;c = i + 1;b = midnum435(a, c);
if (!printed[a] && (printed[a] = 1)) printf("%d ", a);
if (!printed[b] && (printed[b] = 1)) printf("%d ", b);
if (!printed[c] && (printed[c] = 1)) printf("%d ", c);
}
return 0;
}
↓
1 12 2 23 3 34 4 45 5 56 6 67 7 78 8 89 9 91 10 11 21 13 31 14 41 15 51 16 61 17
71 18 81 19 92 20 22 32 24 42 25 52 26 62 27 72 28 82 29 93 30 33 43 35 53 36 6
3 37 73 38 83 39 94 40 44 54 46 64 47 74 48 84 49 95 50 55 65 57 75 58 85 59 96
60 66 76 68 86 69 97 70 77 87 79 98 80 88 99 90 100
>>435 HSP
sdim buf
repeat 100
buf+=str(cnt+1)
loop
l=strlen(buf)
dim flag, 100+1
repeat l
s=cnt
repeat 3, 1
n=int(strmid(buf, s, cnt))
if 1<=n and n<=100 {
if flag(n)=0 : mes n : flag(n)=1
}
loop
loop
>>435 ; Common Lisp
(mapcar #'cdr (sort (loop with n = 100
for i from 1 to n
for s = (prin1-to-string i)
for champernowne = (concatenate 'string "0." s) then (concatenate 'string champernowne s)
collect (cons (search s champernowne) i))
#'< :key #'car))
>>435 Io
Range
c:=1 to(100)asList join
1 to(100)map(i,list(c findSeq(i asString),i))sort map(last)
446 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/12/10(火) 11:43:40.64
お題:枠組みを決めて画像を貼り付けるだけで誰でも簡単にホームページが作れるソフト。
>>435 J
5 20 $ (/: (({.@I.@E.&":)"0 1 ([:;":&.>)))1+i.100
1 12 2 23 3 34 4 45 5 56 6 67 7 78 8 89 9 91 10 11
21 13 31 14 41 15 51 16 61 17 71 18 81 19 92 20 22 32 24 42
25 52 26 62 27 72 28 82 29 93 30 33 43 35 53 36 63 37 73 38
83 39 94 40 44 54 46 64 47 74 48 84 49 95 50 55 65 57 75 58
85 59 96 60 66 76 68 86 69 97 70 77 87 79 98 80 88 99 90 100
お題:与えられた配列をなるべくN等分せよ。 要素の順番は入れ替えず、配列の配列として返す。 Nは1以上とする。 データ構造は、リスト、ベクタ、タプルなどでも可。 回答例およびチェック用出力例: ruby 1.8.6 def narudiv(a, n) d, m = a.size.divmod(n) (1..n).map {|i| a.slice!(0, d + (i <= m ? 1 : 0))} end p narudiv((1..10).to_a, 3) p narudiv((1..15).to_a, 4) ↓ [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]] [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15]]
>>449 HSP
#module arr_mod m_data, m_data_num
#modfunc arr_add int data
m_data(m_data_num)=data
m_data_num++
return
#modcfunc arr_info local ret
ret=""
repeat m_data_num
if cnt : ret+=","
ret+=strf("%d", m_data(cnt))
loop
return ret
#deffunc arrdiv array result, array arr, int N, local i
dimtype result, 5
repeat N
newmod result, arr_mod
work=result.cnt
repeat limit(length(arr)*(cnt+1)/N-i, 0, $7fffffff)
arr_add work, arr(i)
i++
loop
loop
return
#deffunc result_disp array result
foreach result : mes strf("[%s]", arr_info(result(cnt))) : loop
return
#global
repeat 10 : arr(cnt)=cnt+1 : loop
arrdiv result, arr, 3
result_disp result
>>449 ; Common Lisp
; 末尾再帰ではないけれど
(defun narudiv (a n)
(if (zerop n)
nil
(let ((d (ceiling (length a) n)))
(cons (subseq a 0 d) (narudiv (subseq a d) (1- n))))))
(narudiv (loop for i from 1 to 10 collect i) 3) ; ((1 2 3 4) (5 6 7) (8 9 10))
(narudiv (loop for i from 1 to 15 collect i) 4) ; ((1 2 3 4) (5 6 7 8) (9 10 11 12) (13 14 15))
>>449 J
f=:4 :'((1+<.((#y)%x)*i.1+x) +/@(=/) y)<;.1 y'
3 f 1+i.10
+-----+-----+--------+
|1 2 3|4 5 6|7 8 9 10|
+-----+-----+--------+
5 f 1+i.15
+-----+-----+-----+--------+--------+
|1 2 3|4 5 6|7 8 9|10 11 12|13 14 15|
+-----+-----+-----+--------+--------+
6 f 1+i.15
+---+-----+---+------+-----+--------+
|1 2|3 4 5|6 7|8 9 10|11 12|13 14 15|
+---+-----+---+------+-----+--------+
>>449 -- Haskell
f449 :: Int -> [a] -> [[a]]
f449 n xs = if n >= 1 then f m xs
else error $ "invalid number: " ++ show n
where
(d, m) = length xs `divMod` n
f _ [] = []
f k ys = as : f (k - i) bs
where
i = signum k
(as, bs) = splitAt (d + i) ys
main = do
print $ f449 4 [1..15]
print $ f449 3 [1..10]
print $ f449 6 [1..10]
print $ f449 3 [1..9]
print $ f449 0 [1..9]
>>449 Squeak Smalltalk
| naruDiv |
naruDiv := [:arr :N |
| stream d m |
stream := arr readStream.
d := stream size // N.
m := stream size \\ N.
(1 to: N) collect: [:idx | stream next: d + (idx <= m ifTrue: [1] ifFalse: [0])]
].
naruDiv value: (1 to: 10) value: 3. "=> #(#(1 2 3 4) #(5 6 7) #(8 9 10)) "
naruDiv value: (1 to: 15) value: 4. "=> #(#(1 2 3 4) #(5 6 7 8) #(9 10 11 12) #(13 14 15)) "
>>449 Io
Range
f := method(x, n,
a := x size / n
1 to(n) map(i, x slice((i - 1) * a, i * a))
)
Io> f(1 to(10)asList,3)
==> list(list(1, 2, 3), list(4, 5, 6), list(7, 8, 9, 10))
Io> f(1 to(15)asList,4)
==> list(list(1, 2, 3), list(4, 5, 6, 7), list(8, 9, 10, 11), list(12, 13, 14, 15))
>>449 @Mathematica
almostEquallyDivide[lst_,n_]:=Module[{div1,div2},
div1=lst//
Quotient[Last[#],n]&//
Table[#,{i,n}]&;
div2=lst//
Mod[Last[#],n]&//
Table[1,{i,#}]&//
PadRight[#,n]&;
div1+div2//
Accumulate//
Prepend[#,0]&//
Partition[#,2,1]&//
Map[{#[[1]]+1,#[[2]]}&,#]&//
Map[Take[lst,#]&,#]&
];
In := almostEquallyDivide[Range[1,10],3]
Out = {{1,2,3,4},{5,6,7},{8,9,10}}
In := almostEquallyDivide[Range[1,15],4]
Out = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15}}
>>449 N=3で10要素だと、解は3通りあるけれど、1解で良いの?
>>449 Haskell
>>445 のパクリ
g :: Float -> [a] -> [[a]]
g n xs = map (\i -> take (ceiling $ a) $ drop (ceiling $ (i - 1) * a) xs) [1..n]
where a = (fromIntegral $ length xs) / n
newを恐れないなんて、そこにシビれるあこがれる〜。
お題:与えられた文字列中の各文字数をカウントして表示せよ。 表示順や形式は定めない。 回答例およびチェック用出力例: c #include <stdio.h> void check(const char *cs) { int i, counts[256] = {0}; for (i = 0; cs[i] != '\0'; i++) counts[cs[i]] += 1; for (i = 0; i < 256; i++) { if (counts[i]) printf("'%c'=>%d, ", (char)i, counts[i]); } } int main() { check("We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris."); return 0; } ↓ ' '=>16, ','=>2, '.'=>1, ':'=>1, 'W'=>1, 'a'=>7, 'b'=>1, 'c'=>2, 'd'=>2, 'e'=>14 , 'f'=>1, 'g'=>3, 'h'=>3, 'i'=>6, 'l'=>4, 'm'=>3, 'n'=>4, 'o'=>6, 'p'=>3, 'r'=>8 , 's'=>4, 't'=>6, 'u'=>4, 'v'=>2, 'w'=>1, 'y'=>1, 'z'=>1,
>>465 Squeak Smalltalk
| str |
str := 'We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris.'.
^str asBag sortedElements
=> {Character space->16 . $,->2 . $.->1 . $:->1 . $W->1 . $a->7 . $b->1 . $c->2 . $d->2 . $e->14 .
$f->1 . $g->3 . $h->3 . $i->6 . $l->4 . $m->3 . $n->4 . $o->6 . $p->3 . $r->8 .
$s->4 . $t->6 . $u->4 . $v->2 . $w->1 . $y->1 . $z->1}
>>465 s="We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris."
dim count, 256
repeat strlen(s)
count(peek(s, cnt))++
loop
foreach count
if count(cnt) : mes strf("'%c'->%d", cnt, count(cnt))
loop
安価だらけと解釈されてBB2Cが荒らし扱いしよるぐぬぬ
470 :
465 :2013/12/11(水) 22:38:04.92
>>468 その点、マジすみません。書き込んだ直後にアッと思いました。
出力結果を省いていただくか、
">%d"の形にならないように出力していただければ幸いです…。
>>465 J
load 'misc'
nubcount 'hello'
+-+-+
|h|1|
+-+-+
|e|1|
+-+-+
|l|2|
+-+-+
|o|1|
+-+-+
JSで愚直に var s="hello,world!!";var r={};for(var i=0 ; i<s.length ; i++){if(!r[s.charAt(i)])r[s.charAt(i)]=0;r[s.charAt(i)]++}console.log(r); コンソール出力結果(改行省略) !: 2 ,: 1 d: 1 e: 1 h: 1 l: 3 o: 2 r: 1 w: 1 __proto__: Object
>>465 Io
Range
a:="hello";
0 to(a size-1)map(i,a at(i)asCharacter)uniqueCount
==> list(list("h", 1), list("e", 1), list("l", 2), list("o", 1))
>>472 は
>>465 の解答でしたスマソ
謝罪ついでに12文字減らせたので改めて
>>465 var s="hello,world!!";var r={};for(var i=0 ; i<s.length ; i++){var t=s.charAt(i);if(!r[t])r[t]=0;r[t]++}console.log(r);
結果は
>>472 と同
>>465 java 1.6
import java.util.*;
public class Odai465 {
private void check(String s) {
char[] cs = s.toCharArray();
Map<Character, Integer> map = new TreeMap<Character, Integer>();
for (int i = 0; i < cs.length; i++) {
Character c = new Character(cs[i]);
int last = !map.containsKey(c) ? 0 : map.get(c).intValue();
map.put(c, new Integer(last + 1));
}
System.out.println(map);
}
public static void main(String[] args) {
Odai465 odai = new Odai465();
odai.check("We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris.");
}
}
↓
{ =16, ,=2, .=1, :=1, W=1, a=7, b=1, c=2, d=2, e=14, f=1, g=3, h=3, i=6, l=4, m=
3, n=4, o=6, p=3, r=8, s=4, t=6, u=4, v=2, w=1, y=1, z=1}
お題:バブルソートとその変形であるコムソートの実行時間を比較する。
480 :
478 :2013/12/12(木) 00:56:34.49
あー、バブルソートで実装したのは時間なかったからだ。 For文2個覚えておけばいいので簡単なんだよ。計算量はともかく・・・。
>>465 Clojure
(->> "We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris."
seq sort (group-by identity) (map (fn [[k v]] [(str k) (count v)])))
>>465 @Mathematica
countCharacters[str_]:=str//
Characters//
Tally;
In := countCharacters["We will encourage you to develop the three great
virtues of a programmer: laziness, impatience, and hubris."]
Out = {{W,1},{e,14},{ ,16},{w,1},{i,6},{l,4},{n,4},{c,2},{o,6},{u,4},{r,8},
{a,7},{g,3},{y,1},{t,6},{d,2},{v,2},{p,3},{h,3},{s,4},{f,1},{m,3},
{:,1},{z,1},{,,2},{b,1},{.,1}}
イテレータでコムソート実装するの面倒くさいな。俺の場合なんか汚くなるわ。
現状綺麗とは言わないがなるべく無駄は無いはずだ。いや、俺が無駄って話は置いといて・・・。
>>483 短っ!!
アン ドゥ トロワ。・・・ポン! 魔法やがな。
486 :
デフォルトの名無しさん :2013/12/12(木) 04:12:29.04
>>465 with python
//@@
strAt=("We will encourage you to develop the three great virtues of a programmer:"
"laziness, impatience, and hubris.")
dct={}
[dct.update({ch:dct[ch]+1}) if ch in dct else dct.update({ch:1}) for ch in strAt]
print sorted(zip(dct.keys(), dct.values()), key=lambda x:x[1])[::-1]
//@@@
[(' ', 16), ('e', 14), ('r', 8), ('a', 7), ('t', 6), ('o', 6), ('i', 6), ('u', 4),
('s', 4), ('n', 4), ('l', 4), ('p', 3), ('m', 3), ('h', 3), ('g', 3), ('v', 2),
('d', 2), ('c', 2), (',', 2), (':', 1), ('y', 1), ('w', 1), ('f', 1), ('z', 1),
('.', 1), ('W', 1), ('b', 1)]
one-liner だと書き込めないので ばらした
>>478 バブルソートを覚えておくよりも、挿入ソートを覚えていた方が使い回しが利いたのに。
30年前、パソコンベーシックで実装されたマージャンゲームのツモったときの処理が最小値ソートで余りにも遅いので挿入ソートで置き換えた。
そこでお題、ツモったときに挿入ソートをすることには最小値ソートと比べてどんなメリットがあるか述べよ。なんてねw
今時なら、たった13個のデータのソートなんて何をどうしても誤差だからなぁ。
489 :
483 :2013/12/12(木) 09:21:57.79
>>479 Squeak Smalltalk
| bubbleSort combSort |
bubbleSort := [:arr |
arr size - 1 to: 1 by: -1 do: [:limit |
1 to: limit do: [:idx |
(arr at: idx) > (arr at: idx + 1) ifTrue: [arr swap: idx with: idx + 1]]].
arr].
combSort := [:arr |
| width size |
width := size := arr size.
[ width := width // 1.3 min: 1.
[ | changed |
changed := false.
1 to: size - width do: [:idx |
(arr at: idx) > (arr at: idx + width)
ifTrue: [changed := true. arr swap: idx with: idx + width]].
changed] whileTrue.
width = 1] whileFalse.
arr].
^{#bubble. bubbleSort. #comb. combSort} pairsCollect: [:sym :sort |
| shuffled |
shuffled := (1 to: 1000) asArray shuffled.
sym -> [1000 timesRepeat: [sort value: shuffled]] timeToRun]
"=> {#bubble->13807 . #comb->80} "
>>490 いろいろと間違っているみたいなので取り下げます。ごめんなさい。
>>479 Squeak Smalltalk 訂正版。スレ汚しすみません。
| bubbleSort combSort |
bubbleSort := [:arr |
arr size - 1 to: 1 by: -1 do: [:limit |
1 to: limit do: [:idx |
(arr at: idx) > (arr at: idx + 1) ifTrue: [arr swap: idx with: idx + 1]]].
arr].
combSort := [:arr |
| width size |
width := size := arr size.
[ | changed |
changed := false.
width := width // 1.3 min: 1.
1 to: size - width do: [:idx |
(arr at: idx) > (arr at: idx + width)
ifTrue: [changed := true. arr swap: idx with: idx + width]].
width = 1 and: [changed]] whileFalse.
arr].
^{#bubble. bubbleSort. #comb. combSort} pairsCollect: [:sym :sort |
sym -> [1000 timesRepeat: [sort value: (1 to: 1000) asArray shuffled]] timeToRun]
"=> {#bubble->36401 . #comb->671} "
>>465 perl -e '$_=$ARGV[0]; while (/(.)/g) {$h{$1}++;} foreach (sort keys %h) {printf("\"%s\" => %s\n", $_, $h{$_});}' "We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris."
>>492 すいません。コムソートがgdgdでした。三度目の正直…
combSort := [:arr |
| width size |
width := size := arr size.
[ | changed |
changed := false.
width := width // 1.3 max: 1.
1 to: size - width do: [:idx |
(arr at: idx) > (arr at: idx + width)
ifTrue: [changed := true. arr swap: idx with: idx + width]].
width = 1 and: [changed not]] whileFalse.
arr].
self assert: (combSort value: #(5 4 3 2 1)) isSorted.
結果も少し変わります。
"=> {#bubble->36993 . #comb->1817} "
496 :
495 :2013/12/12(木) 14:02:35.43
書き換える途中でミスったのか結果が違ってる
497 :
495 :2013/12/12(木) 14:09:54.34
>>479 #include "d3m.hsp"
#module
#deffunc swap var a, var b, local c
c=a : a=b : b=c : return
#deffunc bubble_sort array data, int data_num
repeat data_num-1
repeat data_num-1-cnt
if data(cnt)>data(cnt+1) : swap data(cnt), data(cnt+1)
loop
loop
return
#deffunc comb_sort array data, int data_num, local h, local f
h=data_num*10/13
repeat
f=0
repeat data_num-h
if data(cnt)>data(cnt+h) : swap data(cnt), data(cnt+h) : f=1
loop
if h>1 : h=h*10/13 : else : if f=0 : break
loop
return
#global
#const DATA_NUM 10000
dim data_org, DATA_NUM : dim data, DATA_NUM
repeat DATA_NUM : data_org(cnt)=rnd(10000) : loop
memcpy data, data_org, 4*DATA_NUM
s=d3timer() : bubble_sort data, DATA_NUM : e=d3timer()
mes strf("bubble_sort %.3f [sec]", 0.001*(e-s))
memcpy data, data_org, 4*DATA_NUM
s=d3timer() : comb_sort data, DATA_NUM : e=d3timer()
mes strf("comb_sort %.3f [sec]", 0.001*(e-s))
>>479 Haskell リストではコムソートをそのままの意味で実装するのは無理っぽいのでパス
>>465 @Python 2.7
def countCharacters(string):
def characters(string):
lst = []
for i in range(0,len(string)):
lst = lst + [string[i]]
return lst
def tally(lst):
import collections
cnt = collections.Counter()
for number in lst:
cnt[number] += 1
return map(lambda x: list(x), cnt.items())
return tally(characters(string))
print countCharacters("We will encourage you to develop the three great ¥
virtues of a programmer: laziness, impatience, and hubris.")
[[' ', 16], [',', 2], ['.', 1], [':', 1], ['W', 1], ['a', 7], ['c', 2],
['b', 1], ['e', 14], ['d', 2], ['g', 3], ['f', 1], ['i', 6], ['h', 3],
['m', 3], ['l', 4], ['o', 6], ['n', 4], ['p', 3], ['s', 4], ['r', 8],
['u', 4], ['t', 6], ['w', 1], ['v', 2], ['y', 1], ['z', 1]]
お題:再帰を使わずにアッカーマン関数を書け。
>>487 ウィキペディア情報だと計算量が挿入ソートはオーダーがN^2なので、俺の書いたバブルソートより遅いよ。
俺の書いた最速バブルソートはオーダーはN*(N/2-1)位なので多少早い。ホント微妙に。
シェルソートにすればいいんだろうけど、単純さでバブルソート最強説をとるね。
それに記憶に刻まれてて変えるのも難しい。でも、コムソートはぜひ覚えたい位の計算オーダーだな。
>>504 >オーダーはN*(N/2-1)位
それもΟ(N^2) というんだよ
挿入ソートもバブルソートもΟ(N^2) という意味では同等
>>502 HSP
#module
#defcfunc ack int m, int n
switch m
case 0 : return n+1
case 1 : return 2+(n+3)-3
case 2 : return 2*(n+3)-2
case 3
if n<=28 : return (1<<(n+3))-3
swbreak
case 4
if n=0 : return 13
if n=1 : return 65533
swbreak
case 5
if n=0 : return 65533
swbreak
swend
mes "Overflow"
return -1
#global
mes ack(3, 28)
>>465 python3
s = "We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris."
[print('{}: {}'.format(char, s.count(char))) for char in set(s)]
509 :
508 :2013/12/12(木) 18:34:58.23
こっちのほうが見やすいか print(['{}: {}'.format(char, s.count(char)) for char in set(s)])
>>504 ソート済み配列に一データ追加する場合のコストを比較してみよう。
>>505 あれ?そうなの??
一応N^2の半分位のオーダーになってるんだけどな。
うーん。残念だ。
オーダー記法では、O(N) = O(N/2)だな。
>>511 (N^2)/1000 だろうが (N^2)*1000 だろうが係数は無視して O(N^2) って表現することになってる
>>510 末尾に一個何らかの値をプッシュバックした場合のソートだと挿入ソートはブロックで移動するので多少マシかな。
でもソート済み判定を途中で入れるとなるとそれはそれで処理食うし。よほどデータ量無いとあんまりペイしないなー。
>>512-513 おぉ。こりゃ勉強になる。
もっと厳密な値だと思ってたよ。
そんなにアバウトだったのか・・・。
説明すると、二重ループの外側はNなんだけど、
内側は外側のカウンタと同じ値まではソート済みなので、内側の開始条件が外側のカウンタから始めても問題無い。
っていう改良なんだけど。なので、内側は、平均でN/2になるんだよ。
スワップ回数でオーダー測ってると思ってたんだけど、どういう計算なんだろう?
わからなくなってきた。
>>465 ruby 1.8.6
def f465(s)
s.scan(/./).inject(Hash.new(0)) {|h, c| h[c]+= 1; h}.sort.map{|a| '('+a.join+')'}.join
end
puts f465("We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris.")
↓
( 16)(,2)(.1)(:1)(W1)(a7)(b1)(c2)(d2)(e14)(f1)(g3)(h3)(i6)(l4)(m3)(n4)(o6)(p3)(r
8)(s4)(t6)(u4)(v2)(w1)(y1)(z1)
>>465 Objective Caml version 3.08.1
module CharMap = Map.Make (Char);;
let countup c m =
let n = if CharMap.mem c m then succ (CharMap.find c m) else 1 in
CharMap.add c n m;;
let s2cs s =
let rec _s2cs i l = if i < 0 then l else _s2cs (i - 1) (s.[i] :: l) in
_s2cs (String.length s - 1) [];;
let f465 s =
let m = List.fold_left (fun m c -> countup c m) CharMap.empty (s2cs s) in
CharMap.iter (fun key value -> Printf.printf "(%c%d)" key value) m;;
f465 "We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris.";;
↓
( 16)(,2)(.1)(:1)(W1)(a7)(b1)(c2)(d2)(e14)(f1)(g3)(h3)(i6)(l4)(m3)(n4)(o6)(p3)(r
8)(s4)(t6)(u4)(v2)(w1)(y1)(z1)
>>502 Squeak Smalltalk
| Ack |
Ack := [:m :n |
m caseOf: {
[0]->[n+1].
[1]->[n+2].
[2]->[2*n+3].
[3]->[(2 raisedTo: n+3)-3].
[4]->[((2 to: n+3) inject: 2 into: [:acc :idx | 2 raisedTo: acc])-3]}
].
Ack value: 4 value: 0. "=> 13 "
Ack value: 4 value: 1. "=> 65533 "
Ack value: 4 value: 2. "=> 2003529930...5719156733 "
俺のこの無知をさらけ出した時のしらけ感。 もっとナジって。あはぁーん。
Smalltalkの速度は今どのくらい出るん? JITコンパイラ入った?
ぱーりん・のいず!
>>479 c
数年前にその二つのソートをcで書いてたので基本的にコピペ。
時間経過はとりあえずclock()で測ったがベストかどうか不明。
あと、バブルソートが遅すぎるのでバグっているのかもしれない。
ttp://codepad.org/WH8cwslm 配列の要素数を30000にしたらタイムアウト。
ttp://ideone.com/8wYrg9 サイトを変えたがタイムアウト。
要素数だけ25000に変更したら結果を出してくれたが、
バブルソートが遅すぎて比較にならない。
ちなみに、テスト環境では要素数30000で、
qsort: 0.015000
bsort: 20.266000
csort: 0.047000
という具合。
お題:このスレの次スレを検索する
次スレのスレタイ:「プログラミングのお題 Part2」「プログラミングの問題を出すスレ」
スレタイリスト(
http://toro.2ch.net/tech/subject.txt )を適当に編集してシミュレートせよ
出力:候補ベスト3に入るようにせよ(以下例)
1. プログラミングの問題を出すスレ
2. プログラミングのお題 Part2
3. 日本語プログラミング言語『なでしこ』スレ5
よくわかんないな
526 :
523 :2013/12/14(土) 22:00:11.44
つまり、スレタイリストからこのスレに似てるタイトルを 3つ抽出せよ。アルゴリズムは問わない。とかそんな感じ?
その通りです
# -*- coding: UTF-8 -*- # ruby1.9.3 a=["推薦図書/必読書のためのスレッド 71", "Windowsストアアプリ開発について語れ", "C#,C#の宿題片付けます。", "C言語なら俺に聞け(入門編)Part 123", "バージョン管理システムについて語るスレ9", "プログラミングの問題を出すスレ", "C++相談室 part108", "プログラミングのお題 Part2", "C言語なら俺に聞け(入門編)Part 122", "VBScriptについて必死に話し合うスレ", "Lisp Scheme Part37", "構造化ウェブプログラミング言語Dart2"] b="プログラミングのお題スレ".split('') c=a.map { |e|[e.size-(e.split('')-b).size,e]}.sort.reverse[0,3].map { |e| puts e[1] }
>>528 ああ、わかった、わかった。
スレタイリストにこのスレの次スレタイトル案を加えて
たとえ細部の表現が多少変わった場合でも
それが上位に来るようなソートができるコードを書けっていう
そういうことね。
つまりレーベンシュタイン距離ね
お題:与えられた正の整数を2進文字列表現で出力せよ。 回答例およびチェック用出力例: c #include <stdio.h> #include <limits.h> void printbits(unsigned int n) { int i; for (i = sizeof (int) * 8 - 1; 0 <= i; i--) { printf("%c", n & (1 << i) ? '1' : '0'); } puts(""); } void check(unsigned int n) { printf("%u\n", n); printbits(n); } int main() { check(0); check(1); check(UINT_MAX); return 0; } ↓ 0 00000000000000000000000000000000 1 00000000000000000000000000000001 4294967295 11111111111111111111111111111111
535 :
534 :2013/12/15(日) 20:31:17.94
捕捉: 文字列左側はゼロで埋めても埋めなくてもいい。 00000000000000000000000000000001 でなくて、 1 でもいい。
>>534 C++
#include <iostream>
#include <limits>
#include <string>
#include <bitset>
using namespace std;
template <typename Integer> string binary_string(Integer n) {
return bitset<sizeof(n) * 8>(n).to_string();
}
template <typename Integer> void test_binary_string(Integer n) {
cout << n << " -> " << binary_string(n) << endl;
}
int main() {
test_binary_string('A');
test_binary_string(L'あ');
test_binary_string<unsigned short>(54321);
test_binary_string(0);
test_binary_string(1);
test_binary_string(numeric_limits<unsigned int>::max());
test_binary_string(0xaaaaaaaaaaaaaaaa);
}
>>534 #module
#defcfunc binary_str int x, local buf
sdim buf
repeat 32
if x & (1<<(31-cnt)) : buf+="1" : else : buf+="0"
loop
return buf
#global
mes binary_str(0)
mes binary_str(1)
mes binary_str(4294967295)
>>534 #ruby1.9.3
p 123.to_s(2)
>>534 Prolog
'与えられた正の整数を2進文字列表現で出力せよ。'(_与えられた正の整数) :-
与えられた正の整数を(_与えられた正の整数),
'2進文字列表現で'(_与えられた正の整数,[],_2進文字列表現),
出力せよ(_2進文字列表現).
与えられた正の整数を(_与えられた正の整数) :-
integer(_与えられた正の整数),
_与えられた正の整数 > 0.
'2進文字列表現で'(0,L,_2進文字列表現) :-
atomic_list_concat(L,_2進文字列表現),!.
'2進文字列表現で'(_正の整数,L,_2進文字列表現) :-
_2で割った商 is _正の整数 // 2,
_2で割った剰余 is _正の整数 mod 2,
'2進文字列表現で'(_2で割った商,[_2で割った剰余|L],_2進文字列表現).
出力せよ(_2進文字列表現) :-
writef('%t\n',[_2進文字列表現]).
お題:正方形領域[i,j]内部の点(x,y)を{ 100*i <= x < 100*(i+1) , 100*j <= y < 100*(j+1) }と定義します。 単調増加もしくは単調減少関数であるy=f(x)が通過する正方形領域[i,j]を全て求めよ。
541 :
540 :2013/12/16(月) 01:34:26.95
補足 y=f(x) の定義域はx0<=x<=x1としますw
542 :
540 :2013/12/16(月) 01:43:56.52
もう1つ補足 i,jは整数です
すみません問題を整理します。 i,jは整数、 x,yは実数、 領域[i,j]内部の点(x,y)を100*i<=x<100*(i+1),100*j<=y<100*(y+1)と定義する。 定義域がx0 <= x <=x1である単調関数y=f(x) が通過する領域[i,j]を全て求めよ。
544 :
デフォルトの名無しさん :2013/12/16(月) 02:01:30.09
うぅああもうやになった100*(y+1)は100*(j+1)です
>>534 ほぼそのままだが、printbitsの変数がビットパターンになってるのが好き。
登場する型名が unsigned int に統一されるのも気持ちいい。
/*前略*/
#define ___ /* empty */
void printbits(unsigned int n) {
___ unsigned int bit;
___ ___ for (bit = 1U << (sizeof(unsigned int)*8 - 1); bit>=1U; bit>>=1) { /* MSB to LSB */
___ ___ printf("%c", n & bit ? '1' : '0');
___ }
___ puts("");
}
/*後略*/
↑インデント間違えたw
printf("%c", ...)はfputc(..., stdout)にしたいところだな。
>>523 Squeak Smalltalk
| key titles |
key := 'プログラミングのお題スレ'.
titles := #('推薦図書/必読書のためのスレッド 71'
'Windowsストアアプリ開発について語れ'
'C#,C#の宿題片付けます。'
'C言語なら俺に聞け(入門編)Part 123'
'バージョン管理システムについて語るスレ9'
'プログラミングの問題を出すスレ'
'C++相談室 part108'
'プログラミングのお題 Part2'
'C言語なら俺に聞け(入門編)Part 122'
'VBScriptについて必死に話し合うスレ'
'Lisp Scheme Part37'
'構造化ウェブプログラミング言語Dart2').
(titles sortBy: [:a :b | (a alike: key) > (b alike: key)]) asArray first: 3
=> #('プログラミングのお題 Part2'
'プログラミングの問題を出すスレ'
'VBScriptについて必死に話し合うスレ')
>>534 Squeak Smalltalk
4294967295 radix: 2
=> '11111111111111111111111111111111'
>>534 JDK1.0.2以降
String s = Integer.toBinaryString(Integer.MAX_VALUE);
555 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/12/16(月) 22:09:42.00
お題:円の中心点と半径が与えられるとき、その円と円の内部に 含まれる格子点(座標成分がすべて整数になる点)の個数を数える。 例) ? 1 1 1 5 ? 0.5 0.5 1 4
556 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/12/16(月) 22:24:10.88
お題:球の中心点と半径が与えられるとき、その球面と球の内部に 含まれる格子点(座標成分がすべて整数になる点)の個数を数える。 例) ? 1 1 1 1 7 ? 0.5 0.5 0.5 1 8
bool inside(double x,double y,double x0,double y0,double r0) { return (x - x0)*(x - x0)+(y - y0)*(y - y0)<=r0*r0; } int count(double x0,double y0,double r0) { int c=0; for (int y=y0-r0; y<=y0+r0+1; y++) for (int x=x0-r0; x<=x0+r0+1; x++) if (inside(x,y,x0,y0,r0))c++; return c; }
種明かしみたいで嫌なんですけど
>>556 Squeak Smalltalk
| latticePointsInSphere |
latticePointsInSphere := [:ori :r |
| x0 y0 z0 range count |
x0 := ori first. y0 := ori second. z0 := ori third.
count := 0.
((range := r negated to: r) + x0) floor do: [:x |
(range + y0) floor do: [:y |
(range + z0) floor do: [:z |
(x - x0 raisedTo: 2) + (y - y0 raisedTo: 2) + (z - z0 raisedTo: 2) <= (r * r)
ifTrue: [count := count + 1]]]].
count].
latticePointsInSphere value: #(1 1 1) value: 1. "=> 7 "
latticePointsInSphere value: #(0.5 0.5 0.5) value: 1. "=> 8 "
>>534 Objective Caml version 3.08.1
let char_of_bits_at bits pos = if (bits land (1 lsl pos)) != 0 then '1' else '0';;
let chars_of_bits bits =
let rec f a pos =
if pos < 0 then a else f (char_of_bits_at bits pos::a) (pred pos) in
f [] 31;;
let f534 n =
print_int n;print_newline ();
List.iter (fun c -> print_char c) (List.rev (chars_of_bits n));
print_newline ();;
f534 0;;
f534 1;;
f534 Pervasives.max_int;;
↓
0
00000000000000000000000000000000
1
00000000000000000000000000000001
1073741823
00111111111111111111111111111111
お題:まず、適当に32ビット整数Xを決めて引数がXと同じなら0を、Xより 大きければ1を小さければ-1を返すaboutX関数を用意します。 この関数を使ってXを求める。
>>564 むか〜しの雑誌(初歩のラジオ)で、
「(BASICで書いた)aboutXがたまにウソをつく用に改変し、
(人間が)その関数を使ってXを求めてみよ」
ってのがあったよ。
567 :
565 :2013/12/17(火) 02:04:24.56
負の整数に対応できてなかった
>>555 ruby 1.8.6
class CircleBounds
def initialize(x, y, r)
@x, @y, @r = x, y, r
end
def contains(x, y)
(@x - x) ** 2 + (@y - y) ** 2 <= @r ** 2
end
end
def f555(x, y, r)
bounds = CircleBounds.new(x, y, r)
def irange(a, b) (a - b).to_i..(a + b).to_i end
xsys = irange(x, r).inject([]) {|a, ix| irange(y, r).inject(a) {|a, iy| a << [ix, iy]}}
points = xsys.select {|(x, y)| bounds.contains(x, y)}
p points.size
end
f555 1, 1, 1
f555 0.5, 0.5, 1
↓
5
4
570 :
565 :2013/12/17(火) 02:30:45.97
>>564 ruby 1.8.6
定番の解き方があるのかないのか分からないまま、
直感で加速させた。眠い時に書くとだいたいこうなる。
class C564
def initialize()
@x = rand(2147483647)
end
def aboutX(y)
@x == y ? 0 : @x < y ? 1 : -1
end
def answer
@x
end
end
obj = C564.new
i, a = 0, 1
while true
c = obj.aboutX(i)
break if c == 0
if 0 < c
a = 0 < a ? - 1 : a - 1
else
a = a < 0 ? 1 : a + 1
end
i += a
end
p i, obj.answer
>>564 HSP
#module
#deffunc aboutX_set int x
s_ans=x
return
#defcfunc aboutX int x
if x<s_ans : return -1
return x>s_ans
#global
aboutX_set -123456
s=$80000000
e=$7fffffff
repeat
c=(s+e)/2
r=aboutX(c)
if r=0 : break
if r>0 : e=c-1 : else : s=c+1
loop
mes c
>>564 HSP
>>573 の s+e が int の範囲を超える場合にバグってたのを修正
#module
#deffunc aboutX_set int x
s_ans=x
return
#defcfunc aboutX int x
if x<s_ans : return -1
return x>s_ans
#global
aboutX_set $7fffffff
s=$80000000
e=$7fffffff
repeat
c=int((double(s)+e)/2) // 修正
r=aboutX(c)
if r=0 : break
if r>0 : e=c-1 : else : s=c+1
loop
mes c
575 :
565 :2013/12/17(火) 03:40:55.38
576 :
565 :2013/12/17(火) 07:00:09.44
32bitのInt 解けないのでボツ
>>564 Squeak Smalltalk
| aboutX genAboutX guess max min sign |
genAboutX := [:X | [:arg | (arg - X) sign]].
aboutX := genAboutX value: 928790609.
min := -1 << 31. max := 1 << 31 - 1.
guess := (min to: max) atRandom.
[(sign := aboutX value: guess) = 0] whileFalse: [
sign < 0 ifTrue: [min := guess] ifFalse: [max := guess].
guess := (min + max) // 2].
^guess "=> 928790609 "
ARDUINOを使ってアナログ入力信号3つを、それぞれの信号の大きさで3段階に分けて3つのピンに出力させたいのですがまったくできません お願いします アナログIN→A/D変換→デジタルOUT この動作を3つのピンでしたいのです A0→D9 A1→D10 A2→D11 このピンになる様にしたいです
何がしたいのお前?
>>564 c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>
int nextint() {
return (rand() % 2 ? 1 : -1) * rand();
}
int aboutX(int x, int y) {
return x == y ? 0 : x < y ? 1 : -1;
}
int main() {
srand(time(NULL));
int x = nextint();
int low = INT_MIN, mid, high = INT_MAX, cmpvalue;
while (low <= high) {
mid = low / 2 + high / 2;
cmpvalue = aboutX(x, mid);
if (cmpvalue == 0) break;
else if (cmpvalue > 0) high = mid - 1;
else if (cmpvalue < 0) low = mid + 1;
}
printf("%d %d\n", x, mid);
return 0;
}
digitalWriteで出力か どちらにせよ書いてある通りにやってできない理由があるならそれをどうにかすればいいだけだろう
>>582 先に半分にすればいいのか。全く気付かなかった
やってみたけどなぜか上手くいかなかった
x = 2147483647 2147483647 / 2 = 1073741823 mid = 1073741823 + 1073741823 = 2147483646 x == 2147483646 -> False 以下ループ
>>575 >>572 のコードは、整数って0を分岐点にして増減の性質の対称性があるわけね。
プラスでもマイナスでも増えるっていうことは、+の動作なんよ。減るっていうことは-の動作なんよ。
ちょっと表現難しいけど。
んで、もし数字がマイナス側だったらフラグで対称性をひっくり返してやって、プラス動作と同等のことをやってる。
まぁ、短いコードだからこういうフェークが使えるんだよな。
なるほど
589 :
デフォルトの名無しさん :2013/12/18(水) 11:07:34.36
>>589 HSP
a=12
p_a=varptr(a)
b=3.45
p_b=varptr(b)
disp "a", "%d", a
disp "p_a", "0x%08X", p_a
disp "b", "%.2f", b
disp "p_b", "0x%08X", p_b
stop
#deffunc disp str name, str fmt, var x
mes strf("%s のアドレスは 0x%08X", name, varptr(x))
mes strf("%s の値は、"+fmt, name, x)
return
>>589 HSP
c='A'
p=varptr(c)
dupptr pc, p, 4
mes strf("%c", pc)
pc+=2
mes strf("%c", pc)
お題:文字列のアスキーコードの平均値を求め、その整数部分を アスキーコードとする文字を返す。 例 "BASIC" -> "F"
>>592 pokeで書いてpeekで読むのか
俺もやろうとしたけどmallocしてからどうすればいいのかわからずにprintfをforeign importして終わった
>>593 Haskell
import Data.Char
import Control.Arrow
main = putChar $ f "BASIC"
f = chr . uncurry div . (sum &&& length) . map ord
>>593 HSP
#module
#defcfunc ave_str str s_, local s, local sum, local len
s=s_
len=strlen(s)
repeat len
sum+=peek(s, cnt)
loop
return strf("%c", sum/len)
#global
mes ave_str("BASIC")
>>593 Squeak Smalltalk
'BASIC' asByteArray average integerPart asCharacter "=> $F "
c++で書くと答えになっちゃうので・・・。 あれだ、ポインタ?それって美味しいの? C++は参照とイテレータがあるのでポインタはnewするときくらいしか使いません。あと、ハード叩く時と。 そして、それで間に合ってます。
>>593 ; Common Lisp
(let ((str "BASIC"))
(code-char (floor (apply #'+ (map 'list (lambda (c) (char-code c)) str)) (length str))))
fortran興味あるけどgfortranやg95はすぐオーバーフローするし多倍長使うのが面倒で全然触ってない
誤爆
フォートランは自分から検索しないと文法すら見かけないな。 俺がC++使ってるのは、VCのデバッガあるからだし。
fortranやっぱ無理 エラーが意味不明
fortran使うなら、intelコンパイラがいいんじゃないか。確か用途によってはフリーだった気がする あとf95よりはf99の方が使いやすいらしい でも今はスパコンじゃなければ、Cの方が計算早いこと多いけどね
>>534 Arc
arc> (def to-binary (n) (coerce n 'string 2))
#<procedure: to-binary>
arc> (to-binary 255)
"11111111"
>>593 OCaml version 4.01.0
let s2cs s =
let rec _s2cs i l = if i < 0 then l else _s2cs (i - 1) (s.[i] :: l) in
_s2cs (String.length s - 1) [];;
let f593 s =
let sum = List.fold_left (fun sum c -> sum + int_of_char c) 0 (s2cs s) in
char_of_int (sum / String.length s);;
print_char (f593 "BASIC");;
↓
F
611 :
610 :2013/12/19(木) 01:13:48.69
>>610 おもろいな、おい。このスレのHaskellはあなたに任せました。ぼくは三年くらい修行してきます。
なんだいこれはw
ダミーの何もしない行とかよくできてるな、ほんとw
616 :
610 :2013/12/19(木) 01:30:39.36
617 :
デフォルトの名無しさん :2013/12/19(木) 01:45:41.79
>>593 with Python
strAt="BASIC"; chr(int(sum(ord(ch) for ch in strAt)/len(strAt)))
===============================
F
>>593 Arc
(def str-avg-char (str)
(coerce (trunc:avg (map int (coerce str 'cons))) 'char))
arc> (str-avg-char "ARC")
#\G
>>616 ありがとう!!
一枚目のもCで解いてくれると非常に嬉しいです
お題:原点を中心として最初に半径1の円をかく。そのあとすでにかかれた円より 大きく格子点を通る最小の円を順番にかいていく。n番目の円の半径は? 例 n=1 -> 1.00 n=2 -> 1.41 n=5 -> 2.82
>>621 Squeak Smalltalk
| radiusAt |
radiusAt := [:n |
| m |
m := (((8 * n + 1) sqrt - 1) / 2 + 1) asInteger.
((1 to: m) gather: [:x | (0 to: x) collect: [:y | (x@y) r]]) asSet asSortedArray at: n].
radiusAt value: 1. "=> 1 "
radiusAt value: 2. "=> 1.414213562373095 "
radiusAt value: 5. "=> 2.82842712474619 "
>>621 ruby 1.8.6
あってるかどうか分からない上に妙に無駄が多い。
def points(x)
(1..x).inject([]) {|a, y| a << x / Math.cos(Math.atan(y.to_f/x))}
end
def f621(n)
r = (1..n).inject([]) {|a, i| a << points(i) << i.to_f}.flatten.uniq.sort[n - 1]
puts 'n=' + n.to_s + ' -> ' + r.to_s
end
f621 1
f621 2
f621 5
↓
n=1 -> 1.0
n=2 -> 1.41421356237309
n=5 -> 2.82842712474619
>>622 Squeak Smalltalk 。いろいろとダメだったので差し替え。
| radiusAt |
radiusAt := [:n |
| set x |
set := Set new.
x := 1.
[set size < n] whileTrue: [(0 to: x) do: [:y | set add: (x@y) r.]. x := x+1].
set asSortedArray at: n].
radiusAt value: 1. "=> 1 "
radiusAt value: 2. "=> 1.414213562373095 "
radiusAt value: 5. "=> 2.82842712474619 "
>>623 ruby 1.8.6 ちょろっと整理。あとpointsって何だpointsって修正。
def f621(n)
def rs(x) (0..x).inject([]) {|a, y| a << x / Math.cos(Math.atan(y.to_f/x))} end
r = (1..n).inject([]) {|a, i| a += rs(i)}.uniq.sort[n - 1]
puts 'n=' + n.to_s + ' -> ' + r.to_s
end
>>621 HSP
#module
#deffunc data_add int v, local s, local e, local c, local h
s=0 : e=s_data_num-1
repeat
if s>e : break
c=(s+e)/2
if s_data(c)=v : h=-1 : break
if s_data(c)>v : e=c-1 : h=c : else : s=c+1 : h=c+1
loop
if h<0 : return
s_data(s_data_num)=0
memcpy s_data, s_data, 4*(s_data_num-h), 4*(h+1), 4*h
s_data(h)=v : s_data_num++
return
#defcfunc nth_circle int n, local r_max, local y_max, local d, local d_num, local x, local y, local i, local j
if n<s_data_num : return sqrt(s_data(n))
repeat
for x, 0, s_r+1
for y, int(sqrt((s_r-1)*(s_r-1)-x*x-0.1)), x+1
if x*x+y*y>s_r*s_r : _break
data_add x*x+y*y
next
next
s_r++
if s_data_num>n : break
loop
return nth_circle(n)
#global
repeat 20, 1
mes strf("n=%d -> %.10f", cnt, nth_circle(cnt))
loop
>>621 HSP
>>626 から使ってない変数削除と少しコードの短縮
#module
#deffunc data_add int v, local s, local e, local c, local h
s=0 : e=s_data_num-1
while 1
if s>e : _break
c=(s+e)/2
if s_data(c)=v : return
if s_data(c)>v : e=c-1 : h=c : else : s=c+1 : h=c+1
wend
s_data(s_data_num)=0
memcpy s_data, s_data, 4*(s_data_num-h), 4*(h+1), 4*h
s_data(h)=v : s_data_num++
return
#defcfunc nth_circle int n, local x, local y
while 1
if n<s_data_num : return sqrt(s_data(n))
for x, int(sqrt(s_r*s_r/2-0.1)), s_r+1
for y, int(sqrt((s_r-1)*(s_r-1)-x*x-0.1)), x+1
if x*x+y*y>s_r*s_r : _break
data_add x*x+y*y
next
next
s_r++
wend
#global
repeat 20, 1
mes strf("n=%d -> %.10f", cnt, nth_circle(cnt))
loop
>>625 ruby 1.8.6
とりあえず、余計に計算させるのを止めさせた。
あと、ピタゴラスさんのことを考えると俺の顔面はスイカの断面より真っ赤になる。
def f621(n)
def r(x, y) Math.sqrt(x * x + y * y) end
def succ(x, y) x == y ? [x + 1, 0] : [x, y + 1] end
rs, x, y = Hash.new(0), 1, 0
while rs.size < n
rs[r(x,y)] += 1
x, y = succ x, y
end
puts 'n=' + n.to_s + ' -> ' + rs.keys.sort[n - 1].to_s
end
f621 1
f621 2
f621 5
>>628 のデバッグ版。最小限に出そうとしてちょっとケア不足だった。
そもそも、あってるかどうかは分からない。
def f621(n)
def r(x, y) Math.sqrt(x * x + y * y) end
def succ(x, y) x == y ? [x + 1, 0] : [x, y + 1] end
rs, x, y = Hash.new(0), 1, 0
while rs.size < n
r = r(x,y)
if r < x + 1
rs[r] += 1
x, y = succ x, y
else
x, y = x + 1, 0
end
end
puts 'n=' + n.to_s + ' -> ' + rs.keys.sort.last.to_s
end
(5..15).each{|n| f621 n}
↓
n=5 -> 2.82842712474619
n=6 -> 3.0
n=7 -> 3.16227766016838
n=8 -> 3.60555127546399
n=9 -> 4.0
n=10 -> 4.12310562561766
n=11 -> 4.47213595499958
n=12 -> 5.0
n=13 -> 5.09901951359278
n=14 -> 5.3851648071345
n=15 -> 5.8309518948453
>>621 J
f=: 3 :'y{(~./:~,|@j./~i.>.%:4*y)'
f 1
1
f 2
1.41421
f 10
4.12311
f 20
6.32456
f 1000
58.0086
f 999
58
634 :
629 :2013/12/19(木) 22:23:58.69
635 :
629 :2013/12/19(木) 22:39:34.56
正直4*の意味がわからない
>>621 HSP
#module
#defcfunc data_get int v, var h, local s, local e
h=0 : s=0 : e=s_data_num-1
while 1
if s>e : return 0
c=(s+e)/2
if s_data(c)=v : h=c : return 1
if s_data(c)>v : e=c-1 : h=c : else : s=c+1 : h=c+1
wend
#deffunc data_add int v, local h
if data_get(v, h) : return
s_data(s_data_num)=0
memcpy s_data, s_data, 4*(s_data_num-h), 4*(h+1), 4*h
s_data(h)=v : s_data_num++
return
#defcfunc nth_circle int n, local h
while 1
if data_get(s_x*s_x, h) : if h>=n-1 : return sqrt(s_data(n-1))
s_x++
repeat s_x+1
data_add s_x*s_x+cnt*cnt
loop
wend
#global
repeat 20, 1
mes strf("n=%d -> %.10f", cnt, nth_circle(cnt))
loop
>>635 最初は2倍して平方根を取っていたのですが、nが大きくなるとうまくいかず
掛ける数字がだんだん大きくなったといういい加減な数字です。
>>624 Squeak Smalltalk 。三度目の正直。
| radiusAt |
radiusAt := [:n |
((1 to: (8 * n + 1) sqrt - 1 / 2 sqrt) gather: [:x |
(0 to: x) collect: [:y | (x@y) r ]]) asSet asSortedArray at: n].
radiusAt value: 999. "=> 58 "
639 :
629 :2013/12/20(金) 01:17:46.97
>>621 Io
Range
f := method(n,
1 to((n sqrt * 2) floor) map(i,
0 to(i) map(j,
i * i + j * j
)
) flatten sort unique at(n - 1) sqrt
)
Io> f(1)
==> 1
Io> f(5)
==> 2.8284271247461903
Io> f(10)
==> 4.1231056256176606
Io> f(100)
==> 16.15549442140351
|._番兵|_ ( ・ω・) <雪かきするよ ○={=}〇, |:::::::::\, ', ´ 、、、、し 、、、(((.@)now nil snow nil snow snow
お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 例 1 11 21 1211 111221 312211 13112221 1113213211 31131211131221 13211311123113112211 11131221133112132113212221
>>642 Squeak Smalltalk 。同じく思考停止系で。
| str |
str := '1'.
Transcript open; show: str.
10 timesRepeat: [
str := String streamContents: [:ss |
(str as: RunArray) runsAndValuesDo: [:run :val | ss nextPutAll: run asString, val]].
Transcript cr; show: str]
>>642 ruby 1.8.6
def f642(s)
s.scan(/(\d)(\1*)/).map{|a| (a[1].size + 1).to_s + a[0]}.join
end
puts (1..10).inject(['1']) {|a, i| a << f642(a.last)}
>>642 #module
#defcfunc func var s, local d, local n, local c, local pc
d=""
repeat strlen(s)+1
pc=c
c=peek(s, cnt)
if c=pc : n++ : continue
if n : d+=strf("%d%c", n, pc)
n=1
loop
return d
#global
s="1"
mes s
repeat 10
s=func(s)
mes s
loop
>>642 HSP
>>641 も HSP
#module
#defcfunc func var s, local d, local n, local c, local i
d=""
repeat strlen(s)+1
c=peek(s, i)
if c=0 : break
n=0
repeat
i++ : n++
if peek(s, i)!c : break
loop
d+=strf("%d%c", n, c)
loop
return d
#global
s="1"
mes s
repeat 10
s=func(s)
mes s
loop
>>642 J
load 'regex'
'(.)\1*' (":@#,{.) rxapply ^:(<10)'1'
>>642 Io
f := method(a,
a = a .. " "
v := a at(0)
c := 0
r := ""
a foreach(x,
if(x == v,
c = c + 1
,
r = r .. c .. v - 48
v = x
c = 1
)
)
r
)
a := "1"
10 repeat(a = f(a println))
>>642 c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const char *f642(const char *cs) {
const char *p, *q;
char *buff = malloc(strlen(cs) * 2 + 1), *bp = buff;
for (p = q = cs; *p != '\0'; p++) {
if (*q != *(p + 1)) {
*bp++ = p - q + '1';
*bp++ = *q;
q = p + 1;
}
}
*bp = '\0';
return buff;
}
int main() {
const char *css[11] = {0}; css[0] = "1";
int i, len = sizeof css / sizeof *css;
for (i = 1; i < len; i++) css[i] = f642(css[i - 1]);
for (i = 0; i < len; i++) printf("%s\n", css[i]);
return 0;
}
>>642 R
a <- "1"
for(i in 1:10){
cat(a, "\n", sep="")
a <- rle(a)
a <- c(rbind(a[[1]], a[[2]]))
}
お題:1から100000までの整をすべて足せ。 すべて足したら、その合計を表示せよ。 回答例: Objective Caml version 3.08.1 let sum1to n = let rec f sum n = if n = 0 then sum else f (sum + n) (n - 1) in f 0 n;; print_int (sum1to 100000);; ↓ 705082704
657 :
656 :2013/12/22(日) 10:37:08.61
×整 ○数
任意精度整数モジュールを使ってバグ修正したかったが、 諸事情でそれもできなかったので出題の意図を縮小して訂正。 お題:1から10000までの整をすべて足せ。 すべて足したら、その合計を表示せよ。 回答例: Objective Caml version 3.08.1 let sum1to n = let rec f sum n = if n = 0 then sum else f (sum + n) (n - 1) in f 0 n;; print_int (sum1to 10000);; ↓ 50005000
>>656 >>658 Io
f : = method(n, n * (n + 1) / 2)
Io> f(10000)
==> 50005000
Io> f(100000)
==> 5.000050e+009
Io> f(10000000)
==> 5.000001e+013
Io> f(10000000)asString(0,0)
==> 50000005000000
>>654 concatMapは>>=でいけたか。
>>656 >>658 Objective Caml version 3.08.1
Big_int使えるようになったので一応。
これで思う存分、足しまくることができる。
let sum1to n =
let rec f sum n =
if n = 0 then sum
else f (Big_int.add_int_big_int n sum) (n - 1) in
f Big_int.zero_big_int n;;
let f658 n = Printf.printf "%s\n" (Big_int.string_of_big_int (sum1to n));;
f658 100000;;
f658 10000000;;
>>656 ttp://ideone.com/svcXCp ふっふっふ、そんな生っちょろい数字ではCゲンガーは殺せん!
とは言え、あんまりデカイ数字出されても困るんだけどね・・・。Orz
数字があわなくてあれ?ッて思ってたら区間間違えてた。
"<="なのね。いつも"<"のみで判定してるから一瞬ビビった。
C++の多倍長演算は現在乱立中で当面大変な状況だ。 何とかならんかねー。Orz
>>656 HSP
sum=0.0
repeat 100000, 1
sum+=cnt
loop
mes strf("%.0f", sum)
>>656 Squeak Smalltalk
(1 to: 100000) sum "=> 5000050000 "
>>642 java 1.6
import java.util.*;
import java.util.regex.*;
public class Odai642 {
private Pattern p = Pattern.compile("(\\d)(\\1*)");
private String f642(String s) {
StringBuffer buff = new StringBuffer();
for (Matcher m = p.matcher(s); m.find(); ) {
buff.append(m.group(0).length()).append(m.group(1));
}
return buff.toString();
}
public static void main(String[] args) {
Odai642 odai = new Odai642();
List<String> list = new ArrayList<String>();
list.add("1");
for (int i = 0; i < 10; i++) list.add(odai.f642(list.get(i)));
for (String s : list) System.out.println(s);
}
}
Cゲンガーの逆襲!
スレにコントリビュートするために問題作ったよ!!
64ビット変数の基数62のハッシュを作ってみよう。
あぁ、別に64ビットじゃなくてもいいや。とにかく基数62のハッシュを作ってみよう。
これを知っていると、例えばURLの字数短縮したりとかまぁチョイチョイ使い道がある。
数学苦手だからこの程度しかできなくてごめんね。
ちなみに62なのは、数字と、アルファベットの大文字小文字を全部足すと62になるから。
64のほうがキリがいいよね。
http://ideone.com/57sb8e あと、バグ報告も歓迎。
自分で書いておいてアレだが、変数名ダサイなー。
>>667 HSP
#module
#defcfunc mod62 var x, local c, local y, local m, local f
sdim y
m=0
repeat strlen(x)
c=peek(x, cnt)-'0'
if c<0 or 9<c : poke x, cnt : break
m=m*10+c
if m/62 : f=1
if f : y+=strf("%c", '0'+m/62)
m\=62
loop
if y="" : y="0"
x=y
return m
#defcfunc radix62 str x_, local x, local y
x=x_
symbol="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
sdim y
repeat
if x="0" : break
y=strmid(symbol, mod62(x), 1)+y
loop
return y
#global
mes radix62("18446744073709551615")
>>670 あそっか。
C++でもStringの長さとれるからそれ基数扱いにすればよかったんだった。勉強になった。
自分の書いたアルゴリズムを他の言語で書いてくるとそれとなく読めて面白いね。
知見がひろがるわー。
>>667 Squeak Smalltalk
| radix62 |
radix62 := [:n |
| chars base buff |
chars := '0123456789abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ'.
base := chars size.
buff := OrderedCollection new.
[n = 0] whileFalse: [buff addFirst: (chars at: n \\ base + 1). n := n // base].
buff as: String].
radix62 value: 18446744073709551615 "=> 'lYGhA16ahyf' "
>>667 ruby 1.8.6
class Integer
def mods(base)
a, i = [], self
begin
a << i % base
end until (i /= base) == 0
a.reverse
end
def f667(table)
cs = table.scan(/./)
mods(cs.size).map {|m| cs[m]}.join
end
end
s = "0123456789abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ"
puts 18446744073709551615.f667(s)
puts 0.f667(s)
↓
lYGhA16ahyf
0
>>670 は、関数型言語だと面倒くさいと思ったけど、意外と素直に実装してくるな。
なるほどなるほど。
>>667 Prolog
'64ビット変数の基数62のハッシュを作ってみよう。'(_64ビット整数) :-
atom_chars('0123456789abcdefghijkomnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',_変換符号ならび),
基数62のハッシュを作る(_64ビット整数,_変換符号ならび,[],_ハッシュ値),
writef('%t -> %t\n',[_64ビット整数,_ハッシュ値]),!.
基数62のハッシュを作る(0,_,L,_ハッシュ値) :-
atomic_list_concat(L,_ハッシュ値),!.
基数62のハッシュを作る(_実,_変換符号ならび,L,_ハッシュ値) :-
基数62のハッシュ符号化(_実,_変換符号ならび,_剰余,_変換された符号),
基数62のハッシュを作る(_剰余,_変換符号ならび,[_変換された符号|L],_ハッシュ値).
radix62符号化(_実,_変換符号ならび,_商,_変換された符号) :-
_剰余 is _実 mod 62,
_商 is _実 // 62,
nth0(_剰余,_変換符号ならび,_変換された符号).
基数62のハッシュを作る(0,_,L,_ハッシュ値) :-
atomic_list_concat(L,_ハッシュ値),!.
基数62のハッシュを作る(_実,_変換符号ならび,L,_ハッシュ値) :-
基数62のハッシュ符号化(_実,_変換符号ならび,_商,_変換された符号),
基数62のハッシュを作る(_商,_変換符号ならび,[_変換された符号|L],_ハッシュ値).
radix62符号化(_実,_変換符号ならび,_商,_変換された符号) :-
_剰余 is _実 mod 62,
_商 is _実 // 62,
nth0(_剰余,_変換符号ならび,_変換された符号).
>>667 Prolog すみません。書き直し。
'64ビット変数の基数62のハッシュを作ってみよう。'(_64ビット整数) :-
atom_chars('0123456789abcdefghijkomnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',_変換符号ならび),
基数62のハッシュを作る(_64ビット整数,_変換符号ならび,[],_ハッシュ値),
writef('%t -> %t\n',[_64ビット整数,_ハッシュ値]),!.
基数62のハッシュを作る(0,_,L,_ハッシュ値) :-
atomic_list_concat(L,_ハッシュ値),!.
基数62のハッシュを作る(_実,_変換符号ならび,L,_ハッシュ値) :-
基数62のハッシュ符号化(_実,_変換符号ならび,_商,_変換された符号),
基数62のハッシュを作る(_商,_変換符号ならび,[_変換された符号|L],_ハッシュ値).
radix62符号化(_実,_変換符号ならび,_商,_変換された符号) :-
_剰余 is _実 mod 62,
_商 is _実 // 62,
nth0(_剰余,_変換符号ならび,_変換された符号).
677 :
676 :2013/12/24(火) 20:31:14.81
まだインデントが不十分でした。恐縮。 atom_charsから始まる行を8文字分右へずらして読んで下さい。その上も一行改行が 多くなっています。
678 :
676 :2013/12/24(火) 20:32:39.98
さらにミス発見 radix62符号化という述語名は勿論間違いで、変換し損ないました。 ここは 基数62のハッシュ符号化 です。
>>667 import Numeric
showIntAtBase62 :: Integer -> String
showIntAtBase62 i = showIntAtBase 62 (xs !!) i ""
where xs = ['0'..'9'] ++ ['a'..'z'] ++ ['A'..'Z']
main = putStrLn $ showIntAtBase62 18446744073709551615 -- lYGhA16ahyf
681 :
670 :2013/12/24(火) 22:33:09.31
>>681 あー確かに、Cゲンガーの俺には読みにくい感じだわ。(汗
これだよこれ。
>>679 とある自然数Nに基数Rを与える。基数R上で桁を一桁増やすときは基数RのRを掛ける。基数10で10掛けると桁が上がるようにね。減らすときは割る。
基数Rの一桁目の数を調べるとき、その桁の数の上限がRなので自然数NからRで余剰を取ると一桁目がわかる。
ちなみに、俺には任意のの桁をO(1)でぶち抜く方法はよくわからん。Orz
基数10のように0を適当に増やすだけでは無理なので普段使いで使ってないとパッとは出てこないね。
そういう意味で10進数は旨いことできてると思う。
>>684 HSP
#module
#define ctype spacer(%1) strf(strf("%%%%%%ds", %1), "")
#deffunc xmas_tree int n, local buf, local symbol
symbol="No%objX*****"
mes spacer(n-1)+"☆"
repeat n, 1
buf=spacer(n-cnt)
repeat cnt*2
buf+=strmid(symbol, rnd(strlen(symbol)), 1)
loop
mes buf
loop
mes spacer(n-1)+"||"
return
#global
repeat 7, 1
xmas_tree cnt
loop
688 :
670 :2013/12/25(水) 08:14:03.73
>>685 Radix62b()だね。
そうしないと末尾再帰にならないので。
Common Lispは末尾再帰最適化が仕様になっていないけれど、多くの実装で最適化してくれるらしい。
>>684 Squeak Smalltalk
| xmasTree |
xmasTree := [:r |
| tree leaves |
tree := #('☆' '||') asOrderedCollection.
leaves := [:w | (1 to: w*2) inject: '' into: [:acc :idx | acc, '*********NiXJo%b' atRandom]].
1 to: r do: [:wd |
wd > 1 ifTrue: [tree doWithIndex: [:each :idx | tree at: idx put: ' ', each]].
tree add: (leaves value: wd) before: tree last].
tree asStringWithCr].
^((1 to: 7) - 1 collect: xmasTree) asStringWithCr
>>688 c は末尾再帰、b はそうではないので、
>>681 は末尾再帰ではないのですか?私まだよく理解できてないな‥‥
692 :
670 :2013/12/25(水) 12:56:15.43
>>684 ruby 1.8.6
def print_xmastree(h, w = h * 2)
cs = "*******NiXJo%b".scan(/./)
tree = (1..h).inject(['☆']) {|tree, i| tree << '**' * i} << '||'
tree = tree.map {|s| s.gsub(/\*/) {cs[rand(cs.size)]}}
tree.each {|s| puts s.center(w)}
end
(0...7).each {|i| print_xmastree(i)}
eJxrdGh0UAAjELEfTHCBOBAIFG9apKOTrB5/EioU1xjQ6NvY0pQHlIyPz7HL t8mJj+eCGQJCyfqNrgqNro2+TQfBIvk66KAWZFJ8TXx8Y+GpxqJ4IIsLbh0I aairN85RUFdXV9AEi2c2+jS6Nl8DmdmYBVJQo6+vXwMhETqBhH/LMv/mXKCu J9GNAU1HmnMbA2LBbAiMRVbcOLdlRdNW9ca5CmD2/Jb5jbGNc2FsIG8uFwDE C2lB ヒント:DしてIする。
アイが分からない
696 :
687 :2013/12/25(水) 21:12:34.13
|._番兵|_ ( ・ω・) <メリークリスマス ○={=}〇, |:::::::::\, ', ´ 、、、、し 、、、(((.@)5 26 27 28 29 30 31
699 :
687 :2013/12/25(水) 23:58:41.54
701 :
687 :2013/12/26(木) 00:18:14.61
702 :
687 :2013/12/26(木) 01:31:30.61
703 :
687 :2013/12/26(木) 01:40:48.88
gen使い回してた。終了。
704 :
687 :2013/12/26(木) 01:49:28.85
705 :
687 :2013/12/26(木) 02:01:12.82
706 :
687 :2013/12/26(木) 02:17:36.40
やっぱdiscreteないと連続でもいけるみたいになるからつけとこう。
707 :
687 :2013/12/26(木) 02:19:37.55
あ、スレ汚しすみません。次の問題貼っときます。 694 :デフォルトの名無しさん:2013/12/25(水) 19:32:17.42 eJxrdGh0UAAjELEfTHCBOBAIFG9apKOTrB5/EioU1xjQ6NvY0pQHlIyPz7HL t8mJj+eCGQJCyfqNrgqNro2+TQfBIvk66KAWZFJ8TXx8Y+GpxqJ4IIsLbh0I aairN85RUFdXV9AEi2c2+jS6Nl8DmdmYBVJQo6+vXwMhETqBhH/LMv/mXKCu J9GNAU1HmnMbA2LBbAiMRVbcOLdlRdNW9ca5CmD2/Jb5jbGNc2FsIG8uFwDE C2lB ヒント:DしてIする。
いや、だから、「僕の考えた最強の暗号を解いてみろ」じゃないんだから ちゃんと問題を記述してよ
709 :
694 :2013/12/26(木) 11:11:04.29
>>707 いえw 問題でもお題でもないので完全スルーでお願いします。
解けた人だけ、こっそりレスしてくれたら満足です。
>>695 アイは膨らませる。あとはアイだけあればいい。
いろいろゴニョゴニョしたりする必要は無い。
そろそろテンプレが必要かね
|._番兵|_ ( ・ω・) <ステンバーイ ○={=}〇, |:::::::::\, ', ´ 、、、、し 、、、(((.@)
>>713 の修正
clock_pos_get hour*360/12+min*15/60, 12, x, y
↓
clock_pos_get hour*360/12+min*30/60, 12, x, y
>>712 Squeak Smalltalk
| analogClock |
analogClock := [:time |
| clock ticks pos |
time := time asTime.
clock := #(
' o'
' o o'
''
' o o'
''
'o o'
''
' o o'
''
' o o'
' o') deepCopy.
ticks := {10@1. 15@2. 18@4. 19@6. 18@8. 15@10. 10@11. 5@10. 2@8. 1@6. 2@4. 5@2}.
pos := ticks at: (time minutes roundTo: 5) / 5 + 1.
(clock at: pos y) at: pos x put: $x.
pos := ticks at: time hour \\ 12 + 1.
(clock at: pos y) at: pos x put: $X.
clock asStringWithCr].
analogClock value: '18:35'.
analogClock value: '00:00'.
analogClock value: '10:03'.
>>712 ruby 1.8.6
class Canvas
def initialize(r = 8)
@r = r
@css = Array.new(1 + r * 2) {Array.new(1 + r * 2) {' '}}
end
def put_char_on_rim(c, t)
x = @r + @r * Math.cos(t)
y = @r + @r * Math.sin(t)
@css[x.round][y.round] = c
end
def to_s
@css.reverse.map {|cs| cs.join(' ').chomp}.join($/)
end
end
def f712(s)
hh, mm = s.split(/:/).map{|x| x.to_i}
roundedmm = (mm / 5.0).round * 5
c, pi2 = Canvas.new(8), 2 * Math::PI
(0...12).each {|i| c.put_char_on_rim('o', pi2 * i / 12)}
c.put_char_on_rim('x', pi2 * roundedmm / 60)
c.put_char_on_rim('X', pi2 * hh / 12)
puts s
puts c.to_s
end
f712('18:35')
f712('00:00')
f712('10:03')
>>718 変数名を変更し、内部の配列の使い方を直感的なものに修正。
def put_char_on_rim(c, t)
x = @r + @r * Math.sin(t)
y = @r - @r * Math.cos(t)
@css[y.round][x.round] = c
end
def to_s
@css.map {|cs| cs.join(' ').chomp}.join($/)
end
>>712 c
#include <stdio.h>
#include <string.h>
#include <math.h>
void f712(const char *hhmm) {
char dial[] = " a\n l b\n\n k c\n\nj d\n\n i e\n\n h f\n g";
char *p, symbols[] = "oooooooooooo";
int h, m, i, slen = strlen(symbols);
if (sscanf(hhmm, "%d:%d", &h, &m) != 2) return;
symbols[(int)round(m / 5.0) % slen] = 'x';
symbols[h % slen] = 'X';
for (i = 0; i < slen; i++) {
p = strchr(dial, 'a' + i);
if (p) *p = symbols[i];
}
puts(hhmm);
puts(dial);
}
int main() {
f712("18:35");
f712("00:00");
f712("10:03");
return 0;
}
723 :
デフォルトの名無しさん :2014/01/02(木) 01:21:58.66
>>667 J
a=:'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
b=:1319718474975x
(62#.inv b){a
newYear
724 :
デフォルトの名無しさん :2014/01/02(木) 07:20:31.83
お題:対ウイルス用プログラムは作れるのか実験せよ! 対ウイルス用プログラムとは ウイルスを自動検出し、どこでかかったかを特定。特定した相手にウイルス を感染させるプログラム。 総員、直にかかれぇ!
>>724 見えなくしてるんでコテハンはずさないでください
お題:連続した自然数の和が2014になるものをすべて求める。
お題の質を向上させるために出した人はまずサンプルを載せてね どんなに最悪でもテストまたは正解を書くこと
>>726 Squeak Smalltalk
(1 to: 2013)
collect: [:start | start to: ((start to: 2013)
detect: [:end | (start + end) * (end - start + 1) / 2 = 2014] ifNone: [0])]
thenSelect: [:range | range notEmpty]
"=> {(12 to: 64) . (97 to: 115) . (502 to: 505)} "
>>726 ruby 1.8.6
アルゴリズムというか考え方は、ぐぐってしまった。しかし正解かどうか不明。
>>727 この場合、正解があってくれたら助かるね。
def f726(n)
oes = (2...n).select {|i| n % i == 0 && i % 2 == 1}.map{|o| [o, n / o]}
numss = oes.map{|(o, e)| (1..o/2).inject([e]){|a, i| a.unshift(e - i).push(e + i)}}
numss.map{|nums| 0 < nums[0] ? nums : nums.delete_if{|n| n <= -nums[0]}}
end
numss = f726(2014)
p numss
p numss.map{|nums| nums.inject(0){|sum, n| sum += n}}
↓
[[97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 1
13, 114, 115], [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64], [502, 503,
504, 505]]
[2014, 2014, 2014]
>>731 ちょっとデバッグ&変数名をわずかに改善。
def f726(n)
dss = (1..n).select {|i| n % i == 0 && i % 2 == 1}.map{|i| [i, n / i]}
numss = dss.map{|(d0, d1)| (1..d0/2).inject([d1]){|nums, i| nums.unshift(d1 - i).push(d1 + i)}}
numss.map{|nums| 0 < nums[0] ? nums : nums.delete_if{|n| n <= -nums[0]}}
end
numss = f726(2014)
p numss
p numss.map{|nums| nums.inject(0){|sum, n| sum += n}}
JS function func(n) { for (var a=[],i=(n/2+1)|0; i>0; i--) for (var b=[],s=0,j=i; j>0; j--) { s+=j;if(s>n)break b.push(j);if(s==n)a.push(b) } return a } func(2014)
>>727 入出力例だけあればいいよ
サンプルは無いほうがいい
答え丸出しのパズルは面白くない
>>726 HSP
for i, 1, 2014+1
sum+=i
while sum>2014
sum-=j
j++
wend
if sum=2014 : mes strf("%d...%d", j, i)
next
>>726 ruby 1.9.3
N = 2014
2.upto(N){|n|
next if N % n != 0
next if n % 2 + N / n % 2 != 1
if n % 2 == 1
a = (N/n-n/2..N/n+n/2)
else
a = (N/n/2-n+1..N/n/2+n)
end
p a if a.to_a[0] > 0
}
別にアルゴリズムは1つじゃないだろうし 出すからには一番真剣にサンプルくらい載せてほしいな
スレに直接書かなければ選択の余地がある
お題 与えられたキーワードを1回ずつ使って、できるだけ面積の小さなクロスワードを作って返す 例 input スイカ、カイバ、イヌ output ス□□ イ□□ カイバ □ヌ□ 注意 ス□□ イヌ□ カイバ は不可 2文字以上文字が連続する部分はキーワードでないといけない この場合「ヌイ」がアウト
補足 1.各キーワードは2字以上、そうでなければエラー 2.それさえ満たせば繋げられなくても問題ないので、解は必ず出せる 例 input マンガ、バター output マンガ □□□ バター 3.キーワードの重複は認める
743 :
742 :2014/01/02(木) 17:28:10.05
>>726 Haskell
sum2014 :: [(Int, Int)]
sum2014 = foldr f [] [1..2014]
where
f x acc = maybe acc (\y -> (x,y):acc) $ g x x
g x s | s > 2014 = Nothing
| s == 2014 = Just x
| otherwise = g (x+1) (s+x+1)
main = print sum2014 -- => [(12,64),(97,115),(502,505),(2014,2014)]
連続とはいったい!? うごごごご…
二桁連続、三桁連続、四桁連続、五桁連続・・・ これでおk
>>739 長方形の周囲長にしないと
面積だと1マス空けになる
スイカ□カイバ□イヌ
みたいに
>>748 又は全てのワードが連結していることを求めるか、だな。
>>740 > 2.それさえ満たせば繋げられなくても問題ないので、解は必ず出せる
これを撤回して、各単語は少なくとも一つの単語と重なりを持つという条件を加えれば
面積でも問題ない?
↑ 解の公式のところ間違えた。 × int last = (int)(-1 + Math.Sqrt(1.0 + 8 * n) / 2); ○ int last = (int)((-1 + Math.Sqrt(1.0 + 8 * n)) / 2); n=2014 ではどっちでも同じみたいだけど。
>>749 ,750
では全て一続きに連結するという条件でお願いします
>>726 Io
f := method(n,
a := 1
b := (n * 2) sqrt floor
s := (a + b) * (b - a + 1) / 2
e := (n / 2) floor + 1
while(b < e,
if(s == n,
writeln(a, ":", b)
b = b + 1
s = s + b
,
if(s > n,
s = s - a
a = a + 1
,
b = b + 1
s = s + b
)
)
)
nil
)
Io> f(2014)
12:64
97:115
502:505
>>726 Maxima
f(n) := map(
lambda([x],[if (a:n/x-(x-1)/2)<=0 then 1-a else a,n/x+(x-1)/2]),
subset(rest(divisors(n)),oddp)
);
(%i23) f(2014);
(%o23) {[12, 64], [97, 115], [502, 505]}
(%i24) f(123456);
(%o24) {[130, 513], [901, 1028], [41151, 41153]}
お題:ジグザグに表示する。 例 123456789 ↓ 1 3 5 7 9 2 4 6 8 The earth turns around the sun. ↓ T e e r h t r s a o n h u . h a t u n r u d t e s n
>>756 c
#include <stdio.h>
void f756(const char *cs) {
const char *p, *end = cs + strlen(cs);
for (p = cs; p < end; p += 2) printf("%c ", *p);
puts("");
for (p = cs + 1; p < end; p += 2) printf(" %c", *p);
puts("");
}
int main() {
f756("123456789");
f756("The earth turns around the sun.");
return 0;
}
760 :
18 :2014/01/04(土) 14:33:32.65
>>756 void func(const char *cs)
{
const int base = 2;
for (int remain = 0; remain < base; ++remain) {
for (int i = 0; cs[i]; ++i)
putchar(i % base == remain ? cs[i] : ' ');
puts("");
}
}
>>759 一応修正しとく。
#include <stdio.h>
void f756(const char *cs) {
const char *p, *end = cs + strlen(cs);
char *buff = malloc(strlen(cs) + 1), *bp;
for (p = cs, bp = buff; p < end; p++) if (!isspace(*p)) *bp++ = *p;
for (p = buff; p < bp; p += 2) printf("%c ", *p);
puts("");
for (p = buff + 1; p < bp; p += 2) printf(" %c", *p);
puts("");
free(buff);
}
int main() {
f756("123456789");
f756("The earth turns around the sun.");
return 0;
}
>>756 HSP
#module
#deffunc f756 str s_, local s, local buf1, local buf2
s=s_
buf1=""
buf2=""
repeat strlen(s)
if (cnt\2)=0 {
buf1+=strf("%c ", peek(s, cnt))
} else {
buf2+=strf(" %c", peek(s, cnt))
}
loop
mes buf1
mes buf2
return
#global
f756 "123456789"
f756 "The earth turns around the sun."
768 :
764 :2014/01/04(土) 17:15:20.16
修正じゃなくて
>>759 のままでよかった。
新年早々なにやってんだか…。脳が腐ってる。
>>756 -- Haskell
zigzag :: String -> [String]
zigzag = foldr (\x [as, bs] -> [x:bs, ' ':as]) [[], []]
main = mapM_ (mapM_ putStrLn . zigzag) ["123456789", "The earth turns around the sun."]
>>756 Io
f := method(s,
a := s asMutable
b := s asMutable
for(i, 0, s size, if(i isOdd, a, b) atPut(i, 32))
writeln(a, "\n", b)
)
>>756 Squeak Smalltalk
| zigzag |
zigzag := [:str |
(str inject: #(' ' '') into: [:acc :chr | {acc second, chr, ' '. acc first}]) asStringWithCr].
zigzag value: '123456789'.
zigzag value: 'The earth turns around the sun.'
>>756 Octave
function f(s)
a = b = s;
a(2:2:end) = " ";
b(1:2:end) = " ";
printf("%s\n%s\n",a,b);
endfunction
> f("123456789")
1 3 5 7 9
2 4 6 8
お題:文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。 半径は文字間隔が離れすぎず近すぎない程度になるよう適当に選ぶ。
>>777 シャッフルしたのはフレームバッファ使わないためだよ。
並びが明確なので、後はスペースの区切り方なんだが、それが上手いこといかない。
円の性質ってそういえばよく知らないな。
>>778 そういうことか。
あ、それで1行2文字の制限になって歪んでるのか。
・・・バッファ節約しなきゃならんサイズの円だと相当大きい円にしない限りゆがみがひどい事になりそ
>>775 ruby 1.8.6
>>718 のCanvas再利用。
def f775(s)
cs = s.scan(/./)
canvas, pi2 = Canvas.new(8), 2 * Math::PI
cs.each_index{|i| canvas.put_char_on_rim(cs[i], pi2 * i / cs.size)}
puts s
puts canvas.to_s
end
f775(('A'..'L').to_a.join)
f775(('A'..'C').to_a.join)
f775(('A'..'X').to_a.join)
>>775 HSP
#module
#deffunc f775 str s_, local s, local cx, local cy
cx=ginfo_cx
cy=ginfo_cy
mes
s=s_
l=strlen(s)
r=double(ginfo_mesy)*l/6
if r<0.5*ginfo_mesy : r=0.5*ginfo_mesy
repeat l
pos r*(1.0+sin(2.0*M_PI*cnt/l))+cx, r*(1.0-cos(2.0*M_PI*cnt/l))+cy
mes strmid(s, cnt, 1)
loop
pos cx, r*2+cy : mes
return
#global
f775 "HappyNewYear"
f775 "12345"
>>775 Io
f := method(s,
n := s size
w := List clone setSize(n*2+1)map("__"repeated(n*2+1))
pi2:=1 atan*8
for(i,0,n-1,
a := i*pi2/n-pi2/4
w at((a sin*n)round+n) atPut(((a cos*n)round+n)*2+1,s at(i))
)
w
)
Io> f("12345")map(println)
___________1__________
______________________
______________________
_5___________________2
______________________
______________________
______________________
______________________
______________________
_____4___________3____
______________________
786 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/06(月) 05:45:41.66
誤差を小さくしたいなら切り捨てより四捨五入
787 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/06(月) 15:01:42.13
文字の位置は左上コーナーの座標ではなく中心点にあるとするのが人間工学的になんちゃらなんちゃら
>>775 R
f <- function(s){
n <- nchar(s)
pie(rep(1,n),unlist(strsplit(s,"")),clock=T,dens=0,lty=0,init=90+360/n/2)
}
円グラフをかくpieを使ってラベル以外を全部消す作戦だったが
中心に向かう短い補助線が消せなかった。
お題:1000以下の自然数で各桁がすべて奇数のものを求める。 例 121 -> ng //偶数の桁がある 357 -> ok
>>789 ruby 1.8.6
def f789(n)
n.to_s.scan(/./).all?{|c| c.to_i % 2 == 1} ? 'ok' : 'ng'
end
puts f789(121)
puts f789(357)
↓
ng
ok
あ、それとも p (1..1000).select{|i| i.to_s.scan(/./).all?{|c| c.to_i % 2 == 1}} こうとか? p (100..1000).select{|i| i.to_s.scan(/./).all?{|c| c.to_i % 2 == 1}} こうとか?
grep { /^[13579]+$/ && print "$_\n";} (1 ... 1000)
>>789 ; Common Lisp
(loop for i from 1 to 1000
do (format t "~4d -> ~:[ng~;ok~]~%"
i
(every (lambda (c)
(oddp (parse-integer (string c))))
(princ-to-string i))))
>>775 Squeak Smalltalk
| str pi ori ps r grid |
str := '0123456789AB' readStream.
pi := Float pi.
ori := 3 * pi / 2.
ps := (1 to: str size * 2) - 1 collect: [:idx |
| theta |
theta := pi / str size * idx + ori.
theta cos @ theta sin].
r := (1 to: str size * 2) detect: [:n | (ps * n * (2@1)) rounded asSet size = ps size].
r := r + 1.
grid := (Array new: r*2+1 withAll: (String new: r*4+1 withAll: $_)) deepCopy.
ps := ((ps+1) * r * (2@1)) rounded + 1 pairsDo: [:p1 :p2 | (grid at: p1 y) at: p1 x put: str next].
^grid asStringWithCr
=> '
________0________
____B_______1____
_A_____________2_
_________________
9_______________3
_________________
_8_____________4_
____7_______5____
________6________'
>>789 Squeak Smalltalk
(1 to: 1000) select: [:n | n asString allSatisfy: [:digChar | digChar digitValue odd]]
>>789 Lua
f = function(n)
local i = 0
while true do
local a = i
local r = ""
repeat
r = (a % 5 * 2 + 1) .. r
a = math.floor(a / 5)
until a <= 0
if tonumber(r) > n then
return
else
print(r)
i = i + 1
end
end
end
>>798 100番台が抜けてしまいます。ボツにします。
>>789 HSP
#module
#defcfunc f789 int x
y=x
while y>0
if (y&1)=0 : return "ng"
y/=10
wend
return "ok"
#global
mes f789(121)
mes f789(357)
>>789 Ruby1.9.3
x="24680".split(//)
1.upto(1000) { |n|
a=n.to_s.split(//)
p n if a==(a-x)
}
>>789 J
~.;&.>}.,{a;a;<a=.a:,;/'13579'
>>797 Squeak Smalltalk 別解
(1 to: 1000) reject: [:n | n asString includesAnyOf: '02468']
お題:辺の長さが1の正3角柱、正4角注、正5角柱がある。これをひもで束ねるとき 結ぶための部分の長さは別としてひもの長さの最小値を求める。
△ □ の下に五角柱が来るから、紐を角柱に沿わせるなら8になる。 実際には五角柱の方が幅が広いから紐が角柱から離れるので8より小さくなるね。
>>789 Lua
f = function(n)
local i = 1
while true do
local a = i
local r = ""
while a > 0 do
a = a - 1
r = (a % 5 + 1) * 2 - 1 .. r
a = math.floor(a / 5)
end
if tonumber(r) > n then
return
else
print(r)
i = i + 1
end
end
end
>>810 最短という条件なら
五角柱は下じゃなくて右か左かにくるはず
そんな条件ないけど
>>807 質問です
どのように配置すれば最小値になるのですか?
お題:辺の長さが1の正n角形の頂点の座標位置を求め回転と平行移動が指定できる関数。
>>814 数学ダメだから、辺長1の正N角形の求め方がわかりません。
とある角度rの弧の求め方ってどうするんだっけ?
回転平行移動自体はアフィン変換でどうでもなるんだけど・・・。
817 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/09(木) 00:20:21.05
>>815 よく分かる解説:
慣例として角度にrは使わない。rは半径(radius)に使う。角度にはθ(シータ)を使うことが多い。
円周率をπ(パイ)とすると、円周の長さは2πr。一回転の角度は360度(2π)。
円の中心から360度をN等分する(2π÷N)角度の半直線を引き、それぞれが円と交わった点を順番に結ぶと正N角形となる。
単純のために円の中心が原点にあると仮定し、さらにある頂点がx軸と正の成分で交わると仮定すれば、
角θにある円周上の点のxy座標は(x,y)==(r cosθ,r sinθ)と表せる。θ==2π÷Nとすれば
多角形の頂点の一つは(x,y)==(r cos(2π/N),r sin(2π/N))と表せる。角度をk倍すると
(x,y)==(r cos(2πk/N),r sin(2πk/N))となる(※)。
0<=k<Nとすれば※が(k+1)番目の頂点を表す座標となる。
818 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/09(木) 00:25:14.57
円の中心が原点にないときは、各座標成分をずらす(平行移動)とよい。 円の中心が(α,β)であれば (x,y)==(α+r cos(2πk/N),β+r sin(2πk/N))となる。
三角関数を使えば円や円運動を描くことができるので、別名「円関数」とも呼ばれる
>>814 ttp://ideone.com/gZEHcJ 多分間違ってるけど一応作ったよ。
Rの式は頭のなかで変形したからオカシイかもしれん。今気づいたけど拡大いらね・・・。
ゲーム作るときはこれくらいはかけないとね。これでもまだ全ッ然足りないけどね。
デバッグ歓迎。
>>816 すげー綺麗だね。Orz
>>817-819 そういう証明とか説明とか理解できなくて数学赤点だったんだよ・・・。(ToT
とかいってもしょうがないけどね。
説明ありがとう。一応理解できるように努力はしてみる。。。
プログラミングで重要な式はこれ: (x,y)==(α+r cosθ,β+r sinθ) この式を使えば(α,β)を中心とし、半径がrの円と円運動を描画できる。(x,y)は円周上の点。θは角度。 θを変化させるだけで位置がくるくる回転するぞ!!!
823 :
820 :2014/01/09(木) 01:01:53.50
>>822 ちょうどいいから質問なんだけど、
アフィン変換の式で、回転成分はXとYの両成分に、X成分とY成分の両方を含んでいるけど、
今示された式とどちらが正解なんだい?
正N角形の頂点2点A,Bがx軸を挟んで対称にある図を考える。(AB=1, ∠AOB=2π/N) A,Bの座標は A(x,1/2) B(x,-1/2) とおく。 (1/2)/x=tan(π/N) ⇒ x=(1/2) /tan(π/N) よって正N角形の全頂点を通る円の半径rは r=sqrt(x^2+(1/2)^2) =(1/2)*sqrt(1+1/(tan(π/N)^2))
計算してみればどちらも正解。 アフィンの特殊化。 変換前のX,Yと変換後のx,yを混同したら駄目だよ。
>>824 俺、バカだからそういう説明がわからないんですよ。
それで任意の辺の長さの数字を得る時ってどうするの?
それって、辺の長さ1に正規化されてるの?
>>825 そうなんだ。解答ありがとう。
アフィン変換の方は行列を解いたらたまたまそうなったという感じだと思うのだけど、
どっちも行けるんであれば、今後は簡単な方をつかうことにするよ。
>>826 一辺の長さがLなら
r=(L/2)*sqrt(1+1/(tan(π/N)^2))
>>828 そうやってパッと答えられるのはすごいと思う。結構マジで。
俺にはどうやって導き出したのかさっぱりだよ・・・。Orz
ちょっと組み込んでみる。
幾何学(きかがく)の基本がわかってないみたいだな…
いかんいかん。
辺の長さじゃなくて半径1で書いてた。^^;
>>816 ,821
ピタゴラスイッチ
うぅ。また余計なことを言ってしまった。 どうしてくれようか。
|._番兵|_ ( ・ω・) <笑えばいいと思うお ○={=}〇, |:::::::::\, ', ´ 、、、、し 、、、(((.@)in cos tan asin acos atan
番兵は死語 はっきりわかんだね
>>831 Squeak Smalltalk 。辺の長さが1になるように修正。
| polygonVertics |
polygonVertics := [:n :angle :move |
| xs |
xs := 2 * Float pi * (0 to: n-1) / n + angle.
xs := xs cos @ xs sin.
xs / (xs second - xs first) r + move roundTo: 0.0001
].
polygonVertics value: 3 value: Float pi / 2 value: 0.5@(3 sqrt / 6)
"=> {
[email protected] .
[email protected] .
[email protected] } "
>>807 辺をひったりくっつける場合
3|4|5 で 7.951
4|3|5 で 7.554
4|3|5 から 4 をずらしていくと 7.415
839 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/09(木) 20:36:00.34
次のお題は難易度高いぞ。これができたらパズルゲーム会社に提出すること。 お題:数独パズルの難易度を1、2、3、4、5の五段階で判定するプログラムを作れ。
私としては、バッティングセンターの打ちごろの球、3手の詰将棋、ぐらいがいいです。
ヒント:与えられた問題の解法をすべて探索し、解法の個数 と各解法のそれぞれの手の発見の難しさを総合的に評価する。
お題:スタックオーバーフローせよ。 回答例および実行例: public class StackOverflowErrorTest { private void recurse(int i) { try { recurse(i + 1); } catch (StackOverflowError e) { System.out.println(i); } } public static void main(String[] args) { new StackOverflowErrorTest().recurse(0); } } ↓ 5776
>>842 Io
f := method(n, f(1 + n println))
Io> f(0)
0
1
...
4365
4366
>>842 C
#include <stdio.h>
void recurse(int n) {
printf("%d\n", n);
recurse(n + 1);
}
int main(void) {
recurse(0);
return 0;
}
↓
...
65090
65091
>>842 Lua
f = function(n) print(n) f(n+1) end
> f(0)
0
1
...
19993
19994
stack overflow
stack traceback:
[C]: in function 'print'
stdin:1: in function 'f'
stdin:1: in function 'f'
...
stdin:1: in function 'f'
stdin:1: in main chunk
[C]: ?
>>842 Haskell
import Control.Exception
main = f 0 where f x = f (x + 1) `catch` \StackOverflow -> print x
-- > 677789
>>842 J
f =: 3 : 0
smoutput y
f >:y
)
f 0
0
1
...
9996
9997
|stack error: smoutput
| smoutput y
>>842 HSP
recursive
#deffunc recursive
recursive
return
>>842 Squeak Smalltalk
| recurse |
recurse := nil.
recurse := [:i | i asString displayAt: 100 asPoint. recurse value: i+1].
recurse value: 0
4960335 を出力したところでメモリ不足で停止。
|=番兵|_ ( ・ω・) <ステンバーイ ○={=}〇, |:::::::::\, ', ´ 、、、、し 、、、(((.@)
四つの塔がある。幽霊に任意の座標を与えたとき、そこから最も近くにある塔を出力しなさい。 塔A、B、C、Dの座標: A(2, 2) B(5, 2) C(2, 5) D(5, 5) 幽霊の座標: 0≦y≦7, 0≦x≦7, 図1:塔の配置 □□□□□□□□ □□□□□□□□ □□A □□B,□□ □□□□□□□□ □□□□□□□□ □□C □□D,□□ □□□□□□□□ □□□□□□□□ 図2:幽霊の座標(3, 3) □□□□□□□□ □□□□□□□□ □□A □□B,□□ □□□幽□□□□ □□□□□□□□ □□C □□D,□□ □□□□□□□□ □□□□□□□□ 入力と出力例: in : (3, 3) out : A
ひっかけ?
>>854 Squeak Smalltalk
| towers gohstPos |
towers := {#A->(2@2). #B->(5@2). #C->(2@5). #D->(5@5)}.
gohstPos := 3@3.
(towers detectMin: [:tower | (tower value - gohstPos) r]) key "=> #A "
#include <stdio.h> int main(void) { int x, y; scanf("%d%d", &x, &y); printf("%c", 'A' + (x > 3) + (y > 3) * 2); return 0; }
>>854 > 最も近くにある塔を出力しなさい。
複数あったら?
図の意味が理解できないバカが来た
>>860 そういった知恵は極力先に働かせないのがプログラミングだろう。
お題:
>>854 をn次元ユークリッド空間に拡張すれ
例
in:
A(26.4, 46.3, -3.0, 19.8) B(-20.9, 39.8, 33.2, -4.1) C(-26.2, -26.7, 26.1, -0.3) D(-29.2, -12.0, 24.3, 45.1)
(0.4, 30, 7.8, 19.1)
out:
A
>>863 Squeak Smalltalk
| towers gohstPos |
towers := {#A->#(26.4 46.3 -3.0 19.8). #B->#(-20.9 39.8 33.2 -4.1). #C->#(-26.2 -26.7 26.1 -0.3). #D->#(-29.2 -12.0 24.3 45.1)}.
gohstPos := #(0.4 30 7.8 19.1).
(towers detectMin: [:tower | (tower value - gohstPos raisedTo: 2) sum sqrt]) key "=> #A "
複数の座標を出力するか最も早く見つけた座標の値を出力するか
>>862 いや、この場合図と配置から意図は汲んでやるべきだろう。
先に知恵を働かせてコンピュータにさせる計算を極力減らすのがプログラミングだろw
与えられた複数の文字列を並べて、同じ文字が同一カラムになるように□を挿入してください。 複数の解が存在する場合、幅が最小となる物を一つ出力してください。 123 134 ↓ 123 1□34 1212 1322 1122 ↓ 1□□2□12 1□422 11□22 ※文字は全角か半角のどちらかに統一して構いません。 半角の場合は□ではなく半角スペースを挿入してください。
みすった、 下から二段目は 1□422 じゃなく 1□322 っすね。
>>863 ttp://ideone.com/vvAtep あのね、あのね。僕ね、3次元までしか扱ったことがないのー。
だからね、このコードが合ってるかどうか解らないのー。
こういうのってどういう感じで絵を見ればいいのかなぁ??
ちょっとボケてみたけど、これ合ってるのか??
今回はちょっとわからないのでランダムしなかった。
>>869 1212
1322
1122
↓
12□12
1□3□22
1□□122
じゃない?
>>869 Squeak Smalltalk
| align multiAlign |
align := [:seq1 :seq2 |
| mat score gap traceback |
mat := Matrix rows: seq1 size + 1 columns: seq2 size + 1.
mat atRow: 1 put: (Array new: mat columnCount withAll: #left->0).
mat atColumn: 1 put: (Array new: mat rowCount withAll: #up->0).
mat at: 1 at: 1 put: nil->0.
score := [:a :b | (seq1 at: a-1) = (seq2 at: b-1) ifTrue: [1] ifFalse: [-1]]. gap := 0.
2 to: mat columnCount do: [:j | 2 to: mat rowCount do: [:i |
| vals max |
max := (vals := {
(mat at: i-1 at: j-1) value + (score value: i value: j).
(mat at: i-1 at: j) value + gap.
(mat at: i at: j-1) value + gap}) max.
mat at: i at: j put: (#(upLeft up left) at: (vals indexOf: max)) -> max]].
traceback := nil.
gap := seq1 isByteString ifTrue: ['-'] ifFalse: ['□'].
traceback := [:i :j | (mat at: i at: j) key caseOf: {
[nil]->[#('' '' '')].
[#upLeft]->[(traceback value: i-1 value: j-1) with: {seq1 at: i-1. seq1 at: i-1. seq2 at: j-1} collect: #,].
[#up]->[(traceback value: i-1 value: j) with: {seq1 at: i-1. seq1 at: i-1. gap} collect: #,].
[#left]->[(traceback value: i value: j-1) with: {seq2 at: j-1. gap. seq2 at: j-1} collect: #,]}].
traceback value: mat rowCount value: mat columnCount].
multiAlign := [:seqs |
| common |
common := seqs allButFirst inject: seqs first into: [:acc :seq | (align value: acc value: seq) first].
(seqs collect: [:seq | (align value: common value: seq) last]) asStringWithCr].
multiAlign value: #('1212' '1322' '1122').
□1□212
□132□2
11□2□2
LCSっぽいんだけど対象が3つ以上の場合どうすればいいかわからん〜
これちゃんと出題者は自分でいちど書いてみて、規模的に適性と判断したのかね。
>>869 python
#!/usr/bin/python
def func(ss, sd):
for a in ss:
if len(a): break
else: return '',ss,sd
caps = [a[0] for a in ss if len(a)]
results = []
for i, c in enumerate(caps):
ss_work, sd_work = ss[:], sd[:]
for j, a in enumerate(ss):
c_dst = "_"
if len(a) and (a[0] == c):
c_dst, ss_work[j] = a[0], a[1:]
sd_work[j] = sd_work[j] + c_dst
sc, ss_work, sd_work = func(ss_work, sd_work)
results.append((c+sc, ss_work, sd_work))
min_len_c = min([len(c) for (c,s,d) in results])
for c,s,d in results:
if len(c) == min_len_c: return c,s,d
if __name__ == "__main__":
import sys
if len(sys.argv) <= 1: sys.exit(0)
src = sys.argv[1:]
cols, dummy, dst = func(src, ["" for a in src])
for s in dst: print s
$ python 20140112.py 1212 1322 1122
121_2_
1__322
1_1_22
一晩以上考えて結局力技になってもた。
>>869 ruby 1.8.6
class Cell
def initialize(value, space = ' ', n_spaces = 0)
@value, @space, @n_spaces = value, space, n_spaces
end
def into(a)
(1..@n_spaces).inject(a){|a, i| a << @space} << @value
end
def to_s
@space * @n_spaces + @value
end
attr_writer :n_spaces
end
def f869(lines)
space, base = '_', 3 # 最大base-1個のスペースを挿入
cellss = lines.map{|s| s.scan(/./).map {|c| Cell.new(c, space)}}
flatten = cellss.flatten
minsize = base * flatten.size
(0..base ** flatten.size).each {|i|
n_spacess = i.to_s(base).rjust(flatten.size, '0').scan(/./).map{|s| s.to_i}
flatten.each_index {|i| flatten[i].n_spaces = n_spacess[i]}
inflated = cellss.map{|cells| cells.inject([]) {|a, cell| cell.into(a)}}
maxsize = inflated.map {|cells| cells.size}.max
inflated.map! {|cells| cells + [space] * (maxsize - cells.size)}
if inflated.transpose.all? {|cols| cols.uniq.delete_if{|c| c == space}.size <= 1} && maxsize <= minsize
puts 'width = ' + maxsize.to_s + $/ + cellss.map {|cells| cells.join}.join($/) + $/ * 2
minsize = maxsize
end
}
end
f869 %w(123 134)
f869 %w(1212 1322 1122)
>>879 スペース押し込んでチェックをひたすら。
以下、出力例抜粋。
width = 4
123
1_34
width = 6
121_2
1__322
1_1_22
width = 6
121_2
__1322
1_1_22
>>879 あまり役に立ってなかったクラス廃止し、ちょい整理。
def f869(lines)
space, base = '_', 3 # 文字の直前に最大base-1個のスペースを挿入
css, n_chars = lines.map{|s| s.scan(/./)}, lines.join.size
minsize = base * n_chars
(0..base ** n_chars).each {|i|
n_spacess = i.to_s(base).rjust(n_chars, '0').scan(/./).map{|s| s.to_i}
inflated = css.map {|cs| cs.map{|c| [space] * n_spacess.shift + [c]}.flatten}
maxsize = inflated.map {|cs| cs.size}.max
transposed = inflated.map {|cs| cs + [space] * (maxsize - cs.size)}.transpose
if transposed.all? {|cols| cols.uniq.delete_if{|c| c == space}.size <= 1} && maxsize <= minsize
puts 'width = ' + maxsize.to_s + $/ + inflated.map {|cs| cs.join}.join($/) + $/ * 2
minsize = maxsize
end
}
end
f869 %w(123 134)
f869 %w(1212 1322 1122)
>>867 この話ちょっとおもしろいと思う。別解がないことの証明を求められる 可能性はあるね。
>>873 Squeak Smalltalk
>>878 を参考に別解
| multiAlign |
multiAlign := [:seqs |
| queue common |
seqs := seqs collect: #readStream.
queue := OrderedCollection with: ''->(Array new: seqs size withAll: 0).
[:exit | [queue notEmpty] whileTrue: [
common := queue first key.
queue removeFirst value with: seqs do: [:pos :seq | seq position: pos].
(seqs allSatisfy: #atEnd) ifTrue: [exit value].
((seqs reject: #atEnd) collect: #peek) asSet do: [:chr |
| incs |
(incs := seqs select: [:seq | seq peek = chr]) do: #next.
queue add: common, chr -> (seqs collect: #position).
incs do: #back]].
] valueWithExit.
(seqs collect: [:seq |
seq reset.
common collect: [:chr | chr = seq peek ifTrue: [seq next] ifFalse: [$-]]]
) asStringWithCr].
multiAlign value: #('1212' '1322' '1122').
12-12-
1-3-22
1--122
|=番兵|_ ( ・ω・) <ステンバーイ ○={=}〇, |:::::::::\, ', ´ 、、、、し 、、、(((.@)
887 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/17(金) 03:56:03.63
お題:与えられたファイルがMS-DOSで実行可能か判定するプログラム。 実行可能ならば「実行可能です」と表示し、可能でなければ 「実行可能ではありません」と表示する。
888 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/17(金) 04:27:08.12
お題:開平法により、正の実数rの正の平方根の十進表示を小数点以下n桁まで求めるプログラム。
889 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/17(金) 04:58:06.84
お題:循環小数を次のようなルールに従って文字列で表記する。 ※小数点以下において循環する最初の部分をカッコで囲み、それ以下を省略する。 例)2.2111111…→2.2(1) 2.020202…→2.(02) 12.3123123…→12.(312) この表記に従った2つの循環小数の和を求めるプログラムを作れ。 例)2.2(1)+2.(02)=4.2(31) 2.(02)+12.(312)=14.(332514)
>>887 ヘッダのチェックしか検査項目は無いがCOM形式も想定するとだとそれすら不要。
お題を出すなら出すでもうちょい頭使ってお題考えろよ。
それともあれか。
プログラムがクラッシュするかどうか、停止性問題でも解けってのか?あほらしい。
891 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/17(金) 05:09:14.08
>>890 .batと.comについては、拡張子チェックだけでOKとします。
.exeについては、MZで始まるDOSヘッダがありPEヘッダがないものをOKとします
宿題やらされてる感w
ありありw
このクソコテは発作か何かで発言してるの?
896 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/17(金) 19:33:50.01
お題:単語データファイル「words.txt」から英単語リストを読み取り、アルファベットでしりとりを行い、 一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。
897 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/17(金) 20:02:33.98
お題:光学ドライブのトレイの開閉
お題:イライラ棒ゲーム
さあ、究極の挫折感を味わい尽くせ!!!
>>895 プログラマの成れの果て。将来のおまえら。
コイツの出したお題はレベル低すぎて手を出す気にもならん奴が大半だろうな
>>854 J
t=:2j2 5j2 2j5 5j5
w=:'ABCD'
f=:3 :'w{~I.(= <./)|t-y'
f 3j3
A
f 4j3
B
>>901 くそコテ擁護になって申し訳ないがお前のレベル判定とコード記述能力の方が疑問
>>854 Io
f:=method(x,y,if(x<4,if(y<4,"A","C"),if(y<4,"B","D")))
Io> f(3,3)
==> A
Io> f(3,4)
==> C
Io> f(4,3)
==> B
Io> f(4,4)
==> D
906 :
デフォルトの名無しさん :2014/01/18(土) 19:07:14.67
>>904 はいはい、解く気も出題する気もない人はこのスレから出ていってくれないか?
それとも、名誉を賭けてわたくしと三番勝負のタイトルマッチでもするか?
はたまた、数百万円ほどのはした金や人の命を賭けたらやる気になるかい? 全人類の命を賭けてわたくしとご勝負致しますかね?
するわけねーだろ
908 :
デフォルトの名無しさん :2014/01/18(土) 19:45:31.93
まさかメモリマップトファイルとか??????????
>>906 QZと勝負してくれよ酉つけて長期戦でさ
ここで待ってればいつかくるよ
お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を 隣り合う文字の間に挿入した文字列を返す。 例 "Personal" -> "Peerrsssoonnall" "Hello, world!" -> "Heellllooo,, wwworrrlldd!"
>>910 Squeak Smalltalk
| lengthen |
lengthen := [:str |
| out |
out := String new writeStream.
str overlappingPairsDo: [:a :b | out nextPutAll: {a. a max: b}].
out nextPut: str last; contents].
lengthen value: 'Personal'. "=> 'Peerrsssoonnall' "
lengthen value: 'Hello, world!'. "=> 'Heellllooo,, wwworrrlldd!' "
912 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2014/01/18(土) 20:54:55.69
>>910 C 携帯から
#include <stdio.h>
#include <string.h>
main(){char s[256];int i,len;
fgets(s,256,stdin);len=strlen(s);s[--len]=0;putchar(s[0]);
for (i=1;i<len-1;i++){
if (s[i-1]>s[i]) putchar(s[i-1]);else putchar(s[i]);
putchar(s[i]);
if (s[i]>s[i+1]) putchar(s[i]);else putchar(s[i+1]);
}putchar(s[len-1]);}
>>910 ; Common Lisp
(let ((str "Personal"))
(format nil "~{~{~c~c~}~}"
(map 'list
(lambda (x y) (list x (if (char< x y) y x)))
str
(subseq str 1))))
>>910 Haskell
intersperseMaxNbr :: Ord a => [a] -> [a]
intersperseMaxNbr [] = []
intersperseMaxNbr [x] = [x]
intersperseMaxNbr (x:y:ys) = x : max x y : intersperseMaxNbr (y:ys)
main = print $ intersperseMaxNbr "Hello, world!" -- > "Heellllooo,, wwworrrlldd!"
>>910 Python
#!/usr/bin/python
import sys
a = unicode(sys.argv[1], 'utf-8')
b = [max([a[i],a[i+1]]) for i in range(len(a)-1)] + ['']
print "".join(["".join(ab) for ab in zip(a,b)])
>>910 c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *f910(const char *cs) {
int i, len = strlen(cs), blen = len * 2 - 1;
char *buff = malloc(blen + 1);
for (i = 0; i < len; i++) buff[i * 2] = cs[i];
for (i = 1; i < blen; i += 2) {
buff[i] = buff[i - 1] < buff[i + 1] ? buff[i + 1] : buff[i - 1];
}
buff[blen] = '\0';
return buff;
}
void check(const char* cs) {
char *p = f910(cs);
printf("%s\n%s\n", cs, p);
free(p);
}
int main() {
check("Personal");
check("Hello, world!");
return 0;
}
>>910 HSP
#module
#define ctype max(%1,%2) (((%1)>(%2))*((%1)-(%2))+(%2))
#defcfunc f910 str s_
s=s_
ret=strmid(s, 0, 1)
repeat strlen(s)-1
ret+=strf("%c%c", max(peek(s, cnt), peek(s, cnt+1)), peek(s, cnt+1))
loop
return ret
#global
mes f910("Personal")
mes f910("Hello, world!")
>>910 C
#include <stdio.h>
void func(char *s)
{
int a, b;
if ((a = *s++) == '\0') return;
for (putchar(a); b = *s++; a > b ? putchar(a) : putchar(b), putchar(b), a = b);
putchar('\n');
}
int main(int argc, char **argv)
{
if (argc >= 2) func(argv[1]);
return 0;
}
>>911 Squeak Smalltalk 別解。
>>914 を参考に
| lengthen |
lengthen := nil.
lengthen := [:str |
str size < 2 ifTrue: [str] ifFalse: [
(str first: 1), (str first: 2) max, (lengthen value: str allButFirst)]].
lengthen value: 'Personal'. "=> 'Peerrsssoonnall' "
lengthen value: 'Hello, world!'. "=> 'Heellllooo,, wwworrrlldd!' "
>>910 ruby 1.8.6
def f910(s)
cs = s.scan(/./)
cs.zip((0...cs.size - 1).inject([]) {|a, i| a << cs[i, 2].max}).join
end
p f910('Personal')
p f910('Hello, world!')
>>906 適切なお題だと思ってるのに挑戦しないお前のほうがこのスレに居るべきじゃない人間だな。
お前はアレが手頃な難易度もしくは十分高い難易度の適切なお題だと思ってるんだろ?
誰と話してるん?
もう一人のお前
>>910 Io
Range
f:=method(s,
0 to(s size-1)map(i,s slice(i,i+1))reduce(c,d,
c .. if(e>d,e,d).. e:=d
)
)
Io> f("Personal")
==> Peerrsssoonnall
Io> f("Hello, world!")
==> Heellllooo,, wwworrrlldd!
>>924 訂正
>>910 Io
Range
f:=method(s,
a:=0 to(s size-1)map(i,s slice(i,i+1))
e:=a first
a reduce(c,d,c .. if(e>d,e,d).. e=d)
)
>>910 Objective Caml version 3.08.1
let cs2s cs = String.concat "" (List.map (fun c -> String.make 1 c) cs);;
let f910 s =
let rec f cs i =
if i == 0 then s.[i]::cs
else f (max s.[i - 1] s.[i]::s.[i]::cs) (pred i) in
cs2s (f [] (String.length s - 1));;
print_string (f910 "Personal");;
print_newline ();;
print_string (f910 "Hello, world!");;
>>910 Python
>>915 別解
#!/usr/bin/python
import sys
if len(sys.argv)<2 or len(sys.argv[1])==0: sys.exit(0)
a = unicode(sys.argv[1], 'utf-8')
print reduce(lambda x,y: x+max(x[-1],y)+y, a)
>>910 c++
#include <iostream>
#include <vector>
#include <numeric>
std::string f(std::string s, char c) {
return s.empty() ? s + c : s + (s[s.size() - 1] < c ? c : s[s.size() - 1]) + c;
}
std::string f910(std::string s) {
return std::accumulate(s.begin(), s.end(), std::string(), f);
}
void check(std::string s) {
std::cout << s << std::endl;
std::cout << f910(s) << std::endl;
}
int main() {
check("Personal");
check("Hello, world!");
return 0;
}
お題:3次元の配列を連番で初期化する。 Jの場合 a=:i.2 3 4 a 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 (<1;2;3){a 23
931 :
930 :2014/01/19(日) 07:12:54.92
わかりました。
>>929 ruby 1.8.6
require 'enumerator'
def a3d(x, y, z)
(0...x * y * z).enum_slice(y * z).map {|xa| xa.enum_slice(z).to_a}
end
p a3d(2, 3, 4)
↓
[[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 1
9], [20, 21, 22, 23]]]
>>929 十進BASIC
DIM a(2,3,4)
FOR i=1 TO 2
FOR j=1 TO 3
FOR k=1 TO 4
LET a(i,j,k)=i*j*k
NEXT K
NEXT J
NEXT I
MAT PRINT a;
END
1 2 3 4
2 4 6 8
3 6 9 12
2 4 6 8
4 8 12 16
6 12 18 24
>>929 # R
array(0:23, 4:2)
>>910 十進BASIC
FUNCTION f$(s$)
LET a$ = s$(1:1)
FOR i = 2 TO LEN(s$)
IF s$(i-1:i-1) < s$(i:i) THEN
LET c$ = s$(i:i)
ELSE
LET c$ = s$(i-1:i-1)
END IF
LET a$ = a$ & c$ & s$(i:i)
NEXT I
LET f$ = a$
END FUNCTION
PRINT f$("BASIC")
END
実行結果
BBASSSIIC
>>929 Maxima
f(a,b,c):=fillarray(make_array(fixnum,a,b,c),makelist(i,i,0,a*b*c-1));
(%i110) f(2,3,4);
(%o110) {Array: #3A(((0 1 2 3) (4 5 6 7) (8 9 10 11))
((12 13 14 15) (16 17 18 19) (20 21 22 23)))}
(%i114) f(2,3,4)[1,2,3];
(%o114) 23
>>929 Squeak Smalltalk
| multiDimIota a |
multiDimIota := [:arr |
arr allButFirst reversed inject: (0 to: (arr reduce: #*)-1)
into: [:acc :m | acc groupsOf: m atATimeCollect: [:g | g]]].
a := multiDimIota value: #(2 3 4).
"=> #(#(#(0 1 2 3) #(4 5 6 7) #(8 9 10 11)) #(#(12 13 14 15) #(16 17 18 19) #(20 21 22 23))) "
((a at: 2) at: 3) at: 4 "=> 23 "
お題: 二次元空間を整数グリッドで表わし、すべての整数グリッド座標を辿る関数。 出力(例): (0, 0) (1, 0) (1, 1) (0, 1) (-1, 1) (-1, 0) (-1, -1) (0, -1) (1, -1) (2, 0) (2, 1) ... 出力(例): (0, 0) (1, 0) (0, 1) (-1, 0) (0, -1) (2, 0) (1, 1) (0, 2) (-1, 1) (-2, 0) (-1, -1) (0, -2) (1, -1) (3, 0) (2, 1) ... お題: 中心を原点とする円の半径が与えられたとき、その円内のすべての整数グリッド座標を辿る関数。 入力(例): 2 出力(例): (0, 0) (1, 0) (1, 1) (0, 1) (-1, 1) (-1, 0) (-1, -1) (0, -1) (1, -1) (2, 0) (0, 2) (-2, 0) (0, -2) 出力(例): (0, 0) (1, 0) (0, 1) (-1, 0) (0, -1) (2, 0) (1, 1) (0, 2) (-1, 1) (-2, 0) (-1, -1) (0, -2) (1, -1)
Polygon関数系?
>>888 や
>>889 はいい問題なんだが、根気よくこつこつと積み上げるのが大変だね‥‥
>>896 もなんとか手をつけたいね‥‥
今日は ::new[](std::nothrow) ではまってしまった‥‥やっぱり例外はちゃんと把握しないといけないのかな‥‥
日記帳っぷりが片山そっくり
>>940 J
f1=:3 :'+/\0,((2#>:i.y)#4|i.+:y){1j0 0j1 _1j0 0j_1'
f1 3
0 1 1j1 0j1 _1j1 _1 _1j_1 0j_1 1j_1 2j_1 2 2j1 2j2
f2=:3 :';(<@#"1~ y>:|)(|.j.~/])i:y'
f2 2
0j2 _1j1 0j1 1j1 _2 _1 0 1 2 _1j_1 0j_1 1j_1 0j_2
座標を複素数で表しています。虚数部が0の場合、省略して表示されています。
>>940 ruby 1.8.6
def f940a(n)
(1..n).inject([[0, 0]]){|a, i|
(1 - i..i).each {|x| a << [x, -i]}
(1 - i..i).each {|y| a << [i, y]}
(1 - i..i).each {|x| a << [-x, i]}
(1 - i..i).each {|y| a << [-i, -y]}; a
}
end
def f940b(r)
f940a(r).select{|a| a.first ** 2 + a.last ** 2 <= r ** 2}
end
p f940a(2)
p f940b(2)
↓
[[0, 0], [0, -1], [1, -1], [1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0], [-1, -1], [
-1, -2], [0, -2], [1, -2], [2, -2], [2, -1], [2, 0], [2, 1], [2, 2], [1, 2], [0,
2], [-1, 2], [-2, 2], [-2, 1], [-2, 0], [-2, -1], [-2, -2]]
[[0, 0], [0, -1], [1, -1], [1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0], [-1, -1], [
0, -2], [2, 0], [0, 2], [-2, 0]]
お題:実数の整数部分と小数点以下を入れ換える。 1.23 -> 23.1 20.24 -> 24.2 2.24 -> 24.2 0.01 -> 1.0
>>947 ruby 1.8.6
def f947(value)
value.to_s.gsub(/(\d+).(\d+)/, '\2.\1').to_f
end
p f947(1.23)
p f947(20.24)
p f947(2.24)
p f947(0.01)
↓
23.1
24.2
24.2
1.0
>>947 Squeak Smalltalk
| swapIntFracPartOf |
swapIntFracPartOf := [:x | ((x asString subStrings: '.') reduce: [:int :frac | frac, '.', int]) asNumber].
swapIntFracPartOf value: 1.23. "=> 23.1 "
swapIntFracPartOf value: 20.24. "=> 24.2 "
swapIntFracPartOf value: 2.24. "=> 24.2 "
swapIntFracPartOf value: 0.01. "=> 1.0 "
>>940 Python
def f940(r):
yield (0,0)
for i in range(1,1+r):
for j in range(i): yield (i,j)
for j in range(i*2): yield (i-j,i)
for j in range(i*2): yield (-i,i-j)
for j in range(i*2): yield (j-i,-i)
for j in range(i): yield (i,j-i)
r = 2
print list(f940(r))
print [(x,y) for (x,y) in f940(r) if x*x+y*y<=r*r]
>>940 Squeak Smalltalk
| gridIntersecs gridIntersecsInCircle |
gridIntersecs := Generator on: [:g |
| pen |
g yield: ((pen := Pen new) up; place: 0@0; location).
1 to: Float infinity do: [:n |
2 timesRepeat: [pen turn: 90. n timesRepeat: [g yield: (pen go: 1; location) rounded]]]].
(gridIntersecs next: 12) asArray.
"=> {0@0 . 1@0 . 1@1 . 0@1 . -1@1 . -1@0 . -1@ -1 . 0@ -1 . 1@ -1 . 2@ -1 . 2@0 . 2@1} "
gridIntersecsInCircle := [:radius |
| intersecs |
intersecs := gridIntersecs copy reset.
Generator on: [:g |
[intersecs peek abs <= radius asPoint] whileTrue: [
intersecs next in: [:next | next r <= radius ifTrue: [g yield: next]]]]].
(gridIntersecsInCircle value: 2) contents
"=> {0@0 . 1@0 . 1@1 . 0@1 . -1@1 . -1@0 . -1@ -1 . 0@ -1 . 1@ -1 . 2@0 . 0@2 . -2@0 . 0@ -2} "
お題:自然数nの階乗の素因数2の個数を求める。(2014年センター試験) n=5 -> 3 n=13 -> 10
>>955 ; Common Lisp
(defun f955 (n)
(loop for i from 1 to n
sum (loop for j = (/ i 2) then (/ j 2)
while (integerp j)
count t)))
>>955 Squeak Smalltalk
| factorTwosInFactorialOf |
factorTwosInFactorialOf := [:n |
(2 to: n) inject: 0 into: [:acc :m |
[m isDivisibleBy: 2] whileTrue: [acc := acc + 1. m := m // 2].
acc
]
].
factorTwosInFactorialOf value: 5. "=> 3 "
factorTwosInFactorialOf value: 13. "=> 10 "
>>955 ruby 1.8.6
def f955(n)
def f(m, d, c = 0) m % d != 0 ? c : f(m / d, d, c + 1) end
(1..n).inject(0) {|sum, i| sum += f(i, 2)}
end
p f955(5)
p f955(13)
↓
3
10
>>955 PARI/GP
f(n)=factor(n!)[1,2]
? f(5)
%2 = 3
? f(13)
%3 = 10
? f(1000)
%4 = 994
>>955 Haskell
import Data.Function
f955 :: Integer -> Integer
f955 n = foldr ((+) . fix (\f k -> if odd k then 0 else f (div k 2) + 1)) 0 [2,4..n]
main = print $ map f955 [1,2,3,4,5,13,1000] -- > [0,1,1,3,3,10,994]
>>955 HSP
#module
#defcfunc f955 int x, local y, local r
y=x
while y
y/=2
r+=y
wend
return r
#global
list=1,2,3,4,5,13,1000
foreach list
mes f955(list.cnt)
loop
>>961 すごい。whileループひとつでできちゃうのか。
>>955 C
#include <stdio.h>
void f(int n){
printf("%d\n", n - __popcountsi2(n));
}
int main(){
f(5);
f(13);
f(1000);
return 0;
}
3
10
994
>>955 Perl
use 5.016;
use warnings;
sub f { length join('', map{ (sprintf("%b", $_) =~ m/(0*)$/)[0] } (2 .. shift)) }
say f(5);
say f(13);
say f(1000);
>>955 Io
f:=method(n,n-n asBinary asNumber%9)
Io> f(5)
==> 3
Io> f(13)
==> 10
Io> f(1000)
==> 994
966 :
デフォルトの名無しさん :2014/01/22(水) 04:07:51.86
>>955 with Python
N= 5; import sympy as ts; ts.factorint(ts.factorial(N))[2]
===============================
3
N=13; import sympy as ts; ts.factorint(ts.factorial(N))[2]
===============================
10
C++いつも書いてるものだが、数学はサッパリだ。Orz お前らが羨ましいぜ。
969 :
デフォルトの名無しさん :2014/01/22(水) 13:32:57.36
死ねゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミwwwww
お題:行編集のまねごと。 最初はカーソルのみの状態で文字をカーソルの前に挿入する。 '['でカーソルを前へ、']'で後ろに移動する。 例 "abc[-[[/" -> "a/b-c" "a[b[c]]d" -> "cbad"
>>970 HSP
#module
#define global ctype f970(%1="", %2="", %3=0) f970_(%1,%2,%3)
#define ctype max(%1,%2) (((%1)-(%2))*((%1)>(%2))+(%2))
#define ctype min(%1,%2) (((%1)-(%2))*((%1)<(%2))+(%2))
#defcfunc f970_ str cmd_, str s_, int p_, local cmd, local s, local p, local l, local t
s=s_
cmd=cmd_
l=strlen(s)
p=max(min(p_, l), 0)
repeat strlen(cmd)
c=peek(cmd, cnt)
switch c
case '['
p=max(p-1, 0)
swbreak
case ']'
p=min(p+1, l)
swbreak
default
s=strf("%s%c%s", strmid(s, 0, p), c, strmid(s, p, l-p))
p++
l++
swbreak
swend
loop
mref t, 64 : t=p
return s
#global
mes f970("abc[-[[/")
mes f970("a[b[c]]d")
>>970 ruby 1.8.6
def f970(s)
l, r = [], []
s.scan(/./).each {|c|
case c
when '['
r.unshift l.pop if !l.empty?
when ']'
l.push r.shift if !r.empty?
else
l << c
end
}
[l, r].join
end
p f970("abc[-[[/")
p f970("a[b[c]]d")
↓
"a/b-c"
"cbad"
>>955 ruby 1.8.6 mathn使用
require 'mathn'
def f955(n)
n == 1 ? 0 : (2..n).inject(1) {|r, i| r * i}.prime_division[0][1]
end
p [1,2,3,4,5,13,1000].map {|n| f955(n)}
↓
[0, 1, 1, 3, 3, 10, 994]
>>970 Squeak Smalltalk
| lineEdit |
lineEdit := [:str |
| cursor |
cursor := 0.
(str inject: OrderedCollection new into: [:coln :chr |
chr caseOf: {
[$[]->[cursor := cursor - 1].
[$]]->[cursor := cursor + 1]
} otherwise: [coln add: chr afterIndex: cursor. cursor := cursor + 1].
coln]) as: String
].
lineEdit value: 'abc[-[[/'. "=> 'a/b-c' "
lineEdit value: 'a[b[c]]d'. "=> 'cbad' "
>>947 HSP
#module
#defcfunc f947 double x
if x<0.0 : return "-"+f947_int(strf("%.10f", -x))
return f947_int(strf("%.10f", x))
#defcfunc f947_int str s_, local s, local l, local r, local p
s=s_
l="" : r=""
p=instr(s, 0, ".")
l=strmid(s, 0, p)
r=strmid(s, p+1, strlen(s))
remove_tail_zero(r)
repeat strlen(r)-1
if peek(r, 0)!'0' : break
r=strmid(r, 1, strlen(r))
loop
remove_tail_zero(l)
return strf("%s.%s", r, l)
#deffunc remove_tail_zero var s, local i
for i, strlen(s)-1, 0, -1
if peek(s, i)!'0' : _break
poke s, i, 0
next
return
#global
mes f947(1.23)
mes f947(20.24)
mes f947(2.24)
mes f947(-0.01)
>>970 Python
def f970(ss):
i = 0
xx = ""
sft = {"[":-1,"]":1}
for c in ss:
if c in sft.keys():
i += sft[c]
else:
xx = xx[:i] + c + xx[i:]
i += 1
return xx
for ss in ["abc[-[[/", "a[b[c]]d", "abcd[[@]]@efg"]:
print "%s -> %s" % (ss, f970(ss))
>>979 Io
Range
f method(s,
r := list
p := 0
a := 0 to(s size - 1) map(v, s at(v) asCharacter)
a foreach(c,
if(c == "[",
p = 0 max(p - 1)
,
if(c == "]", p = r size min(p + 1), r insertAt(c, p); p = p + 1)
)
)
r join
)
Io> f("abc[-[[/")
==> a/b-c
Io> f("a[b[c]]d")
==> cbad
>>979 forの中で、iの範囲を制限するのが抜けてました。(_ _)
i = min(max(0,i),len(xx))
>>978 の エラー制御板。
デバッガで開発してるのでエラーで吹き飛ぶのはあんまり考慮してません。開発中は止まったほうが有難いですし。
#include <iostream>
#include <string>
#include <algorithm>
std::string EditLine(std::string Command){
std::string ret;
int Cur = 0;
for (std::size_t i = 0; i < Command.size(); i++){
if (Command[i] == '['){
if (Cur > 0) Cur--;
continue;
}
if (Command[i] == ']'){
if (Cur <= ret.size()) Cur++;
continue;
} auto ins = std::inserter(ret, ret.begin() + (Cur++));
ins = Command[i];
} return ret;
} int main(){
std::string str = "abc[-[[/";
std::string str2 = "a[b[c]]d";
std::string R;
R = EditLine(str);
std::cout << str << " -> " << R << std::endl;
R = EditLine(str2);
std::cout << str2<< " -> " << R << std::endl;
return 0;
}
983 :
デフォルトの名無しさん :2014/01/22(水) 22:27:27.43
>>973 def f970 s
s.chars.inject [[],[]] do | ( l , r ) , c |
case c
when '['
r.unshift l.pop if !l.empty?
when ']'
l.push r.shift if !r.empty?
else
l << c
end
[ l , r ]
end.join
end
p f970("abc[-[[/")
p f970("a[b[c]]d")
>>955 J
f =: - +/@#:
f 5
3
f 13
10
f 1000
994
えーと。説明へただしなあ。本当にJ言語に興味があるなら基本知識は
自分で調べてください。
「-」自体は二項演算子の減算です。
f =: - +/@#:
は、引数をyで表す書き方をすると
f =:3 :'y - +/@#: y'
で
>>963 の
n - __popcountsi2(n)
に相当します。
なるほど。分かりました。ありがとうございます。
988 :
930 :2014/01/23(木) 11:47:47.40
>>955 Prolog
'自然数nの階乗の素因数2の個数を求める。(2014年センター試験)'(_n,_自然数nの階乗の素因数2の個数) :-
findsum(_ある自然数の素因数2の個数,(
between(1,_n,_ある自然数),
ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数)),
_自然数nの階乗の素因数2の個数).
ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数) :-
nth0(_ある自然数の素因数2の個数,_,_),
\+(0 is _ある自然数 mod (2 ^ (_ある自然数の素因数2の個数 + 1))),!.
findsum(_選択項,_副目標,_合計) :-
findall(_選択項,_副目標,_選択項ならび),
sumlist(_選択項ならび,_合計).
>>970 J
L=:3 : 0
if. 0<#a do.
b=:({:a),b
a=:}:a
end.
)
R=:3 : 0
if. 0<#b do.
a=:a,{.b
b=:;}.b
end.
)
A=:3 : 'a=:a,y'
f=:3 : 0
L`R`A @.('[]'&i.)"0 y
a,b
)
f'a[b[c]]d' [ a=:b=:''
cbad
f'abc[-[[/' [ a=:b=:''
a/b-c
お題:円周率の歴史の長さからみれば出来立てほやほやのBBPの式を使って 円周率を小数点以下15桁まで求める。 ∞ π=Σ(4/(8*k+1)-1/(4*k+2)-1/(8*k+5)-1/(8*k+6))/(16^k) k=0
>>990 Squeak Smalltalk
| pi k epsilon delta |
pi := k := 0.
epsilon := 1/1e15.
[ delta := (4/(8*k+1))-(1/(4*k+2))-(1/(8*k+5))-(1/(8*k+6))/(16 raisedTo: k).
k := k + 1.
pi := pi + delta.
delta > epsilon] whileTrue.
pi asScaledDecimal: 15 "=> 3.141592653589793s15 "
次のスレ立ててくれ
>>990 Perl
use 5.016;
use warnings;
use bignum;
sub imp {
(4 / (8 * $_[0] + 1) - 1 / (4 * $_[0] + 2) - 1 /
(8 * $_[0] + 5) - 1 / ( 8 * $_[0] + 6)) / (16 ** $_[0])
}
sub f {
sub {
$_[2] < 1.0e-15 ?
$_[1] :
__SUB__->($_[0] + 1, $_[1] + $_[2], imp($_[0] + 1))
}->(0, 0, imp(0))->ffround(-15)
}
say f();
>>990 Io
r:=0
for(k,0,10,r=r+(4/(8*k+1)-1/(4*k+2)-1/(8*k+5)-1/(8*k+6))/(16**k))asString(0,15)
==> 3.141592653589793
>>990 Haskell
pi' :: (Enum a, RealFrac a) => a
pi' = sum $ takeWhile (1/1e15 <) [(4/(8*k+1) - 1/(4*k+2) - 1/(8*k+5) - 1/(8*k+6))/(16^floor k) | k <- [0..]]
main = print pi' -- 3.141592653589793
>>990 Lua
r=0
k=0
repeat
a=(4/(8*k+1)-1/(4*k+2)-1/(8*k+5)-1/(8*k+6))/(16^k)
r=r+a
k=k+1
until a<1e-15
print(("%.15f"):format(r))
3.141592653589793
>>955 SWI-Prolog
?- N is 13,X is N - popcount(N).
N = 13,
X = 10.
うんこ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。