切符の数字で10を作れ

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
誰でも子どものころやったことがあるだろう。
切符に印字された4桁の数字。
4つの数字と四則演算を使って10を作るという遊び。

あれをいかにCOOLな方法で実装するかを競うのがこのスレの遊び。
4桁の数字の入力を受けて10が作れるか検討するプログラムもよし。
全件のリストをはきだすもよし。

言語は問わない。
lispでさくっと実装するもよし。
COBOLやBASICで実装するもよし。
2σ・∀・)σゲッツ!!
lispだとサクっと作れるの?
糞スレ
つーか、レスすんなよ
6JavaScript:03/05/15 21:04
<html>
<head>
<title>
kippu no suuji de 10 wo tsukuru script
</title>
</head>
<body>
<script language = "JavaScript">

<!--

document.numbers.hyouji.value = "";

function k(a1,op,a2){ //keisan suru kansuu
if(op == 0) {return parseFloat(a1)+parseFloat(a2);}
if(op == 1) {return parseFloat(a1)-parseFloat(a2);}
if(op == 2) {return parseFloat(a1)*parseFloat(a2);}
if(op == 3 && a2 != 0) {return parseFloat(a1)/parseFloat(a2);}
return "err";
}

function check(a0, a1, a2, a3) {
opst = new Array();
opst[0] = "+";
opst[1] = "-";
opst[2] = "*";
opst[3] = "/";

for (o0 = 0; o0 < 4; o0++){
for(o1 = 0; o1 < 4; o1++){
7JavaScript:03/05/15 21:05
for(o2 = 0; o2 < 4; o2++){
// ((a0 o0 a1) o1 a2) o2 a3
result = k(k(k(a0,o0,a1),o1,a2),o2,a3);
if(9.99 <= result && result <= 10.01){
document.numbers.hyouji.value = document.numbers.hyouji.value+
"(("+a0+opst[o0]+a1+")"+opst[o1]+a2+")"+opst[o2]+a3+"="+result+"\n";
}

// (a0 o0 (a1 o1 a2) o2 a3
result = k(k(a0, o0, k(a1, o1, a2)), o2, a3);
if(9.99 <= result && result <= 10.01){
document.numbers.hyouji.value = document.numbers.hyouji.value+
"("+a0+opst[o0]+"("+a1+opst[o1]+a2+"))"+opst[o2]+a3+"="+result+"\n";
}

// (a0 o0 a1) o1 (a2 o2 a3)
result = k(k(a0, o0, a1), o1, k(a2, o2, a3));
if(9.99 <= result && result <= 10.01){
document.numbers.hyouji.value = document.numbers.hyouji.value+
"("+a0+opst[o0]+a1+")"+opst[o1]+"("+a2+opst[o2]+a3+")"+"="+result+"\n";
}

// a0 o0 ((a1 o1 a2) o2 a3)
result = k(a0, o0, k(k(a1, o1, a2), o2, a3));
if(9.99 <= result && result <= 10.01){
document.numbers.hyouji.value = document.numbers.hyouji.value+
a0+opst[o0]+"(("+a1+opst[o1]+a2+")"+opst[o2]+a3+")"+"="+result+"\n";
}

// a0 o0 (a1 o1 (a2 o2 a3))
8JavaScript:03/05/15 21:05
result = k(a0, o0, k(a1, o1, k(a2, o2, a3)));
if(9.99 <= result && result <= 10.01){
document.numbers.hyouji.value = document.numbers.hyouji.value+
a0+opst[o0]+"("+a1+opst[o1]+"("+a2+opst[o2]+a3+"))"+"="+result+"\n";
}

}
}
}
}

function calcAndPrint() {
document.numbers.hyouji.value = "";

num1 = document.numbers.n1.options[document.numbers.n1.selectedIndex].value;
num2 = document.numbers.n2.options[document.numbers.n2.selectedIndex].value;
num3 = document.numbers.n3.options[document.numbers.n3.selectedIndex].value;
num4 = document.numbers.n4.options[document.numbers.n4.selectedIndex].value;

check(num1, num2, num3, num4);
check(num1, num2, num4, num3);
check(num1, num3, num2, num4);
check(num1, num3, num4, num2);
check(num1, num4, num2, num3);
check(num1, num4, num3, num2);

check(num2, num1, num3, num4);
check(num2, num1, num4, num3);
check(num2, num3, num1, num4);
check(num2, num3, num4, num1);
9JavaScript:03/05/15 21:06
check(num2, num4, num1, num3);
check(num2, num4, num3, num1);

check(num3, num1, num2, num4);
check(num3, num1, num4, num2);
check(num3, num2, num1, num4);
check(num3, num2, num4, num1);
check(num3, num4, num1, num2);
check(num3, num4, num2, num1);

check(num4, num1, num2, num3);
check(num4, num1, num3, num2);
check(num4, num2, num1, num3);
check(num4, num2, num3, num1);
check(num4, num3, num1, num2);
check(num4, num3, num2, num1);

}


//-->
</script>

<form name="numbers">
<select name="n1">
<option selected value = 0>0
<option value = 1>1
<option value = 2>2
<option value = 3>3
<option value = 4>4
10JavaScript:03/05/15 21:07
<option value = 5>5
<option value = 6>6
<option value = 7>7
<option value = 8>8
<option value = 9>9
</select>

<select name="n2">
<option selected value = 0>0
<option value = 1>1
<option value = 2>2
<option value = 3>3
<option value = 4>4
<option value = 5>5
<option value = 6>6
<option value = 7>7
<option value = 8>8
<option value = 9>9
</select>

