トップページ⇒tech
1001コメント413KB

プログラミングのお題スレ 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/

宿題は宿題スレがあるのでそちらへ。
01531482014/02/12(水) 21:30:39.85
>>152
「突っ切る」イメージは>>148以上に説明しようがないのが辛いところです
(要するに、全ての縦/横の筋に対して、1枚でも畳が横切っていればOKということ)
どう実装するかは頭を捻ってもらうしか……
01541492014/02/12(水) 21:40:03.46
Ideonの調子が悪い。
正直、ギブアップなので、コード晒そうと思ったんだが。。。
これでは収まりが付かないので移植してみるか。
万が一うまく言ったらアップする。
0155デフォルトの名無しさん2014/02/12(水) 21:46:33.21
>>152>>153
「盤の辺と同じ長さの直線が四辺以外に生じてはならない」とか、
「盤面を分断する直線はNG」とか、そういうことだと思う。

>>148の図を元にNGとされる直線を太線で示すとこうかな。
┌┬┬─┰┬┐
││├┬┨││
├┴┤│┠┴┤
┝┯┷┿╋━┥
│├─┤┠─┤
└┴─┴┸─┘
0156デフォルトの名無しさん2014/02/12(水) 22:35:03.25
>>148 HSP
http://codepad.org/XjgdObG6
01571482014/02/12(水) 22:43:27.54
>>156
乙。HSPってこんなに重かったっけ……?
概説してくれると嬉しいかなって
01581562014/02/12(水) 23:00:09.39
>>157
HSP が遅いってのも少しはあるけど
アルゴリズムが悪いだけ

再帰呼び出しで畳をすべて敷き詰めてみてから
分断する線がないかどうかチェックしてる


縦方向に分断する線について考えるとき
横幅 6 なら 5本 の可能性がある
畳を横向きに置いたとき
対応する縦線に対応するカウンタを増やす
最終的にカウンタが 0 の線があれば
分断されていると判断できる
横方向に分断する線についても同様に考える

カウンタを増やす理由は
1、0 だけでやると元に戻すときに変更前の値を保存しておかないといけないから
面倒くさいという理由

>>156 では畳に1〜 の番号を振って
カウンタも畳の番号と同じものを増減させてる
0159デフォルトの名無しさん2014/02/12(水) 23:11:09.06
>>157
ttp://ideone.com/jZJoae
ベターCに移植してみた。設計いいから簡単だった。変換がちょっとややこしいけど。
移植してみた感想?うーん。わからん!利点は、グローバル変数が消えました。位・・・。Orz
チャック関数が何やってるのかサッパリわからん。

うーん。脱力。
ttp://ideone.com/IZDTEt
上のようなコードを移植前に書いていたがダサすぎる。
俺に才能をクレ。Orz
01601482014/02/12(水) 23:18:35.82
>>158
あー、私が書いたコードの場合はちゃんと枝刈りするから速いんでしょうね……
(明らかにこれは駄目だ、と判定されたら次の畳を置かない)
>>159
check関数では、「明らかに駄目」な盤面ならfalse(0)を返すようにしています
盤面データは、「0なら置かれていない、1以上(畳の番号)なら置かれている」として、
水平・垂直方向にそれぞれ走査してチェックしています。……まあ要するに、
「筋の両側のペアを見て、もし筋の両側が完全には埋まっていなかったり、
筋を跨ぐ方向に畳が存在した場合はチェックをパスする(駄目扱いしない)」
ってことなんですけどね
0161デフォルトの名無しさん2014/02/12(水) 23:41:06.71
>> 148 Python
import 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
>>161 の出力(>>148また安価ミスったww)
<result> 124
(1)
↓↓→←↓→←
↑↑→←↑↓↓
↓→←→←↑↑
↑→←↓→←↓
→←↓↑→←↑
→←↑→←→←
(1)
↓→←→←→←
↑→←→←↓↓
→←→←↓↑↑
↓→←↓↑→←
↑→←↑→←↓
→←→←→←↑
(1)
↓→←→←→←
↑→←↓→←↓
→←↓↑→←↑
→←↑→←↓↓
↓↓→←↓↑↑
↑↑→←↑→←
01631592014/02/13(木) 00:07:43.00
>>160
解説ありがとう。参考にします。
01641562014/02/13(木) 00:21:35.43
>>156 を高速化
if x>=length(field) : x=0 : y++
↓
if x>=length(field) {
if y+1<length2(field) : if cnt_v(y)=0 : return
x=0
y++
}
0165 ◆QZaw55cn4c 2014/02/13(木) 02:12:09.61
>>114
>trueと比較するのは個人的な流儀なのでこれは曲げれん。

