プログラミングのお題スレ Part3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2014/01/24(金) 09:59:09.83前スレ
プログラミングのお題スレ
http://toro.2ch.net/test/read.cgi/tech/1357191974/
出されたお題をコーディングして罵られるスレ
http://toro.2ch.net/test/read.cgi/tech/1354393458/
【出題と回答例】
1 名前:デフォルトの名無しさん
お題:お題本文
2 名前:デフォルトの名無しさん
>>1 使用言語
回答本文
【ソースコードが長くなったら】
http://codepad.org/
http://ideone.com/
宿題は宿題スレがあるのでそちらへ。
0153148
2014/02/12(水) 21:30:39.85「突っ切る」イメージは>>148以上に説明しようがないのが辛いところです
(要するに、全ての縦/横の筋に対して、1枚でも畳が横切っていればOKということ)
どう実装するかは頭を捻ってもらうしか……
0154149
2014/02/12(水) 21:40:03.46正直、ギブアップなので、コード晒そうと思ったんだが。。。
これでは収まりが付かないので移植してみるか。
万が一うまく言ったらアップする。
0155デフォルトの名無しさん
2014/02/12(水) 21:46:33.21「盤の辺と同じ長さの直線が四辺以外に生じてはならない」とか、
「盤面を分断する直線はNG」とか、そういうことだと思う。
>>148の図を元にNGとされる直線を太線で示すとこうかな。
┌┬┬─┰┬┐
││├┬┨││
├┴┤│┠┴┤
┝┯┷┿╋━┥
│├─┤┠─┤
└┴─┴┸─┘
0156デフォルトの名無しさん
2014/02/12(水) 22:35:03.25http://codepad.org/XjgdObG6
0158156
2014/02/12(水) 23:00:09.39HSP が遅いってのも少しはあるけど
アルゴリズムが悪いだけ
再帰呼び出しで畳をすべて敷き詰めてみてから
分断する線がないかどうかチェックしてる
縦方向に分断する線について考えるとき
横幅 6 なら 5本 の可能性がある
畳を横向きに置いたとき
対応する縦線に対応するカウンタを増やす
最終的にカウンタが 0 の線があれば
分断されていると判断できる
横方向に分断する線についても同様に考える
カウンタを増やす理由は
1、0 だけでやると元に戻すときに変更前の値を保存しておかないといけないから
面倒くさいという理由
>>156 では畳に1〜 の番号を振って
カウンタも畳の番号と同じものを増減させてる
0159デフォルトの名無しさん
2014/02/12(水) 23:11:09.06ttp://ideone.com/jZJoae
ベターCに移植してみた。設計いいから簡単だった。変換がちょっとややこしいけど。
移植してみた感想?うーん。わからん!利点は、グローバル変数が消えました。位・・・。Orz
チャック関数が何やってるのかサッパリわからん。
うーん。脱力。
ttp://ideone.com/IZDTEt
上のようなコードを移植前に書いていたがダサすぎる。
俺に才能をクレ。Orz
0160148
2014/02/12(水) 23:18:35.82あー、私が書いたコードの場合はちゃんと枝刈りするから速いんでしょうね……
(明らかにこれは駄目だ、と判定されたら次の畳を置かない)
>>159
check関数では、「明らかに駄目」な盤面ならfalse(0)を返すようにしています
盤面データは、「0なら置かれていない、1以上(畳の番号)なら置かれている」として、
水平・垂直方向にそれぞれ走査してチェックしています。……まあ要するに、
「筋の両側のペアを見て、もし筋の両側が完全には埋まっていなかったり、
筋を跨ぐ方向に畳が存在した場合はチェックをパスする(駄目扱いしない)」
ってことなんですけどね
0161デフォルトの名無しさん
2014/02/12(水) 23:41:06.71import itertools, copy
def f148(tate, yoko):
area = [[None for y in range(yoko)] for x in range(tate)]
result = dict()
def f148r(area, tate, yoko, n=0):
for x,y in itertools.product(range(yoko), range(tate)):
if not area[y][x]:
for (dx,dy) in [(1,0), (0,1)]:
if x+dx<yoko and y+dy<tate:
if not area[y+dy][x+dx]:
area_copy = copy.deepcopy(area)
area_copy[y][x], area_copy[y+dy][x+dx] = u"→↓"[dy], u"←↑"[dy]
f148r(area_copy, tate, yoko, n+1)
return
elif y != tate-1:
if x == yoko-1 and all(c in u"→←↑" for c in area[y]): return
else:
if x != yoko-1 and all(c in u"←↑↓" for c in [area[i][x] for i in range(len(area))]): return
else:
key = "".join("".join(line) for line in area)
if not result.has_key(key): result[key] = [1, area]
else: result[key][0] += 1
f148r(area, tate, yoko)
print "<result>", len(result.keys())
for key in sorted(result.keys(), lambda x,y: cmp(x[0],y[0]))[-3:]:
n,a = result[key]
print "(%d)" % (n)
for x in a: print "".join(x)
f148(6,7)
0162デフォルトの名無しさん
2014/02/12(水) 23:48:08.06<result> 124
(1)
↓↓→←↓→←
↑↑→←↑↓↓
↓→←→←↑↑
↑→←↓→←↓
→←↓↑→←↑
→←↑→←→←
(1)
↓→←→←→←
↑→←→←↓↓
→←→←↓↑↑
↓→←↓↑→←
↑→←↑→←↓
→←→←→←↑
(1)
↓→←→←→←
↑→←↓→←↓
→←↓↑→←↑
→←↑→←↓↓
↓↓→←↓↑↑
↑↑→←↑→←
0164156
2014/02/13(木) 00:21:35.43if x>=length(field) : x=0 : y++
↓
if x>=length(field) {
if y+1<length2(field) : if cnt_v(y)=0 : return
x=0
y++
}
>trueと比較するのは個人的な流儀なのでこれは曲げれん。
記述性/可読性に関する個人的な見解に異論を挟むつもりはまったくないのだけれども、
こと、C/C++ に関しては true/false との比較では、単に可読性の問題ではすまないと考えているので、 >>113 が教条主義とはどうしても思えない。
歴史的事情なのかどうかは定かではないが、C/C++ では「true/false」は「非零/零」の対立に対応するので(isalpha() とかね)、
「== true」は、それをみただけで、「まずい」、と感じるセンスが必要なのかもしれないかと。
でも、最近、お題についていけないかわいそうな状態の私がこれ以上の意見を述べるのは、ここではちと身の程知らず
なにかお題を解いたら、これについてちょっと説明を考えてみますね、最近のお題は結構むずかしいなあ‥‥
0166デフォルトの名無しさん
2014/02/13(木) 10:17:51.750168デフォルトの名無しさん
2014/02/13(木) 13:38:15.340169デフォルトの名無しさん
2014/02/13(木) 14:23:52.850170デフォルトの名無しさん
2014/02/13(木) 17:43:49.69m=3 -> 1/3,1/2,2/3
m=5 -> 1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5
0171デフォルトの名無しさん
2014/02/13(木) 18:31:06.45もうクズ呼びでもいいやとでも思っているのだろうか……>QZ
0172デフォルトの名無しさん
2014/02/13(木) 20:24:19.46ム板のコテは自虐入ってるくせに非難されてもメゲないという地味にウザい性格の奴が多いようで
0173デフォルトの名無しさん
2014/02/13(木) 21:07:45.02この問題いいの?
某所からのパクりじゃない?
0174デフォルトの名無しさん
2014/02/13(木) 21:17:35.87ttp://ideone.com/0nAThz
保険にちょっと大げさに警告文書いておいた。訴訟もじさないなら流用してミソ。
>>173ソースプリーズ。
畳に比べたら簡単。ほぼC。
0175デフォルトの名無しさん
2014/02/13(木) 21:42:17.70(defun f (m)
(let ((rs (loop for n from 1 upto (1- m)
nconc (loop for d from 1 upto m for r = (/ n d) collect r))))
(sort (remove-duplicates (remove-if (complement (lambda (x) (< 0 x 1)))
rs))
#'<)))
(loop for m from 2 upto 10 do (format t "~D => ~S~%" m (f m)))
2 => (1/2)
3 => (1/3 1/2 2/3)
4 => (1/4 1/3 1/2 2/3 3/4)
5 => (1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5)
6 => (1/6 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 5/6)
7 => (1/7 1/6 1/5 1/4 2/7 1/3 2/5 3/7 1/2 4/7 3/5 2/3 5/7 3/4 4/5 5/6 6/7)
0176デフォルトの名無しさん
2014/02/13(木) 22:13:46.500177デフォルトの名無しさん
2014/02/13(木) 22:15:03.21回答者の気まぐれによる。
あった方がいい。
0178デフォルトの名無しさん
2014/02/13(木) 22:24:39.560179174
2014/02/13(木) 22:30:07.380180デフォルトの名無しさん
2014/02/13(木) 23:29:46.18import Data.List (nub, sort)
import Data.Ratio
f170 :: Integral a => a -> [Ratio a]
f170 m = sort . nub $ [a % b | b <- [2..m], a <- [1..b-1]]
main :: IO ()
main = flip mapM_ [3,5] $ print . f170
-- [1 % 3,1 % 2,2 % 3]
-- [1 % 5,1 % 4,1 % 3,2 % 5,1 % 2,3 % 5,2 % 3,3 % 4,4 % 5]
0181デフォルトの名無しさん
2014/02/14(金) 00:59:38.56| fractions |
fractions := [:m | ((2 to: m) gather: [:n | (1 to: n-1) / n]) asSet asSortedArray].
fractions value: 3. "=> {(1/3) . (1/2) . (2/3)} "
fractions value: 5. "=> {(1/5) . (1/4) . (1/3) . (2/5) . (1/2) . (3/5) . (2/3) . (3/4) . (4/5)} "
0182デフォルトの名無しさん
2014/02/14(金) 05:12:23.78m=3; ts(); sorted({`1r nmrtr/dnmntr for dnmntr in range(1,m+1) for nmrtr in range(1,dnmntr)})
===============================
[1/3, 1/2, 2/3]
m=5; ts(); sorted({`1r nmrtr/dnmntr for dnmntr in range(1,m+1) for nmrtr in range(1,dnmntr)})
===============================
[1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5]
0183デフォルトの名無しさん
2014/02/14(金) 07:40:02.13f:=method(m,g(0,1,1,1,m))
g:=method(a,b,c,d,n,
if(b+d<=n,
g(a,b,a+c,b+d,n)
write(a+c,"/",b+d," ")
g(a+c,b+d,c,d,n)
)
)
Io> f(3)
1/3 1/2 2/3 ==> false
Io> f(5)
1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 ==> false
0184174
2014/02/14(金) 18:06:37.53みんな、どうやって既約判定してるのか全然読めない俺の頭が恨めしい。
>>173が逃げたのでブラフは一応気にしなくていいよ。このスレ内ではね。
0185デフォルトの名無しさん
2014/02/14(金) 18:17:36.81#module
#deffunc swap var a, var b, local c
c=a : a=b : b=c
return
#defcfunc gcd int a, int b
if b=0 : return a
return gcd(b, a\b)
#defcfunc f170 int n, local i, local j, local ans_double, local ans_frac, local ans_count, local ret
for i, 2, n+1
for j, 1, i
if gcd(j, i)=1 {
ans_double(ans_count)=double(j)/i
ans_frac(ans_count)=strf("%d/%d", j, i)
ans_count++
}
next
next
sdim ret
for i, 0, ans_count
for j, 0, ans_count-1-i
if ans_double(j)>ans_double(j+1) {
swap ans_double(j), ans_double(j+1)
swap ans_frac(j), ans_frac(j+1)
}
next
ret=strf("%s ", ans_frac(ans_count-1-i))+ret
next
return ret
#global
mes f170(3)
mes f170(5)
0186174
2014/02/14(金) 19:17:38.74いやー、ほんとユーグリッドの互除法無しでどうやって既約判定してるのか全然読めんわ。
なんか他アルゴリズムあるんだろうけど、俺にはわからないなー。Orz
ほんっと、数学ダメなんだよね。
0187デフォルトの名無しさん
2014/02/14(金) 19:41:58.71f=:3 :'~./:~(#~1&>),%/~x:>:i.y'
f 3
1r3 1r2 2r3
f 5
1r5 1r4 1r3 2r5 1r2 3r5 2r3 3r4 4r5
0188デフォルトの名無しさん
2014/02/14(金) 19:53:25.76#module
#deffunc ans_add double d, str f, array ans_double, array ans_frac, var ans_count, local i, local j
for i, 0, ans_count
if ans_double(i)=d : return
if ans_double.i>d : _break
next
for j, ans_count, i, -1
ans_double(j)=ans_double(j-1)
ans_frac(j)=ans_frac(j-1)
next
ans_double(i)=d
ans_frac(i)=f
ans_count++
return
#defcfunc f170 int n, local i, local j, local ans_double, local ans_frac, local ans_count
for i, 2, n+1
for j, 1, i
d=double(j)/i
f=strf("%d/%d", j, i)
ans_add d, f, ans_double, ans_frac, ans_count
next
next
sdim ret
repeat ans_count
ret+=ans_frac(cnt)+" "
loop
return ret
#global
mes f170(3)
mes f170(5)
0189174
2014/02/14(金) 19:56:33.38ホント、何もしないって。
0191174
2014/02/14(金) 20:15:28.50たまたま被ったのか。そーりー。
これでしばらく黙ります。しーゆー。
0192174
2014/02/14(金) 20:22:59.01慣れないことはするもんじゃないね。トホホ・・・。Orz
0193175
2014/02/14(金) 20:49:00.82>>175ですが、既約分数の判定は(陽には)していません。Common Lispでは除算
の結果が整数で表せない場合、分数が返されますが、それらは既に約分されて
います(他の分数を扱える言語やライブラリでもそうなんじゃないかな)。
(/ 2 4) ;=> 1/2
;; リテラルでも
2/4 ;=> 1/2
なので、分子(n)と分母(d)を列挙してそれらを除算(/ n d)した数のリストをま
ず作り、そこから重複要素を取除くことで目的の結果を得ています。
0194デフォルトの名無しさん
2014/02/14(金) 21:16:33.96結城浩の日記 - 2003年12月30日 (火) - 既約分数
http://www.hyuki.com/diary/dia0312.html#i30
Scheme:数遊び:既約分数
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3A%E6%95%B0%E9%81%8A%E3%81%B3%3A%E6%97%A2%E7%B4%84%E5%88%86%E6%95%B0
上記問題に対するSchemeによる回答。
「Haskellによるエレガントな解法」へのリンクがあったらしいが404。一つだけInternet Archiveに残ってた。
http://web.archive.org/web/20060513102938/http://www.sampou.org/cgi-bin/cahier.cgi?Cahier%3a2004-01-02
0195184==174
2014/02/14(金) 21:42:05.70>>193
まず、反省なんだけど。
俺、既約って言うことについてWikipediaで読んだくらいの知識しか無いんだわ。
>>193読んでてそう言えば小学校で習ったかもと思い出した。俺、算数もできなくなってるよ。Orz
んで、やっぱり高級言語はそうでないとね。C系列はライブラリなさすぎなんだよなぁ。
解説ありがとう。色々納得いっていい勉強になりました。
アルゴリズムはこうか。
既約とは分数の約分がすでに終わっていることである。
分母分子の小さなものの答えが小さい方から貯めていって、
すでにあったらそれは分母分子が規約分数の倍数である。
なのでそれを取り除く。って感じか。
なるほど。前は違うこと考えて解いてたわ。(汗
>>170
ttp://ideone.com/g49nVI
コードは思うところがあって共変しようと思って>>188を参考に書いてみた。
これで循環。キモいな俺。
>>194
ソースありがとう。
なんかのコンテストじゃなくてよかったよ。
0196デフォルトの名無しさん
2014/02/14(金) 22:11:46.50std::map 使えばいいのにw
0197デフォルトの名無しさん
2014/02/14(金) 22:16:45.46あ、やっぱ言われた。
書き終わって、あーこれエラトステネスの篩と同じ系統だ。
と理解して納得したまでが今日のハイライト。
まぁ、暇なので書いてみるよ。
0198デフォルトの名無しさん
2014/02/14(金) 22:39:33.52ttp://ideone.com/gP0wYa
書いたよ。アルゴリズムの理解が済んでると早いね。ただ合ってるかしらんけど。
ソートはMapが勝手にやってくれるので手でやる必要がない。
それくらいかな。
0199デフォルトの名無しさん
2014/02/15(土) 11:41:05.83http://ideone.com/iozPxO
0200デフォルトの名無しさん
2014/02/15(土) 15:46:46.02function f(m)
local r={}
for i=m,2,-1 do
for j=i-1,1,-1 do r[j/i]=j.."/"..i end
end
local d={}
for k,v in pairs(r) do table.insert(d,k) end
table.sort(d)
for i,v in pairs(d) do io.write(r[v].." ") end
print()
end
> f(3)
1/3 1/2 2/3
> f(5)
1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5
0201デフォルトの名無しさん
2014/02/16(日) 10:59:32.12入力:2つの正整数
出力:筆算の計算過程(例:http://codepad.org/lPPcBt2p)
0202デフォルトの名無しさん
2014/02/16(日) 11:34:15.78#module
#defcfunc n_str str s, int n, local buf
sdim buf
repeat n
buf+=s
loop
return buf
#deffunc f171 int a, int b_, local result, local result_len, local b, local x
b=b_
result=a*b
result_len=strlen(str(result))
mes strf(strf(" %%%dd", result_len), a)
mes strf(strf("x%%%dd", result_len), b)
mes n_str("-", result_len+1)
repeat
if b=0 : break
x=a*(b\10)
if x : mes strf(strf(" %%%dd", result_len-cnt), x)
b=b/10
loop
mes n_str("-", result_len+1)
mes strf(strf(" %%%dd", result_len), result)
return
#global
f171 1234, 567
f171 1234, 1001
0203デフォルトの名無しさん
2014/02/16(日) 14:25:04.18#include <cstdio>
#include <cmath>
unsigned int GetUIntLen(unsigned int x) {
unsigned int len = 0;
do {len++, x /= 10;} while (x);
return len;
}
void OutputSpace(unsigned int len) {
for (unsigned int i = 0; i < len; i++) std::putchar(' ');
}
void OutputLine(unsigned int len) {
for (unsigned int i = 0; i < len; i++) std::putchar('-'); std::putchar('\n');
}
void func(unsigned int a, unsigned int b) {
unsigned int ans = a * b, a_len = GetUIntLen(a), b_len = GetUIntLen(b), ans_len = GetUIntLen(ans), DelSpace = 0, zero, output;
std::putchar(' '), OutputSpace(ans_len - a_len), std::printf("%u\n", a);
std::putchar('x'), OutputSpace(ans_len - b_len), std::printf("%u\n", b);
for (OutputLine(ans_len + 1), zero = 0; b; DelSpace += 1 + zero, zero = 0, b /= 10) {
while (b % 10 == 0) {zero++, b /= 10;}
output = a * (b % 10) * std::pow(10, zero);
if (GetUIntLen(output / std::pow(10, zero)) == a_len) std::putchar(' ');
OutputSpace(ans_len - a_len - DelSpace - zero), std::printf("%u\n", output);
}
OutputLine(ans_len + 1), std::printf(" %u\n", ans);
}
int main() {
func(1234u, 567u), func(1234u, 1001u), func(99u, 909090u);
return 0;
}
0204デフォルトの名無しさん
2014/02/16(日) 15:53:24.46; Common Lisp
(defun f (n m)
(let* ((result (* n m))
(length (1+ (length (princ-to-string result))))
(kugiri (make-string length :initial-element #\-)))
(format t "~@?~%x~@?~%~a~%~@?~a~% ~d~%"
(format nil "~~~dd" length) n
(format nil "~~~dd" (1- length)) m
kugiri
(format nil "~~{~~~d@a~%~~}" length)
(loop for c across (nreverse (princ-to-string m))
for zero = 0 then (if (zerop i) (1+ zero) 0)
for space = 0 then (if (zerop i) space (1+ space))
for i = (* n (parse-integer (string c)))
unless (zerop i)
collect
(concatenate 'string
(princ-to-string i)
(make-string zero :initial-element #\0)
(make-string space :initial-element #\ )))
kugiri
result)))
0205デフォルトの名無しさん
2014/02/16(日) 16:40:38.41ほぼC。速度で負けてしまったが、まぁいいんだ。
今回は表示系頑張ったよ。データが適当なので扱うの大変かも。
っていうか、コード片の流用禁止な。アルゴリズムは別にいいよ。
っていうかあってるか?
0206デフォルトの名無しさん
2014/02/16(日) 18:46:11.79http://ideone.com/N9C270
0207デフォルトの名無しさん
2014/02/16(日) 19:25:13.52def f201(a, b):
mid = [(i, a*long(s)) for (i,s) in enumerate(reversed(str(b))) if s != "0"]
res = long(a)*long(b)
w = len(str(res)) + len("x")
aa = [str(a), str(b), "-"*w] + [str(x) + " "*i for (i,x) in mid] + ["-"*w, str(res), ""]
ss = ["".join(list(s)).rjust(w) for s in aa]
ss[1] = "x" + ss[1][1:]
for s in ss:
print s
f201(1234, 567)
f201(1234, 1001)
f201(12, 1999808070605040302010) #otsu
0208204
2014/02/16(日) 19:55:56.33http://ideone.com/ruEXDp
0209デフォルトの名無しさん
2014/02/16(日) 22:50:46.50#include <stdio.h>
#define SPACE(n) (&"________________________________"[32-(n)]) /* ほんとは下線=SP */
#define BAR(n) (&"--------------------------------\n"[32-(n)])
static int len(unsigned long long x) {
int n; for (n = 0; n++, x /= 10, x;); return n;
}
static void f201(unsigned int a, unsigned int b) {
unsigned long long d, ans = (unsigned long long)a*b;
unsigned int i, n, w = len(ans);
printf(" %s%d\n", SPACE(w-len(a)), a);
printf("x%s%d\n", SPACE(w-len(b)), b);
printf(BAR(w+1));
for (i = 0, n = len(b); i < n; b /= 10, i++)
if (d = (b % 10))
printf(" %s%lld%s\n", SPACE(w-i-len(d*a)), d*a, SPACE(i));
printf(BAR(w+1));
printf(" %s%lld\n\n", SPACE(w-len(ans)), ans);
}
int main(void) {
f201(1234, 567);
f201(1234, 1001);
return 0;
}
0211デフォルトの名無しさん
2014/02/17(月) 02:20:01.03| hissan |
hissan := [:a :b |
| res bar |
a := a asString. b := b asString.
res := {a. b. a * b} asOrderedCollection.
res add: (bar := String new: (res last size max: res second size + 2) withAll: $-) before: res last.
res := res collect: [:each | each forceTo: bar size paddingStartWith: $_].
res second at: 1 put: $x.
(b asArray collectWithIndex: [:dig :idx | a * dig asString forceTo: bar size - b size + idx paddingStartWith: $_])
do: [:each | each asInteger isZero ifFalse: [res add: each after: bar]].
res add: bar before: res last; asStringWithCr].
hissan value: 1234 value: 567.
=>
__1234
x__567
------
__8638
_7404
6170
------
699678
0212デフォルトの名無しさん
2014/02/20(木) 16:59:36.42(a) 4つ以上連続した数を消す (複数ある場合は一番左を優先する)
(b) (a)を繰り返す
例:
-------
in : 11233344433331111143322211
out:
11233344433331111143322211
1123334441111143322211
11233344443322211
1123333322211
11222211
1111
-------
in : 1122224411112222
out:
1122224411112222
114411112222
11442222
1144
-------
in : 211222211333312
out:
211222211333312
21111333312
2333312
212
0213デフォルトの名無しさん
2014/02/20(木) 18:19:37.46ttp://ideone.com/XqaHUW
ほぼC。今回は消去法で実装。あってるかな?
一ラインずつでももっと一気にガッツリ消したほうが早いと思う。
0214デフォルトの名無しさん
2014/02/20(木) 18:31:12.190215デフォルトの名無しさん
2014/02/20(木) 18:40:17.00use 5.016;
use warnings;
sub f {
my $d = $_[-1];
return ($d =~ s/(\d)\1{3,}// ? f(@_, $d) : @_);
}
say join("\n", f('11233344433331111143322211'));
say join("\n", f('1122224411112222'));
say join("\n", f('211222211333312'));
0216デフォルトの名無しさん
2014/02/20(木) 18:41:11.97#include <iostream>
#include <string>
#include <cstddef>
#define NUM 4
void func(std::string s) {
std::size_t p, i, n;
char c;
std::cout << s << '\n';
for (p = 0; p < s.size(); ) {
c = s[p];
for (i = p + 1, n = 1; c == s[i]; i++, n++);
if (n >= NUM) {
s.erase(p, n);
std::cout << s << '\n';
p = 0;
} else {
p++;
}
}
std::cout << "-------" << '\n';
}
int main() {
func("11233344433331111143322211");
func("1122224411112222");
func("211222211333312");
return 0;
}
0217デフォルトの名無しさん
2014/02/20(木) 18:55:55.43途中解も出す必要があるのが面倒くさい……
C++で書こうかと思ったがだるいのでHSPに変更
http://codepad.org/u9j7BfcR
0218デフォルトの名無しさん
2014/02/20(木) 19:23:42.84無駄な検索してた
p++;
↓
p += n;
0219デフォルトの名無しさん
2014/02/21(金) 00:09:30.20f <- function(s)
local r = 1
while r == 1 do
print(s)
s,r = s:gsub("(.)%1%1%1","",1)
end
end
> f("211222211333312")
211222211333312
21111333312
2333312
212
0220デフォルトの名無しさん
2014/02/21(金) 00:38:43.53| dropQuad |
dropQuad := [:str |
| ra idx |
Transcript showln: str.
ra := str asString.
[(idx := (ra := ra as: RunArray) runs findFirst: [:len | len >= 4]) isZero] whileFalse: [
ra runs at: idx put: 0.
Transcript showln: (ra := ra as: String)
]
].
Transcript open.
dropQuad value: 11233344433331111143322211.
dropQuad value: 1122224411112222.
dropQuad value: 211222211333312.
0221デフォルトの名無しさん
2014/02/21(金) 01:59:38.30VCと同等の環境ってなかなか置いてないね。
未満だとCodepad使えばいいんだけど。foreachとauto使えないのはやだなー。
0222デフォルトの名無しさん
2014/02/21(金) 02:38:17.22間違えた。
f <- は f = です。
0223デフォルトの名無しさん
2014/02/21(金) 03:29:21.31Python 3
http://ideone.com/ZNq2Hz
0224デフォルトの名無しさん
2014/02/21(金) 19:31:04.950225デフォルトの名無しさん
2014/02/21(金) 19:58:20.640226デフォルトの名無しさん
2014/02/21(金) 20:45:14.74http://ideone.com/Ry0hWl
文句ばっか言ってるのもアレなんで、一応書いたよ。
最初に言っておくが美的センスは絶望的だ。
JSで書いたほうが効率的だな。書かないけど。
動作確認はIE11でやった。汚い縦伸びが見えた。
以上だ。
0227デフォルトの名無しさん
2014/02/22(土) 01:35:24.56これってfizzbizzみたいに凝って書いたほうが評価高いの?
0228デフォルトの名無しさん
2014/02/22(土) 05:11:32.780229デフォルトの名無しさん
2014/02/22(土) 06:04:46.54f:=method(a,b,
for(y,-a,a,
writeln("<hr width=\"",(((1-y*y/(a*a))*b*b)sqrt*40)round,"\">")
)
)
0230デフォルトの名無しさん
2014/02/22(土) 06:28:14.00あれはいかようにも書けるけど、設計を見る問題だと思ってるよ。
関数で書くより、オブジェクト思考で設計すると相当難易度上がる。
だから、熟練プログラマほど難しいんだってさ。
お題:http://toro.2ch.net/test/read.cgi/tech/1364631733/12
Java: http://toro.2ch.net/test/read.cgi/tech/1313183984/190,191
C++: http://toro.2ch.net/test/read.cgi/tech/1313183984/730
0232デフォルトの名無しさん
2014/02/22(土) 11:14:53.96use 5.016;
use warnings;
sub hr { qq{<hr style="padding: 0; margin: 0 auto; width: $_[0]">\n} }
sub _width { map{ int(sqrt((1 - ($_ / $_[1]) ** 2) * $_[0] ** 2)) } (0 .. $_[1] - 1) }
sub f { sub{ map{ hr($_ * 2) } (reverse(@_), @_[1 .. $#_]) }->(_width($_[0] / 2, $_[1] / 2 + 1)) }
say f(240, 80);
0233デフォルトの名無しさん
2014/02/22(土) 12:12:46.13import math
def f224(a, b, c=0.0):
""" 楕円を<hr>で表示するHTMLを出力
楕円 : (x/a)^2 + (y/b)^2 + 2*c*(x/a)*(y/b) = 1
ある y における x の座標: x = a*(c*y/b + sqrt((c*c-1)*y/b + 1))
y の範囲(最大値) : y = b/sqrt(1-c*c)
"""
a, b, c = [float(x) for x in (a, b, min(c,1.0))]
qq = []
max_y = b / math.sqrt(1-c*c)
for i in range(int(-max_y-0.5), int(max_y+0.5)+1):
Y = float(i) / b
D = max((c*c - 1.0)*Y*Y + 1.0, 0)
x1 = a*(-c*Y - math.sqrt(D))
x2 = a*(-c*Y + math.sqrt(D))
qq.append((x1, x2-x1))
ofs = min(x1 for (x1,w) in qq)
qq = [(int(x1-ofs+0.5), int(w)) for (x1,w) in qq]
print "<html>\n<head>\n</head>\n<body>"
for (x,w) in qq:
print "<hr width=%d align=left style=\"margin-left:%dpx;\">" % (w, x)
print "</body>\n</html>"
f224(300,20,0.5)
0234デフォルトの名無しさん
2014/02/22(土) 12:52:15.52誤 a, b, c = [float(x) for x in (a, b, min(c,1.0))]
正 a, b, c = [float(x) for x in (a, b, min(max(c,-1.0),1.0))]
0235デフォルトの名無しさん
2014/02/22(土) 16:33:19.55cが何を表しているのか解らなかったので実行してみた。
おお、傾きの度合いだったのか。
0236デフォルトの名無しさん
2014/02/22(土) 17:23:58.73| trait |
trait := Trait named: #FizzBuzz uses: #() category: 'FizzBuzz-Traits'.
trait compile: 'fizzBuzz: spec
| assoc |
(self isKindOf: Integer) ifTrue: [Processor activeProcess environmentAt: #fizzBuzz put: self->''''].
assoc := Processor activeProcess environmentAt: #fizzBuzz.
^(assoc key isDivisibleBy: spec key)
ifTrue: [assoc value: assoc value, spec value; value]
ifFalse: [assoc value ifEmpty: [assoc key]]'.
trait compile: 'fizz ^self fizzBuzz: 3->''Fizz'''.
trait compile: 'buzz ^self fizzBuzz: 5->''Buzz'''.
trait compile: 'gizz ^self fizzBuzz: 7->''Gizz'''.
{Integer. String} do: [:class | class uses: trait].
1 fizz buzz. "=> 1 "
3 fizz buzz. "=> 'Fizz' "
5 fizz buzz. "=> 'Buzz' "
15 fizz buzz. "=> 'FizzBuzz' "
7 fizz buzz gizz. "=> 'Gizz' "
21 fizz buzz gizz. "=> 'FizzGizz' "
35 fizz buzz gizz. "=> 'BuzzGizz' "
105 fizz buzz gizz. "=> 'FizzBuzzGizz' "
105 fizz gizz buzz. "=> 'FizzGizzBuzz' "
0237デフォルトの名無しさん
2014/02/22(土) 17:26:46.97999.fizz.buzz は "Fizz" の間違い?
失礼しました、ご指摘のとおり問題の間違いです。
3 でも 5 でも 7 でも割り切れなかったら、その数字をそのまま出力ください。
1
Fizz
Buzz
Gizz
FizzBuzz
FizzGizz
BuzzGizz
FizzBuzzGizz
997
0239デフォルトの名無しさん
2014/02/22(土) 18:53:12.94module FizzBuzz
def fizz_buzz(spec)
Thread.current[:fizzbuzz] = [self, ""] if kind_of?(Integer)
state = Thread.current[:fizzbuzz]
state[0] % spec[0] == 0 ?
state[1] += spec[1] :
(state[1].empty? ? state[0] : state[1])
end
def fizz; fizz_buzz([3, "Fizz"]) end
def buzz; fizz_buzz([5, "Buzz"]) end
def gizz; fizz_buzz([7, "Gizz"]) end
end
[Integer, String].each{ |klass| klass.include(FizzBuzz) }
1.fizz.buzz #=> 1
3.fizz.buzz #=> "Fizz"
5.fizz.buzz #=> "Buzz"
15.fizz.buzz #=> "FizzBuzz"
7.fizz.buzz.gizz #=> "Gizz"
21.fizz.buzz.gizz #=> "FizzGizz"
35.fizz.buzz.gizz #=> "BuzzGizz"
105.fizz.buzz.gizz #=> "FizzBuzzGizz"
105.fizz.gizz.buzz #=> "FizzGizzBuzz"
999.fizz.buzz #=> "Fizz"
0240デフォルトの名無しさん
2014/02/22(土) 18:59:35.22そのJavaとかC++の解答例ってお題の要求仕様を無視してないか?
双方ともオープンクラスじゃないから、buzz(fizz(1)) で 1、
buzz(fizz(15)) で "FIzzBuzz" とかを返せるようにしないと。
0241デフォルトの名無しさん
2014/02/22(土) 19:38:56.78ttp://ideone.com/qcjk9X
C++。自分が真面目に設計すると大体こんな感じになる。実装手抜きだけど。
一応簡単に拡張できるようにはなってるんだが、必要だっただろうか・・・。Orz
0242デフォルトの名無しさん
2014/02/22(土) 19:47:56.240243241
2014/02/22(土) 20:37:25.68そのほうが勉強になる。
0244デフォルトの名無しさん
2014/02/22(土) 20:56:52.38>>240
0245デフォルトの名無しさん
2014/02/22(土) 21:03:25.19http://ideone.com/Osyt5g
0246デフォルトの名無しさん
2014/02/22(土) 21:30:43.91なるほど、これだったらクラスつかうんじゃなかったな。
>>245を参考にさせてもらう。
ま、評価結果自体を切り替えるのがホンモノですが、確かにその域までは無理でした‥‥
0248デフォルトの名無しさん
2014/02/22(土) 22:05:42.04ttp://ideone.com/AZIcMU
ベターC。これであってると思う?保守性メチャクチャ悪いんだけど。
今回はちゃんとBuzzにしたよ!
0249デフォルトの名無しさん
2014/02/22(土) 22:10:06.81逆に、スレッドローカル以外での実現方法はないものか。
換言すると、副作用を許さない関数型では絶対無理なんだろうか?
0250デフォルトの名無しさん
2014/02/22(土) 22:18:09.630251デフォルトの名無しさん
2014/02/22(土) 23:00:08.33class FizzBuzzInt(int):
def __init__(self, number, tests={"fizz":3, "buzz":5, "gizz":7}):
self.number = number
self.tests = tests
self.strings = []
def test(self, name):
if (self.number % self.tests[name]) == 0:
self.strings.append(name.capitalize())
return self
def __getattr__(self, name):
if name not in self.tests.keys():
raise AttributeError
return self.test(name)
def __str__(self):
if self.strings:
return "".join(self.strings)
return int.__str__(self)
def fizz(x):
if not isinstance(x, FizzBuzzInt): x = FizzBuzzInt(x)
return x.test("fizz")
def buzz(x):
if not isinstance(x, FizzBuzzInt): x = FizzBuzzInt(x)
return x.test("buzz")
def gizz(x):
if not isinstance(x, FizzBuzzInt): x = FizzBuzzInt(x)
return x.test("gizz")
print gizz(buzz(fizz(15)))
print FizzBuzzInt(21).fizz.buzz.gizz
どっちの書き方でもできるようにしました。
0252デフォルトの名無しさん
2014/02/22(土) 23:13:22.81module FizzBuzz
def fizz_buzz(n, msg)
Thread.current[:fizzbuzz] = [self, ""] if kind_of?(Integer)
state = Thread.current[:fizzbuzz]
state[0] % n == 0 ? state[1] += msg : (state[1] == "" ? state[0] : state[1])
end
def fizz; fizz_buzz(3, "Fizz") end
def buzz; fizz_buzz(5, "Buzz") end
def gizz; fizz_buzz(7, "Gizz") end
end
[Integer, String].each{ |klass| klass.include(FizzBuzz) }
1.fizz.buzz #=> 1
3.fizz.buzz #=> "Fizz"
5.fizz.buzz #=> "Buzz"
15.fizz.buzz #=> "FizzBuzz"
7.fizz.buzz.gizz #=> "Gizz"
21.fizz.buzz.gizz #=> "FizzGizz"
35.fizz.buzz.gizz #=> "BuzzGizz"
105.fizz.buzz.gizz #=> "FizzBuzzGizz"
105.fizz.gizz.buzz #=> "FizzGizzBuzz"
999.fizz.buzz #=> "Fizz"
■ このスレッドは過去ログ倉庫に格納されています