<select name="n3">
<option selected value = 0>0
<option value = 1>1
<option value = 2>2
<option value = 3>3
<option value = 4>4
<option value = 5>5
<option value = 6>6
<option value = 7>7
<option value = 8>8
11JavaScript:03/05/15 21:07
<option value = 9>9
</select>

<select name="n4">
<option selected value = 0>0
<option value = 1>1
<option value = 2>2
<option value = 3>3
<option value = 4>4
<option value = 5>5
<option value = 6>6
<option value = 7>7
<option value = 8>8
<option value = 9>9
</select>

<input type="button" value = "計算" onClick = "calcAndPrint();">

<br>
<textarea name="hyouji" rows = 10 cols = 50 >
</textarea>

</form>
<br>

</body>
</html>

12JavaScript :03/05/15 21:09
<option value = 5>5
<option value = 6>6
<option value = 7>7
<option value = 8>8
<option value = 9>9
</select>

<select name="n2">
<option selected value = 0>0
<option value = 1>1
<option value = 2>2
<option value = 3>3
<option value = 4>4
<option value = 5>5
<option value = 6>6
<option value = 7>7
<option value = 8>8
<option value = 9>9
</select>

<select name="n3">
<option selected value = 0>0
<option value = 1>1
<option value = 2>2
<option value = 3>3
<option value = 4>4
<option value = 5>5
<option value = 6>6
<option value = 7>7
<option value = 8>8
13JavaScript:03/05/15 21:09
check(num2, num4, num1, num3);
check(num2, num4, num3, num1);

check(num3, num1, num2, num4);
check(num3, num1, num4, num2);
check(num3, num2, num1, num4);
check(num3, num2, num4, num1);
check(num3, num4, num1, num2);
check(num3, num4, num2, num1);

check(num4, num1, num2, num3);
check(num4, num1, num3, num2);
check(num4, num2, num1, num3);
check(num4, num2, num3, num1);
check(num4, num3, num1, num2);
check(num4, num3, num2, num1);

}


//-->
</script>

<form name="numbers">
<select name="n1">
<option selected value = 0>0
<option value = 1>1
<option value = 2>2
<option value = 3>3
<option value = 4>4
14JavaScript:03/05/15 21:10
result = k(a0, o0, k(a1, o1, k(a2, o2, a3)));
if(9.99 <= result && result <= 10.01){
document.numbers.hyouji.value = document.numbers.hyouji.value+
a0+opst[o0]+"("+a1+opst[o1]+"("+a2+opst[o2]+a3+"))"+"="+result+"\n";
}

}
}
}
}

function calcAndPrint() {
document.numbers.hyouji.value = "";

num1 = document.numbers.n1.options[document.numbers.n1.selectedIndex].value;
num2 = document.numbers.n2.options[document.numbers.n2.selectedIndex].value;
num3 = document.numbers.n3.options[document.numbers.n3.selectedIndex].value;
num4 = document.numbers.n4.options[document.numbers.n4.selectedIndex].value;

check(num1, num2, num3, num4);
check(num1, num2, num4, num3);
check(num1, num3, num2, num4);
check(num1, num3, num4, num2);
check(num1, num4, num2, num3);
check(num1, num4, num3, num2);

check(num2, num1, num3, num4);
check(num2, num1, num4, num3);
check(num2, num3, num1, num4);
check(num2, num3, num4, num1);
15JavaScript:03/05/15 21:11
<option value = 5>5
<option value = 6>6
<option value = 7>7
<option value = 8>8
<option value = 9>9
</select>

<select name="n2">
<option selected value = 0>0
<option value = 1>1
<option value = 2>2
<option value = 3>3
<option value = 4>4
<option value = 5>5
<option value = 6>6
<option value = 7>7
<option value = 8>8
<option value = 9>9
</select>

<select name="n3">
<option selected value = 0>0
<option value = 1>1
<option value = 2>2
<option value = 3>3
<option value = 4>4
<option value = 5>5
<option value = 6>6
<option value = 7>7
<option value = 8>8
8*(3-(7/4))=10
17デフォルトの名無しさん:03/05/15 21:15
数字の中に0は有りなのか?
>>17
0001
だったりしたら「つくれない」が答えだと思われ。
>>18
10 + 0 + 0
>>19
ローカルルールがありそうだね…
>>1 括弧は使っていいんですか?
22デフォルトの名無しさん:03/05/15 21:34
『1919』

はりきってどうぞ。
イクイクぱっくん
24デフォルトの名無しさん:03/05/15 21:39
これって、なんかうまいアルゴリズムってあるんですか?
25デフォルトの名無しさん:03/05/15 21:40
>>24
総当り
C数行で書けそう
>>22
√9 * √9 * 1 + 1
>>27
ルート無しの場合も考えてみて
2927:03/05/15 21:56
19 * 1 - 9とか
( 91 - 1 ) / 9とか






マジレス
( 1 / 9 + 1 ) * 9
evalが使える系だとちょろそう。
31デフォルトの名無しさん:03/05/15 22:07
>>30
じゃあつくれ
>>31
他力本願はやめろ。
33デフォルトの名無しさん:03/05/15 22:09
int get(int a1,int a2,int o){
switch(o){
case 0:
a1+=a2;
break;
case 1:
a1-=a2;
break;
case 2:
a1*=a2;
break;
case 3:
(a2==0) ?(0) :(a1/=a2);
break;
}return a1;}
char* getO(int n){
switch(n){
case 0:
return "+";
case 1:
return "-";
case 2:
return "*";
case 3:
return "/";
}}
34デフォルトの名無しさん:03/05/15 22:09
int main(){
int res;
while(true){
int r;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
for(int k=0;k<10;k++){
for(int n=0;n<10;n++){

for(int o1=0;o1<4;o1++){
int A=get(i,j,o1);
for(int o2=0;o2<4;o2++){
int B=get(A,k,o2);
for(int o3=0;o3<4;o3++){
if(B==10)
break;
int C=get(B,n,o3);
if(C==10)
{
printf("%d %s %d %s %d %s %d",i,getO(o1),j,getO(o2),k,getO(o3),n);
printf("\n");
}
}}}//for
}}}}
}
return 0;
}

