3値理論を計算する練習問題が解けずに困っています


堀江伸一  2011-03-19 17:35:13  No: 72465  IP: 192.*.*.*

http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1155&lang=jp
リンク先問題が解けずに困っております。

コードはmystackに計算中の式を代入して問題を解いています。
myprint関数にmystackを渡すことで、計算中の式を見ることができます。
コードに何か問題があるらしくテストデータで不正解をくらってしまいます。
自分で何度もチェックしたのですがわかりませんでした。
どなたかアドバイスをお願いします。


#include <stdio.h>
#include <stack>
#include <map>
#include <string.h>
void myprint(std::stack<char> my);
void solve(int n,char data[81]);
char myNot(char c);
int myVer(char c);
char myAnd(char c1,char c2);
char myOr(char c1,char c2);

std::stack<char> mystack;
std::map<char,int> rank;

int r,q,p;

int main()
{
  char data[81];
  int n;
  scanf("%s",data);
  n=strlen(data);
  rank['P']=rank['Q']=rank['R']=0;
  rank['0']=rank['1']=rank['2']=0;
  rank['+']=1;
  rank['*']=2;
  rank['-']=3;
  rank['(']=4;
  rank[')']=-1;
  
  
  while(!(data[0]=='.' && n==1)){
    solve(n,data);
    scanf("%s",data);
    n=strlen(data);
  }
}

void solve(int n,char data[81]){
  int point=0;
  int nowRank=0;
  char ts[3];
  int count=0;
  bool kakkoFlag=false;
  
  for(r=0;r<3;r++){
  for(p=0;p<3;p++){
  for(q=0;q<3;q++){
    while(mystack.empty()==false) mystack.pop();    
    point=1;
    mystack.push(data[0]);
    nowRank=rank[data[0]];
    while(point<=n)
    {
      if(n==point || nowRank>rank[data[point]])
      {
      
        if(point<n)
        {
          if(data[point]!=')') mystack.push(data[point]);
          nowRank=rank[data[point]];
          if(data[point]==')') kakkoFlag=true;
          else kakkoFlag=false;
        }
          while(mystack.size()>1)
          {
            ts[0]=mystack.top();
            mystack.pop();
            ts[1]=mystack.top();
            mystack.pop();
            nowRank=rank[ts[1]];
            if(ts[1]=='('){
              if(ts[0]=='('){
                mystack.push(ts[1]);
                if(kakkoFlag==false){
                  mystack.push(ts[0]);
                }
                break;
              }else if(ts[0]=='-'){
                mystack.push(ts[1]);
                mystack.push(ts[0]);
                break;
              }else{
                if(kakkoFlag==true){
                  mystack.push(ts[0]);
                  break;
                }else{
                  mystack.push(ts[1]);
                  mystack.push(ts[0]);
                  break;
                }
              }
              
            }else if(ts[1]=='-'){
              if(ts[0]=='-'){
                mystack.push('-');
                mystack.push('-');
                break;
              }else if(ts[0]=='('){
                mystack.push('-');
                mystack.push('(');
                break;
              }else{
                mystack.push(myNot(ts[0]));
              }
            }else if(ts[1]=='+' || ts[1]=='*'){
              if(ts[0]=='-' || ts[0]=='('){
                mystack.push(ts[1]);
                mystack.push(ts[0]);
                break;
              }else{
                ts[2]=mystack.top();
                mystack.pop();
                if(ts[1]=='+'){
                  ts[0]=myOr(ts[2],ts[0]);
                }else if(ts[1]=='*'){
                  ts[0]=myAnd(ts[2],ts[0]);
                }
                mystack.push(ts[0]);
              }
            }else{
              mystack.push(ts[1]);
              mystack.push(ts[0]);
              break;
            }
          }
          point++;
      }else{
          if(n>point){
            mystack.push(data[point]);
            nowRank=rank[mystack.top()];
            point++;
          }
      }
    }
  if(myVer(mystack.top())==2) count++;
  
  }
  }
  }
  
  printf("%d\n",count);
}

void myprint(std::stack<char> my){
  std::stack<char> nt;
  while(my.empty()==false){
    nt.push(my.top());
    my.pop();
    
  }
  
  while(nt.empty()==false){
    my.push(nt.top());
    printf("%c",nt.top());
    nt.pop();
  }
  printf("\n");
}


char myNot(char c){
  int t=myVer(c);
  if(t==2){
    return '0';
  }else if(t==1){
    return '1';
  
  }else if(t==0){
    return '2';
  }
  return c;
}


int myVer(char c){
  int t=c;
  if(c=='R'){
    t=r;
  }else if(c=='P'){
    t=p;
  }else if(c=='Q'){
    t=q;
  }else if('3'>c && c>='0'){
    t=c-'0';
  }
  return t;
}


