プログラミングのお題スレ

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2014/01/21(火) 04:08:25.70
953デフォルトの名無しさん:2014/01/21(火) 12:34:45.69
>>940 Squeak Smalltalk
| gridIntersecs gridIntersecsInCircle |
gridIntersecs := Generator on: [:g |
  | pen |
  g yield: ((pen := Pen new) up; place: 0@0; location).
  1 to: Float infinity do: [:n |
    2 timesRepeat: [pen turn: 90. n timesRepeat: [g yield: (pen go: 1; location) rounded]]]].
(gridIntersecs next: 12) asArray.
"=> {0@0 . 1@0 . 1@1 . 0@1 . -1@1 . -1@0 . -1@ -1 . 0@ -1 . 1@ -1 . 2@ -1 . 2@0 . 2@1} "

gridIntersecsInCircle := [:radius |
  | intersecs |
  intersecs := gridIntersecs copy reset.
  Generator on: [:g |
    [intersecs peek abs <= radius asPoint] whileTrue: [
      intersecs next in: [:next | next r <= radius ifTrue: [g yield: next]]]]].
(gridIntersecsInCircle value: 2) contents
"=> {0@0 . 1@0 . 1@1 . 0@1 . -1@1 . -1@0 . -1@ -1 . 0@ -1 . 1@ -1 . 2@0 . 0@2 . -2@0 . 0@ -2} "
954デフォルトの名無しさん:2014/01/21(火) 13:03:34.67
955デフォルトの名無しさん:2014/01/21(火) 19:09:07.91
お題:自然数nの階乗の素因数2の個数を求める。(2014年センター試験)
n=5 -> 3
n=13 -> 10
956デフォルトの名無しさん:2014/01/21(火) 19:44:42.33
>>955
; Common Lisp
(defun f955 (n)
 (loop for i from 1 to n
    sum (loop for j = (/ i 2) then (/ j 2)
         while (integerp j)
         count t)))