35デフォルトの名無しさん:03/05/15 22:15
あら、これじゃ抜けれないか。まぁどっかにbreakでも入れておいて>>1
36デフォルトの名無しさん:03/05/15 22:22
>>33
演算子は優先順位無しで左結合扱いっていうルールか。

かっこの有無とか、並べて2桁の数字にしていいかとかでめんどくささが変わりそうね
37デフォルトの名無しさん:03/05/15 22:33
>>4つの数字と四則演算を使って
>>4桁の数字の入力を受けて

2桁の数字もありなのか?どうなんだ?
1919 → (1+9) | (1+9) = 10 とかビット演算もアリにすると、もっと幅が広がりそうだな。
39デフォルトの名無しさん:03/05/15 22:42
>>36
左右の数字をくっつける演算子を増やせばいいだけ。
基本: 演算は +(加算) -(減算) *(乗算) と商が整数になる /(除算) だけ。
追加1: %(剰余) を追加。
追加2: 結果が整数になる √(平方根) を追加(1, 4, 9)。
追加3: &(論理積)、|(論理和)、^(排他的論理和) を追加。
追加4: 2進数8桁の ~(ビット反転) を追加。
追加4': 10進数での ~(ビット反転) を追加。

とかなー
41デフォルトの名無しさん:03/05/15 23:00
>>40
商は整数にならなくても最後につじつまが合えばよいのでは?
42デフォルトの名無しさん:03/05/15 23:02
ものすげー適当。対応予定は括弧と平方根まで。
母者から教わったルールは2桁以上はなしで順番の入れ替えはありだよん

ival=inputbox("4桁の数字入れれ")
if len(ival)<>4 then wscript.quit
for q=0 to 4*4*4-1
op=q
oval=clng(mid(ival,1,1))
for r=2 to 4
select case op mod 4
case 0:oval=oval+clng(mid(ival,r,1))
case 1:oval=oval-clng(mid(ival,r,1))
case 2:oval=oval*clng(mid(ival,r,1))
case 3:oval=oval/clng(mid(ival,r,1))
end select
op=op\4
next
if oval=10 then
op=q
out=mid(ival,1,1)
for r=2 to 4
select case op mod 4
case 0:out=out&"+"&mid(ival,r,1)
case 1:out=out&"-"&mid(ival,r,1)
case 2:out=out&"*"&mid(ival,r,1)
case 3:out=out&"/"&mid(ival,r,1)
end select
op=op\4
next
msgbox out,4096,"でけた"
exit for
end if
next
44C言語 ひたすら表示:03/05/15 23:17
#include <stdio.h>
int Count(int num1,int num2,int enzansi){
if(enzansi==3&&num2==0)return -32768;
return enzansi==0?num1+num2:enzansi==1?num1-num2:enzansi==2?num1*num2:num1/num2;}
char E(int enzansi){return enzansi==0?'+':enzansi==1?'-':enzansi==2?'*':'/';}
int main(void){
int num[4]={0};int enzansi[3];int a,n,c=0;
for(;num[3]<=9;){
for(a=0;a<=2;a++)enzansi[a]=0;
for(;enzansi[2]<=3;){
for(a=0,n=num[0];a<=2;a++)
n=Count(n,num[a+1],enzansi[a]);
if(n==10){printf("%d%c%d%c%d%c%d ",num[0],E(enzansi[0]),num[1],E(enzansi[1]),num[2],E(enzansi[2]),num[3],n);c++;
if(c%200==0){printf("続きを表示します 改行を押してください");getchar();}}
enzansi[0]++;for(a=0;a<=1;a++)if(enzansi[a]==4)
{enzansi[a]=0;enzansi[a+1]++;}}
num[0]++;for(a=0;a<=2;a++)if(num[a]==10){
num[a]=0;num[a+1]++;}}
printf("\n終了します 改行を押してください");getchar();return 0;}
45デフォルトの名無しさん:03/05/15 23:29
あれだ、プログラムのっける人は、およその仕様をつけることにしようや。

かっこ有りとか無しとか。
使ってる演算子の種類とか。
せめて言語名と動作確認コンパイラ&実行環境を書いてほしい。
4744:03/05/15 23:48
>>45-46
>>44
言語:C(標準Cのみ) 動作:Cコンパイラ全般
○□○□○□○ (○==数値(0~9) □==演算子(+-*/))の組み合わせの
パターン(640000通り)の演算を行い、10に成るもののみ表示する。
演算は左から順番に行う。割り算は切り捨てる。

int add(int a,int b){ return a+b; }
int sub(int a,int b){ return a-b; }
int mul(int a,int b){ return a*b; }
int div(int a,int b){ return b ? a/b : 0x7fffffff; }
int mod(int a,int b){ return b ? a%b : 0x7fffffff; }
int and(int a,int b){ return a&b; }
int or(int a,int b){ return a|b; }
int xor(int a,int b){ return a^b; }

