14/01/24 09:59:09.83
プログラミングのお題スレです。
前スレ
プログラミングのお題スレ
スレリンク(tech板)
出されたお題をコーディングして罵られるスレ
スレリンク(tech板)
【出題と回答例】
1 名前:デフォルトの名無しさん
お題:お題本文
2 名前:デフォルトの名無しさん
>>1 使用言語
回答本文
【ソースコードが長くなったら】
URLリンク(codepad.org)
URLリンク(ideone.com)
宿題は宿題スレがあるのでそちらへ。
2:デフォルトの名無しさん
14/01/24 11:28:16.25
あー、イク…ちんぽイク!
ニニЭ・:∴:・゚・。。・:∴。・゚・・。・。。・゚・'.
3:デフォルトの名無しさん
14/01/24 19:07:12.79
お題:aをもっとも近いbの倍数に丸める。ちょうど中間の場合は
0から遠ざかる方向へ丸める。bが実数の場合は誤差はやむを得ないものとする。
例
a=123,b=12 -> 120
a=126,b=12 -> 132
a=-123,b=12 -> -120
a=-126,b=12 -> -132
a=1.234,b=0.01 -> 1.23
a=1.235,b=0.01 -> 1.24
4: ◆QZaw55cn4c
14/01/24 19:46:55.95
>>3
>a=123,b=120 -> 120
>a=126,b=120 -> 132
>a=-123,b=120 -> -120
>a=-126,b=120 -> -132
じゃないのか?仕様をちゃんと記述してみろよ、このスカポンタン
5:デフォルトの名無しさん
14/01/24 20:30:27.51
>>4
お前は馬鹿か?
bの倍数に丸めるのにbが120で解が132ってどんだけ間が抜けているんだ?
6:デフォルトの名無しさん
14/01/24 21:08:15.26
>>3
; Common Lisp
(defun f3 (a b)
(let* ((rem (rem a b))
(i (- a rem)))
(if (< (abs rem) (/ b 2))
i
(funcall (if (plusp a) #'+ #'-) i b))))
7:デフォルトの名無しさん
14/01/24 21:56:09.16
>>3 Python
def f3(a,b):
x = a + b*(0.5+1e-10*(a*b)/abs(a*b))
return x - x%b
for a,b in [(123, 12), (126, 12), (-123, 12), (-126, 12), (1.234, 0.01), (1.235, 0.01)]:
if not isinstance(a+b, float):
print "a=%d, b=%d -> %d" % (a, b, f3(a,b))
else:
print "a=%f, b=%f -> %f" % (a, b, f3(a,b))
8:デフォルトの名無しさん
14/01/24 22:31:58.20
>>3 HSP
#module
#defcfunc f3 double a, double b, \
local abs_a, local abs_b, local is_minus, local c, local d, local r
abs_a=absf(a)
abs_b=absf(b)
if a*b<0.0 : is_minus=1
c=int(abs_a/abs_b)
d=abs_a-abs_b*c
if d*2>=abs_b : c++ : d-=abs_b
r=abs_a-d
if is_minus : r=-r
if double(int(b))=b : r=int(r)
return r
#global
mes f3(123, 12)
mes f3(126, 12)
mes f3(-123, 12)
mes f3(-126, 12)
mes f3(1.234, 0.01)
mes f3(1.235, 0.01)
9:デフォルトの名無しさん
14/01/24 23:35:33.38
>>3 Squeak Smalltalk
| a b |
a := 123. b := 12. a roundTo: b. "=> 120 "
a := 126. b := 12. a roundTo: b. "=> 132 "
a := -123. b := 12. a roundTo: b. "=> -120 "
a := -126. b := 12. a roundTo: b. "=> -132 "
a := 1.234. b := 0.01. a roundTo: b. "=> 1.23 "
a := 1.235. b := 0.01. a roundTo: b. "=> 1.24 "
10:デフォルトの名無しさん
14/01/24 23:58:24.81
>>3 Perl
use 5.016;
use warnings;
use bignum;
sub f { ($_[0] <=> 0) * (int((abs($_[0]) + abs($_[1] / 2)) / $_[1]) * $_[1]) }
say f(123, 12);
say f(126, 12);
say f(-123, 12);
say f(-126, 12);
say f(1.234, 0.01);
say f(1.235, 0.01);
11:デフォルトの名無しさん
14/01/25 00:06:22.40
>>3 Io
Number f := method(b, (self / b) round * b)
Io> 123 f(12)
==> 120
Io> 126 f(12)
==> 132
Io> -123 f(12)
==> -120
Io> -126 f(12)
==> -132
Io> 1.234 f(0.01)
==> 1.23
Io> 1.235 f(0.01)
==> 1.24
12:デフォルトの名無しさん
14/01/25 00:20:06.75
>>3 Haskell
roundToMultiple :: (Enum a, RealFrac a) => a -> a -> a
roundToMultiple _ 0 = 0
roundToMultiple a b0 = f $ map ((signum a *) . (b *)) [fromIntegral . floor $ a/b ..]
where
b = abs b0
f (x:y:ys)
| abs (x-a) == b / 2 = y
| abs (x-a) < b / 2 = x
| otherwise = f (y:ys)
main :: IO ()
main = print $ map (uncurry roundToMultiple)
[(123,12),(126,12),(-123,12),(-126,12),(1.234,0.01),(1.235,0.01)]
-- -> [120.0,132.0,-120.0,-132.0,1.23,1.24]
13:デフォルトの名無しさん
14/01/25 02:16:38.19
>>3 ruby 1.8.6
def f3(a, b)
(a / b.to_f).round * b
end
p [[123,12],[126,12],[-123,12],[-126,12],[1.234,0.01],[1.235,0.01]].map{|(a, b)| f3(a, b)}
↓
[120, 132, -120, -132, 1.23, 1.24]
14:デフォルトの名無しさん
14/01/25 03:55:11.45
>>3 ruby 2.1.0 p0
"a=123,b=12 -> 120
a=126,b=12 -> 132
a=-123,b=12 -> -120
a=-126,b=12 -> -132
a=1.234,b=0.01 -> 1.23
a=1.235,b=0.01 -> 1.24
"
.scan(/=([\d\-\.]+)/).flatten.each_slice(2) do | a , b |
printf("[%s,%s]," % [a,b])
end
# => [123,12],[126,12],[-123,12],[-126,12],[1.234,0.01],[1.235,0.01],
15:デフォルトの名無しさん
14/01/26 13:31:26.98
お題:引数を表示して改行し、引数をそのまま返す関数。
例
p(p(p(1)+1)+1)
1
2
3
16:デフォルトの名無しさん
14/01/26 14:11:18.45
>>15 GNU Smalltalk
| p |
p := [:x | x printNl].
p value: (p value: (p value: 1) + 1) + 1
URLリンク(ideone.com)
--
Squeak Smalltalk
| p |
Transcript open.
p := [:x | Transcript showln: x. x].
p value: (p value: (p value: 1) + 1) + 1
17:デフォルトの名無しさん
14/01/26 14:23:07.25
>>15 ruby 1.8.6
def f15(x)
puts x;x
end
f15(f15(f15(1)+1)+1)
18:デフォルトの名無しさん
14/01/26 14:42:47.02
>>3
URLリンク(ideone.com)
C++標準でSign関数搭載してくれないかなぁ。イチイチ書くの面倒くさい。
Sign関数はNYSLでいいので。
19:デフォルトの名無しさん
14/01/26 15:04:53.97
>>15
関数パースしないといけないのかと思って一瞬ビビったのは内緒だ。
#include <iostream>
template<class T>
const T& p(const T& In){
std::cout << In << std::endl;
return In;
}
int main(){
p(p(p(1) + 1) + 1);
return 0;
}
20:デフォルトの名無しさん
14/01/26 15:25:01.73
>>15 Haskell
import Control.Applicative
import System.IO.Unsafe
p :: Show a => a -> a
p = unsafePerformIO . liftA2 (>>) print return
eval :: a -> IO ()
eval x = x `seq` return ()
main :: IO ()
main = eval $ p ( p ( p 1 + 1 ) + 1 )
21:デフォルトの名無しさん
14/01/26 19:54:12.62
>>15 HSP
#module
#defcfunc f15 int x
mes x
return x
#global
dummy=f15(f15(f15(1)+1)+1)
22:デフォルトの名無しさん
14/01/26 22:13:47.32
>>15 Perl
use 5.016;
use warnings;
sub p { sub{ $_[0] }->($_[0], say $_[0]) }
p(p(p(1) + 1) + 1);
23:デフォルトの名無しさん
14/01/27 13:49:38.56
お題:
リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する
ソートされていなければ先頭からソートされている個数を出力する
[6,6,3,2,6,4,7,4,7,4] => 4
[2,3,4,4,4,6,6,6,7,7] => AS
[7,7,6,6,6,4,4,4,3,2] => DES
[1,1,1,1,1,1,1,1,1,1] => EQ
[] => EQ
[1] => EQ
24:デフォルトの名無しさん
14/01/27 14:38:45.18
お題:
リストを与え、昇順でソートされている部分列のリスト出力する
[8,3,4,9,9,10,6,1,4,3] => [[8],[3,4,9,9,10],[6],[1,4],[3]]
[1,3,3,4,4,6,8,9,9,10] => [[1,3,3,4,4,6,8,9,9,10]]
[10,9,9,8,6,4,4,3,3,1] => [[10],[9,9],[8],[6],[4,4],[3,3],[1]]
[1,1,1,1,1,1,1,1,1,1] => [[1,1,1,1,1,1,1,1,1,1]]
[] => []
[1] => [[1]]
25:デフォルトの名無しさん
14/01/27 16:03:34.28
>>24
[3,4]も[3,4,9]だって部分文字列だろう。
適切な文言で表現をするべきだ。
26:デフォルトの名無しさん
14/01/27 16:11:04.85
>>23 Squeak Smalltalk
| sortOrder |
sortOrder := [:arr |
| signs |
arr size < 2 ifTrue: [#EQ] ifFalse: [
signs := (arr allButFirst - arr allButLast) sign.
true caseOf: {
[signs allSatisfy: #isZero] -> [#EQ].
[signs allSatisfy: #positive] -> [#AS].
[signs negated allSatisfy: #positive] -> [#DES]
} otherwise: [
| first |
first := signs detect: [:each | each ~= 0].
signs findFirst: [:sign | sign ~= 0 and: [sign ~= first]]
]
]
].
sortOrder value: #(6 6 3 2 6 4 7 4 7 4). "=> 4 "
sortOrder value: #(2 3 4 4 4 6 6 6 7 7). "=> #AS "
sortOrder value: #(7 7 6 6 6 4 4 4 3 2). "=> #DES "
sortOrder value: #(1 1 1 1 1 1 1 1 1 1). "=> #EQ "
sortOrder value: #(). "=> #EQ "
sortOrder value: #(1). "=> #EQ "
27:デフォルトの名無しさん
14/01/27 16:16:42.56
>>24 Squeak Smalltalk
| groupsOfSorted |
groupsOfSorted := nil.
groupsOfSorted := [:arr |
arr ifEmpty: [arr] ifNotEmpty: [
| limit rest |
limit := (1 to: arr size) findLast: [:m | (arr first: m) isSorted].
rest := arr allButFirst: limit.
{arr first: limit}, (groupsOfSorted value: rest)
]
].
groupsOfSorted value: #(8 3 4 9 9 10 6 1 4 3). "=> #(#(8) #(3 4 9 9 10) #(6) #(1 4) #(3)) "
groupsOfSorted value: #(1 3 3 4 4 6 8 9 9 10). "=> #(#(1 3 3 4 4 6 8 9 9 10)). "
groupsOfSorted value: #(10 9 9 8 6 4 4 3 3 1). "=> #(#(10) #(9 9) #(8) #(6) #(4 4) #(3 3) #(1)). "
groupsOfSorted value: #(1 1 1 1 1 1 1 1 1 1). "=> #(#(1 1 1 1 1 1 1 1 1 1)). "
groupsOfSorted value: #(). "=> #(). "
groupsOfSorted value: #(1). "=> #(#(1)) "
28:デフォルトの名無しさん
14/01/27 17:40:59.68
>>23 HSP
#module
#const IS_ASCEND 1
#const IS_DESCEND 2
#const IS_EQUAL 4
#const MASK_ALL (IS_ASCEND|IS_DESCEND|IS_EQUAL)
#defcfunc f23 array arr, int arr_num, local mask
mask=MASK_ALL
repeat arr_num
if cnt=0 : continue
if arr(cnt)>arr(cnt-1) : mask &= IS_ASCEND
if arr(cnt)<arr(cnt-1) : mask &= IS_DESCEND
if mask=0 : r=cnt : break
loop
if mask & IS_EQUAL : return "EQ"
if mask & IS_ASCEND : return "AS"
if mask & IS_DESCEND : return "DES"
return str(r)
#global
arr=6,6,3,2,6,4,7,4,7,4
mes f23(arr, 10)
arr=2,3,4,4,4,6,6,6,7,7
mes f23(arr, 10)
arr=7,7,6,6,6,4,4,4,3,2
mes f23(arr, 10)
arr=1,1,1,1,1,1,1,1,1,1
mes f23(arr, 10)
mes f23(arr, 0)
arr=1
mes f23(arr, 1)
29:デフォルトの名無しさん
14/01/27 17:57:49.80
>>24 HSP
#module
#defcfunc f24 str s_, local s, local data_str, local data_num, local data, local ret
s=s_
if s="" : return "[]"
split s, ",", data_str
data_num=stat
repeat data_num
data(cnt)=int(data_str(cnt))
loop
ret=strf("[[%d", data(0))
repeat data_num-1, 1
if data(cnt)<data(cnt-1) {
ret+=strf("][%d", data(cnt))
} else {
ret+=strf(",%d", data(cnt))
}
loop
ret+="]]"
return ret
#global
mes f24("8,3,4,9,9,10,6,1,4,3")
mes f24("1,3,3,4,4,6,8,9,9,10")
mes f24("10,9,9,8,6,4,4,3,3,1")
mes f24("1,1,1,1,1,1,1,1,1,1")
mes f24("")
mes f24("1")
30:デフォルトの名無しさん
14/01/27 18:25:37.70
>>23 ruby 1.8.6
require 'enumerator'
def f23(a)
s = a.enum_cons(2).inject([]) {|cs, (x, y)|cs << (x == y ? '=' : x < y ? '<' : '>')}.to_s
pairs = [[/^[=]*$/, 'EQ'], [/^[<=]+$/, 'AS'], [/^[>=]+$/, 'DES'], [//, nil]]
pairs.find() {|(re, tag)| re =~ s}.last || 1 + [s.index('<'), s.index('>')].max
end
p f23([6,6,3,2,6,4,7,4,7,4])
p f23([2,3,4,4,4,6,6,6,7,7])
p f23([7,7,6,6,6,4,4,4,3,2])
p f23([1,1,1,1,1,1,1,1,1,1])
p f23([])
p f23([1])
>>24 ruby 1.8.6
def f24(a)
a.inject([[]]) {|xss, x|
!xss.last.last || xss.last.last <= x ? xss.last << x : xss << [x]
xss
}
end
p f24([8,3,4,9,9,10,6,1,4,3])
p f24([1,3,3,4,4,6,8,9,9,10])
p f24([10,9,9,8,6,4,4,3,3,1])
p f24([1,1,1,1,1,1,1,1,1,1])
31:デフォルトの名無しさん
14/01/27 18:54:13.58
>>25
リストを隣合う要素の左側が右側より大きい箇所を境目にグループ化したリストを出力する
32:デフォルトの名無しさん
14/01/27 18:55:30.11
>>25
勝手に文字列に変換してる奴がよく言うwww
33:デフォルトの名無しさん
14/01/27 19:38:13.50
>>30 いちおう修正
def f24(a)
a.inject([]) {|xss, x|
xss.size < 1 || xss.last.last > x ? xss << [x] : xss.last << x
xss
}
end
p f24([])
p f24([1])
↓
[]
[[1]]
34:デフォルトの名無しさん
14/01/27 20:05:31.93
>>23
import Control.Monad
isSorted :: Ord a => [a] -> Either Int Ordering
isSorted [] = Right EQ
isSorted [_] = Right EQ
isSorted xs = foldM f EQ $ zip [1..] $ zipWith compare xs $ tail xs
where
f EQ (_,x) = Right x
f acc (_,EQ) = Right acc
f acc (i,x)
| acc == x = Right acc
| otherwise = Left i
main :: IO ()
main = do
test [6,6,3,2,6,4,7,4,7,4] -- => 4
test [2,3,4,4,4,6,6,6,7,7] -- => AS
test [7,7,6,6,6,4,4,4,3,2] -- => DES
test [1,1,1,1,1,1,1,1,1,1] -- => EQ
test ([] :: [Int]) -- => EQ
test [1] -- => EQ
test :: (Ord a, Show a) => [a] -> IO ()
test xs = do
putStr $ show xs ++ " => "
putStrLn $ case isSorted xs of
Left i -> show i
Right EQ -> "EQ"
Right LT -> "AS"
Right GT -> "DES"
35:デフォルトの名無しさん
14/01/27 20:10:40.70
>>24
groupBySorted :: Ord a => [a] -> [[a]]
groupBySorted [] = []
groupBySorted (x0:xs0) = ls0 : groupBySorted rs0
where
(ls0, rs0) = f x0 xs0
f x [] = ([x], [])
f x (y:ys)
| x <= y = let (ls, rs) = f y ys in (x:ls, rs)
| otherwise = ([x], y:ys)
main :: IO ()
main = do
test [8,3,4,9,9,10,6,1,4,3] -- => [[8],[3,4,9,9,10],[6],[1,4],[3]]
test [1,3,3,4,4,6,8,9,9,10] -- => [[1,3,3,4,4,6,8,9,9,10]]
test [10,9,9,8,6,4,4,3,3,1] -- => [[10],[9,9],[8],[6],[4,4],[3,3],[1]]
test [1,1,1,1,1,1,1,1,1,1] -- => [[1,1,1,1,1,1,1,1,1,1]]
test ([] :: [Int]) -- => []
test [1] -- => [[1]]
test :: (Ord a, Show a) => [a] -> IO ()
test xs = putStrLn $ show xs ++ " => " ++ show (groupBySorted xs)
36:デフォルトの名無しさん
14/01/27 20:12:12.04
>>34 >>35 Haskell
37:デフォルトの名無しさん
14/01/27 20:27:36.92
>>23 Python
def f23(a):
sign = 0
for i in range(len(a)):
if i and a[i] != a[i-1]:
if sign and sign * (a[i] - a[i-1]) < 0: return i
sign = int((a[i] - a[i-1]) / abs(a[i] - a[i-1]))
return ["DES", "EQ", "AS"][sign+1]
q23 = [
[6,6,3,2,6,4,7,4,7,4],
[2,3,4,4,4,6,6,6,7,7],
[7,7,6,6,6,4,4,4,3,2],
[1,1,1,1,1,1,1,1,1,1],
[],
[1],
]
for x in q23:
print x, "=>", f23(x)
38:デフォルトの名無しさん
14/01/27 20:29:09.36
>>24 Python
def f24(a):
if len(a) == 0: return []
ans = []
i = 0
for j in range(len(a)):
if j and a[j] < a[j-1]:
ans.append(a[i:j])
i = j
return ans + [a[i:]]
q24 = [
[8,3,4,9,9,10,6,1,4,3],
[1,3,3,4,4,6,8,9,9,10],
[10,9,9,8,6,4,4,3,3,1],
[1,1,1,1,1,1,1,1,1,1],
[],
[1],
]
for x in q24:
print x, "=>", f24(x)
39:デフォルトの名無しさん
14/01/27 20:37:22.62
>>23
URLリンク(ideone.com)
バグいじくりまわしてたら正常動作するようになったぁゃしぃコード。まともなデバッグしてない。
40:デフォルトの名無しさん
14/01/27 21:26:25.61
>>24
URLリンク(ideone.com)
今回はボトムアップで作った。なんかコード短くなった気がする。
41:デフォルトの名無しさん
14/01/27 21:59:48.76
>>23 c
#include <stdio.h>
#define SIZE(a) (sizeof a / sizeof *a)
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int eq(int a, int b) {return a == b;}
int le(int a, int b) {return a <= b;}
int ge(int a, int b) {return a >= b;}
int count_true_pair_combo(int *is, int size, int (*f)(int, int)) {
int i;
for (i = 0; i < size - 1; i++) if (!f(is[i], is[i + 1])) break;
return i;
}
void f23(int *is, int size) {
int n_pairs = size - 1;
int n_eq = count_true_pair_combo(is, size, eq);
int n_le = count_true_pair_combo(is, size, le);
int n_ge = count_true_pair_combo(is, size, ge);
if (size < 2 || n_eq == n_pairs) puts("EQ");
else if (n_le == n_pairs) puts("AS");
else if (n_ge == n_pairs) puts("DES");
else printf("%d\n", 1 + MAX(n_le, n_ge));
}
int main() {
int a[] = {6,6,3,2,6,4,7,4,7,4}; f23(a, SIZE(a));
int b[] = {2,3,4,4,4,6,6,6,7,7}; f23(b, SIZE(b));
int c[] = {7,7,6,6,6,4,4,4,3,2}; f23(c, SIZE(c));
int d[] = {1,1,1,1,1,1,1,1,1,1}; f23(d, SIZE(d));
int e[] = {}; f23(e, SIZE(e));
int f[] = {1}; f23(f, SIZE(f));
return 0;
}
42:デフォルトの名無しさん
14/01/27 23:32:06.68
>>23-24 Perl
URLリンク(ideone.com)
43:デフォルトの名無しさん
14/01/28 19:03:35.07
お題 与えられた集合の要素を数珠順列に並べたもの全てを列挙せよ。
例
# {'a','b','c','d'} の数珠順列の全て
necklace=λ kfsAg:sum([[(kfsAg.sl[0],y)+x+(z,) for x in permutate(kfsAg-kfs([kfsAg.sl[0],y,z]))] for y,z in combinate(kfsAg.sl[1:],2)],[]); necklace(kfs("abcd"))
===============================
[('a', 'b', 'd', 'c'), ('a', 'b', 'c', 'd'), ('a', 'c', 'b', 'd')]
# [1, 2, 3, 4, 5] の数珠順列の全て
necklace=λ kfsAg:sum([[(kfsAg.sl[0],y)+x+(z,) for x in permutate(kfsAg-kfs([kfsAg.sl[0],y,z]))] for y,z in combinate(kfsAg.sl[1:],2)],[]); necklace(kfs([1,2,3,4,5]))
===============================
[(1, 2, 4, 5, 3), (1, 2, 5, 4, 3), (1, 2, 3, 5, 4), (1, 2, 5, 3, 4), (1, 2, 3, 4, 5), (1, 2, 4, 3, 5),
(1, 3, 2, 5, 4), (1, 3, 5, 2, 4), (1, 3, 2, 4, 5), (1, 3, 4, 2, 5), (1, 4, 2, 3, 5), (1, 4, 3, 2, 5)]
参考 URL;;URLリンク(www.geocities.jp)
44:デフォルトの名無しさん
14/01/28 20:28:25.53
>>43
URLリンク(ideone.com)
リンク先のベタ移植。値の加工はまた今度。たまたま時間なかった。
演算子がよくわからんかった。
45:デフォルトの名無しさん
14/01/28 21:43:08.63
>>43
URLリンク(ideone.com)
>>44の値を加工した。適当に加工したので使いにくいな。
実はC++には・・・順列が・・・。
46:デフォルトの名無しさん
14/01/28 22:11:10.23
URLリンク(ideone.com)
C++。これライブラリ使って作ってみたけど、これ円順列の方かな???
そう言えば任意のオーダーで数珠順列作りたかったら、
まじめにけいさんして返ってきた(0,N]の配列を配列のインデックスにすれば良かったんだな。
考えが足りなかった。
47:デフォルトの名無しさん
14/01/28 23:30:56.13
>>43 Squeak Smalltalk 。例に書かれたコードを参考に。
| necklace |
necklace := [:arr |
arr size < 4 ifTrue: [arr] ifFalse: [
Array streamContents: [:ss |
arr allButFirst combinations: 2 atATimeDo: [:yz |
(arr copyWithoutAll: {arr first}, yz) permutationsDo: [:x |
ss nextPut: {arr first. yz first}, x, {yz second}]]]]].
necklace value: #(1 2 3 4 5)
=> #(
#(1 2 4 5 3)
#(1 2 5 4 3)
#(1 2 3 5 4)
#(1 2 5 3 4)
#(1 2 3 4 5)
#(1 2 4 3 5)
#(1 3 2 5 4)
#(1 3 5 2 4)
#(1 3 2 4 5)
#(1 3 4 2 5)
#(1 4 2 3 5)
#(1 4 3 2 5))
48:デフォルトの名無しさん
14/01/29 04:01:27.44
>>43
URLリンク(ideone.com)
ほぼC。たぶんこれで完成。
例文の関数言語は読めないので翻訳できない。Orz
49:デフォルトの名無しさん
14/01/29 12:14:31.55
>>43
AABCD
みたいに同一の要素が入ることは無いのかな?
50:デフォルトの名無しさん
14/01/29 21:03:29.91
>>46 ruby 1.8.6
def combination(a, k, is = [], acc = [])
if is.size == k
acc << is.map {|i| a[i]}
else
start = is.empty? ? 0 : is.last + 1
(start..a.size - 1).each {|i| combination(a, k, is + [i], acc) if i < a.size}
end
acc
end
def rotated_arrays(org, n_times, pos)
tmp = org.dup
(1..n_times).inject([]) {|ras, a| ras << (tmp << tmp.delete_at(pos)).dup}
end
def permutation(a, pos = 2, acc = [])
if a.size < 2
acc.concat a
elsif a.size == pos
acc.concat rotated_arrays(a, pos, -pos)
else
rotated_arrays(a, pos, -pos).each {|ra| permutation(ra, pos + 1, acc)}
end
acc
end
51:デフォルトの名無しさん
14/01/29 21:08:04.10
>>50 つづき。あ、>>50のリンク先はタイプミス。>>43が正解。
def f43(a)
a.size <= 3 ? a : combination(a[1, a.size - 1], 2).inject([]) {|acc, (y, z)|
permutation(a - [a[0], y, z]).inject(acc) {|acc, x|
acc << [a[0], y, x, z].flatten
}
}
end
p f43(('a'..'d').to_a)
p f43((1..5).to_a)
↓
[["a", "b", "d", "c"], ["a", "b", "c", "d"], ["a", "c", "b", "d"]]
[[1, 2, 5, 4, 3], [1, 2, 4, 5, 3], [1, 2, 5, 3, 4], [1, 2, 3, 5, 4], [1, 2, 4, 3
, 5], [1, 2, 3, 4, 5], [1, 3, 5, 2, 4], [1, 3, 2, 5, 4], [1, 3, 4, 2, 5], [1, 3,
2, 4, 5], [1, 4, 3, 2, 5], [1, 4, 2, 3, 5]]
combinationとpermutationの自作に正直ホネが折れた。
>>43が何を書いてるかサッパリ分からないがそこはフィーリングで。
52:デフォルトの名無しさん
14/01/31 23:20:26.68
お題:1から1001までしりとりで数え上げる。0は「ん」として
末尾が0の数字はスキップする。
例
1,11,12,2,21,13,...,1001
53:デフォルトの名無しさん
14/02/01 00:48:39.92
>>24 J
f=:3 :'if. y-:i.0 0 do. a: else.(1,0<(}:-}.)y)<;.1 y end.'
f 8 3 4 9 9 10 6 1 4 3
+-+----------+-+---+-+
|8|3 4 9 9 10|6|1 4|3|
+-+----------+-+---+-+
f 1 3 3 4 4 6 8 9 9 10
+--------------------+
|1 3 3 4 4 6 8 9 9 10|
+--------------------+
f 10 9 9 8 6 4 4 3 3 1
+--+---+-+-+---+---+-+
|10|9 9|8|6|4 4|3 3|1|
+--+---+-+-+---+---+-+
f i.0 0
++
||
++
f 1
+-+
|1|
+-+
54:デフォルトの名無しさん
14/02/01 01:39:53.62
>>52 Squeak Smalltalk
| shiritori |
shiritori := Generator on: [:g |
| keys |
keys := {'11'}, ((1 to: 9) gather: [:hd | (hd+1 to: 9) gather: [:tl |
{hd asString, tl},
(hd = 1 ifTrue: [{tl asString, tl}] ifFalse: [{}]),
{tl asString, (tl = 9 ifTrue: [hd = 8 ifTrue: [1] ifFalse: [hd+1]] ifFalse: [hd])}]]).
keys do: [:pair |
pair asSet size = 1 ifTrue: [g yield: pair first digitValue].
g yield: pair asNumber].
0 to: 9 do: [:m |
keys do: [:pair | g yield: (pair first asString, m, pair last) asNumber]].
g yield: 1001].
(shiritori next: 15) asArray. "=> #(1 11 12 2 22 21 13 3 33 31 14 4 44 41 15) "
shiritori contents last: 10. "=> #(896 699 997 798 897 799 998 899 991 1001) "
55:デフォルトの名無しさん
14/02/01 13:41:11.13
>>52
1~1001の中で末尾が0以外の数字は全部使うの?
56:55
14/02/01 13:57:58.06
自己解決.全部使えた
57:デフォルトの名無しさん
14/02/01 14:07:22.51
>>52 Haskell
URLリンク(ideone.com)
58:デフォルトの名無しさん
14/02/01 17:27:30.38
>>52 ruby 1.8.6
伝家の宝刀「なぜか動いた」。脳みそ0mgでお送りします。
少なくとも1..101と1..1001のときなぜか答えを返すのを確認。
def f52(r)
trios = r.inject([]) {|trios, i|
cs = i.to_s.scan(/./)
l, r = cs.first.to_i, cs.last.to_i
r == 0 ? trios : trios << [l, i, r]
}
l, r = [trios.shift], [trios.pop]
while 0 < trios.size
trio = trios.shift
if l.last.last == trio.first
l.push trio
elsif trio.last == r.first.first
r.unshift trio
else
trios.push trio
trios.push l.pop if 1 < l.size
end
end
l.last.last == r.first.first ? (l + r).map {|trio| trio[1]} : nil
end
p f52(1..1001)
59:デフォルトの名無しさん
14/02/01 17:30:35.99
>>58 の出力。
[1, 155, 546, 697, 748, 81, 185, 596, 667, 768, 889, 91, 177, 798, 899, 991, 184
, 465, 566, 687, 788, 879, 981, 112, 2, 253, 364, 485, 576, 677, 778, 869, 971,
143, 394, 445, 526, 61, 175, 556, 647, 728, 859, 992, 233, 374, 475, 586, 657, 7
58, 849, 961, 197, 718, 839, 982, 283, 384, 425, 516, 637, 738, 829, 972, 213, 3
54, 495, 536, 627, 799, 962, 263, 344, 496, 617, 708, 819, 951, 193, 334, 455, 5
87, 789, 941, 165, 597, 779, 952, 203, 324, 486, 698, 809, 931, 164, 476, 607, 7
69, 942, 293, 314, 435, 567, 759, 932, 273, 304, 405, 577, 749, 921, 12, 294, 41
5, 557, 739, 922, 243, 395, 547, 729, 911, 122, 223, 385, 537, 719, 901, 183,
:
, 665, 564, 463, 362, 261, 116, 69, 958, 857, 756, 655, 554, 453, 352, 251, 128,
85, 59, 948, 847, 746, 645, 544, 443, 342, 241, 107, 74, 49, 938, 837, 736, 635
, 534, 433, 332, 231, 129, 96, 63, 39, 928, 827, 726, 625, 524, 423, 322, 221, 1
19, 97, 75, 53, 31, 19, 918, 817, 716, 615, 514, 413, 312, 211, 108, 86, 64, 42,
29, 9, 999, 989, 979, 969, 959, 949, 939, 929, 919, 909, 908, 898, 888, 878, 86
8, 858, 848, 838, 828, 818, 808, 807, 797, 787, 777, 767, 757, 747, 737, 727, 71
7, 707, 706, 696, 686, 676, 666, 656, 646, 636, 626, 616, 606, 605, 595, 585, 57
5, 565, 555, 545, 535, 525, 515, 505, 504, 494, 484, 474, 464, 454, 444, 434, 42
4, 414, 404, 403, 393, 383, 373, 363, 353, 343, 333, 323, 313, 303, 302, 292, 28
2, 272, 262, 252, 242, 232, 222, 212, 202, 201, 191, 181, 171, 161, 151, 141, 13
1, 121, 111, 109, 99, 98, 88, 87, 77, 76, 66, 65, 55, 54, 44, 43, 33, 32, 22, 21
, 1001]
60:デフォルトの名無しさん
14/02/01 21:13:43.00
>>52 Perl
URLリンク(ideone.com)
61:デフォルトの名無しさん
14/02/02 01:34:45.96
適当に昇順でサーチしてたら1001が余るなー。なぜだー。。。Orz
62:デフォルトの名無しさん
14/02/02 02:10:06.26
>>52
URLリンク(ideone.com)
ゴリ押しで問題といてみた。他の数字で動くときはほぼ偶然。
具体的には9から昇順サーチしてって、
1000個だとピッタリ循環するんだけど1001個だと1001番が余るので配列を結果見てから2個後ろにずらして、1001番を追加している。
非常にダーティなハックですなー。もっと綺麗に書きたい。
パズルとか思考のネストが深いと頭がオーバーヒートする。Orz
63:デフォルトの名無しさん
14/02/02 10:47:08.50
>>52 J
f=:3 :0
a=.~.;".&.>/:~":&.> ~./:~@(,|.&.":)&.>;/(#~0<10&|)>:i.1000
b=.(+/(1+i.9)="0 1[a)<;.1 a
c=.18}.;{.b
1,101,(;,(;/102+i.8),.(}.b),.(;/1+100*2+i.8)),c,1001
)
1 101 102 2 202 203 302 204 402 205 502 206 602 207 702 208 802 209 902 212
213 312 214 412 215 512 216 612 217 712 218 812 219 912 22 222 223 322 224 422
...
179 971 18 81 181 182 281 183 381 184 481 185 581 186 681 187 781 188 881 189
981 19 91 191 192 291 193 391 194 491 195 591 196 691 197 791 198 891 199 991
1001
自分で出題したのに知らないうちに難易度が上がってうまく解けないよ。
全部の数字を使い切らない解しか想定していませんでした。
みなさん、お題を育ててくれてありがとう。
64:デフォルトの名無しさん
14/02/02 11:02:24.20
>>63
> 全部の数字を使い切らない解しか想定していませんでした。
な、なんだって~!w
使い切らないで良いなら1,1001で終わるから違うんだろうなぁって判断した。
65:デフォルトの名無しさん
14/02/02 11:07:00.14
>>54の人がまじめに解いちゃったからね。いや、素晴らしいことだよ。ホント。
66:デフォルトの名無しさん
14/02/02 11:12:11.74
>>54 はすごいね、smalltalkはOO方面で伝説らしいし手をつけてみようか
67:デフォルトの名無しさん
14/02/02 11:19:47.55
>>52の問題って、アウトオブオーダー実行のチェイン見たくて不思議な魅力があって面白い。と、思う。
解も様々あるし。
68:デフォルトの名無しさん
14/02/02 12:36:56.93
>>66
>>54 は全部列挙できるルールを見つけたのでそれに基づいたジェネレーターを書き下ろしただけで
解いてはいません。ほめてもらってるのにすみません。でもSmalltalkに興味を持ってもらえるのは嬉しいです。
余計なことかもしれませんが、Smalltalkは処理系に違いで、あるいは同じ処理系でも
バージョンの違いですぐコードが動かなくなりますので、写経とかするときは注意してください。
古いバージョンでも大枠は学べるので、しょっぱな最新版をおっかけないほうがいいです。
一般に、何か教本を用いるときは、その教本が想定としている処理系(可能ならバージョンも)を
できるだけ一致させるのが吉です。あと、分からないことはプライドは捨ててどんどん訊いてください。
以下、比較的名前の知られた処理系のご紹介。
GNU Smalltalkは、紛らわしいことにSmalltalkとしてはかなり変わり種の処理系で、
ファンが作ったオレオレSmalltalk処理系ですが、通常のスクリプト言語に近い感じで使えるので
Smalltalkを素朴に言語処理系として学びたい人にはお勧めです。ideone.comでも使えます。
どうせなら(自分はともかく誰かが)仕事で使っているクオリティのきちんとした処理系で学びたい
ということでしたら、Cincom社のVisualWorksという処理系がお薦めです。非商用はフリーです。
URLリンク(smalltalk.cincom.jp)
URLリンク(smalltalk.cincom.jp)
Squeakは、処理系としてはめちゃくちゃですが、くだらない(というと語弊がありますが
「多岐のユースケースに沿った」というとちょっと恰好がつきますか…)クラスやAPIが充実しているので
こういうお題を解くときに痒いところに手が届くので個人的には気に入って使っています。
URLリンク(sourceforge.jp)
URLリンク(swikis.ddo.jp)
PharoはSqueakのコアメンバーが、Squeakの冗長さにイヤ気して、よくある「整理したい」
「大胆にやりなおしたい」症候群でやっているプロジェクトで、Squeakより処理系としては
少しまともな半面、まだ発展途上なのが注意点です。
URLリンク(www.pharo-project.org)
URLリンク(github.com)
URLリンク(dotinstall.com)
69:デフォルトの名無しさん
14/02/02 17:23:47.94
お題:
n=1のとき
01
10
n=2のとき
0011
0011
1100
1100
n=3のとき
000111
000111
000111
111000
111000
111000
を表示する。
70:デフォルトの名無しさん
14/02/02 17:50:09.02
>>69 ruby 1.8.6
def f69(n)
puts ['0' * n + '1' * n] * n + ['1' * n + '0' * n] * n
end
(1..3).each {|n| f69(n)}
71:デフォルトの名無しさん
14/02/02 18:40:53.61
>>69 HSP
#module
#deffunc f69 int n
mes n_str(n_str("0", n)+n_str("1", n)+"\n", n)+n_str(n_str("1", n)+n_str("0", n)+"\n", n)
return
#defcfunc n_str str s, int n, local buf
sdim buf
repeat n : buf+=s : loop
return buf
#global
f69 1
f69 2
f69 3
72:デフォルトの名無しさん
14/02/02 18:45:47.05
>>69 Haskell
zeroOneMatrix :: Int -> String
zeroOneMatrix n = unlines . replicate n . (replicate n =<<) =<< ["01","10"]
main = putStr $ zeroOneMatrix 3
73:デフォルトの名無しさん
14/02/02 19:03:18.19
>>69 Squeak Smalltalk
| checker |
checker := [:n |
| zeros ones CRs |
zeros := Matrix new: n element: $0.
ones := Matrix new: n element: $1.
CRs := Matrix rows: n columns: 1 element: Character cr.
((zeros, ones, CRs),, (ones, zeros, CRs)) asArray as: String].
checker value: 3.
000111
000111
000111
111000
111000
111000
74:デフォルトの名無しさん
14/02/02 21:25:11.08
>>69
URLリンク(ideone.com)
ほぼC。いつもより多めに回っております。
75:66 ◆QZaw55cn4c
14/02/02 22:34:05.84
>>69
URLリンク(codepad.org)
>>68
thx a lot! c++/java とは違う世界に期待して.
先日のお題で,√2 1000桁を追試しようと squeqk (だと思う)を早速いれたけれども,これってウィンドウシステム全体を入れたみたいな扱いなんですね.
76:デフォルトの名無しさん
14/02/02 22:42:23.06
>>75
トリ割れしたのにまだそれつかってんの?w
それとも、それは勘違いでそのトリは新しいやつなの?
77:デフォルトの名無しさん
14/02/02 22:59:04.21
>>69 Io
f:=method(n,
a:="0"repeated(n)
b:="1"repeated(n)
(a .. b .. "\n")repeated(n)..(b .. a .."\n")repeated(n)
)
Io> f(2)println
0011
0011
1100
1100
78:デフォルトの名無しさん
14/02/02 23:06:02.37
>>69 C
void f(int n){
int x,y;
for(y=n*2;y--;){
for(x=n*2;x--;){
putchar(x/n^y/n|48);
}
puts("");
}
puts("");
}
int main(){
f(1);
f(2);
f(5);
return 0;
}
79:デフォルトの名無しさん
14/02/02 23:41:49.49
>>75
>これってウィンドウシステム全体を入れたみたいな扱いなんですね.
そうです。Smalltalk はアラン・ケイらが自身が構想した理想のパーソナルコンピューターである
「ダイナブック」URLリンク(swikis.ddo.jp) の暫定OSとして独特な思想や世界観を背景
URLリンク(web.archive.org) に作られたため
セルフホスティング(処理系・環境の大部分がSmalltalk自身で記述されている)の仮想OSのような構成で
独自のウインドウシステムも環境の中に備えています。余談ですが、このウインドウシステムを
スティーブ・ジョブズらが観てインスパイアされ(有り体に言えばパクって)LisaやMacを作ったり、
そのときは真似られなかったAPIを参考に、のちに改めてNeXTSTEP(今のOS X、iOSの前身)を
作ったのは比較的よく知られた話です。URLリンク(americanhistory.si.edu)
そんなわけで、もしSmalltalkを使うためだけに慣れたUNIX環境などから離れたくない、
ということでしたら、繰り返しになりますがGNU Smalltalkをお薦めします。
言語のみのSmalltalk、という本来のSmalltalkからすれば限定的な世界しか体験できませんが、
それでも組み込みライブラリひとつとってもSmalltalkはかなり盛りだくさんなので、
学ぶのに退屈することはないかと思います。
参考まで、件のコードをGNU Smalltalkでも動作するように書き換えてみました(ideone.com でも
時間切れにならないように 100桁で)。
| m x epsilon delta |
m := 100.
x := 1.
epsilon := 10 raisedTo: m negated.
[(delta := -2 * x * x + 1 * x / 2) abs > epsilon] whileTrue: [x := x + delta].
((x * 2) asScaledDecimal: m) printNl
URLリンク(ideone.com)
80:デフォルトの名無しさん
14/02/02 23:55:20.39
>>79
>余談ですが、このウインドウシステムをスティーブ・ジョブズらが観て
いうまでもなく「このウインドウシステム」は、1979年当時の―です。念のため^^;
URLリンク(classes.soe.ucsc.edu)
81:デフォルトの名無しさん
14/02/03 00:34:55.88
>>69 R
>>78の真似
f <- function(n){
a <- rep(0:1,c(n,n))
write(1-outer(a,a,"=="),"",n*2,sep="")
}
82:デフォルトの名無しさん
14/02/03 18:16:35.78
>>69 J
f =: '01'&([ {~ [: ~:/~ ] # [)
smoutput@(f"0) 1 2 3
01
10
0011
0011
1100
1100
000111
000111
000111
111000
111000
111000
83:デフォルトの名無しさん
14/02/03 19:21:46.77
お題:次の式をn=10について計算し、大きい順に式と値を表示する。
logは自然対数、sqrtは平方根、!は階乗、^は累乗とする。
2^n
2^log(n)
4^n
n
n^2
n!
n*log(n)
log(n!)
log(log(n))
sqrt(log(n))
84:デフォルトの名無しさん
14/02/03 20:15:11.09
>>83 ruby 1.8.6
def f83(n)
a = []
a << [2 ** n, '2^n']
a << [2 ** Math.log(n), '2^log(n)']
a << [4 ** n, '4^n']
a << [n, 'n']
a << [n ** 2, 'n^2']
a << [(1..n).inject(1){|r, i| r * i}, 'n!']
a << [n * Math.log(n), 'n*log(n)']
a << [Math.log((1..n).inject(1){|r, i| r * i}), 'log(n!)']
a << [Math.log(Math.log(n)), 'log(log(n))']
a << [Math.sqrt(Math.log(n)), 'sqrt(log(n))']
a.sort.reverse
end
puts f83(10).map {|a| a.join(' = ')}
↓
3628800 = n!
1048576 = 4^n
1024 = 2^n
100 = n^2
23.0258509299405 = n*log(n)
15.1044125730755 = log(n!)
10 = n
4.9334096679146 = 2^log(n)
1.51742712938515 = sqrt(log(n))
0.834032445247956 = log(log(n))
85:デフォルトの名無しさん
14/02/03 21:48:51.10
>>83 Squeak Smalltalk
| n exprs |
n := 10.
exprs := {
'2^n' -> [2 raisedTo: n].
'2^log(n)' -> [2 raisedTo: n ln].
'4^n' -> [4 raisedTo: n].
'n' -> [n].
'n^2' -> [n raisedTo: 2].
'n!' -> [n factorial].
'n*log(n)' -> [n * n ln].
'log(n!)' -> [n factorial ln].
'log(log(n))' -> [n ln ln].
'sqrt(log(n))' -> [n ln sqrt]}.
^(exprs collect: [:kv | kv value value -> kv key]) sort reversed
=> {3628800->'n!' .
1048576->'4^n' .
1024->'2^n' .
100->'n^2' .
23.02585092994046->'n*log(n)' .
15.10441257307552->'log(n!)' .
10->'n' .
4.9334096679146->'2^log(n)' .
1.517427129385147->'sqrt(log(n))' .
0.834032445247956->'log(log(n))'}
86:デフォルトの名無しさん
14/02/03 21:59:00.40
URLリンク(ideone.com)
あってるかな?数学はダメなんだよね。
階乗だけ手書きした。64ビット変数でも簡単にオーバーフローするので気をつけてね。
87:デフォルトの名無しさん
14/02/03 22:01:45.80
>>86 -> >>83
安価忘れてた。Orz
88:デフォルトの名無しさん
14/02/03 22:54:03.60
>>52 (>>55) Perl
URLリンク(ideone.com)
出来てるはず……。
>>69 Perl
use 5.016;
use warnings;
sub f { map{ (join '', map{ $_ x $_[0] } @{$_}) x $_[0] } ([0, 1], [1, 0]) }
foreach(1 .. 3){
say join("\n", f($_));
}
>>83 Perl
URLリンク(ideone.com)
89:デフォルトの名無しさん
14/02/04 00:43:17.27
>>83 Haskell
URLリンク(ideone.com)
90:デフォルトの名無しさん
14/02/04 11:58:40.99
>>69
JavaScript
var NumberObj={};NumberObj.Number=0;
NumberObj.SetNumber=function (n){this.Number=n;}
NumberObj.Main=function (){
var ReturnNumberString='';
for(l=0;l<this.Number;l++){
for(n=0;n<this.Number;n++){var ReturnNumberString;ReturnNumberString+="0";}
for(m=0;m<this.Number;m++){var ReturnNumberString;ReturnNumberString+="1";}
ReturnNumberString+="\n" ;}
for(i=0;i<this.Number;i++){
for(j=0;j<this.Number;j++){ReturnNumberString+="1";}
for(k=0;k<this.Number;k++){var ReturnNumberString;ReturnNumberString+="0";}
ReturnNumberString+="\n";}
window.alert(ReturnNumberString);
}
NumberObj.SetNumber(5);NumberObj.Main();
スマートではないですが勉強の一環として。改行多すぎといわれたため可読性低下。
91:90訂正
14/02/04 12:00:23.99
>>69 JavaScript
var NumberObj={};
NumberObj.Number=0;
NumberObj.SetNumber=function (n){this.Number=n;}
NumberObj.Main=function (){
var ReturnNumberString='';
for(l=0;l<this.Number;l++){
for(n=0;n<this.Number;n++){ReturnNumberString+="0";}
for(m=0;m<this.Number;m++){ReturnNumberString+="1";}
ReturnNumberString+="\n" ;
}
for(i=0;i<this.Number;i++){
for(j=0;j<this.Number;j++){ReturnNumberString+="1";}
for(k=0;k<this.Number;k++){ReturnNumberString+="0";}
ReturnNumberString+="\n";
}window.alert(ReturnNumberString);
}
NumberObj.SetNumber(5);
NumberObj.Main();
NumberObj.SetNumber(5);NumberObj.Main();
スマートではないですが勉強の一環として。改行多すぎといわれたためインデント等省き可読性ゼロ。
スマートではないですが勉強の一環として。改行多すぎといわれたため可読性低下。
92:デフォルトの名無しさん
14/02/04 12:13:20.70
>>83 J
f=:3 :0
s=.'2^n';'2^log(n)';'4^n';'n';'n^2';'n!';'n*log(n)';'log(n!)';'log(log(n))';'sqrt(log(n))'
v=.((2&^);(2&^@^.);(4&^);(]);(^&2);(!);(*^.);(^.@!);(^.@^.);(%:@^.))y
;"1 |."1 ":&.> \:~ v ,. (<' = ') ,. s
)
f 10
n! = 3628800
4^n = 1048576
2^n = 1024
n^2 = 100
n*log(n) = 23.02585093
log(n!) = 15.10441257
n = 10
2^log(n) = 4.933409668
sqrt(log(n)) = 1.517427129
log(log(n)) = 0.8340324452
93:デフォルトの名無しさん
14/02/04 20:12:25.22
>>69 Maxima
f(n):=?format(?t,"~v@{~:*~v@{0~}~:*~v@{1~}~%~}~v@{~:*~v@{1~}~:*~v@{0~}~%~}",n,n,0);
94:デフォルトの名無しさん
14/02/04 22:06:24.71
>>69
>>93を元に、任意の文字を指定できるようにしてみた(Common Lisp)。
ideone.com/rzzYhs
ちなみにこっちは自分で一昨日書いたもの。
ideone.com/sEOxWw
"@" を使わず、"~:*" の使いどころもなってないので(formatの)引数がぐっちゃぐちゃ。
95:デフォルトの名無しさん
14/02/04 23:17:59.32
ボイヤー・ムーア法において,単語の検索が完了するまでの,
単語と英文の文字列比較の回数を数える
文字列比較の回数を画面表示する
ようなプログラムを作成しなさい。
96:デフォルトの名無しさん
14/02/05 05:33:50.45
|=番兵|_
( ・ω・) <C/C++の宿題片付けます 166代目
○={=}〇,
|:::::::::\, ', ´
、、、、し 、、、(((.@)スレリンク(tech板)
97:デフォルトの名無しさん
14/02/05 18:13:42.67
お題:ボイヤー・ムーア法で使う移動量の表をつくる。
文字と移動量の対応がわかれば表現は自由。
例 Jの場合
f=:3 :'|:~.y;"0((|.y) i. y){_1|.>:i.#y'
f'hello'
+-+-+-+-+
|h|e|l|o|
+-+-+-+-+
|4|3|1|5|
+-+-+-+-+
f'boyer-moore'
+--+-+-+--+-+-+-+
|b |o|y|e |r|-|m|
+--+-+-+--+-+-+-+
|10|2|8|11|1|5|4|
+--+-+-+--+-+-+-+
98:デフォルトの名無しさん
14/02/05 20:23:45.80
>>97 ruby 1.8.6
def bmmap(s)
cs = s.scan(/./)
(0...cs.size - 1).inject({}) {|m, i| m[cs[i]] = cs.size - 1 - i; m}.update({cs.last=>cs.size})
end
p bmmap('hello')
p bmmap('boyer-moore')
↓
{"l"=>1, "o"=>5, "e"=>3, "h"=>4}
{"m"=>4, "-"=>5, "b"=>10, "y"=>8, "o"=>2, "e"=>11, "r"=>1
99:デフォルトの名無しさん
14/02/05 21:17:51.79
>>97 Perl
use 5.016;
use warnings;
sub f {
sub {
+{ (map{ $_[$_] => $#_ - $_ } (0 .. $#_ - 1)), $_[-1] => 0+ @_ }
}->(split //, shift)
}
use Data::Dumper;
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Indent = 0;
say Dumper(f("hello"));
say Dumper(f("boyer-moore"));
結果
{'l' => 1,'e' => 3,'h' => 4,'o' => 5}
{'-' => 5,'e' => 11,'y' => 8,'r' => 1,'b' => 10,'m' => 4,'o' => 2}
100:デフォルトの名無しさん
14/02/05 23:39:16.03
>>97
URLリンク(ideone.com)
ほぼC。これあってる?検索してでたページを勝手に解釈して作ったんだけど。
頭悪いからこういう理論系ってにがてー。Orz
101:デフォルトの名無しさん
14/02/06 01:13:55.34
>>97 Haskell
bmAlist :: Eq a => [a] -> [(a, Int)]
bmAlist [] = []
bmAlist xs = let (ln,(y,_):ys) = reverse `fmap` foldr f (0,[]) xs in (y,ln) : ys
where
f x (i,ys) = maybe (i+1,(x,i):ys) (const (i+1,ys)) $ lookup x ys
main :: IO ()
main = mapM_ print $ map bmAlist ["hello","boyer-moore"]
-- [('o',5),('l',1),('e',3),('h',4)]
-- [('e',11),('r',1),('o',2),('m',4),('-',5),('y',8),('b',10)]
102:_uy2.1p0
14/02/06 07:44:59.04
# ruby 2.1.0p0 (2013-12-25 revision 44422) [i386-mswin32_100]
# >>30 , >>33
def f24(a)
a.inject([]){|xss, x| xss.empty? || xss.last.last > x ? xss << [x] : xss.last << x ; xss}
end
p f24([]) ; p f24([1])
# >>50 , >>51
p [1,2,3,4].combination(2).to_a
p [1,2,3,4].permutation(2).to_a
# >>84
n = 9
p [(1..n).inject(1,:*), 'n!']
# >>98
def bmmap(s)
cs = s.split(//)
cs.size.times.inject({}) {|m, i| m[cs[i]] = cs.size - 1 - i; m}.merge(cs.last=>cs.size)
end
p bmmap('hello') ; p bmmap('boyer-moore')
# => []
# => [[1]]
# => [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
# => [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 4], [3, 1], [3, 2], [3, 4], [4, 1], [4, 2], [4, 3]]
# => [362880, "n!"]
# => {"h"=>4, "e"=>3, "l"=>1, "o"=>5}
# => {"b"=>10, "o"=>2, "y"=>8, "e"=>11, "r"=>1, "-"=>5, "m"=>4}
103:デフォルトの名無しさん
14/02/06 18:06:34.12
お題:与えられた年月のカレンダーを表示せよ。
回答例と出力例:
require 'date'
def weeks(year, mon)
first, last = Date.new(year, mon, 1), Date.new(year, mon, -1)
weeks = (first..last).inject([]) {|ws, d| d.day == 1 || d.wday == 0 ? ws << [d] : ws.last << d; ws}
weeks[0] = [nil] * (7 - weeks.first.size) + weeks.first
weeks[-1] = weeks.last + [nil] * (7 - weeks.last.size)
weeks
end
def calendar(year, mon)
weeks(year, mon).map {|days| days.map {|d| d ? "%2d" % d.day : ' '}.join(' ')}
end
def yearmon(date = Date.today)
[date.year, date.mon]
end
puts calendar(*yearmon)
↓
URLリンク(codepad.org)
104:デフォルトの名無しさん
14/02/06 18:18:12.91
>>103
#!/bin/sh -f
/bin/cal $2 $1
105:デフォルトの名無しさん
14/02/06 19:01:30.57
実際に何年も使っているコード
import calendar as cl; cl.prmonth(2014, 02, w=11, l=2)
February 2014
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
1 2
3 4 5 6 7 8 9
・・
24 25 26 27 28
106:デフォルトの名無しさん
14/02/06 20:40:25.00
>>97 Squeak Smalltalk
| bmTable |
bmTable := [:str |
str asSet collect: [:chr | chr -> ((str size - (str lastIndexOf: chr)) - 1 \\ str size + 1)]
].
bmTable value: 'hello'. "=> a Set($o->5 $e->3 $h->4 $l->1) "
bmTable value: 'boyer-moore'. "=> a Set($y->8 $o->2 $-->5 $b->10 $r->1 $e->11 $m->4) "
107:デフォルトの名無しさん
14/02/06 21:29:49.77
>>103 Squeak Smalltalk
| ans month |
Transcript open.
ans := FillInTheBlank request: 'yyyy-mm' initialAnswer: (Date today yyyymmdd allButLast: 3).
month := (ans ifEmpty: [Date today] ifNotEmpty: [(ans, ' 1') asDate]) month.
month weeks do: [:week |
week dates do: [:date |
Transcript nextPutAll: (date month = month
ifFalse: ['__']
ifTrue: [date dayOfMonth printPaddedWith: $_ to: 2])
] separatedBy: [Transcript space]
] separatedBy: [Transcript cr].
Transcript endEntry
'2014-02' =>
__ __ __ __ __ __ _1
_2 _3 _4 _5 _6 _7 _8
_9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 __
108:デフォルトの名無しさん
14/02/06 22:09:57.68
>>103 Perl
URLリンク(ideone.com)
109:デフォルトの名無しさん
14/02/06 22:17:48.04
>>103 Common Lisp
ideone.com/sW9TkK
110:デフォルトの名無しさん
14/02/06 23:43:50.60
>>103 J
load 'dates'
f=:3 :0
({.6!:0'')f y
:
a=:>:i.(todayno x,(y+1),1)-todayno x,y,1
b=.'SMTWTFS'
(_7,\((weekday x,y,1)#0),a){'_123456789abcdefghijklmnopqrstuv'
)
2014 f 2
SMTWTFS
______1
2345678
9abcdef
ghijklm
nopqrs_
111:デフォルトの名無しさん
14/02/06 23:48:26.08
URLリンク(ideone.com)
ほぼC。まともに書いたの初めてかも。
色々検索してやっと書けた。
ライブラリなしでも書けるもんだな。
112:デフォルトの名無しさん
14/02/06 23:58:15.89
>>111 -> >>103
安価忘れた。コードあってるよね?
113:デフォルトの名無しさん
14/02/07 08:01:51.73
>>112
デバッグの楽しみを奪うのは気が退けるから自分で頑張ってテストしてくれ。
で、ぱっと見で気づいた点。
・trueと比較するな。
・全部大文字の変数名を作るな。
紛らわしい。
114:デフォルトの名無しさん
14/02/07 08:41:47.66
>>113
Defineは基本的には使わない主義なので全部大文字だと、困るかなぁ。
いい名前思い浮かばなかったのは確かだけど。まぁ、これは失態。
でも、trueと比較するのは個人的な流儀なのでこれは曲げれん。
葉末を叩くより、ロジックを洗って欲しかった。
115:デフォルトの名無しさん
14/02/07 10:09:05.19
>>114
そこはそれこそ、自分でやるべきことだがな<ロジック
他に気づいた点。
・「与えられた」と言う仕様(お題)を満たしていない。
・主義なら止めないが、std::endlは'\n'とイコールではないぞ。
・定数にはconstをつけよう。特に、文字列。
・ついでに言えば、文字列配列はstaticにして無駄な代入は減らすべき。
・5とか6とかマジックナンバーうぜぇ。それこそ、const int Sunday = Saturday + 1;とかしたらいいのに。
・LastDayOfMonth()が折角異常時に負値を返しているのに呼び出し元がケアしてないのな。
・1900年から足すのは流石に地道過ぎる。例えば2000年辺りを基準に365*3+366で計算しちゃえば?
・つーか、元を糾せばtime.h使えば楽なのに。まぁ、そこを自力でやりたかったのか。
それにしても、trueと比較って意味がわからねぇ。
比較結果を返す関数の結果がtrueかどうか比較したくなるなら、なんで普通の比較はtrueと比較したくならないんだ?
ついでに言えば、折角コンパイラが勝手に最適化してくれる可能性を自ら潰しているぞ。
116:デフォルトの名無しさん
14/02/07 10:13:32.43
>113が教条主義なのは兎も角、全部大文字だと
書いた方は困らんだろうけど読む方は勘違いする罠。
それと、LastDayOfMonth()はテーブル使った方が見やすくないか?
117:デフォルトの名無しさん
14/02/07 17:03:02.76
>>103 Io
f := method(y,m,
d1 := Date clone setYear(y) setMonth(m) setDay(1)
d2 := Date clone setYear(y + (m / 12)floor) setMonth(m % 12 + 1) setDay(1)
a := (d2 - d1) days
w := d1 asString("%w") asNumber
writeln(" Su Mo Tu We Th Fr Sa")
for(i,1,w + a,
write(if(i <= w, "___", (i - w) asString(3,0).. if((i % 7) == 0, "\n","")))
)
writeln
)
Io> f(2014,2)
_Su_Mo_Tu_We_Th_Fr_Sa
____________________1
__2__3__4__5__6__7__8
__9_10_11_12_13_14_15
_16_17_18_19_20_21_22
_23_24_25_26_27_28
118:103
14/02/07 18:05:49.35
>>112
> コードあってるよね?
シラネw ワカンネw
回答者ならではとか言語ならではの違いが見たいだけだから、
答えがあってるかどうかまでは見てないんす。すまんすw
あとはお題に対する解釈で、どこを押さえてくれて、
どこで遊んでくれるのかを見るのも、それも楽しみかなあ。
いいかげんで無責任な出題でホント申し訳ないw
119:デフォルトの名無しさん
14/02/07 18:21:13.82
>>115
おはよう。
お題をみたしてないってどういうこと?余計に表示してるってことなのか、それとも他に?
Endlineって\nじゃないの?
constはあんまり突ける癖ないな。コンパイル時定数はさすがにstatic constにするけど。
マジックナンバーは、最後の詰めが甘かったね。反省。ほぼ完成した後追加したから気が回らなかった。
関数書くときは異常系もちゃんと書いておくんだよ。あんまり使わないけど。自分の範囲内だから他人がいじるのは想定してない。
1900から足しているのは、仕様だ。まぁ、検索した時に出てきた資料に沿ったんだけどさ。あとはある程度ロールバックできるようにしたかった。
time.hって乱数以外で使ったこと無いのよね。自前で書けそうだったのと調べるの面倒だったので手書きした。
trueとの比較は、自分のコーディングスタイルなので効率とかそういう話じゃない。
とにかく、X==Yの形で書いてないと俺自身の字句解析がおかしくなるんだよ~。かっこ厨だしな。
左から右に流れて読む癖があるからね。
とりあえず、要求満たしてないっていうのがどういうことなのか知りたい。
>>116
それについては俺も反省。
Define使わない主義だけど、やっぱ紛らわしいか。せめてスコープ内位は探して欲しいが。
テーブルの件は確かにそうだね~。実質2時間程度で書いたので意識が散漫だった。
のと、グローバル変数はなるべく使わない主義なので、選択肢になかった。
でも、テーブルでも良かったかな。std::vectorがイニシャライザリスト使えることだし、そんなに悪い選択でもなかった。
あ、でもうるう年のとき面倒くさいな。難しい選択だ。
120:デフォルトの名無しさん
14/02/07 18:24:01.67
>>118
まぁ、そういうことなら一応安心。
蛇足も許してくれそうでよかった。
121:デフォルトの名無しさん
14/02/07 18:26:38.97
>>115
そだそだ、暇だったら参加してよ。
コールドリーディングもいい勉強になるからさ。
122:デフォルトの名無しさん
14/02/07 18:33:32.22
>>103 Haskell
URLリンク(codepad.org)
123:デフォルトの名無しさん
14/02/07 18:42:25.97
>>121
コールドリーディングってなんぞ?コード・リーディングな。。。Orz
IMEのサジェストに頼ったのがいけなかったな。
124:デフォルトの名無しさん
14/02/07 19:01:56.81
>>121
いったい何を聞き出すんです?
まあSE的にはそれなりに役立ちそうな能力だが>コールドリーディング
125:103
14/02/07 19:04:30.81
>>103 ruby 1.8.6
回答する人にとって余計な負担になると思って省いたが、
つけてる人の見るとやっぱそっちがカッコイイのでいちおうつけとく。
def calendar(year, mon)
lines = weeks(year, mon).map {|ds| ds.map {|d| d ? "%2d" % d.day : ' '}.join(' ')}
lines = [(0...7).map {|i| Date::DAYNAMES[i].gsub(/^(..).*/, '\1')}.join(' ')] + lines
lines = [(Date::MONTHNAMES[mon] + ' ' + year.to_s).center(lines.first.size)] + lines
end
↓
February 2014
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
126:デフォルトの名無しさん
14/02/07 23:31:44.60
>>109 Python
import calendar
calendar.setfirstweekday(calendar.SUNDAY)
calendar.prmonth(2014, 2)
127:デフォルトの名無しさん
14/02/08 01:33:16.94
>>119
「与えられた年、月のカレンダー」と言うお題に対して、2014年のカレンダーを出力しているってことでしょ。
ShowCalendar()がその意味ではお題に対する解ってことでいいんでない?
128:デフォルトの名無しさん
14/02/08 01:55:54.14
>>127
まぁ、そういうことなら安心だ。
何事かと思った。
129:デフォルトの名無しさん
14/02/10 21:30:11.23
お題:ワードサーチパズルのソルバーを書いてください。
問題の与え方は(ハードコードを含め)自由です。
結果は、先頭の文字の場所を示せればOKです。
余力があれば、一つの単語の解答が複数ある場合にも対応してください。
入力例:
WVERTICALL
ROOAFFLSAB
ACRILIATOA
NDODKONWDC
DRKESOODDK
OEEPZEGLIW
MSIIHOAERA
ALRKRRIRER
KODIDEDRCD
HELWSLEUTH
WEEK
FIND
RANDOM
SLEUTH
BACKWARD
VERTICAL
DIAGONAL
WIKIPEDIA
HORIZONTAL
WORDSEARCH
出力例:
WEEK, なし; FIND, (2,5); RANDOM, (2,1); SLEUTH, (10,5);
BACKWARD, (2,10); VERTICAL, (1,2); DIAGONAL, (9,7);
WIKIPEDIA, (10,4); HORIZONTAL, (10,1); WORDSEARCH, (1,1)
130:デフォルトの名無しさん
14/02/10 21:53:29.85
>>129
もしかして、入力って2次元配列なの?
131:デフォルトの名無しさん
14/02/10 22:55:20.67
>>130
ワードサーチパズルは、たとえばこんなのです。
URLリンク(www.eigo21.com)
132:デフォルトの名無しさん
14/02/10 23:17:38.30
>>129 Squeak Smalltalk
| str mat words dirs |
str := 'WVERTICALL
ROOAFFLSAB
ACRILIATOA
NDODKONWDC
DRKESOODDK
OEEPZEGLIW
MSIIHOAERA
ALRKRRIRER
KODIDEDRCD
HELWSLEUTH'.
words := #('WEEK' 'FIND' 'RANDOM' 'SLEUTH' 'BACKWARD' 'VERTICAL'
'DIAGONAL' 'WIKIPEDIA' 'HORIZONTAL' 'WORDSEARCH').
mat := Matrix rows: str lines size columns: str lines first size contents: str lines concatenation.
dirs := {1@0. 1@1. 0@1. -1@1. -1@0. -1@ -1. 0@ -1. 1@ -1}.
^words collect: [:word |
| res pos |
mat replaceAll: word first with: $*.
res := 0@0.
[(pos := mat indexOf: $*) isZero] whileFalse: [
mat at: pos x at: pos y put: word first.
((1 to: word size - 1) allSatisfy: [:m | m * dirs + pos anySatisfy: [:cur |
(mat at: cur x at: cur y ifInvalid: nil) = (word at: m + 1)]]) ifTrue: [res := pos]].
word -> (res isZero ifTrue: ['not found'] ifFalse: [res])]
=> {'WEEK'->'not found' . 'FIND'->2@5 . 'RANDOM'->2@1 . 'SLEUTH'->10@5 .
'BACKWARD'->2@10 . 'VERTICAL'->1@2 . 'DIAGONAL'->9@7 . 'WIKIPEDIA'->10@4 .
'HORIZONTAL'->10@1 . 'WORDSEARCH'->1@1}
133:デフォルトの名無しさん
14/02/10 23:39:38.16
>>129
出遅れたか……言語はC++
URLリンク(codepad.org)
なお、input.txtと出力は次の通り(1行目は横サイズ・縦サイズ・単語数)
URLリンク(codepad.org)
134:デフォルトの名無しさん
14/02/11 00:25:21.92
>>131
うぇー、斜めあるんですか。。。
ちょっと大変だなー。
135:デフォルトの名無しさん
14/02/11 06:06:40.15
URLリンク(ideone.com)
ほぼC。アーちきしょー。イッパイ殴られたわ。正直合ってるかどうかわからん。
汎用性は持たせたが、ほぼハードコーディングだし、処理速度遅め。
久しぶりにすごい勢いでコード書いたわ。あー疲れた。
最初もっと難しい問題かと思って何度か書きなおしちゃったよ。
6時間もかかるとか想定外だ。ほんっと疲れた。Orz
>>132の設計のほうがいいな~。土台できてから書きえるのはリスキーだね。
自分の頭呪いたい。超絶呪いたい。俺に才能をクレ。
136:135
14/02/11 06:14:18.91
あーすまん。
グダグダ言ってしまったが、歯ごたえのあるイイ問題だった。
半分くらいは自分のせいだが、いやーすごかった。
137:デフォルトの名無しさん
14/02/11 10:38:18.77
>> 129 Python
def f129(table, words, SP = "*"):
result = dict((word, []) for word in words)
h, w = len(table), max(len(x) for x in table)
table = [x.ljust(w) for x in table]
def f129s(table, down=0, right=1):
if down:
if right < 0: table = [SP*i + table[i] + SP*(w-1-i) for i in range(w)]
elif right > 0: table = [SP*(w-1-i) + table[i] + SP*i for i in range(w)]
table = ["".join(table[i][j] for i in range(len(table))) for j in range(len(table[0]))]
for word in words:
rev_word = "".join(reversed(word))
for i in range(len(table)):
for (wd, inv, ofs) in [(word, 1, 0), (rev_word, -1, len(rev_word)-1)]:
if wd in table[i]:
row, col = i, table[i].find(wd) - inv*ofs
if down:
row += col*right
if right > 0: row -= w-1
row, col = col, row
result[word].append(((row+1, col+1), (row+inv*down*len(wd), col+inv*right*len(wd)),(inv*down, inv*right)))
for (down, right) in ((0,1), (1,0), (1,1), (1,-1)):
f129s(table, down, right)
for k in words:
print k, result[k]
table = ['WVERTICALL', 'ROOAFFLSAB', 'ACRILIATOA', 'NDODKONWDC', 'DRKESOODDK', 'OEEPZEGLIW', 'MSIIHOAERA', 'ALRKRRIRER', 'KODIDEDRCD', 'HELWSLEUTH']
words = ['WEEK', 'FIND', 'RANDOM', 'SLEUTH', 'BACKWARD', 'VERTICAL', 'DIAGONAL', 'WIKIPEDIA', 'HORIZONTAL', 'WORDSEARCH']
f129(table, words)
138:デフォルトの名無しさん
14/02/11 10:46:44.75
>>137 の出力(>>129 安価ミスったw)
WEEK []
FIND [((2, 5), (5, 8), (1, 1))]
RANDOM [((2, 1), (7, 0), (1, 0))]
SLEUTH [((10, 5), (9, 10), (0, 1))]
BACKWARD [((2, 10), (9, 9), (1, 0))]
VERTICAL [((1, 2), (0, 9), (0, 1))]
DIAGONAL [((9, 7), (0, 6), (-1, 0))]
WIKIPEDIA [((10, 4), (0, 3), (-1, 0))]
HORIZONTAL [((10, 1), (-1, 10), (-1, 1))]
WORDSEARCH [((1, 1), (10, 10), (1, 1))]
((開始位置), (終了位置), (探索方向)) のリストになってます
139:133
14/02/11 12:14:00.95
>>135
方向ごとに関数書くとかゴリ押しすぎるだろwww
……ま、移動方向の差分が各方向に-1~1で済むというアイデアは、
皆どこかで拾ったか昔思いついたんだろうね
140:デフォルトの名無しさん
14/02/11 18:19:25.64
>>137 ruby 1.8.6
def ddup(o)
Marshal.load(Marshal.dump(o))
end
def f129(table, words)
css = table.map {|s| s.scan(/./)}
trioss = (0...css.size).inject([]) {|trioss, i| trioss << (0...css[i].size).inject([]){|trios, j| trios << [i, j, css[i][j]]}}
naname = Array.new(trioss.size + trioss[0].size - 1) {|i| []}
tmp, a, b = trioss.dup, ddup(naname), ddup(naname)
while !tmp.empty?
trios = tmp.pop
i = trios.size - 1 - tmp.size
trios.each_index{|j| a[i + j] << trios[j]; b[i + j] << trios[trios.size - 1 - j]}
end
lines = trioss + trioss.transpose + a + b # 横、縦、斜め、逆斜め
lines = lines + lines.map {|trios| trios.reverse} # 逆方向
tails = words.inject({}) {|h, w| h[w] = w.scan(/./).size - 1; h}
lines.each {|trios|
s = trios.map{|trio| trio.last}.join
words.each{|w|
i = s.index(w)
puts w + ' ' + trios[i].inspect + '..' + trios[i + tails[w]].inspect if i
}
}
end
table = %w(WVERTICALL ROOAFFLSAB ACRILIATOA NDODKONWDC DRKESOODDK OEEPZEGLIW MSIIHOAERA ALRKRRIRER KODIDEDRCD HELWSLEUTH)
words = %w(WEEK FIND RANDOM SLEUTH BACKWARD VERTICAL DIAGONAL WIKIPEDIA HORIZONTAL WORDSEARCH)
f129(table, words)
141:デフォルトの名無しさん
14/02/11 18:19:57.74
>>140
↓
VERTICAL [0, 1, "V"]..[0, 8, "L"]
SLEUTH [9, 4, "S"]..[9, 9, "H"]
RANDOM [1, 0, "R"]..[6, 0, "M"]
BACKWARD [1, 9, "B"]..[8, 9, "D"]
HORIZONTAL [9, 0, "H"]..[0, 9, "L"]
WIKIPEDIA [9, 3, "W"]..[1, 3, "A"]
DIAGONAL [8, 6, "D"]..[1, 6, "L"]
WORDSEARCH [0, 0, "W"]..[9, 9, "H"]
FIND [1, 4, "F"]..[4, 7, "D"]
142:デフォルトの名無しさん
14/02/11 18:22:19.50
>>140のリンク先はタイプミス。>>129が正解。
143:デフォルトの名無しさん
14/02/11 19:27:28.93
>>139
勘違いして別の問題のコード書いてた設計そのまま使ったので結果的に損した感じ。
初見の選定眼って大事!Orz
144:デフォルトの名無しさん
14/02/11 19:50:50.70
>>129 HSP
#module
#defcfunc is_match array field, int x, int y, int c
if y<0 or y>=length(field) : return 0
if x<0 or x>=strlen(field.y) : return 0
return peek(field.y, x)=c
#deffunc f129 array field, var word, local found_count
vx= 1, 1, 0,-1,-1,-1, 0, 1
vy= 0,-1,-1,-1, 0, 1, 1, 1
for sy, 0, length(field)
for sx, 0, strlen(field.cnt)
for d, 0, 8
is_found=1
x=sx : y=sy
repeat strlen(word)
if is_match(field, x, y, peek(word, cnt))=0 : is_found=0 : break
x+=vx.d : y+=vy.d
loop
if is_found : mes strf("%s %d,%d", word, sx+1, sy+1) : found_count++
next
next
next
if found_count=0 : mes strf("%s not found.", word)
return
#global
field="WVERTICALL","ROOAFFLSAB","ACRILIATOA","NDODKONWDC","DRKESOODDK","OEEPZEGLIW","MSIIHOAERA","ALRKRRIRER","KODIDEDRCD","HELWSLEUTH"
words="WEEK","FIND","RANDOM","SLEUTH","BACKWARD","VERTICAL","DIAGONAL","WIKIPEDIA","HORIZONTAL","WORDSEARCH"
foreach words
f129 field, words.cnt
loop
145:デフォルトの名無しさん
14/02/11 19:52:18.90
>>144 訂正
for sx, 0, strlen(field.cnt)
↓
for sx, 0, strlen(field.sy)
146:デフォルトの名無しさん
14/02/11 21:23:26.33
>>129 Perl
URLリンク(ideone.com)
147:135
14/02/12 05:09:52.50
>>129
URLリンク(ideone.com)
ほぼC。>>132を勝手にいただいて書きなおした。
1/3になったんで>>135の時は相当おかしなこと考えてたんだな。
マダマダ修行が足りない。Orz
148:デフォルトの名無しさん
14/02/12 17:31:15.91
お題:
長方形状の盤面が与えられますので、その中に畳を敷いて下さい。
ただし、畳の縁が盤面を突っ切ってはいけません。
例:
5x6の場合、この盤面は矢印で示した2箇所がNG。
┌┬┬─┬┬┐
││├┬┤││
├┴┤│├┴┤
├┬┴┼┼─┤←
│├─┤├─┤
└┴─┴┴─┘
↑
一方、この盤面は突っ切りがないのでOK。
┌─┬┬─┬┐
├┬┤├─┤│
││├┴┬┼┤
├┼┴┬┤││
│├─┤├┴┤
└┴─┴┴─┘
入出力の形式:
自由です。標準入出力でもファイルでもソースに直書きでも構いません。
ヒント:
対称盤面を除かずにカウントした場合、条件に当てはまる盤面数は次の通り。
5x6→6個
5x8→108個
6x6→0個
6x7→124個
149:デフォルトの名無しさん
14/02/12 19:55:50.60
>>148
再帰関数で解こうと思ったがうまく敷き詰めるのもできないなー。
リファレンス求む。
150:デフォルトの名無しさん
14/02/12 20:16:40.40
>>149
リファレンス……模範解答ってことか?
参考になるかは分からんが、昔Cで書いたのがこんな感じ。
(stdin部分をコメントアウトしている)
URLリンク(codepad.org)
151:148
14/02/12 20:18:21.03
あ、ID出ないから分かりづらいけど>>150は私です
152:デフォルトの名無しさん
14/02/12 21:08:00.99
>>150-151
あら、ちゃんと出来てるなー。
俺は謎のバグが取れなくて泣いてるよ。なぜだーーー。
あと、どういうのが正常系の配列なのかの定義がよくわからん。
153:148
14/02/12 21:30:39.85
>>152
「突っ切る」イメージは>>148以上に説明しようがないのが辛いところです
(要するに、全ての縦/横の筋に対して、1枚でも畳が横切っていればOKということ)
どう実装するかは頭を捻ってもらうしか……
154:149
14/02/12 21:40:03.46
Ideonの調子が悪い。
正直、ギブアップなので、コード晒そうと思ったんだが。。。
これでは収まりが付かないので移植してみるか。
万が一うまく言ったらアップする。
155:デフォルトの名無しさん
14/02/12 21:46:33.21
>>152>>153
「盤の辺と同じ長さの直線が四辺以外に生じてはならない」とか、
「盤面を分断する直線はNG」とか、そういうことだと思う。
>>148の図を元にNGとされる直線を太線で示すとこうかな。
┌┬┬─┰┬┐
││├┬┨││
├┴┤│┠┴┤
┝┯┷┿╋━┥
│├─┤┠─┤
└┴─┴┸─┘
156:デフォルトの名無しさん
14/02/12 22:35:03.25
>>148 HSP
URLリンク(codepad.org)
157:148
14/02/12 22:43:27.54
>>156
乙。HSPってこんなに重かったっけ……?
概説してくれると嬉しいかなって
158:156
14/02/12 23:00:09.39
>>157
HSP が遅いってのも少しはあるけど
アルゴリズムが悪いだけ
再帰呼び出しで畳をすべて敷き詰めてみてから
分断する線がないかどうかチェックしてる
縦方向に分断する線について考えるとき
横幅 6 なら 5本 の可能性がある
畳を横向きに置いたとき
対応する縦線に対応するカウンタを増やす
最終的にカウンタが 0 の線があれば
分断されていると判断できる
横方向に分断する線についても同様に考える
カウンタを増やす理由は
1、0 だけでやると元に戻すときに変更前の値を保存しておかないといけないから
面倒くさいという理由
>>156 では畳に1~ の番号を振って
カウンタも畳の番号と同じものを増減させてる
159:デフォルトの名無しさん
14/02/12 23:11:09.06
>>157
URLリンク(ideone.com)
ベターCに移植してみた。設計いいから簡単だった。変換がちょっとややこしいけど。
移植してみた感想?うーん。わからん!利点は、グローバル変数が消えました。位・・・。Orz
チャック関数が何やってるのかサッパリわからん。
うーん。脱力。
URLリンク(ideone.com)
上のようなコードを移植前に書いていたがダサすぎる。
俺に才能をクレ。Orz
160:148
14/02/12 23:18:35.82
>>158
あー、私が書いたコードの場合はちゃんと枝刈りするから速いんでしょうね……
(明らかにこれは駄目だ、と判定されたら次の畳を置かない)
>>159
check関数では、「明らかに駄目」な盤面ならfalse(0)を返すようにしています
盤面データは、「0なら置かれていない、1以上(畳の番号)なら置かれている」として、
水平・垂直方向にそれぞれ走査してチェックしています。……まあ要するに、
「筋の両側のペアを見て、もし筋の両側が完全には埋まっていなかったり、
筋を跨ぐ方向に畳が存在した場合はチェックをパスする(駄目扱いしない)」
ってことなんですけどね
161:デフォルトの名無しさん
14/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)
162:デフォルトの名無しさん
14/02/12 23:48:08.06
>>161 の出力(>>148また安価ミスったww)
<result> 124
(1)
↓↓→←↓→←
↑↑→←↑↓↓
↓→←→←↑↑
↑→←↓→←↓
→←↓↑→←↑
→←↑→←→←
(1)
↓→←→←→←
↑→←→←↓↓
→←→←↓↑↑
↓→←↓↑→←
↑→←↑→←↓
→←→←→←↑
(1)
↓→←→←→←
↑→←↓→←↓
→←↓↑→←↑
→←↑→←↓↓
↓↓→←↓↑↑
↑↑→←↑→←
163:159
14/02/13 00:07:43.00
>>160
解説ありがとう。参考にします。
164:156
14/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++
}
165: ◆QZaw55cn4c
14/02/13 02:12:09.61
>>114
>trueと比較するのは個人的な流儀なのでこれは曲げれん。
記述性/可読性に関する個人的な見解に異論を挟むつもりはまったくないのだけれども、
こと、C/C++ に関しては true/false との比較では、単に可読性の問題ではすまないと考えているので、 >>113 が教条主義とはどうしても思えない。
歴史的事情なのかどうかは定かではないが、C/C++ では「true/false」は「非零/零」の対立に対応するので(isalpha() とかね)、
「== true」は、それをみただけで、「まずい」、と感じるセンスが必要なのかもしれないかと。
でも、最近、お題についていけないかわいそうな状態の私がこれ以上の意見を述べるのは、ここではちと身の程知らず
なにかお題を解いたら、これについてちょっと説明を考えてみますね、最近のお題は結構むずかしいなあ‥‥
166:デフォルトの名無しさん
14/02/13 10:17:51.75
で、クズが書いたプログラムは?
167: ◆QZaw55cn4c
14/02/13 12:39:57.51
>>166
このスレでは >>75 のみ
168:デフォルトの名無しさん
14/02/13 13:38:15.34
Qはもう棺桶に片足突っ込んでるな
169:デフォルトの名無しさん
14/02/13 14:23:52.85
system("ls -l ./prog");
170:デフォルトの名無しさん
14/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
171:デフォルトの名無しさん
14/02/13 18:31:06.45
>>166-167
もうクズ呼びでもいいやとでも思っているのだろうか……>QZ
172:デフォルトの名無しさん
14/02/13 20:24:19.46
>>171
ム板のコテは自虐入ってるくせに非難されてもメゲないという地味にウザい性格の奴が多いようで
173:デフォルトの名無しさん
14/02/13 21:07:45.02
>>170
この問題いいの?
某所からのパクりじゃない?
174:デフォルトの名無しさん
14/02/13 21:17:35.87
>>170
URLリンク(ideone.com)
保険にちょっと大げさに警告文書いておいた。訴訟もじさないなら流用してミソ。
>>173ソースプリーズ。
畳に比べたら簡単。ほぼC。
175:デフォルトの名無しさん
14/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)
176:デフォルトの名無しさん
14/02/13 22:13:46.50
このスレは解答例無しでもOKになったの?
177:デフォルトの名無しさん
14/02/13 22:15:03.21
>>176
回答者の気まぐれによる。
あった方がいい。
178:デフォルトの名無しさん
14/02/13 22:24:39.56
無いほうがいい
179:174
14/02/13 22:30:07.38
一応出題者が一回解いてる前提で俺は回答している。
180:デフォルトの名無しさん
14/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]
181:デフォルトの名無しさん
14/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)} "
182:デフォルトの名無しさん
14/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]
183:デフォルトの名無しさん
14/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
184:174
14/02/14 18:06:37.53
俺がろくでもないこと書いたばかりに。うっ・・・うっ。っていうのは置いといて。
みんな、どうやって既約判定してるのか全然読めない俺の頭が恨めしい。
>>173が逃げたのでブラフは一応気にしなくていいよ。このスレ内ではね。
185:デフォルトの名無しさん
14/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)
186:174
14/02/14 19:17:38.74
使ってくれてありがと。
いやー、ほんとユーグリッドの互除法無しでどうやって既約判定してるのか全然読めんわ。
なんか他アルゴリズムあるんだろうけど、俺にはわからないなー。Orz
ほんっと、数学ダメなんだよね。
187:デフォルトの名無しさん
14/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
188:デフォルトの名無しさん
14/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)
189:174
14/02/14 19:56:33.38
うむ。ちと気持ち悪かったか。
ホント、何もしないって。
190:185
14/02/14 20:02:58.28
ごめん
何言ってるのか分からんかったが >>174 みてきたら分かったw
191:174
14/02/14 20:15:28.50
あー、そういうことなら良かった。杞憂でした。
たまたま被ったのか。そーりー。
これでしばらく黙ります。しーゆー。
192:174
14/02/14 20:22:59.01
最後に一言。
慣れないことはするもんじゃないね。トホホ・・・。Orz
193:175
14/02/14 20:49:00.82
>>184
>>175ですが、既約分数の判定は(陽には)していません。Common Lispでは除算
の結果が整数で表せない場合、分数が返されますが、それらは既に約分されて
います(他の分数を扱える言語やライブラリでもそうなんじゃないかな)。
(/ 2 4) ;=> 1/2
;; リテラルでも
2/4 ;=> 1/2
なので、分子(n)と分母(d)を列挙してそれらを除算(/ n d)した数のリストをま
ず作り、そこから重複要素を取除くことで目的の結果を得ています。
194:デフォルトの名無しさん
14/02/14 21:16:33.96
>>170の元ネタはこれかな。こっちは 0以上1以下 で、ソートは要件に入ってない。
結城浩の日記 - 2003年12月30日 (火) - 既約分数
URLリンク(www.hyuki.com)
Scheme:数遊び:既約分数
URLリンク(practical-scheme.net)
上記問題に対するSchemeによる回答。
「Haskellによるエレガントな解法」へのリンクがあったらしいが404。一つだけInternet Archiveに残ってた。
URLリンク(web.archive.org)
195:184==174
14/02/14 21:42:05.70
黙るって言ったけど、返信する矛盾。
>>193
まず、反省なんだけど。
俺、既約って言うことについてWikipediaで読んだくらいの知識しか無いんだわ。
>>193読んでてそう言えば小学校で習ったかもと思い出した。俺、算数もできなくなってるよ。Orz
んで、やっぱり高級言語はそうでないとね。C系列はライブラリなさすぎなんだよなぁ。
解説ありがとう。色々納得いっていい勉強になりました。
アルゴリズムはこうか。
既約とは分数の約分がすでに終わっていることである。
分母分子の小さなものの答えが小さい方から貯めていって、
すでにあったらそれは分母分子が規約分数の倍数である。
なのでそれを取り除く。って感じか。
なるほど。前は違うこと考えて解いてたわ。(汗
>>170
URLリンク(ideone.com)
コードは思うところがあって共変しようと思って>>188を参考に書いてみた。
これで循環。キモいな俺。
>>194
ソースありがとう。
なんかのコンテストじゃなくてよかったよ。
196:デフォルトの名無しさん
14/02/14 22:11:46.50
>>195
std::map 使えばいいのにw
197:デフォルトの名無しさん
14/02/14 22:16:45.46
>>196
あ、やっぱ言われた。
書き終わって、あーこれエラトステネスの篩と同じ系統だ。
と理解して納得したまでが今日のハイライト。
まぁ、暇なので書いてみるよ。
198:デフォルトの名無しさん
14/02/14 22:39:33.52
>>170,196
URLリンク(ideone.com)
書いたよ。アルゴリズムの理解が済んでると早いね。ただ合ってるかしらんけど。
ソートはMapが勝手にやってくれるので手でやる必要がない。
それくらいかな。
199:デフォルトの名無しさん
14/02/15 11:41:05.83
>>170 Perl
URLリンク(ideone.com)
200:デフォルトの名無しさん
14/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
201:デフォルトの名無しさん
14/02/16 10:59:32.12
お題:乗算の筆算
入力:2つの正整数
出力:筆算の計算過程(例:URLリンク(codepad.org))
202:デフォルトの名無しさん
14/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
203:デフォルトの名無しさん
14/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;
}