char myAnd(char c1,char c2){
  char t[3][4]={"000","011","012"};
  return t[myVer(c1)][myVer(c2)];
}

char myOr(char c1,char c2){
  char t[3][4]={"012","112","222"};
  return t[myVer(c1)][myVer(c2)];
}

編集 削除
επιστημη  URL  2011-03-19 21:53:58  No: 72466  IP: 192.*.*.*

コメントもインデントもないコードべたーと貼って
「アドバイスくれ」とおっしゃられても...ねぇ。

編集 削除
komiya  2011-03-19 22:59:09  No: 72467  IP: 192.*.*.*

ジャッジデータが
http://sparth.u-aizu.ac.jp/icpc2008/
で公開されているので、一度自分で確認されることをお勧めします。
ジャッジデータで正解が出るようでしたらAizu Online Judgeの入出力データが間違っている可能性もありますが、そのときはAizu Online Judgeの掲示板でその旨報告されるとよいと思います。

編集 削除
眞鋳  2011-03-20 19:37:45  No: 72468  IP: 192.*.*.*

TRACEを入れて確認する癖をお勧めします><

編集 削除
翔泳ミキオ  2011-04-11 17:13:25  No: 72469  IP: 192.*.*.*

おいおい、
クイズ好きなんだろ?

オレの普通問題にチャレンジしてみる?
まぁ、ニセ者なら、無理に誘っても、作成できないだろうな。

宿題

米村墓背のstdio.hで作られたC++(コマンドプロント),3Dドラゴンの
プログラムを透視変換等を使いVisualBasic2005以上のコードに書き換えよ。

プログラムレベルは初級だが。

言語変換ソフトは無いはずだから、オールオリジナルで作成しなければならないよ。ふっふっ。

まぁ、カンニングマンには、ちょっと、ハイレベルなのかな?

編集 削除
堀江伸一  2011-05-21 13:43:13  No: 72470  IP: 192.*.*.*

>翔泳ミキオ 
なんでしょ、変なこという方ですね?
確かに私はカンニングしてます。
カンニングした問題のリストはこちらにありますが?
結局勉強になればいいですから、どうしてもわからない時は答えを見ます。
http://www14.atwiki.jp/c21coterie/pages/427.html
今回の問題についてはカンニングしたならこんな長いコードは書いてません。
検索したら驚くほど短いコードの答えがでてきますが、苦労して書いたものなので自分のコードで解いてみてから、短いコードの答えを理解しようと思ってます。

komiyaさんありがとうございます。
テストデータでチェックしてみます。
多分私のコードは演算子の優先順位に間違いがあるんじゃないかと思います。

>米村墓背のstdio.hで作られたC++(コマンドプロント),3Dドラゴンの
プログラムを透視変換等を使いVisualBasic2005以上のコードに書き換えよ。
変換しろ。
せめてそのプログラムコードへのリンクを張り付けてくださいよ。

編集 削除
翔泳ミキオ  2011-05-21 18:30:24  No: 72471  IP: 192.*.*.*

カンニングできるのなら、すべてカンニングすればよかろう。

つまり、質問しなくても自力解決できるのではありませんか?

まぁ、コンピューター言語みたいな簡単なもんは、全部、自力で解決できるもんばかりですよ。
小学生でもプログラムなんぞはかけます。