main()
{
  const int num=10;
  const int opn=8;
  int (*op[])(int,int)={add,sub,mul,div,mod,and,or,xor};
  char ops[]={'+','-','*','/','%','&','|','^'};

  for(int i=0; i<num; i++)
    for(int j=0; j<num; j++)
      for(int k=0; k<num; k++)
        for(int n=0; n<num; n++)
          for(int a=0; a<opn; a++)
            for(int b=0; b<opn; b++)
              for(int c=0; c<opn; c++)
                if(op[c](op[b](op[a](i,j),k),n)==10)
                  printf("((%d%c%d)%c%d)%c%d\n",i,ops[a],j,ops[b],k,ops[c],n);
}

c言語 
演算子は{'+','-','*','/','%','&','|','^'}; 2項演算子系なら簡単に追加可能
演算は左から順番
10と等しかったら表示する
>>48
ひさしぶりに気持ち良いプログラムをみた
>>49
かっこいい。int (*op[])(int,int)={add,sub,mul,div,mod,and,or,xor};は
関数のポインタと言うやつ?初めて見ますた。
5150:03/05/16 00:49
>>50 >>48でした。すいません。
52デフォルトの名無しさん:03/05/16 00:49
与えられた4つの数字で10作れるか考えるプログラムも作ろうよ
53デフォルトの名無しさん:03/05/16 00:53
除算は実数って気がするんだけど・・・
(3-7/4)*8
とか
(1/9+1)*9
とか認めたいし。
>53
それが 9.999... だったり 10.000... だったりにならなければな。

分子と分母(ともに整数)で分けて扱うとかな。
>>54
>6は9.99<10<10.01で判定しているようだが。
全件表示の仕様(演算子の種類とか整数か実数かとか)決めといて
実行速度競うってのどうよ?
>>56
表示速度争いは極度の不公平。
バックトラックだろうとこの程度の計算量では話にならん。

--------------------------終了------------------------
HSP厨にも是非参加して欲しい。
59aki:03/05/16 02:23
6048:03/05/16 02:33
>>59
うげ! 
自分が書いたのと怖いぐらいそっくりなモノがある・・・
関数名まで一緒だ・・・
累乗はだめ?
「2334」だと、2^4-3-3 しか答えがないような気がする。

あと、立方根とか。
「3448なら」3√8(8の立方根) +4+4
もうそのへんになると切符の数字組み合わせなんてホノボノしたものじゃなくなるんだが・・・
そういえば、√って1/2乗だからなー、別の数字使ってる気がして、
なんか√使うの反則な気もする
>>62
そだねーw

あと、「2258」lを、「log2(底)の8」+2+5とか・・・w
>>61
「2334」
( 4 / 3 + 2 ) * 3
「3448」
( 3 * 4 ) - ( 8 / 4 )

66デフォルトの名無しさん:03/05/16 10:37
関数型ヲタが参戦してないな。
Cで足りるということか。
67デフォルトの名無しさん:03/05/16 12:31
6789は?
>>67
(6*(7+8))/9
>>67-68
のようなやりとりをプログラムで実現しろというのが>>1の主張なのでは?
7042=68:03/05/16 13:08
>>69
今作ったトコなんだけど3448で>>65の答えが出てこなかったからやり直し中。
面倒くさいから環境はWSH。
7142=68:03/05/16 13:18
と思ったけど計算は3484だったか。

dim ival()
istr=inputbox("4桁の数字入れれ")
if len(istr)=4 then
redim ival(3)
for i=0 to 3
ival(i)=cint(mid(istr,i+1,1))
next

for i=0 to 3
for j=0 to 3
for k=0 to 3
for l=0 to 1
if l=1 then ival(0)=-ival(0)
for x=0 to 2
for y=0 to 1
ans=val(ival(x),i,ival(x+1))
out=val2(ival(x),i,ival(x+1))
select case x
case 0
select case y
case 0
ans=val(val(ans,j,ival(2)),k,ival(3))
out=val2(val2(out,j,ival(2)),k,ival(3))
case 1
ans=val(ans,k,val(ival(2),j,ival(3)))
out=val2(out,k,val2(ival(2),j,ival(3)))
end select
7242=68:03/05/16 13:19
case 1
select case y
case 0
ans=val(val(ival(0),j,ans),k,ival(3))
out=val2(val2(ival(0),j,out),k,ival(3))
case 1
ans=val(ival(0),k,val(ans,j,ival(3)))
out=val2(ival(0),k,val2(out,j,ival(3)))
end select
case 2
select case y
case 0
'やらない
case 1
ans=val(ival(0),k,val(ival(1),j,ans))
out=val2(ival(0),k,val2(ival(1),j,out))
end select
end select
if ans=10 then
if instr(replace(replace(out2,"(",""),")",""),replace(

replace(out,"(",""),")",""))=0 then
out2=out2&vbcrlf&" |"&out
end if
end if
out=""
7342=68:03/05/16 13:20
next
next
next
next
next
next
if len(out2)<>0 then
msgbox "  / ̄ ̄ ̄ ̄"&vbcrlf&"< でけた"&out2&vbcrlf&"  \____",vbcritical+4096,"10作る"
else
msgbox "  / ̄ ̄ ̄ ̄"&vbcrlf&"< できない"&vbcrlf&"  \____",vbcritical+4096,"10作る"
end if
end if
function val(a,op,b)
select case op
case 0:val=a+b
case 1:val=a-b
case 2:val=a*b
case 3:if b=0 then val=-100 else val=a/b
end select
end function
function val2(a,op,b)
select case op
case 0:val2=a&"+"&b
case 1:val2=a&"-"&b
case 2:val2=a&"*"&b
case 3:val2=a&"/"&b
end select
val2="("&val2&")"
end function