957デフォルトの名無しさん:2014/01/21(火) 20:11:41.40
>>955 Squeak Smalltalk
| factorTwosInFactorialOf |
factorTwosInFactorialOf := [:n |
  (2 to: n) inject: 0 into: [:acc :m |
    [m isDivisibleBy: 2] whileTrue: [acc := acc + 1. m := m // 2].
    acc
  ]
].

factorTwosInFactorialOf value: 5. "=> 3 "
factorTwosInFactorialOf value: 13. "=> 10 "
958デフォルトの名無しさん:2014/01/21(火) 20:24:36.67
>>955 ruby 1.8.6
def f955(n)
def f(m, d, c = 0) m % d != 0 ? c : f(m / d, d, c + 1) end
(1..n).inject(0) {|sum, i| sum += f(i, 2)}
end
p f955(5)
p f955(13)

3
10
959デフォルトの名無しさん:2014/01/21(火) 21:30:12.29
>>955 PARI/GP
f(n)=factor(n!)[1,2]

? f(5)
%2 = 3
? f(13)
%3 = 10
? f(1000)
%4 = 994
960デフォルトの名無しさん:2014/01/21(火) 22:01:02.73
>>955 Haskell
import Data.Function

f955 :: Integer -> Integer
f955 n = foldr ((+) . fix (\f k -> if odd k then 0 else f (div k 2) + 1)) 0 [2,4..n]

main = print $ map f955 [1,2,3,4,5,13,1000] -- > [0,1,1,3,3,10,994]
961デフォルトの名無しさん:2014/01/21(火) 22:09:17.93
>>955 HSP
#module
#defcfunc f955 int x, local y, local r
y=x
while y
y/=2
r+=y
wend
return r
#global

list=1,2,3,4,5,13,1000
foreach list
mes f955(list.cnt)
loop
962デフォルトの名無しさん:2014/01/21(火) 23:18:23.12
>>961
すごい。whileループひとつでできちゃうのか。
963デフォルトの名無しさん:2014/01/21(火) 23:30:34.91
>>955 C

#include <stdio.h>
void f(int n){
printf("%d\n", n - __popcountsi2(n));
}
int main(){
f(5);
f(13);
f(1000);
return 0;
}


3
10
994
964デフォルトの名無しさん:2014/01/22(水) 00:59:03.22
>>955 Perl
use 5.016;
use warnings;

sub f { length join('', map{ (sprintf("%b", $_) =~ m/(0*)$/)[0] } (2 .. shift)) }

say f(5);
say f(13);
say f(1000);
965デフォルトの名無しさん:2014/01/22(水) 01:52:24.57
>>955 Io
f:=method(n,n-n asBinary asNumber%9)

Io> f(5)
==> 3
Io> f(13)
==> 10
Io> f(1000)
==> 994
966デフォルトの名無しさん:2014/01/22(水) 04:07:51.86
>>955 with Python

N= 5; import sympy as ts; ts.factorint(ts.factorial(N))[2]
===============================
3

N=13; import sympy as ts; ts.factorint(ts.factorial(N))[2]
===============================
10
967 ◆QZaw55cn4c :2014/01/22(水) 04:23:26.70
>>963
__popcountsi2 ...
968デフォルトの名無しさん:2014/01/22(水) 07:38:47.57
C++いつも書いてるものだが、数学はサッパリだ。Orz
お前らが羨ましいぜ。
969デフォルトの名無しさん:2014/01/22(水) 13:32:57.36
死ねゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミゴミwwwww
970デフォルトの名無しさん:2014/01/22(水) 15:12:30.99
お題:行編集のまねごと。
最初はカーソルのみの状態で文字をカーソルの前に挿入する。
'['でカーソルを前へ、']'で後ろに移動する。

"abc[-[[/" -> "a/b-c"
"a[b[c]]d" -> "cbad"
971デフォルトの名無しさん:2014/01/22(水) 15:58:11.89
>>970 HSP
#module
#define global ctype f970(%1="", %2="", %3=0) f970_(%1,%2,%3)
#define ctype max(%1,%2) (((%1)-(%2))*((%1)>(%2))+(%2))
#define ctype min(%1,%2) (((%1)-(%2))*((%1)<(%2))+(%2))
#defcfunc f970_ str cmd_, str s_, int p_, local cmd, local s, local p, local l, local t
s=s_
cmd=cmd_
l=strlen(s)
p=max(min(p_, l), 0)
repeat strlen(cmd)
c=peek(cmd, cnt)
switch c
case '['
p=max(p-1, 0)
swbreak
case ']'
p=min(p+1, l)
swbreak
default
s=strf("%s%c%s", strmid(s, 0, p), c, strmid(s, p, l-p))
p++
l++
swbreak
swend
loop
mref t, 64 : t=p
return s
#global

mes f970("abc[-[[/")
mes f970("a[b[c]]d")
972デフォルトの名無しさん:2014/01/22(水) 17:27:27.61
973デフォルトの名無しさん:2014/01/22(水) 17:28:08.80
>>970 ruby 1.8.6
def f970(s)
l, r = [], []
s.scan(/./).each {|c|
case c
when '['
r.unshift l.pop if !l.empty?
when ']'
l.push r.shift if !r.empty?
else
l << c
end
}
[l, r].join
end
p f970("abc[-[[/")
p f970("a[b[c]]d")

"a/b-c"
"cbad"

>>955 ruby 1.8.6 mathn使用
require 'mathn'
def f955(n)
n == 1 ? 0 : (2..n).inject(1) {|r, i| r * i}.prime_division[0][1]
end
p [1,2,3,4,5,13,1000].map {|n| f955(n)}

[0, 1, 1, 3, 3, 10, 994]
974デフォルトの名無しさん:2014/01/22(水) 18:21:38.24
>>970 Squeak Smalltalk
| lineEdit |
lineEdit := [:str |
  | cursor |
  cursor := 0.
  (str inject: OrderedCollection new into: [:coln :chr |
    chr caseOf: {
      [$[]->[cursor := cursor - 1].
      [$]]->[cursor := cursor + 1]
    } otherwise: [coln add: chr afterIndex: cursor. cursor := cursor + 1].
  coln]) as: String
].

lineEdit value: 'abc[-[[/'. "=> 'a/b-c' "
lineEdit value: 'a[b[c]]d'. "=> 'cbad' "
975デフォルトの名無しさん:2014/01/22(水) 18:28:54.77
>>947 HSP
#module
#defcfunc f947 double x
if x<0.0 : return "-"+f947_int(strf("%.10f", -x))
return f947_int(strf("%.10f", x))

#defcfunc f947_int str s_, local s, local l, local r, local p
s=s_
l="" : r=""
p=instr(s, 0, ".")
l=strmid(s, 0, p)
r=strmid(s, p+1, strlen(s))
remove_tail_zero(r)
repeat strlen(r)-1
if peek(r, 0)!'0' : break
r=strmid(r, 1, strlen(r))
loop
remove_tail_zero(l)
return strf("%s.%s", r, l)

#deffunc remove_tail_zero var s, local i
for i, strlen(s)-1, 0, -1
if peek(s, i)!'0' : _break
poke s, i, 0
next
return
#global

mes f947(1.23)
mes f947(20.24)
mes f947(2.24)
mes f947(-0.01)
976デフォルトの名無しさん:2014/01/22(水) 19:33:55.08
977デフォルトの名無しさん:2014/01/22(水) 19:51:23.60
978デフォルトの名無しさん:2014/01/22(水) 20:44:23.92
>>970
ttp://ideone.com/xEfyeD
なんとかできたかな。
自分がゴミなのはわかってるけど、数学できなくてもコードは書ける証明。ってことで。
979デフォルトの名無しさん:2014/01/22(水) 21:13:18.97
>>970 Python
def f970(ss):
  i = 0
  xx = ""
  sft = {"[":-1,"]":1}
  for c in ss:
    if c in sft.keys():
      i += sft[c]
    else:
      xx = xx[:i] + c + xx[i:]
      i += 1
  return xx

for ss in ["abc[-[[/", "a[b[c]]d", "abcd[[@]]@efg"]:
  print "%s -> %s" % (ss, f970(ss))
980デフォルトの名無しさん:2014/01/22(水) 21:33:39.81
>>979 Io
Range
f method(s,
r := list
p := 0
a := 0 to(s size - 1) map(v, s at(v) asCharacter)
a foreach(c,
if(c == "[",
p = 0 max(p - 1)
,
if(c == "]", p = r size min(p + 1), r insertAt(c, p); p = p + 1)
)
)
r join
)

Io> f("abc[-[[/")
==> a/b-c
Io> f("a[b[c]]d")
==> cbad
981デフォルトの名無しさん:2014/01/22(水) 21:49:37.79
>>979
forの中で、iの範囲を制限するのが抜けてました。(_ _)
i = min(max(0,i),len(xx))
982デフォルトの名無しさん:2014/01/22(水) 21:56:23.44
>>978 の エラー制御板。
デバッガで開発してるのでエラーで吹き飛ぶのはあんまり考慮してません。開発中は止まったほうが有難いですし。
#include <iostream>
#include <string>
#include <algorithm>
std::string EditLine(std::string Command){
std::string ret;
int Cur = 0;
for (std::size_t i = 0; i < Command.size(); i++){
if (Command[i] == '['){
if (Cur > 0) Cur--;
continue;
}
if (Command[i] == ']'){
if (Cur <= ret.size()) Cur++;
continue;
} auto ins = std::inserter(ret, ret.begin() + (Cur++));
ins = Command[i];
} return ret;
} int main(){
std::string str = "abc[-[[/";
std::string str2 = "a[b[c]]d";
std::string R;
R = EditLine(str);
std::cout << str << " -> " << R << std::endl;
R = EditLine(str2);
std::cout << str2<< " -> " << R << std::endl;
return 0;
}
983デフォルトの名無しさん:2014/01/22(水) 22:27:27.43
>>973
def f970 s
  s.chars.inject [[],[]] do | ( l , r ) , c |
    case c
    when '['
      r.unshift l.pop if !l.empty?
    when ']'
      l.push r.shift if !r.empty?
    else
      l << c
    end
    [ l , r ]
  end.join
end
p f970("abc[-[[/")
p f970("a[b[c]]d")
984デフォルトの名無しさん:2014/01/22(水) 23:34:08.87
>>955 J
f =: - +/@#:

f 5
3
f 13
10
f 1000
994
985デフォルトの名無しさん:2014/01/23(木) 00:45:31.69
>>984
これ、- は何しているんですか?
986デフォルトの名無しさん:2014/01/23(木) 01:41:29.62
えーと。説明へただしなあ。本当にJ言語に興味があるなら基本知識は
自分で調べてください。
「-」自体は二項演算子の減算です。
f =: - +/@#:
は、引数をyで表す書き方をすると
f =:3 :'y - +/@#: y'
>>963
n - __popcountsi2(n)
に相当します。
987デフォルトの名無しさん:2014/01/23(木) 10:37:47.55
なるほど。分かりました。ありがとうございます。
988930:2014/01/23(木) 11:47:47.40
>>955 Prolog

'自然数nの階乗の素因数2の個数を求める。(2014年センター試験)'(_n,_自然数nの階乗の素因数2の個数) :-
    findsum(_ある自然数の素因数2の個数,(
          between(1,_n,_ある自然数),
          ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数)),
        _自然数nの階乗の素因数2の個数).

ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数) :-
    nth0(_ある自然数の素因数2の個数,_,_),
    \+(0 is _ある自然数 mod (2 ^ (_ある自然数の素因数2の個数 + 1))),!.