記述性/可読性に関する個人的な見解に異論を挟むつもりはまったくないのだけれども、
こと、C/C++ に関しては true/false との比較では、単に可読性の問題ではすまないと考えているので、 >>113 が教条主義とはどうしても思えない。

歴史的事情なのかどうかは定かではないが、C/C++ では「true/false」は「非零/零」の対立に対応するので(isalpha() とかね)、
「== true」は、それをみただけで、「まずい」、と感じるセンスが必要なのかもしれないかと。

でも、最近、お題についていけないかわいそうな状態の私がこれ以上の意見を述べるのは、ここではちと身の程知らず
なにかお題を解いたら、これについてちょっと説明を考えてみますね、最近のお題は結構むずかしいなあ‥‥
0166デフォルトの名無しさん2014/02/13(木) 10:17:51.75
で、クズが書いたプログラムは?
0167 ◆QZaw55cn4c 2014/02/13(木) 12:39:57.51
>>166
このスレでは >>75 のみ
0168デフォルトの名無しさん2014/02/13(木) 13:38:15.34
Qはもう棺桶に片足突っ込んでるな
0169デフォルトの名無しさん2014/02/13(木) 14:23:52.85
system("ls -l ./prog");
0170デフォルトの名無しさん2014/02/13(木) 17:43:49.69
お題:分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。
m=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
>>166-167
もうクズ呼びでもいいやとでも思っているのだろうか……>QZ
0172デフォルトの名無しさん2014/02/13(木) 20:24:19.46
>>171
ム板のコテは自虐入ってるくせに非難されてもメゲないという地味にウザい性格の奴が多いようで
0173デフォルトの名無しさん2014/02/13(木) 21:07:45.02
>>170
この問題いいの?
某所からのパクりじゃない?
0174デフォルトの名無しさん2014/02/13(木) 21:17:35.87
>>170
ttp://ideone.com/0nAThz
保険にちょっと大げさに警告文書いておいた。訴訟もじさないなら流用してミソ。
>>173ソースプリーズ。
畳に比べたら簡単。ほぼC。
0175デフォルトの名無しさん2014/02/13(木) 21:42:17.70
>>170 Common Lisp