既出判定が汚い。
↑追記:小学生でもできる四則と括弧まで。では名無しに戻ります
75デフォルトの名無しさん:03/05/16 20:40
Cで4桁の数字を引数にとるヤシ誰か書けよ
>>75
自分で書いて晒せ
a+b+c+d==10
a+b+c*d==10
a+b+c/d==10
...
a+b+c-d==10
...
いっぱいやってく?
78デフォルトの名無しさん:03/05/16 21:56
0000〜9999の全てに場合の解答を用意する。高速。
まずはどれくらいの速さを高速とするか定義せよ。
80デフォルトの名無しさん:03/05/16 22:00
じゃあ、最速
CPUは?
>>78
解答を用意する時間が掛かる。
四則演算で不可能な組合せは1101個
84デフォルトの名無しさん:03/05/16 23:52
>>83
可能か不可能かだけじゃなくてカッコと演算子と数字の並びを全件書き出すべきだと思う。
>>6でそれができてるっぽいけど、ダブりが大杉
>>84
4-(9-(3*5))
4-(9-(5*3))
こういうのもダブり?
>85
だぶりだろうな。
87デフォルトの名無しさん:03/05/17 01:29
項書き換え系の話題になってまいりました
この手のネタ、「C言語による最新アルゴリズム事典」に載ってなかった?
小町算とかいう江戸時代の・・・・・
全体に-かけた
4-(9-3*5)
3*5-9+4
これもだぶりだよね?
あ、違った。忘れて……
でもだぶりには違いないよね。
>>89-90

4-(9-3*5)と
4+(3*5-9)
っていうのがいいたかったんしょ
9392:03/05/17 06:49
っていうか、
4+(3*5-9)と
4+3*5-9 はだぶりなんだろうか・・・
5/(2/(7-3))と5*(7-3)/2もだぶり
漏れの中では括弧をとっても同じ式になるものをダブりだと思ってたが
随分減るな
(2/1)/(1/5)
(5/1)/(1/2)
(2*1)/(1/5)
(5*1)/(1/2)

こういうのは?
1+2+3+4
(1+2+3+4)
((1+2+3+4))
(((1+2+3+4)))
((((;゚Д゚))))ガタガタブルブル
(;゚Д゚)ガタ

((;゚Д゚))ガタガタ

(((;゚Д゚)))ガタガタブル

((((;゚Д゚))))ガタガタブルブル
100デフォルトの名無しさん:03/05/17 20:58
つーか、あれだ。
標準的な記述方法を決めて、ある式が与えられた時それを標準化する方法を決めて、
標準形式になったヤシを同値類とかんがえればよいのだ。
>>100
その標準方法を決めるのが、大変そう
>101
数字が昇順に並んでいるものから列挙していって先に出た方が標準でいいのではないか
103デフォルトの名無しさん:03/05/18 00:41
タームリライティングシステム得意なヤシ募集
おまいら、よくかんがえろや。
4つの数字の演算パターンは次の二つしかないんだよ。

(A op B) op (C op D)
((A op B) op C) op D
8/(1-1/5)
(A op (B op C)) op D
A op ((B op C) op D)
A op (B op (C op D))
A op1 B op2 C op3 D
(A op1 B) op2 C op3 D
A op1 (B op2 C) op3 D
A op1 B op2 (C op3 D)
(A op1 B) op2 (C op3 D)
(A op1 B op2 C) op3 D
(A op1 (B op2 C)) op3 D
((A op1 B) op2 C) op3 D
A op1 (B op2 C op3 D)
A op1 (B op2 (C op3 D))
A op1 ((B op2 C) op3 D)
全件探索力技形
言語は意味もなくJava

public class TenFinder {
public static final String OP_ADD = "+";
public static final String OP_SUB = "-";
public static final String OP_MUL = "*";
public static final String OP_DIV = "/";
public static final String[] OPS = {OP_ADD, OP_SUB, OP_MUL, OP_DIV};

public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
int a = i / 1000;
int b = (i - (a * 1000)) / 100;
int c = (i - (a * 1000) - (b * 100)) / 10;
int d = (i - (a * 1000) - (b * 100) - (c * 10)) / 1;
System.out.println(a + " " + b + " " + c + " " + d + "------------------------");
search(a, b, c, d);
}
}

private static void search(int a, int b, int c, int d) {
for (int x = 0; x < OPS.length; x++)
for (int y = 0; y < OPS.length; y++)
for (int z = 0; z < OPS.length; z++)
calculate(a, OPS[x], b, OPS[y], c, OPS[z], d);
}
>>107
( ゚Д゚)ポカーン…
private static void calculate(int a, String x, int b, String y, int c, String z, int d) {
calculateWithPatern1(a, x, b, y, c, z, d);
calculateWithPatern2(a, x, b, y, c, z, d);
calculateWithPatern3(a, x, b, y, c, z, d);
calculateWithPatern4(a, x, b, y, c, z, d);
calculateWithPatern5(a, x, b, y, c, z, d);
}

//(A op B) op (C op D)
private static void calculateWithPatern1(int a, String x, int b, String y, int c, String z, int d) {
try {
int result = simpleCalc(simpleCalc(a, x, b), y, simpleCalc(c, z, d));
if (result == 10) System.out.println("(" + a + x + b + ")" + y + "(" + c + z + d + ") = 10");
} catch (ArithmeticException ex) { return; }
}