findsum(_選択項,_副目標,_合計) :-
    findall(_選択項,_副目標,_選択項ならび),
    sumlist(_選択項ならび,_合計).
989デフォルトの名無しさん:2014/01/23(木) 20:12:46.12
>>970 J
L=:3 : 0
if. 0<#a do.
b=:({:a),b
a=:}:a
end.
)
R=:3 : 0
if. 0<#b do.
a=:a,{.b
b=:;}.b
end.
)
A=:3 : 'a=:a,y'
f=:3 : 0
L`R`A @.('[]'&i.)"0 y
a,b
)

f'a[b[c]]d' [ a=:b=:''
cbad
f'abc[-[[/' [ a=:b=:''
a/b-c
990デフォルトの名無しさん:2014/01/23(木) 22:06:04.88
お題:円周率の歴史の長さからみれば出来立てほやほやのBBPの式を使って
円周率を小数点以下15桁まで求める。
  ∞
π=Σ(4/(8*k+1)-1/(4*k+2)-1/(8*k+5)-1/(8*k+6))/(16^k)
  k=0
991デフォルトの名無しさん:2014/01/23(木) 23:20:12.36
>>990 Squeak Smalltalk
| pi k epsilon delta |
pi := k := 0.
epsilon := 1/1e15.
[ delta := (4/(8*k+1))-(1/(4*k+2))-(1/(8*k+5))-(1/(8*k+6))/(16 raisedTo: k).
  k := k + 1.
  pi := pi + delta.
  delta > epsilon] whileTrue.
pi asScaledDecimal: 15 "=> 3.141592653589793s15 "
992デフォルトの名無しさん:2014/01/24(金) 03:22:22.23
次のスレ立ててくれ
993デフォルトの名無しさん:2014/01/24(金) 04:15:00.66
>>990
http://ideone.com/gIeEAT
数学できない俺にもできて嬉しい。<3
994デフォルトの名無しさん:2014/01/24(金) 10:00:10.62
次スレ
プログラミングのお題スレ Part3
http://toro.2ch.net/test/read.cgi/tech/1390525149/
995デフォルトの名無しさん:2014/01/24(金) 12:16:38.83
>>990 Perl
use 5.016;
use warnings;
use bignum;

sub imp {
(4 / (8 * $_[0] + 1) - 1 / (4 * $_[0] + 2) - 1 /
(8 * $_[0] + 5) - 1 / ( 8 * $_[0] + 6)) / (16 ** $_[0])
}

sub f {
sub {
$_[2] < 1.0e-15 ?
$_[1] :
__SUB__->($_[0] + 1, $_[1] + $_[2], imp($_[0] + 1))
}->(0, 0, imp(0))->ffround(-15)
}

say f();
996デフォルトの名無しさん:2014/01/24(金) 18:01:52.94
>>990 Io
r:=0
for(k,0,10,r=r+(4/(8*k+1)-1/(4*k+2)-1/(8*k+5)-1/(8*k+6))/(16**k))asString(0,15)
==> 3.141592653589793
997デフォルトの名無しさん:2014/01/24(金) 19:54:42.06
>>990 Haskell
pi' :: (Enum a, RealFrac a) => a
pi' = sum $ takeWhile (1/1e15 <) [(4/(8*k+1) - 1/(4*k+2) - 1/(8*k+5) - 1/(8*k+6))/(16^floor k) | k <- [0..]]

main = print pi' -- 3.141592653589793
998デフォルトの名無しさん:2014/01/25(土) 08:48:55.06
>>990 Lua
r=0
k=0
repeat
a=(4/(8*k+1)-1/(4*k+2)-1/(8*k+5)-1/(8*k+6))/(16^k)
r=r+a
k=k+1
until a<1e-15
print(("%.15f"):format(r))


3.141592653589793
999デフォルトの名無しさん:2014/01/25(土) 09:53:41.21
>>955 SWI-Prolog
?- N is 13,X is N - popcount(N).
N = 13,
X = 10.
1000デフォルトの名無しさん:2014/01/25(土) 14:25:16.59
うんこ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。