ただ、10年もやっても、モノにならなきゃ、もうだめだけどね(笑

編集 削除
堀江伸一  2011-05-22 08:17:19  No: 72472  IP: 192.*.*.*

>カンニングできるのなら、すべてカンニングすればよかろう。
カンニングという言葉を悪い意味で使った人が書くことですか?
翔泳ミキオさんてカンニングを肯定してするような人だから、他人もカンニングすると考えるタイプですか?
証拠もなく見ず知らずの人をカンニング呼ばわりするのは、誹謗中傷というのです。
翔泳ミキオさんは普段もそういう人なのでしょうか?
社会人としての適性を疑います。
確かに316問中14問もカンニングして解いたのはカンニングマンと呼ばれても仕方ないかもしれませんが、勉強なのですから多少のカンニングは仕方ないと思います。


komiyaさんありがとうございます。
コード解けました。
http://www14.atwiki.jp/c21coterie/?cmd=upload&act=open&page=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E5%8B%89%E5%BC%B7%E6%97%A5%E8%A8%98&file=1155HowcanIsatisfytheeLetmecounttheways4.txt

>まぁ、コンピューター言語みたいな簡単なもんは、全部、自力で解決できるもんばかりですよ。
会津大学の問題の正答率を90%台の問題から10%の問題まで多種多様で、10%〜20%の問題はやはり難しいです。
難しいから正答率が低いわけです。
正答数上位(難しい問題は高いポイントが割り振られそれでランク付けされる)は偏差値の高い大学の学生で占められています。

プログラムって難しい問題は難しいと思います。
例えば飛行機の翼などは、遺伝的アルゴリズムというプログラム手法、コンピュータ内で生物が進化していくように翼を進化させて、最適な形を決定した。
この問題は翼の全体の形状や内部構造や翼内の燃料や配線も含めて考慮すべき変数がものすごい数になるのでとても難しい問題。
みたいな難しい問題もあれば、NP困難問題の近似解の効率化のような高レベルの数学が必要な問題もあると聞きますし未解決問題もたくさんあると聞きます。
プログラムは難しいと思いますが。
翔泳ミキオさんはそんなに高度な問題も解けるのでしょうか?
低レベルプログラマの私には手が届かない難しい世界がたくさんです。

編集 削除
堀江伸一  2011-05-22 08:34:14  No: 72473  IP: 192.*.*.*

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0509
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1049
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=2108&lang=jp
翔泳ミキオさんにとってプログラムの問題って簡単なんですよね?
会津大学の少し難しい問題を3つならべてみました。
翔泳ミキオさんくらい頭がいいなら、カンニングなしで解けますよね?
解き方をお願いします。
コードが答えを出すまでの制限時間が設定されていて、遅いコードだと不正解になります。

編集 削除
επιστημη  URL  2011-05-22 10:07:36  No: 72474  IP: 192.*.*.*

だから阿呆はほっとけ、と。

編集 削除
翔泳ミキオ  2011-05-23 00:44:51  No: 72475  IP: 192.*.*.*

で、賞金でもでるのかね?(笑)

時間の無駄だな。
堀君>>
キミのパソは変だぞ。まず、ソレに気がつくべきだね。

村人の範囲数を知ればよい。(笑)

編集 削除
堀江伸一  2011-05-23 14:01:22  No: 72476  IP: 192.*.*.*

賞金は出ませんが、勉強と思って頑張ってます。
単純肉体労働しか経験がないので、なんとかして勉強して場末の技術職程度に慣れたらと思い。
そのために日々プログラムの勉強をしています。
書籍も買っていますしプログラムの勉強もしてます。
まだまだ初心者ですが、今頑張って勉強してる内容も1〜2年後にはなんであんな低レベルの問題で悩んでたんだろうと思えるような来年を目指してます日々勉強してます。

編集 削除
堀江伸一  2011-05-23 14:10:09  No: 72477  IP: 192.*.*.*

あの?
私のパソが変というのはどういう意味でしょうか?
もしかしてアクセスログとかにウイルスが入ってる兆候でもありましたか?
一応ウイルスバスター入れてるのですが。

編集 削除
翔泳ミキオ  2011-05-23 20:29:07  No: 72478  IP: 192.*.*.*

テスト

テスト

編集 削除
翔泳ミキオ  2011-05-23 20:37:13  No: 72479  IP: 192.*.*.*

ところで、堀君は迷路プログラムをかけるの?
問題では簡単な図で面白くないね。

モット、もっと「アリの巣」みたいなやつのが面白いな。

で、アリの巣の迷路プログラムを作りなさい。
分岐ポイントは70くらいでいいよ(笑)
スクロールもすると面白いなぁ。

で、ポパイ&ブルートみたいに追いかけっこするんだよ。
簡単だろ?

面白いプログラムを作って、私を楽しませてくれ。

編集 削除
ダミー  2011-05-24 06:44:54  No: 72480  IP: 192.*.*.*

この人がカギを握っている可能性が高い。
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+201105/11050010.txt

編集 削除
堀江伸一  2011-06-02 08:57:08  No: 72481  IP: 192.*.*.*

迷路プログラムですか?
書いたことがないので日数かかるかもしれません。
私は頭がいい方ではない(どちらかというとかなり悪い)うえプログラマとしてはまだ低レベルなので相当時間がかかるかも。
壁画が簡単そうなHTML5+jscriptで書いてみようかとは思います。
気が向いたらコード書いてみます。
追っかけっこが成立する程度に賢く動かすとなるとそれなりに工夫が要りますよね。
迷路を探索して経路を決定したり相手の動きを読んで動いたり追い詰めたり、なんだか難しそうですね。
迷路は壁を生成するのでなく、枡目にぎっしりの壁の中に穴を掘っていく感じで作ればいいですかね、でも下手な掘り方すると迷路にならなさそう。
隣接する周囲8マスに5マス以上穴があれば、そこにはもう穴を掘らないとか?


ミキオさんは私の実力を中学生レベルのプログラマと考えておられるようですね。

私の実力は今のところ自分で見るに高校3年生レベルのプログラマです。
多少コードが書ける証拠としてプヨプヨ箱詰めというFlashゲームを見本に、一から自分で設計図を引いて10時間ほどで全部自力で書いたことはあります。
元ネタ
http://puyofever.sega.jp/pf_haco.html

自作(HTML5が動くブラウザ限定で動作)
http://www.geocities.jp/sinapusu2002/puyopuyohakodume/puyopuyohakodume4.html

まだ自分のプログラムの実力は高校生レベル。
最近ようやく大学1年生レベルのプログラムに足を踏み入れたところですので少し難しい課題になるとすぐお手上げです。
基礎をやっている段階で、ちょっとしたアプリやゲーム以上のものなんてまだまだという感じです。

世の中にでて、プログラムができますと言える実力になるには1年先か2年先かはたまた何年先になるのやらというレベルです。

大学に行ったことがないので行列式はn*nの逆行列や行列の体積拡大率くらい。
微積分と行列の組み合わせなんてわかりませんし、微積分は高校レベル。
機械はまったく教育を受けたことがないので理数系や工学系の仕事もできないし、大学レベルの教育や研究とコンピュータの組み合わせみたいな仕事は多分つけないんじゃないかと思っています。

単純肉体労働しかしたことがないので事務畑のプログラムというわけにもいかないかもしれません。
自分でも肉体労働しか道はないかとは思うのですが、一応勉強して就職口がみつかればいいなあという程度のものです。
でも独習ですがかなりの時間をプログラムの勉強に咲いているので、いつかなれたらとは考えています。

編集 削除
翔泳ミキオ  2011-06-02 22:27:34  No: 72482  IP: 192.*.*.*

幹夫に直接に履歴書をだして、「レオ」の紹介と書いとけば、会ってくれるんじゃないの?

やってみなよ。

ま、うそから出た「まこと」とかゆうもんもあるらしいよ^^

編集 削除
翔泳ミキオ  2011-06-02 22:29:09  No: 72483  IP: 192.*.*.*

上級者マークが間違えた。

あらため、ホトトギス。

編集 削除
翔泳ミキオ  2011-06-02 22:34:47  No: 72484  IP: 192.*.*.*

私の実力は今のところ自分で見るに高校3年生レベルのプログラマです。
多少コードが書ける証拠としてプヨプヨ箱詰めというFlashゲームを見本に、一から自分で設計図を引いて10時間ほどで全部自力で書いたことはあります。

この部分に天狗を感じたんで、ちょっと書いとこう。

ちなみにオレは72時間ぶっとうしでコードをかいてた時期があったよ。
16進数コードのみでね。
これは、もはや言語には見えないレベルだが、
オレは「やれた」、ホントだぞ。

以上です。

72時間とは幻覚症状がデルので、まぁ、マネはしないように。

編集 削除
堀江伸一  2011-06-06 10:18:53  No: 72485  IP: 192.*.*.*

すごい集中力ですね。
私だったら多分40時間超えたあたりで一度睡眠を要求するかも。

16進数のみなんて、コンパイル後の機械語の修正を直打ちしたんですか?
コンパイル後の機械語なんて私読み方すら知らないです。

でもC系プログラマを目指すなら、機械語の手作業による修正できた方がいいとか聞きますね。

編集 削除
翔泳ミキオ  2011-06-06 22:23:08  No: 72486  IP: 192.*.*.*

ビジュアルスタジオで制作してみてよ。

オレのパックマンのコード見た?

あのプログラムに自分で動かせるピンク色のパックマンを入れて、黄色のパックマンを全部、食べたら、「end]とゆう文字を出すように改造してみて下さい。

できたら、少し信用してあげるよ。

でも、できますかね?

かなり、簡単な「オリジナルの問題」ですけど。

ああ、黄色パックマンを食べたときに500点とゆう文字がフワフワ浮くようにしてください。

編集 削除
通りすがり  2011-06-11 01:07:41  No: 72487  IP: 192.*.*.*

アホ相手にムキになるのもアホっぽいが
翔泳ミキオ>
こいつなんなの??
書いてることが馬鹿っぽいし、、初心者相手にドヤ顔してんな。お前が井の中の蛙じゃん

>まぁ、コンピューター言語みたいな簡単なもんは、全部、自力で解決できるもんばかりですよ。
それはお前が簡単な問題しか知らねえからだよ、出直してこい

>オレのパックマンのコード見た?
知るかよそんなモンw、どうせ専門学校の課題かなんかで作ったんだろ。
一人でパックマンやってろ

編集 削除