//((A op B) op C) op D
private static void calculateWithPatern2(int a, String x, int b, String y, int c, String z, int d) {
try {
int result = simpleCalc(simpleCalc(simpleCalc(a, x, b), y, c), z, d);
if (result == 10) System.out.println("((" + a + x + b + ")" + y + c + ")" + z + d + " = 10");
} catch (ArithmeticException ex) { return; }
}
//(A op (B op C)) op D
private static void calculateWithPatern3(int a, String x, int b, String y, int c, String z, int d) {
try {
int result = simpleCalc(simpleCalc(a, x, simpleCalc(b, y, c)), z, d);
if (result == 10) System.out.println("(" + a + x + "(" + b + y + c + "))" + z + d + " = 10");
} catch (ArithmeticException ex) { return; }
}

//A op ((B op C) op D)
private static void calculateWithPatern4(int a, String x, int b, String y, int c, String z, int d) {
try {
int result = simpleCalc(a, x, simpleCalc(simpleCalc(b, y, c), z, d));
if (result == 10) System.out.println(a + x + "((" + b + y + c + ")" + z + d + ") = 10");
} catch (ArithmeticException ex) { return; }
}
//A op (B op (C op D))
private static void calculateWithPatern5(int a, String x, int b, String y, int c, String z, int d) {
try {
int result = simpleCalc(a, x, simpleCalc(b, y, simpleCalc(c, z, d)));
if (result == 10) System.out.println(a + x + "(" + b + y + "(" + c + z + d + ")) = 10");
} catch (ArithmeticException ex) { return; }
}

private static int simpleCalc(int m, String op, int n) throws ArithmeticException {
if (op.equals(OP_ADD)) return m + n;
else if (op.equals(OP_SUB)) return m - n;
else if (op.equals(OP_MUL)) return m * n;
else {
if (n == 0) throw new ArithmeticException();
if ((m % n) != 0) throw new ArithmeticException();
return m / n;
}
}
}
113デフォルトの名無しさん:03/05/18 14:23
+と*が可換なのを考慮して標準化するルールを考えれ
>>113
それだけだと簡単だけど、
A-(B-C)=A+(C-B)
A/(B/C)=A*(C/B)
みたいなのも考慮する必要がある。
えーと「会社を辞めようと思ったソースコード」スレはここではないのですが…。
(A/B)/(C/D) (A/B)*(D/C) (D/C)*(A/B) (A*D)/(B*C) (A*D)/(C*B)
(D*A)/(B*C) (D*A)/(C*B) A*(D/(B*C)) A*(D/(C*B)) D*(A/(B*C))
D*(A/(C*B)) A/((B*C)/D) A/((C*B)/D) D/((B*C)/A) D/((C*B)/A)

これみんな一緒ってことでOK?
まだあった
(A/(B*C))*D (A/(C*B))*D
(D/(B*C))*A (D/(C*B))*A
除算がはいると分母が0の時は扱いが別だろ?
>>116-117
まだある。60とおり。
この課題で標準化することに何か意味があるの?
10が作れればOKってことなら、1234で10がつくれたら
1243...4321をすっ飛ばすというのが速そうだが。
>>120
>>84の言葉に従ってるだけ。
四則演算で作れる組合せを知るだけなら、>>59にあるので十分。
あそこのは何故かすっ飛ばす処理を入れてないけどな。

四則演算でできない組合せについて方法を探す方が楽しいかも。
> この課題で標準化することに何か意味があるの?
((1+2)+3)+4 と (1+(2+3))+4 と (1+2)+(3+4) と … と似たような式を大量に列挙するのはカコワルイなぁ、という意味が。
-----------------------

正しさも列挙しやすさも全く保証しないが標準形を考えてみた。
以下の文法から生成できる式を「準々標準形」とする
 expr ::= addsub_expr | muldiv_expr
 addsub_expr ::= (expr + int) | (expr - int) | int
 muldiv_expr ::= (expr * addsub_expr) | (expr / addsub_expr)
※ 要は、 a op1 (B op2 C) の形が許されるのはop1が乗除算でop2が加減算の時のみ。a-(b-c) はダメで (a-b)+c はOK、などなど。

準々標準形の式のうち、次をみたすものを「準標準形」とする
 ・ □-△ の形の部分式では、△≠0
 ・ □/△ の形の部分式では、△≠1
 ・(□-△)+○ の形の部分式が存在しない
 ・(□/△)*○ の形の部分式が存在しない
※ 3/(2-1) はダメで 3*(2-1) はOK。((1-2)+3)-4 はダメで ((1+3)-2)-4 はOK、などなど。足し算掛け算が先。

準標準形の式のうち、次を満たす物を「標準形」とする。
  ・(((A1+A2)+A3)+...+An)
  ・(((A1*A2)*A3)*...*An)
  ・(((□-A1)-A2)-...-An)
  ・(((□/A1)/A2)/.../An)
 の形の部分式では、Ai は Ai+1 より「簡単な式」になっている。ただし、
  ・"数a < 数a+数b < 数a-数b < 数a*数b < 数a/数b < それ以外" の順で左の方が簡単
  ・↑の基準で同じ簡単さだったら、数aが小さい方が簡単
  ・↑それでも同じ簡単さだったら、AiとAi+1は同じ簡単さなので順序はどっちでもよし。
 と定義する。数字4つならこれで大丈夫なつもり
※ (4-2)/2*2 はダメで 2*(4-2)/2 はOKなどなど。
標準形に直した時の数字の順番が今の順番以下なら既出なのですっ飛ばす。