(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.50
このスレは解答例無しでもOKになったの?
0177デフォルトの名無しさん2014/02/13(木) 22:15:03.21
>>176
回答者の気まぐれによる。
あった方がいい。
0178デフォルトの名無しさん2014/02/13(木) 22:24:39.56
無いほうがいい
01791742014/02/13(木) 22:30:07.38
一応出題者が一回解いてる前提で俺は回答している。
0180デフォルトの名無しさん2014/02/13(木) 23:29:46.18
>>170 Haskell
import 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
>>170 Squeak Smalltalk
| 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.78
>>170 with PythonSf

m=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.13
>>170 Io
f:=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
01841742014/02/14(金) 18:06:37.53
俺がろくでもないこと書いたばかりに。うっ・・・うっ。っていうのは置いといて。
みんな、どうやって既約判定してるのか全然読めない俺の頭が恨めしい。
>>173が逃げたのでブラフは一応気にしなくていいよ。このスレ内ではね。
0185デフォルトの名無しさん2014/02/14(金) 18:17:36.81
>>170 HSP
#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)
01861742014/02/14(金) 19:17:38.74
使ってくれてありがと。
いやー、ほんとユーグリッドの互除法無しでどうやって既約判定してるのか全然読めんわ。
なんか他アルゴリズムあるんだろうけど、俺にはわからないなー。Orz
ほんっと、数学ダメなんだよね。
0187デフォルトの名無しさん2014/02/14(金) 19:41:58.71
>>170 J
f=: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
>>170 HSP
#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)
01891742014/02/14(金) 19:56:33.38
うむ。ちと気持ち悪かったか。
ホント、何もしないって。
01901852014/02/14(金) 20:02:58.28
ごめん
何言ってるのか分からんかったが >>174 みてきたら分かったw
01911742014/02/14(金) 20:15:28.50
あー、そういうことなら良かった。杞憂でした。
たまたま被ったのか。そーりー。
これでしばらく黙ります。しーゆー。
01921742014/02/14(金) 20:22:59.01
最後に一言。
慣れないことはするもんじゃないね。トホホ・・・。Orz
01931752014/02/14(金) 20:49:00.82
>>184
>>175ですが、既約分数の判定は(陽には)していません。Common Lispでは除算
の結果が整数で表せない場合、分数が返されますが、それらは既に約分されて
います(他の分数を扱える言語やライブラリでもそうなんじゃないかな)。

(/ 2 4) ;=> 1/2
;; リテラルでも
2/4 ;=> 1/2

なので、分子(n)と分母(d)を列挙してそれらを除算(/ n d)した数のリストをま
ず作り、そこから重複要素を取除くことで目的の結果を得ています。
0194デフォルトの名無しさん2014/02/14(金) 21:16:33.96
>>170の元ネタはこれかな。こっちは 0以上1以下 で、ソートは要件に入ってない。

結城浩の日記 - 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==1742014/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.50
>>195
std::map 使えばいいのにw
0197デフォルトの名無しさん2014/02/14(金) 22:16:45.46
>>196
あ、やっぱ言われた。
書き終わって、あーこれエラトステネスの篩と同じ系統だ。
と理解して納得したまでが今日のハイライト。

まぁ、暇なので書いてみるよ。
0198デフォルトの名無しさん2014/02/14(金) 22:39:33.52
>>170,196
ttp://ideone.com/gP0wYa
書いたよ。アルゴリズムの理解が済んでると早いね。ただ合ってるかしらんけど。
ソートはMapが勝手にやってくれるので手でやる必要がない。
それくらいかな。
0199デフォルトの名無しさん2014/02/15(土) 11:41:05.83
>>170 Perl
http://ideone.com/iozPxO
0200デフォルトの名無しさん2014/02/15(土) 15:46:46.02
>>170 Lua >>198のやり方で
function 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
>>201 HSP
#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
>>201 C++
#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
>>201
; 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
ttp://ideone.com/ZhgnC7
ほぼC。速度で負けてしまったが、まぁいいんだ。
今回は表示系頑張ったよ。データが適当なので扱うの大変かも。
っていうか、コード片の流用禁止な。アルゴリズムは別にいいよ。
っていうかあってるか?
0206デフォルトの名無しさん2014/02/16(日) 18:46:11.79
>>201 Perl
http://ideone.com/N9C270
0207デフォルトの名無しさん2014/02/16(日) 19:25:13.52
>>201 Python
def 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
02082042014/02/16(日) 19:55:56.33
ごめん、ちょっと違ってたので修正。
http://ideone.com/ruEXDp
0209デフォルトの名無しさん2014/02/16(日) 22:50:46.50
>>201 C
#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;
}
02102052014/02/17(月) 00:15:26.00
>>208
筆算過程のヒネリ具合がなんか面白い。
C++にも多倍長演算入ってほしい。
0211デフォルトの名無しさん2014/02/17(月) 02:20:01.03
>>201 Squeak Smalltalk
| 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.46
>>212
ttp://ideone.com/XqaHUW
ほぼC。今回は消去法で実装。あってるかな?
一ラインずつでももっと一気にガッツリ消したほうが早いと思う。
0214デフォルトの名無しさん2014/02/20(木) 18:31:12.19
あ、そしたら答え変わっちゃうか・・・。Orz
0215デフォルトの名無しさん2014/02/20(木) 18:40:17.00
>>212 Perl
use 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
>>212 C++
#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
>>212
途中解も出す必要があるのが面倒くさい……
C++で書こうかと思ったがだるいのでHSPに変更
http://codepad.org/u9j7BfcR
0218デフォルトの名無しさん2014/02/20(木) 19:23:42.84
>>216
無駄な検索してた
p++;
↓
p += n;
0219デフォルトの名無しさん2014/02/21(金) 00:09:30.20
>>212 Lua
f <- 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
>>212 Squeak Smalltalk
| 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.30
ideon重たいねぇ。ここ以外だとわんどぼっくすか。うーん。
VCと同等の環境ってなかなか置いてないね。
未満だとCodepad使えばいいんだけど。foreachとauto使えないのはやだなー。
0222デフォルトの名無しさん2014/02/21(金) 02:38:17.22
>>219
間違えた。
f <- は f = です。
0223デフォルトの名無しさん2014/02/21(金) 03:29:21.31
>>212
Python 3
http://ideone.com/ZNq2Hz
0224デフォルトの名無しさん2014/02/21(金) 19:31:04.95
お題:HRタグを使って楕円を描くHTMLコードを生成する。
0225デフォルトの名無しさん2014/02/21(金) 19:58:20.64
ショートコーディング向きじゃない気がしますけどいかがでしょうか?
0226デフォルトの名無しさん2014/02/21(金) 20:45:14.74
>>224
http://ideone.com/Ry0hWl
文句ばっか言ってるのもアレなんで、一応書いたよ。
最初に言っておくが美的センスは絶望的だ。
JSで書いたほうが効率的だな。書かないけど。
動作確認はIE11でやった。汚い縦伸びが見えた。
以上だ。
0227デフォルトの名無しさん2014/02/22(土) 01:35:24.56
>>224
これってfizzbizzみたいに凝って書いたほうが評価高いの?
0228デフォルトの名無しさん2014/02/22(土) 05:11:32.78
fizzbizzみたいなのって凝って書いたほうが評価高いの?
0229デフォルトの名無しさん2014/02/22(土) 06:04:46.54
>>224 Io
f:=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
>>228
あれはいかようにも書けるけど、設計を見る問題だと思ってるよ。
関数で書くより、オブジェクト思考で設計すると相当難易度上がる。
だから、熟練プログラマほど難しいんだってさ。
0231 ◆QZaw55cn4c 2014/02/22(土) 09:20:27.80
>>230の流れならば

