emu in blogjava

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            171 隨筆 :: 103 文章 :: 1052 評論 :: 2 Trackbacks

          我的評論

          共9頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 
          秋水無恨的javascript解法 emu 2005-08-16 09:53  
          <script>
          var m=1000000000;//000;

          function choices(decree)
          {
              var i,j,n=1;
              var arrSum=new Array(26);//最后一個字母在每個位置的總合
              for(j=0;j<arrSum.length;++j)arrSum[j]=0;
              for(i=1;i<=decree.length;++i)
              {
                  var tmpSum=new Array(26);
                  for(j=0;j<26;++j)tmpSum[j]=0;

                  if('A'==decree.charAt(i-1))
                  {
                      if(1==i)
                      {
                          arrSum[0]=1;
                      }
                      else
                      {
                          n=0;
                          for(j=i-1;j>=0;--j)//向前分散,如123->6530
                          {
                              n+=arrSum[j];
                              tmpSum[j]=n;
                          }
                          n = 0
                          for(j=0;j<=i;++j)
                          {//保存到arrSum
                              arrSum[j]=tmpSum[j];
                              n+=arrSum[j];
                          }

                      }
                  }
                  else
                  {
                      if(1==i)
                      {
                          arrSum[1]=1;
                      }
                      else
                      {
                          n=0;
                          for(j=0;j<i;++j)//向后分散,如123->0136
                          {
                              n+=arrSum[j];
                              tmpSum[j+1]=n;
                          }
                          n = 0
                          for(j=0;j<=i;++j)
                          {//保存到arrSum
                              arrSum[j]=tmpSum[j];
                              n+=arrSum[j];
                          }
                      }
                  }
                  document.write(decree.substr(0,i),"=",n,"<br>");
                  //if(n>m)return -1;
              }

              return n;
          }
          document.write("BAA","=",choices("BAA"),"<br>");
          document.write("AAAA","=",choices("AAAA"),"<br>");
          document.write("BABABABABABABABABABABABAB","=",choices("BABABABABABABABABABABABAB"),"<br>");
          </script>

          emu的解法 emu 2005-08-16 09:52  
          這道比較難,emu寫了程序窮舉了各種可能性輸出后,手工分析了一番數據才終于找到規律。嘔血中……


          public class Alphabet {
          public static void main(String[] args) {
          Alphabet a = new Alphabet();
          String[] data = new String[]{"BAABABBAABBBAAB:-1","AABBABABABABBA:520259727",
          "BAABABAAABBBAAB:969740563","AAABABABABABBA:294939658"};
          for (int i = 0; i < data.length; i++) {
          String[] sample = data[ i ].split(":");
          String decree = sample[0];
          int choices = Integer.parseInt(sample[1]);
          assertEquals(a.choices(decree), choices);
          }
          System.out.println("all passed!");
          }

          private static void assertEquals(int a, int b) {
          if (a != b)
          throw new RuntimeException("assert failed!! Expected " + b +
          " but got " + a);
          }

          public int choices(String decree) {
          int[] oldPosList = new int[3];
          int timesCount = 1;
          oldPosList[decree.startsWith("A")?1:2]=1;
          for (int i = 2; i <= decree.length(); i++) {
          timesCount = 0;
          int[] newPosList = new int[i + 2];
          char ch = decree.charAt(i - 1);
          if (ch == 'A') {
          for (int j = 1; j <= i; j++) {
          int times = oldPosList[j];
          if (i < decree.length())
          for (int k = 1; k <= j; k++) newPosList[k] += times;
          timesCount += j*times;
          }
          } else {
          for (int j = 1; j <= i; j++) {
          int times = oldPosList[j];
          if (i < decree.length())
          for (int k = j + 1; k <= i + 1; k++) newPosList[k] += times;
          timesCount += (i-j+1)*times;
          }
          }
          oldPosList = newPosList;
          if (timesCount > 1000000000) return -1;
          }
          return timesCount;
          }
          }



          秋水無恨的javascript解法 emu 2005-08-16 09:42  
          用了一些高深的數學原理,不過對“th+=e/n;”能否把閘值修正到曲線線的定點,我有一點懷疑。

          <SCRIPT LANGUAGE="JavaScript">
          <!--
          function minErr(s,c)
          {
          for(var th=2;th<50;++th)
          {
          var e = 0,n=0;
          for(var i=0;i<s.length;++i)
          {
          if(c.charAt(i )!=(s[i]>=th?"C":"N"))
          {
          ++n;
          e+=(s[i]-th);
          }
          }
          if(e<=0)
          {
          th+=e/n;
          break;
          }
          }
          e = 0;
          for(var i=0;i<s.length;++i)
          {
          if(c.charAt(i )!=(s[i]>=th?"C":"N"))
          {
          e+=(s[i]-th)*(s[i]-th);
          }
          }
          return e/s.length;
          }

          //-->
          </SCRIPT>
          emu的解法 emu 2005-08-16 09:39  
          我估計均方差是一條類似拋物線的曲線(有一個頂點或者一個平的頂部),用二分法收斂到曲線的頂點上。但是由于計算機二進制計算精度限制的原因,實際收斂到的地方可能和頂點有微小的偏差(比如0.1,0.2,0.3,0.4用二進制表示都是循環小數,因此用二分法如果不做特別處理就收斂不到這些點上)。


          public class MSQErr {
          public static void main(String[] args) {
          MSQErr err = new MSQErr();
          assertEquals(err.minErr(new int[] {3, 3, 1, 8}, "NNNC"), 0);
          assertEquals(err.minErr(new int[] {5, 2, 3, 6}, "CCNC"), 0.125);
          assertEquals(err.minErr(new int[] {5, 2, 3, 6, 2}, "CCNCN"), 0.1);
          assertEquals(err.minErr(new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
          12, 13, 14, 15, 16, 17, 18, 19, 20},
          "NNNCNNNCNNNCNCCCCCCC"), 2.34);
          System.out.println("all pass");
          }

          private static void assertEquals(double a, double b) {
          if (a != b)
          throw new RuntimeException("assert failed!! Expected " + b +
          " but got " + a);
          }

          public double minErr(int[] score, String cancerous) {
          double max = 0, min = 1000;
          for (int i = 0; i < score.length; i++) {
          int s = score[ i ];
          if (s > max)
          max = s;
          if (s < min)
          min = s;
          }
          double mid = (max + min) / 2;
          double d1 = 1, d2 = 2;
          while (d1 != d2) {
          d1 = getErr(score, cancerous, mid);
          d2 = getErr(score, cancerous, mid + (max - min) / 1000000000);
          if (d1 > d2)
          min = mid;
          else
          max = mid;
          mid = (max + min) / 2;
          }
          return Math.floor(d1 * 1000000000) / 1000000000;
          }

          public double getErr(int[] score, String cancerous, double threshold) {
          double result = 0;
          for (int i = 0; i < score.length; i++) {
          double d = score[ i ] - threshold;
          char c = cancerous.charAt(i);
          if (d > 0 && c == 'N' || d < 0 && c == 'C') {
          result += d * d;
          }
          }
          return result / score.length;
          }
          }



          對它的正確性沒有充分驗證過,因為
          d2 = getErr(score, cancerous, mid + (max - min) / 1000000000);
          我只是想知道向x軸正方向走一小步看看拋物線的走向是向上還是向下。如果這一小步恰好跨過了拋物線頂點的話對方向的判斷有可能就是錯的,不過這樣的事件發生的概率實在是太小了。
          參數驗證沒有做,如果給錯誤參數的話,有可能拋異常(cancerous串太短的話),也有可能忽略錯誤的數據(cancerous太長或者不完全由N和C構成)。題目中沒有明確的提出應該怎么處理這樣的數據,由它去吧。
          emu的最終解法 emu 2005-08-16 09:39  
          趕上秋水無恨第一次的解法了,時間復雜度o(1)。

          public class HouseParty {
          public static void main(String[] args) {
          HouseParty hp = new HouseParty();
          //hp.maxArea(3,0,0);
          long startBy = System.currentTimeMillis();
          System.out.println("(8, 0, 0):"+hp.maxArea(8, 0, 0));
          System.out.println("(7, 0, 1):"+hp.maxArea(7, 0, 1));
          System.out.println("(9, 8, 2):"+hp.maxArea(9, 8, 2));
          System.out.println("(6, 23, 13):"+hp.maxArea(6, 23, 13));
          System.out.println("(16, 0, 4):"+hp.maxArea(16, 0, 4));
          System.out.println("(16, 2, 1):"+hp.maxArea(16, 2, 1));
          System.out.println("(16, 4, 4):"+hp.maxArea(16, 4, 4));
          System.out.println("(1024, 324, 4):"+hp.maxArea(1024, 324, 4));
          System.out.println("(9, 0, 3):"+hp.maxArea(9, 0, 3));
          System.out.println("time used:" + (System.currentTimeMillis() - startBy));
          }
          public int maxArea(int numReg, int numWin, int numDoor) {
          int width = 0;
          int length = 0;
          if (numDoor>4) numDoor =4;
          if (numReg<6) return 0;
          if (numDoor<1) return 0;
          if (numReg+numWin+numDoor<8) return 0;
          if (numDoor>1) {
          width = 1;
          length = 3;
          numReg -= 6;
          numDoor -= 2;
          }else if (numWin>1){
          width = 1;
          length = 3;
          numReg -= 6;
          numDoor -= 1;
          numWin -= 1;
          }else{
          width = 1;
          length = 3;
          numReg -= 7;
          numDoor -= 1;
          }
          if (numDoor >=2 && numReg>=2){
          if (width<length) width += 2; else length += 2;
          numDoor -= 2;
          numReg -= 2;
          }

          if (numWin >=2 && numReg>=2){
          int n = Math.min(numWin,numReg)/2;
          int m = n/2; n -= m;
          if (width<length) {
          width += n*2;
          length += m*2;
          } else{
          width += m*2;
          length += n*2;
          }
          numWin -= 2*(n+m);
          numReg -= 2*(n+m);
          }

          if (numDoor >=1 && numWin >=1 && numReg>=2){
          if (width<length) width += 2; else length += 2;
          numWin -= 1;
          numDoor -= 1;
          numReg -= 2;
          }
          if ((numDoor >=1 || numWin >=1) && numReg>=3){
          if (width<length) width += 2; else length += 2;
          numReg -= 3;
          }
          if (numReg>=2){
          int n = numReg/2;
          int m = n/2; n -= m;
          if (width<length) {
          width += n;
          length += m;
          } else{
          width += m;
          length += n;
          }
          }
          return width*length*16;
          }
          }

          emu第二次的解法 emu 2005-08-16 09:37  
          這次時間復雜度降到了o〔n),結果也正確了,從代碼可以看得清思路。


          public class HouseParty {
              public static void main(String[] args) {
                  HouseParty hp = new HouseParty();
                  long startBy = System.currentTimeMillis();
                  System.out.println("(50,50,50):" + hp.maxArea(50, 50, 50));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("(8, 0, 0):" + hp.maxArea(8, 0, 0));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("(8, 1, 1):" + hp.maxArea(8, 1, 1));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("(7, 0, 1):" + hp.maxArea(7, 0, 1));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("(9, 8, 2):" + hp.maxArea(9, 8, 2));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("(6, 23, 13):" + hp.maxArea(6, 23, 13));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("(16, 0, 4):" + hp.maxArea(16, 0, 4));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("(16, 2, 1):" + hp.maxArea(16, 2, 1));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("(16, 4, 4):" + hp.maxArea(16, 4, 4));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("(9, 0, 3):" + hp.maxArea(9, 0, 3));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("(8, 0, 4):" + hp.maxArea(8, 0, 4));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("(9, 1, 2):" + hp.maxArea(9, 1, 2));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("(9, 2, 1):" + hp.maxArea(9, 2, 1));
                  System.out.println("biggest room:" + hp.biggestRoom);
                  System.out.println("time used:" + (System.currentTimeMillis() - startBy));

              }

              public Room biggestRoom;
              public int maxArea(int numReg, int numWin, int numDoor) {
                  biggestRoom = null;
                  if (numReg < 6)
                      return 0;
                  if (numDoor < 1)
                      return 0;
                  if (numReg + numWin + numDoor < 8)
                      return 0;
                  Room initialRoom = null;
                  if (numDoor > 1) {
                      initialRoom = new Room("RDR", "R", "RDR", "R");
                      numReg -= 6;
                      numDoor -= 2;
                  } else if (numWin > 0) {
                      initialRoom = new Room("RDR", "R", "RWR", "R");
                      numReg -= 6;
                      numDoor -= 1;
                      numWin -= 1;
                  } else {
                      initialRoom = new Room("RDR", "R", "RRR", "R");
                      numReg -= 7;
                      numDoor -= 1;
                  }

                  if (numDoor >= 2 && numReg >= 2) {
                      initialRoom.appendWalls("DR", "DR");
                      numDoor -= 2;
                      numReg -= 2;
                  } else if (numDoor >= 1) {
                      if (numWin >= 1 && numReg >= 2) {
                          initialRoom.appendWalls("DR", "WR");
                          numWin -= 1;
                          numDoor -= 1;
                          numReg -= 2;
                      } else if (numReg >= 3) {
                          initialRoom.appendWalls("DR", "RR");
                          numDoor -= 1;
                          numReg -= 3;
                      }
                  }

                  while (numWin >= 2 && numReg >= 2) {
                      initialRoom.appendWalls("WR", "WR");
                      numWin -= 2;
                      numReg -= 2;
                  }
                  if (numWin >= 1 && numReg >= 3) {
                      initialRoom.appendWalls("WR", "RR");
                      numWin -= 1;
                      numReg -= 3;
                  } while (numReg >= 2) {
                      initialRoom.appendWalls("R", "R");
                      numReg -= 2;
                  }
                  biggestRoom = initialRoom;
                  return initialRoom.getArea() * 16;
              }


              private class Room {
                  StringBuffer east, south, west, north;
                  public Room(String east, String south, String west, String north) {
                      this.east = new StringBuffer(east);
                      this.south = new StringBuffer(south);
                      this.west = new StringBuffer(west);
                      this.north = new StringBuffer(north);
                  }

                  public int getArea() {
                      return east.length() * south.length();
                  }

                  public String toString() {
                      return "east:" + east + "\tsouth:" + south + "\twest:" + west +
                              "\tnorth:" + north;
                  }

                  public void appendWalls(String w1, String w2) {
                      if (east.length() < south.length()) {
                          east.append(w1);
                          west.append(w2);
                      } else {
                          south.append(w1);
                          north.append(w2);
                      }
                  }
              }
          }

          <script>
          function Int(n){return Math.floor(n)};
          function min(n,m){return Math.min(n,m)};
          function maxArea(numReg,numWin,numDoor){
           if(numDoor<1 || numReg<4 )
            return 0;
           var l,x=1,y=1;//x,y表示長和寬
           if(numDoor>4)numDoor=4;numReg-=4;
           var nUsed=min(numReg,numDoor+numWin);//用的門窗的總合
           
           if(nUsed%2)//如果是1或3,則補足2的倍數
           if(numReg-1>nUsed){//如果墻夠用來代替門窗
            if((0==(numReg%2))&&(1==(nUsed%4))&&(nUsed>1))--nUsed;else//(12,4,1)bug
            {numReg-=1;++nUsed;}//則多用一個門窗
           }else --nUsed;//若不夠,則少用一個門窗

           if(nUsed==0)return 0;//(5,5,5)bug

           if(l=Int(nUsed/4))//先添加到四面
           {
            x+=l*2;y+=l*2;//2=一個門窗加一個墻
            numReg-=l*4;nUsed%=4;//每面都要用墻,故*4
           }
           if(nUsed==2)
           {
            numReg-=2;//減去和門窗對應的墻
            x+=2;//先添加給一邊,因為目前兩邊還一樣長
            if(numReg>=2){numReg-=2;y+=1;}//如果墻有多余的,先給另一邊加1,盡量相同
           }

           if(l=Int(numReg/4))//先添加到四面
           {
            x+=l;y+=l;//這時只加了一個墻
            numReg-=l*4;//但一樣每面都要用墻,故*4
           }
           if(numReg>1)//多出來的分兩邊
           {
            numReg-=2;//只有一面加墻
            if(x>y)y+=1;else x+=1;
           }
           return x*y*16;
          }

          document.write("8,0,0=",maxArea(8,0,0), "<br>");
          document.write("8,0,1=",maxArea(8,0,1), "<br>");
          document.write("9,8,2=",maxArea(9,8,2), "<br>");
          document.write("6,23,13=",maxArea(6,23,13), "<br>");
          </script>

          emu 第一次的解法 emu 2005-08-16 09:34  
          窮舉法。其中用了3進制代替多重循環遍歷。時間復雜度超過題目要求,失敗!


          import java.util.*;

          public class HouseParty {
          public static void main(String[] args) {
          HouseParty hp = new HouseParty();
          //hp.maxArea(3,0,0);
          long startBy = System.currentTimeMillis();
          /*
          System.out.println(hp.maxArea(7, 0, 1));
          System.out.println("biggest room:" + hp.biggestRoom);
          System.out.println(hp.maxArea(9, 8, 2));
          System.out.println("biggest room:" + hp.biggestRoom);
          System.out.println(hp.maxArea(6, 23, 13));
          System.out.println("biggest room:" + hp.biggestRoom);
          */
          System.out.println("(16, 0, 4):"+hp.maxArea(16, 0, 4));
          System.out.println("biggest room:" + hp.biggestRoom);
          System.out.println("(16, 2, 1):"+hp.maxArea(16, 2, 1));
          System.out.println("biggest room:" + hp.biggestRoom);
          System.out.println("(16, 4, 4):"+hp.maxArea(16, 4, 4));
          System.out.println("biggest room:" + hp.biggestRoom);
          System.out.println("time used:" + (System.currentTimeMillis() - startBy));
          }

          private int numReg, numWin, numDoor;
          private int REG = 0, WIN = 1, DOOR = 2;
          private Room biggestRoom = null;
          public int maxArea(int numReg, int numWin, int numDoor) {
          if (numDoor == 0)
          return 0;
          if (numReg < 4)
          return 0;
          if (numDoor > 4)
          numDoor = 4;
          if (numWin > numReg / 2)
          numWin = numReg / 2;
          this.numReg = numReg;
          this.numWin = numWin;
          this.numDoor = numDoor;
          ArrayList possibleWalls = getPossibleWals(numReg / 2 , numWin,1);
          int result = getMaxArea(possibleWalls);
          return result * 16;
          }

          private ArrayList getPossibleWals(int numReg, int numWin, int numDoor) {
          ArrayList result = new ArrayList();
          if (numWin > numReg / 2 - 1)
          numWin = numReg / 2 - 1;
          if (numDoor > 1)
          numDoor = 1;
          int wallMaxLength = numReg + numWin + numDoor;
          for (int wallLength = 1; wallLength < wallMaxLength; wallLength++) {
          for (int i = 0, n = new Double(Math.pow(3, wallLength)).intValue();
          i < n; i++) { //這樣窮舉的效率很低,應用遞歸檢查
          Wall wall = new Wall();
          wall.wall = new int[wallLength];
          int tmp = i;
          for (int j = 0; j < wallLength; j++) {
          wall.wall[j] = tmp % 3;
          tmp = tmp / 3;
          }
          if (wall.checkRule()) {
          result.add(wall);
          }
          }
          }
          return result;
          }

          private int getMaxArea(ArrayList possibleWalls) {
          int wallCount = possibleWalls.size();
          int result = 0;
          for (int iWallEast = 0; iWallEast < wallCount; iWallEast++) {
          Wall east = (Wall) possibleWalls.get(iWallEast);
          for (int iWallWest = 0; iWallWest < wallCount; iWallWest++) {
          Wall west = (Wall) possibleWalls.get(iWallWest);
          if (east.wall.length != west.wall.length)
          continue;
          if (east.wall.length != west.wall.length)
          continue;
          if (east.getRegCount() + west.getRegCount() > numReg)
          continue;
          if (east.getWinCount() + west.getWinCount() > numWin)
          continue;
          if (east.getDoorCount() + west.getDoorCount() > numDoor)
          continue;
          for (int iWallSouth = 0; iWallSouth < wallCount; iWallSouth++) {
          Wall south = (Wall) possibleWalls.get(iWallSouth);
          if (east.getRegCount() + west.getRegCount() +
          south.getRegCount() > numReg)
          continue;
          if (east.getWinCount() + west.getWinCount() +
          south.getWinCount() > numWin)
          continue;
          if (east.getDoorCount() + west.getDoorCount() +
          south.getDoorCount() > numDoor)
          continue;
          for (int iWallNorth = 0; iWallNorth < wallCount; iWallNorth++) {
          Wall north = (Wall) possibleWalls.get(iWallNorth);
          if (south.wall.length != north.wall.length)
          continue;
          if (east.getRegCount() + west.getRegCount() +
          south.getRegCount() + north.getRegCount() > numReg)
          continue;
          if (east.getWinCount() + west.getWinCount() +
          south.getWinCount() + north.getWinCount() > numWin)
          continue;
          if (east.getDoorCount() + west.getDoorCount() +
          south.getDoorCount() + north.getDoorCount() >
          numDoor)
          continue;
          if (east.getDoorCount() + west.getDoorCount() +
          south.getDoorCount() + north.getDoorCount() < 1)
          continue;
          Room room = new Room(east, south, west, north);
          if (room.getArea() > result) {
          result = room.getArea();
          biggestRoom = room;
          }
          }
          }
          }
          }
          return result;
          }

          private class Wall {
          public int[] wall;
          public int[] combinationCount;
          public int getRegCount() {
          return combinationCount[REG];
          }

          public int getWinCount() {
          return combinationCount[WIN];
          }

          public int getDoorCount() {
          return combinationCount[DOOR];
          }

          public String toString() {
          char[] tmp = new char[] {'R', 'W', 'D'};
          String result = "";
          for (int i = 0; i < wall.length; i++)
          result += tmp[wall[ i ]];
          return result;

          }

          public boolean checkRule(){
          this.combinationCount = new int[3];
          if (wall[0] == DOOR)
          return false;
          if (wall[wall.length - 1] == DOOR)
          return false;
          if (wall[0] == WIN)
          return false;
          if (wall[wall.length - 1] == WIN)
          return false;
          for (int i = 0, n = wall.length; i < n; i++)
          if (wall[ i ] == WIN && (wall[i - 1] != REG || wall[i + 1] != REG))
          return false;
          else
          combinationCount[wall[ i ]]++;
          if (getRegCount() < 1)
          return false;
          if (getRegCount() > numReg)
          return false;
          if (getWinCount() > numWin)
          return false;
          if (getDoorCount() > numDoor)
          return false;
          if (getDoorCount() > 1)
          return false;
          return true;
          }
          }


          private class Room {
          Wall east, south, west, north;
          public Room(Wall east, Wall south, Wall west, Wall north) {
          this.east = east;
          this.south = south;
          this.west = west;
          this.north = north;
          }

          public int getArea() {
          if (east.wall.length != west.wall.length)
          return 0;
          if (south.wall.length != north.wall.length)
          return 0;
          if (east.getRegCount() + west.getRegCount() + south.getRegCount() +
          north.getRegCount() > numReg)
          return 0;
          if (east.getWinCount() + west.getWinCount() + south.getWinCount() +
          north.getWinCount() > numWin)
          return 0;
          if (east.getDoorCount() + west.getDoorCount() + south.getDoorCount() +
          north.getDoorCount() > numDoor)
          return 0;
          if (east.getDoorCount() + west.getDoorCount() + south.getDoorCount() +
          north.getDoorCount() < 1)
          return 0;
          return east.wall.length * south.wall.length;

          }

          public String toString() {
          return "east:" + east + "\tsouth:" + south + "\twest:" + west +
          "\tnorth:" + north;
          }
          }
          }


          >>import Java.util.Hashtable;

          Java這個包是樓主自己寫的吧?我只知道有個java.util.Hashtable

          >>Map allDrivers =; 這也能編譯通過?
          不只jboss和eclipse是免費的,java也是免費的,但是我們都還在靠java混飯吃呢,這倒沒什么不妥。

          從來沒有人證明過不可能有銀彈,這也不是問題。目標過于遠大?這更不成其為問題了。

          剩下的問題我認為才是真正的問題。普元再強,你能強得過微軟去?windows上面的軟件大半不是微軟出品的,用java開發的軟件也大半不是sun出品的,可是普元上面的構件卻基本上是普元出品的。雖然我們自己也可以開發構建,但是這不是一個開放的標準,我們如果這樣做了自己的利益得不到保障,誰會去這樣做呢?所以普元這個封閉的標準造成了他只能閉門造車,想幫他忙豐富他的構件庫的人都無從下手。普元開發能力再強能開發出來多少種構件呢?

          我覺得普元想做大,唯一的出路就是吧開發和應用環境都免費開放,最好干脆開源,并免費開放目前的大多數可以通用化的構件,在他的主導下創建并維護一個社群,讓每個人都可以用EOS獲取自己的利益,然后他可以以定制構件和生產出售在EOS平臺上的軟件來盈利。

          如果他不這樣做,我相信他的競爭對手遲早也會這么做。事實上,如果我是個沒有生存壓力的自由程序員,我現在也許已經在這么做了。

          在他轉向開放之前,我沒有辦法再看好他。
          題目真夠難的,一個鐘頭完成3道題的,都是些什么人?。。?/div>
          找到原因了,原來每次競賽的競賽平臺版本都不同的,我下的Competition Arena 是google在2月的競賽平臺,它視圖去連的2月競賽服務器,難怪死的很難看。
          re: JIRA 發布 3.2.3版了 emu 2005-08-09 16:17  
          指的是 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103041

          jira在3.1的時候這樣聲明:
          JDK 1.5 has a bug that prevents JIRA from processing mail correctly. Until the issue is resolved, JIRA does not support JDK 1.5. We recommend you use JDK 1.4.x but it is possible to continue with JDK 1.5 by restarting the server with option \'-Dallow.jdk.1.5=true\'. You can find the JDK bug at http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103041

          哈哈,jdk1.5是大勢所趨,jira犟了幾天終于還是投降了。
          re: 關于方舟子的爭論 emu 2005-08-09 14:16  
          不懂就不要瞎摻和!

          要證明徐業林的“無偏二極管”就是永動機不用照方舟和何院士,我就可以。所謂第二類永動機就是指可以依靠單一熱源做功的熱機,“無偏二極管”從空氣中獲得熱量來輸出電流,因此就是第二類永動機。

          其實所謂的“無偏二極管”和最原始的第二類永動機原型(從空氣或者海水中獲得熱量來做功的熱機)并無二致。任振球(中國氣象科學研究院研究員) 陳其翔(北京聯合大學教授) 孫文鵬(核工業北京地質研究院研究員) 李世輝(總參工程兵第四設計研究院高級工程師)這幾個《無偏二極管不是“永動機”》的作者應該好好學習一下熱力學和再發表他們的高論。他們提出的“熱力學第二定律成立必須滿足的嚴格的限定條件”和在原始的第二類永動機原型上同樣適用,他們應該先回顧一下歷史上其他的第二類永動機失敗的原因再反思他們的高論能否成立。(http://www.gmw.cn/01gmrb/2005-04/21/content_219445.htm)
          想不出什么情形下需要用到。
          王俊28日進倉 emu 2005-08-03 09:14  
          王俊28日進倉
          作者: Administrator
          2005-07-29
          王俊28日下午進倉,預計將在無菌倉內化療10日左右,之后進行骨髓移植手術。

          王俊妹妹王燚從工行和招行帳戶中取款12萬元,與其他8萬元一起作為手術押金交納給北大醫院。王燚在10日后也將住院1-2日作移植。屆時將由王俊的其他親屬負責照顧。

          目前暫定于在術后一周(8月15日左右)結束募捐活動。據悉在術后7-10日即可得知手術成功與否。讓我們祝福王俊吧~ 這20天,你要加油哦~

          re: 關于復用的一點感想 emu 2005-08-02 09:31  
          技術在人腦子里面啊。
          每個人都在頭疼這個問題 emu 2005-08-02 09:18  
          我們有一組同事一個多月前開始做一個示范項目,公司的原目的是在項目中積累一些通用的模塊和框架,可是就我現在看來,他們一群人都撲上去趕進度了,通用性?還是下回再說吧。

          也許換種方式和框架,可重用性能得到一些提高?也許我們應該多關注一下soa了?
          re: 感受BOINC emu 2005-08-01 13:48  
          我讀計算機純粹是個誤會,高考報的全部院校的第一志愿都是填的物理專業,第二才是計算機,跟別人反著來的,想著實在讀不成物理了讀計算機也將就,誰知道最后還真的讀不成物理了跑去讀計算機,可惜了一個大好物理人才。
          完啦? emu 2005-08-01 13:45  
          你手頭的好東東還真多
          java的正則沒怎么玩過,jscript中的特殊字符有以下11個。

          $ 匹配輸入字符串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,請使用 \$。
          ( ) 標記一個子表達式的開始和結束位置。子表達式可以獲取供以后使用。要匹配這些字符,請使用 \( 和 \)。
          * 匹配前面的子表達式零次或多次。要匹配 * 字符,請使用 \*。
          + 匹配前面的子表達式一次或多次。要匹配 + 字符,請使用 \+。
          . 匹配除換行符 \n之外的任何單字符。要匹配 .,請使用 \。
          [ 標記一個中括號表達式的開始。要匹配 [,請使用 \[。
          ? 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 \?。
          \ 將下一個字符標記為或特殊字符、或原義字符、或向后引用、或八進制轉義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("。
          ^ 匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配 ^ 字符本身,請使用 \^。
          { 標記限定符表達式的開始。要匹配 {,請使用 \{。
          | 指明兩項之間的一個選擇。要匹配 |,請使用 \|。
          >>這還不是我理想的java,只要是Object賦值,都要可以:
          >>MyClass myobj = obj0:

          其實在動態類型里面應該是在對任何變量賦任何值的時候都
          myobj = obj0:

          或者
          var myobj = obj0:

          最次的也是
          Object myobj = obj0:

          如果還限定MyClass 那就還是強類型語言了。
          2個多月過去了,不知道樓主有什么進展?

          我覺得于組件技術的要害首先是組件基礎設施,包括主要的運行框架,組件的接口和協議。這個設計要先做好了,在它的基礎上開發組件才有成功的希望。直接創建組件庫的作用是不大的。所以按照我的理解,你的論文題目首先是關于組件基礎設施的。

          《業務構件工廠》(http://www.csdn.net/primeton/download/factory.rar)不知道樓主有沒有看過?
          深圳 emu 2005-07-28 14:11  
          在深圳,做過程序員,開過公司,有過非常好的朋友,也有過不怎么樣的,住過黃木崗那么爛的房子,也在梅林水庫邊上最舒服的房子里住過,過過非常開心的日子,不開心的日子也有過,吃過山天和巴蜀風,也曾窮的開不起飯,絕色的網友mm也見過,恐龍當然也見過,還見過csdn上的絕頂高手,淘過美國村的各種小玩意兒,在大梅沙游過泳,在南山頂吹過清新的海風,太多太多的回憶難以忘懷。
          re: 這個城進的好困難 emu 2005-07-28 13:48  
          現在進來這么難啊?我原來申請好像是自動受理的,剛申請就自動開通了。
          >>>>map裡面放值可以進一步控制類型,比如什麼key只能放什麼類型的value.
          >>泛型不是已經能實現了嗎!?

          呵呵Dennis 看混了。什么key只能放什么類型的value是不大可能被支持的?,F實應用中的key的可能性是無窮多的,即使相同的key在不同的應用中也有不同的含義,而且一個key在一個容器里面只能對應一個對象,所以從語言層面上在key和value之間建立這樣的關聯是無法想像的,goldrain只是在鉆牛角尖而已。
          re: Java5.0,越來越死板的java emu 2005-07-28 11:49  
          >>>>編譯當然不去能排除所以錯誤,但是所有能夠在編譯期排除的錯誤都沒有理由留到調試的時候去發現
          >>代價難道是增加一門語言的復雜度?
          你可以選擇的,多接受一個語言概念,少一些犯錯誤的可能性,或者相反。我想任何一個做過中等以上規模項目的人都知道怎么選擇的代價更大。

          >>現在的動態類型語言如python連變量的類型都不用定義了,
          >>而且還不是一樣那么多的追隨者,一樣做大型的項目,
          >>甚至很多人都已經開始懷疑我們到底要強類型還是弱類型,
          >>要編譯語言還是腳本語言了。java卻一意孤行,在復雜的道路上越走越遠...這么發展下去,再出個java6.0,7.0,不知到又會增加怎樣的功能,但結果是顯然的:java將越來越復雜!

          java6就會支持至少3種動態語言了,如果你高興還有很多開源項目會幫你支持更多的。但是弱類型和腳本語言也有它的代價。沒有編譯期類型檢查的支持,做大的軟件項目和負責的應用是不可想像的。而且腳本語言的運行效率暫時也不可能像jvm的運行效率這樣芝麻開花節節高。反編譯一個groovy腳本編譯成的class文件來讀一讀你就會看到,動態類型造成了多大的代價。而當前摩爾定律正在面臨失效……

          >>語言究竟要簡單還是要復雜?沒有泛型前的我們真的很需要泛型么?

          沒有人喜歡復雜的語言的,但是怎么樣才是真正的簡單是個值得思考的問題。泛型在我看來恰恰讓語言更簡單了。我們不用自己去做煩瑣的類型檢查而同時也不用擔心我們api的調用者往我們容器里面亂放東西了,更不要說節省我們沒有作類型檢查而費盡心思去調試程序找出錯誤調用的代價。
          >>而5.0加入的泛型就顯得多余,java控制了變量的類型還不夠,還想通吃List,Map中的類型控制。本來List,Map只要對象就能放進去,加道控制不是自己給自己設卡么。有幾個開發會犯這種錯誤……

          不是這樣的。5.0沒有通吃List,Map中的類型控制,他只是提供了泛型這個手段,沒有強制你一定要轉到泛型上。

          >>有幾個開發會犯這種錯誤,就算設錯了類型,這種錯誤到運行期讓它拋出就是了,沒必要對原本簡單的語法大作文章,你難道想在編譯期就排除所有錯誤么

          如果你的包將發布給你不知道的人使用,你就要對他們有可能范的錯誤盡可能做好準備而不是一相情愿的相信沒幾個開發者會犯錯誤。這中錯誤在編譯期發現和運行期發現處理的代價相差是非常巨大的。編譯當然不去能排除所以錯誤,但是所有能夠在編譯期排除的錯誤都沒有理由留到調試的時候去發現(很多時候甚至調試時都發現不了)。
          >>本標簽只支持jdk1.5,及其通過jndi獲得數據庫連接!!

          wow!一個標簽還要處理數據庫連接,還要獲得sql語句,和底層綁定的太多,實用倒實用了,通用性呢?
          原來也想過做相同的東西,但是關鍵問題沒有想通。其實displaytag的開發者倒也未必沒想過這個問題,但是可能要找一個漂亮簡單通用的解決方案真的不大容易吧。

          如果一次不把全部數據交給displaytag去分頁,那么在翻頁的時候就要重新進行查詢,那么displaytag就不得不和數據訪問部分綁定,這樣標簽就沒有辦法通用化了。

          我很有興趣的是大明白的displaytagpro怎么解決翻頁的時候重新查詢呢?

          就是demo里面的displaytagpro.jar文件對嗎?怎么不提供原碼?
          我現在在成都發展,一時間還回不了深圳,天天盼啊。
          那天聽說google有衛星地圖,趕快就上去看了深圳了,看到以前工作學習過的那些地方,不禁感慨。
          我們搞的技術好像差不多。一直在關注你的blog。
          曉得在深圳,深圳哪里啊?我在深圳也住過2年,搬過10次家 :-P
          >>很多Java框架是幫我們省去很多繁雜的操作,解決我們實際開發中共同遇到的問題的,關鍵是你能不能理解到這個共同的實際問題是什么

          好!
          買在哪里???
          嘻嘻,這篇隨筆居然上了七月的程序員雜志。
          re: 關于時間穿梭 emu 2005-07-22 19:06  
          突然想起一個問題,假如熱力學箭頭反轉而心理學箭頭不反轉,那么我們其實沒有辦法分別現在的宇宙是在膨脹還是收縮……也許我們現在的前進方向根本就是反的呢?
          re: 關于時間穿梭 emu 2005-07-22 18:57  
          與時間穿梭有關的一個話題是時間反演:在遙遠的未來,宇宙膨脹結束后繼以收縮,時間箭頭反轉(熱力學箭頭會反轉,但是心理學箭頭也會嗎?存疑),一切開始反演,我們腐爛的尸體也重新變得新鮮,然后心臟又開始跳動,反演我們的一生之后鉆回媽媽肚子里面結束這一生(我的天?。。辽傥锢韺W上是沒有矛盾的。

          不過現在的天文觀測表明宇宙繼續在加速膨脹(而不是減速),因此很可能我們不會再回來。

          還有蟲洞,我想物理學最終不會容許破壞因果關系的現在出現的……不過也難說,量子邏輯這么古怪的怪胎畢竟都誕生了,說不定有一天新的“蟲洞邏輯”也會出現呢?
          王俊近況及募捐情況報告
          作者: Administrator
          2005-07-22
          7月18日,王俊由于牙齒發炎,拔了一顆牙。另由于醫院無菌倉被其他病人占用,尚無法預約。因此還需要休養一段時間才能夠預定手術時間。目前王俊打算再次回家休養。

          7月19日,《競報》采訪了王俊,登載報道:博客總動員拯救程序員王俊,日前已在人民網等媒體轉載。

          王俊的照片參見: http://blog.donews.com/xinhaiguang/archive/2005/07/18/471058.aspx

          7月20日,募捐款達到10萬(不含親友借款)

          王俊托我們向大家說:感謝所有的哥們
          re: Tencent Messenger (continued) emu 2005-07-18 18:46  
          原以為大胃這樣的高手是不用金山詞霸的呢。
          TT跟金山詞霸也有沖突。他們兩家人是不是鬧什么矛盾?。勘舜硕际亲盍餍械膰a軟件,居然沒有彼此做過兼容性測試?
          斷線跟電信網絡這段時間不穩定有關吧。
          我有個朋友現在都改用手機上QQ了,7*24在線,因為現在動感地帶的一個套餐是gprs10元包月不限時不限流量。
          re: EJB 3.0 vs Spring emu 2005-07-15 13:44  
          改起來總沒有寫起來麻煩??梢栽趙ord里面編輯好了粘貼到blog里面。要突出的評論也不一定要通過顏色。
          re: EJB 3.0 vs Spring emu 2005-07-15 13:23  
          鐵手的批注很好看,可惜粉紅色很難看,斜體也很難看。
          出于開發成本考慮,老板總是希望工程師無所不會,這樣才能減少成本嘛?!才會出現很多招聘廣告上這樣寫道“精通A,B,C,D,E。。。。,工作經驗2年”薪水卻只開到2K。這樣的事天天發生。是覺得可笑嗎?還是覺得悲哀。是覺得人事部門的問題,還是該公司的技術管理著根本就不懂?;蛘呔褪抢习宓膯栴}。不,這是市場的問題。同一個軟件,規模和功能幾乎一樣,在國內買個10萬,很高了,在英國賣到60萬英鎊。呵呵,這就是市場。市場就絕對正確嗎?可是房價天天漲,現在畢業的程序員,看著房價怎的不愁?NND.
          愁啊,雖然畢業多年了,一樣愁。市場變成現在的樣子,不是沒有原因的。
          re: iBatis2.1 emu 2005-07-15 12:21  
          快兩個月過去了,對iBatis SqlMap 的研究有否進展?
          re: String pool emu 2005-07-15 12:19  
          >>我們比較兩個String的值,最好用equals()方法,而最好不要使用==

          結論是對的,但是跟string pool沒什么關系。

          >>另外,聲明String的時候,最好用=,這樣就可以體現String pool的作用了。

          結論也是對的,但是這樣做不是為了體現String pool的作用而是避免重復創建對象。
          re: Java中的隨機數應用 emu 2005-07-13 16:08  
          不需要取模吧。直接random.nextInt(100)就可以了嘛:

          ...
          * @param n the bound on the random number to be returned. Must be
          * positive.
          * @return a pseudorandom, uniformly distributed <tt>int</tt>
          * value between 0 (inclusive) and n (exclusive).
          * @exception IllegalArgumentException n is not positive.
          * @since 1.2
          */

          public int nextInt(int n) {
          ...
          作者: 冰云(BJUG)
          2005-07-11
          目前帳戶中總額達到了14萬左右,其中8萬左右為各位朋友的募捐,6萬左右是王俊親友的借款。另有一些朋友直接將錢交到了王俊家人手中,再加上他自己原本借到的一些,已經基本湊足了20萬手術費。

          具體帳戶數目請參見:http://befresh.bjug.org/content/view/20/3/

          王俊已經向醫生預約了手術,11日就將進入醫院做全面的術前身體檢查,并將一直住院直到康復。具體手術時間需要視王俊體檢情況和醫院的安排來定,目前暫無法得知。手術押金將在手術時間確定后繳納。

          手術后將是最危險的一段時間,由于白細胞皆被化療殺死,病人將非常脆弱,免疫力極其低下,必須住在無菌病房中。再加上術后的排異藥物,術后保健等,仍需要一些資金支持。(以上醫學知識本人只是了解大概,可能不太準確)

          因此我們的目標為30萬。在這里再次呼吁我們其它同樣有愛心的兄弟姐妹們,我們已經籌集了到了20萬(包括親屬籌集),但是還有10萬的缺口需要補齊,希望能得到您的幫助。我們也在用其他的方式進行籌集,相信不久,我們就能夠湊夠所有的治療費用。

          讓我們一起為王俊祈禱,祝他早日康復吧。

          同時,感謝所有獻出愛心的朋友,祝福你們:
          http://befresh.bjug.org/content/view/12/12/


          re: 關于方舟子的爭論 emu 2005-07-08 09:03  
          嘿嘿,emu(鴯鹋)跟鴕鳥倒恰好是一家。
          re: 關于Generics的一點兒理解 emu 2005-07-07 14:19  
          可是你說的是泛形帶來的其他問題,而這個問題其實不是泛形帶來的。
          re: 關于方舟子的爭論 emu 2005-07-07 13:26  
          daniel 只是和 emu 觀點不同而已,并不是糨糊腦袋,我猜想他是看到了發愣分子或者其他一些方舟的對頭編造的謠言。不過具體是什么樣的謠言我也很好奇。
          re: 關于Generics的一點兒理解 emu 2005-07-06 18:27  
          這是jdk1.5一個已經報告的bug:
          http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103041


          問題在于在jdk1.5中Timestamp多定義了一個比較方法:

          public int compareTo(java.util.Date o) {
          return compareTo((Timestamp)o);
          }

          這樣如樓主所說,在1.4中Timestamp.compareTo(Date)的時候會調用繼承來的Date.compareTo(Date)方法來完成比較,而Date.compareTo(Date)在比較前會把參數造型成Date對象,因此可以完成比較;而在1.5中Timestamp則直接使用自己的Timestamp.compareTo(Date)方法來比較,并試圖在其中把參數造型成Timestamp,因此拋出造型異常。

          但是這并不像樓主想像的,“Generics也會帶來一些其他的問題”,而是sun有意為之??瓷厦孢@個compareTo方法的相關說明:

          // This forwarding method ensures that the compareTo(Date) method defined
          // in java.util.Date is not invoked on a Timestamp

          顯然sun認為1.4中的做法是不對的,下定決心在以放棄兼容性為代價在1.5中更正這個錯誤,而不是一個bug(真的要修復這個bug的話只要把上面這個方法刪掉就行了)。sun堅持的正好就是樓主說的原則問題:只比較具有相同類型的兩個對象

          放棄兼容性的代價就是有一些在1.4下面正常的代碼在1.5下面不能允許了,包括大名鼎鼎的JIRA。對此JIRA的反應是:

          JDK 1.5 has a bug that prevents JIRA from processing mail correctly. Until the issue is resolved, JIRA does not support JDK 1.5. We recommend you use JDK 1.4.x but it is possible to continue with JDK 1.5 by restarting the server with option \'-Dallow.jdk.1.5=true\'. You can find the JDK bug at http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103041


          可是JIRA想要等“issue is resolved”那一天恐怕等不著了,這是個原則問題嘛 :)

          共9頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 
          主站蜘蛛池模板: 信宜市| 峡江县| 民和| 绍兴县| 文登市| 敖汉旗| 米泉市| 邵东县| 阿巴嘎旗| 屯门区| 灵璧县| 麻江县| 新巴尔虎右旗| 桦甸市| 嘉禾县| 沧州市| 额济纳旗| 天长市| 驻马店市| 呈贡县| 双柏县| 怀仁县| 保定市| 阿勒泰市| 南宁市| 桂东县| 土默特左旗| 呼和浩特市| 宁河县| 大连市| 德令哈市| 永善县| 泰来县| 隆尧县| 揭西县| 南开区| 青州市| 刚察县| 海林市| 望江县| 琼中|