ex)
abcd
a + b + c + d

d + c + b + a

if (dcba <= abcd) nop;
>>123
っていうか、abcd < dcbaだったとして、それはdcbaのところで
やればいいんちゃう?

標準形にならない数字順はやらない。つまり、
if (abcd != dbcd) nop;
でいいのでは?
ふむ、そうするとある式が標準形でないことを証明する方が
簡単そうだね。
標準形でなければ、処理せずに飛ばせばいいんだから。
#include <stdio.h>

main(){
 int i0,i1,i2,i3;

 for(i0=0; i0<=9; i0++)
  for(i1=i0; i1<=9; i1++)
   for(i2=i1; i2<=9; i2++)
    for(i3=i2; i3<=9; i3++)
    {
     if(i0+i1+i2+i3==10 || i0+i1+i2-i3==10
     || i0+i1-i2+i3==10 || i0+i1-i2-i3==10
     || i0-i1+i2+i3==10 || i0-i1+i2-i3==10
     || i0-i1-i2+i3==10 || -i0+i1+i2+i3==10
     || -i0+i1+i2-i3==10 || -i0+i1-i2+i3==10
     || -i0-i1+i2+i3==10)
      printf("%d%d%d%d ",i0,i1,i2,i3);
     if(i0+i1+i2*i3==10 || i0+i1-i2*i3==10 || i0-i1+i2*i3==10 || -i0+i1+i2*i3==10 || -i0-i1+i2*i3==10
     || i1+i2+i3*i0==10 || i1+i2-i3*i0==10 || i1-i2+i3*i0==10 || -i1+i2+i3*i0==10 || -i1-i2+i3*i0==10
     || i2+i3+i0*i1==10 || i2+i3-i0*i1==10 || i2-i3+i0*i1==10 || -i2+i3+i0*i1==10 || -i2-i3+i0*i1==10
     || i3+i0+i1*i2==10 || i3+i0-i1*i2==10 || i3-i0+i1*i2==10 || -i3+i0+i1*i2==10 || -i3-i0+i1*i2==10 )
      printf("%d%d%d%d ",i0,i1,i2,i3);


    }
}
ぶっちゃけこんなんでも良いと思うが。
ちょっと式が多いけど。割り算などまだ足りないし。
表示する時に並び替えた物を一緒に表示するなり、全体をソートしながら表示したり。
式を関数の中で処理して引数の順を入れ替えたり。いろいろできるよ。ってかやらなきゃならんのか
127デフォルトの名無しさん:03/05/18 20:28
+か*の時carとcdrを入れ換えたものは同一視
128デフォルトの名無しさん:03/05/18 23:49
カッコをできるだけはずした段階で第一標準形
+と*の可換性を考慮して昇順にして第二標準形
A+(a-b)とA-(b-a)を同一視して第三標準形
・・・・
・・・
129かおりん祭り:03/05/18 23:49
130r:03/05/19 01:53
関数型言語大好きさん!
関数型言語の威力を見せつけるチャンスですよ!
eval
でけた
2263とおりでファイナルアンサー?
>>132
2263通りをここに晒せ

多分違うと思う(勘)
>>132
少ないような気がする。
>>133
無理。

>>134
多いことはあっても少ないことはない。
できない組合せの数は1853。これは>>59と合ってる。
136132:03/05/19 22:03
>多いことはあっても少ないことはない。
「多いことはあっても少ないことはないと思う」に訂正します。
言い切る自信はない。
順列で 5,836件、組合せで 552通りある。
http://www.amy.hi-ho.ne.jp/odasan/com/programs/number4/number4.html
間違ってたら恥ずかしいな。
>>137
順列は5878個。↓足りない分
1,1,4,8 (1+(1/4))*8 1,1,9,9 (1+(1/9))*9
1,2,3,6 (1+(2/3))*6 1,2,8,8 (1+(2/8))*8
1,3,3,5 (1+(3/3))*5 1,3,7,7 (1+(3/7))*7
1,4,4,5 (1+(4/4))*5 1,4,6,6 (1+(4/6))*6
1,5,5,5 (1+(5/5))*5 1,6,4,4 (1+(6/4))*4
1,6,6,5 (1+(6/6))*5 1,7,3,3 (1+(7/3))*3
1,8,8,5 (1+(8/8))*5 1,9,6,4 (1+(9/6))*4
1,9,9,5 (1+(9/9))*5 2,2,9,2 (2+(2*9))/2
2,6,8,5 (2+(6*8))/5 3,4,4,5 (3-(4/4))*5
3,5,5,5 (3-(5/5))*5 3,7,4,8 (3-(7/4))*8
3,7,7,5 (3-(7/7))*5 3,8,8,5 (3-(8/8))*5
3,9,9,5 (3-(9/9))*5 4,2,3,3 (4-(2/3))*3
4,3,3,2 (4+(3/3))*2 4,4,9,4 (4+(4*9))/4
4,6,6,4 (4+(6*6))/4 4,7,7,2 (4+(7/7))*2
4,9,9,2 (4+(9/9))*2 5,5,2,4 (5-(5/2))*4
5,5,9,5 (5+(5*9))/5 6,6,4,3 (6+(6*4))/3
6,6,6,2 (6-(6/6))*2 6,7,2,2 (6+(7*2))/2
6,8,8,7 (6+(8*8))/7 6,9,9,2 (6-(9/9))*2
7,6,3,2 (7-(6/3))*2 7,7,9,7 (7+(7*9))/7
7,8,4,2 (7-(8/4))*2 8,3,2,5 (8-(3*2))*5
8,8,9,8 (8+(8*9))/8 9,8,2,2 (9-(8/2))*2
139137:03/05/20 02:25
>>138
あ、ほんとうだ。
あしたチェックしてみます。
THANKS.
 +と−、×と÷