お題: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.96
>>224 Perl
use 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.13
>>224 Python
import 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
>>233 修正
誤 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.55
>>233
cが何を表しているのか解らなかったので実行してみた。
おお、傾きの度合いだったのか。
0236デフォルトの名無しさん2014/02/22(土) 17:23:58.73
>>231 Squeak Smalltalk
| 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.97
>>231
999.fizz.buzz は "Fizz" の間違い?
0238 ◆QZaw55cn4c 2014/02/22(土) 18:15:06.74
>>237
失礼しました、ご指摘のとおり問題の間違いです。
3 でも 5 でも 7 でも割り切れなかったら、その数字をそのまま出力ください。

1
Fizz
Buzz
Gizz
FizzBuzz
FizzGizz
BuzzGizz
FizzBuzzGizz
997
0239デフォルトの名無しさん2014/02/22(土) 18:53:12.94
>>231 Ruby >>236のパクリ
module 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
>>231
そのJavaとかC++の解答例ってお題の要求仕様を無視してないか?
双方ともオープンクラスじゃないから、buzz(fizz(1)) で 1、
buzz(fizz(15)) で "FIzzBuzz" とかを返せるようにしないと。
0241デフォルトの名無しさん2014/02/22(土) 19:38:56.78
>>231
ttp://ideone.com/qcjk9X
C++。自分が真面目に設計すると大体こんな感じになる。実装手抜きだけど。
一応簡単に拡張できるようにはなってるんだが、必要だっただろうか・・・。Orz
0242デフォルトの名無しさん2014/02/22(土) 19:47:56.24
そう言えば、FizzBizzだと思ってたら、よく見るとFizzBuzzだった罰ゲーム。orz
02432412014/02/22(土) 20:37:25.68
今回真面目に作ったから、結構真面目に罵ってほしいなぁ。
そのほうが勉強になる。
0244デフォルトの名無しさん2014/02/22(土) 20:56:52.38
>>243
>>240
0245デフォルトの名無しさん2014/02/22(土) 21:03:25.19
>>231 Java >>240に従って>>239を参考に
http://ideone.com/Osyt5g
0246デフォルトの名無しさん2014/02/22(土) 21:30:43.91
>>244
なるほど、これだったらクラスつかうんじゃなかったな。
>>245を参考にさせてもらう。
0247 ◆QZaw55cn4c 2014/02/22(土) 22:04:58.18
>>240
ま、評価結果自体を切り替えるのがホンモノですが、確かにその域までは無理でした‥‥
0248デフォルトの名無しさん2014/02/22(土) 22:05:42.04
>>240,244-245
ttp://ideone.com/AZIcMU
ベターC。これであってると思う?保守性メチャクチャ悪いんだけど。
今回はちゃんとBuzzにしたよ!
0249デフォルトの名無しさん2014/02/22(土) 22:10:06.81
クイズはいったんネタバレしちゃうとつまらないな…
逆に、スレッドローカル以外での実現方法はないものか。
換言すると、副作用を許さない関数型では絶対無理なんだろうか?
0250デフォルトの名無しさん2014/02/22(土) 22:18:09.63
Q%Aサイトつくるかね?
0251デフォルトの名無しさん2014/02/22(土) 23:00:08.33
>>231 Python
class 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.81
>>239 fizz_buzz(spec)とかSmalltalkに引っ張られすぎてたので一部修正。
module 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"
■ このスレッドは過去ログ倉庫に格納されています