は入れ換えられる
141137=139:03/05/20 15:13
式の中のカッコをひとつ忘れておりました。
こっそり直しました。順列で 5,878個ありました。
http://www.amy.hi-ho.ne.jp/odasan/com/programs/number4/number4.html
142132:03/05/20 22:17
正しいかどうかチェックお願い。
http://airh.zapto.org/n4/
>>142
9991が重複しているの?
後置記法だよね?
>>143
どういう意味でしょうか?
((9*9)/9)+1
((9/9)+9)*1
この二つは同じではないと思いますが…

>>144
そうです。
147132:03/05/21 11:17
(3-1)*(6-1) (1-6)*(1-3) のようなダブリを許していました。
修正した結果、2230とおりになりました。
http://airh.zapto.org/n4/
148132:03/05/21 16:28
2235でした。
>>146
読んで無いので知らんが同じ並びだからこれで一通りじゃ?
0000〜9999のうちの9991というもの(一万分の一)
((9*9)/9)+1
((9/9)+9)*1

計算の違いで別にカウントするの?
150132:03/05/21 22:44
>>149
この↓ルールで何とおりの式を作れるか?

4個の数字と3個の四則演算子で計算結果を10にする。
ただし, 式を変形して同じになるものと、
以下の2つの形のものは取り除いておく。
○/△ △=1 例) (2*5)/(9-8) ((2*5)*(9-8)と同等なので)
○-△ △=0 例) (3+7)-(0*2) ((3+7)+(0*2)と同等なので)

答: 2235とおり(http://airh.zapto.org/n4/)

>>132に何も書いてなかったですね。すんません。
151132:03/05/21 23:13
> 以下の2つの形のものは取り除いておく。
> ○/△ △=1 例) (2*5)/(9-8) ((2*5)*(9-8)と同等なので)
> ○-△ △=0 例) (3+7)-(0*2) ((3+7)+(0*2)と同等なので)

ちなみに↑をしなければ 3278とおりです。
微妙に違うけどこれもおもろい

4つの4で遊ぼうよ
http://www.faireal.net/articles/5/27/#d20527
153デフォルトの名無しさん:03/05/24 02:26
遺伝的切符の数字
154132:03/05/26 00:33
>>150
((9+9)-7)-1 ((9+9)-1)-7のようなダブリを許してました。
修正した結果、2174(>>151 3161)とおりになりました。
http://airh.zapto.org/n4/
まだまだ完璧じゃないと思うので、誰かチェックしてください。
つか>>84-130あたり話してた人は誰一人やってないの?
昔ポケコンでやったときは全体の7割+αくらいの回答率が出たと記憶している。

あってるかどうかわからんけど。
156山崎渉:03/05/28 12:44
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
157デフォルトの名無しさん:03/05/29 08:43
((((;゚Д゚))))ガタガタブルブル
3466ってできる?たぶんうらわざ使わないとできないと想うんだけど
四則演算のみ
並びを変えない
というルールなら無理
160158:03/06/17 23:54
64のトリプルート(3乗根)+6
スマソ
並びを変えてよいのなら、そんなことしなくても出来る。
(4*6+6)/3
2桁の数を許すなら、
4+36/6
46-36
163158:03/06/18 02:53
>>161-162
まけますた
>>158
プログラム板なんだからプログラム組んで確かめろ
165158:03/06/18 20:28
>>164
あう、そうでした
CPUは?
286?
>>167
V30
169デフォルトの名無しさん:03/06/24 23:48
lispは無いの?
>>1
なつかしー
リアル厨房の頃やったよ
>>169
さくっと実装してくれ
1113 並びを入れ替えずに、どうぞ
173デフォルトの名無しさん:03/06/25 23:40
四則混合と乗算だけじゃ無理ぽ
174172:03/06/25 23:56
>>173
反応してくれてありがとう、正解は
1+1+(1<<3)
175デフォルトの名無しさん:03/06/26 01:08
>>172
二進数(111) + 十進数(3) = 10
>>174
3ビットシフト・・・?
177789:03/06/27 16:34
>>174
(1<<1)+(1<<3)
でもいいんでないか?
178デフォルトの名無しさん:03/07/08 04:31
179デフォルトの名無しさん:03/07/08 04:43
0+0=8
とかもアリですか?
180デフォルトの名無しさん:03/07/08 09:36
>>179
「とか」って、他に何が並ぶ?
0+0=∞
とか
3+3=8
とか
1+1=田
とか
1+1=1
   1
1÷1=母
1-1=日
1+5=苺
100-1=白
189 :03/07/12 12:21
いきなり消防のなぞなぞスレになりさがたな、、、。
なぞなぞはガキのものだと思ってやがる(笑)
犯人は*15
1+1=想い出
ちょっとかんがえたけどさ・・・
「0000」とか入力されたらどうする?
何を考えたの?
何をどうするの?
195デフォルトの名無しさん:03/07/12 16:55
196デフォルトの名無しさん:03/07/12 18:05
>>193
例外データとして登録しておく。
197山崎 渉:03/07/15 09:53

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
198デフォルトの名無しさん:03/07/27 06:21
保守
199デフォルトの名無しさん:03/07/29 03:06
3,4,7,8 ・・・・
200_:03/07/29 03:06
201山崎 渉:03/08/02 02:13
(^^)
202山崎 渉
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン