2009/12/17

[Java]カード配り問題に挑戦

■ カード配り問題に挑戦

qune: プログラミングメモ - カード配り問題とか
10分で終わると聞いてやってみました。
結局20分かかりました...。

■ ソースコード

public class Cards {
 public String[] deal(int numPlayers, String deck){
  String[] playerCards = new String[numPlayers];
  int cardNum = deck.length();
  
  //配列初期化
  for(int i = 0; i < numPlayers; i++){
   playerCards[i] = "";
  }
  
  //プレイヤーに同じ数のカードを配るために、余るカードは抜けておく
  int amari = cardNum % numPlayers; 
  deck = deck.substring(0, cardNum - amari);
  cardNum = deck.length();
  
  //一人に一枚づつすら配れない場合は誰にもカードを配らない
  if(cardNum == 0){ return playerCards; }
  
  //カードを配る
  for(int i = 0; i < cardNum; i++){
   playerCards[i%numPlayers] += deck.charAt(i);
  }
  
  //結果を返す
  return playerCards;
 }
}

public class CardsTest {
 public static void main(String[] args) {
  int numPlayers;
  String deck;
  String[] results;
  
  Cards cards = new Cards();

  //例1
  numPlayers = 6;
  deck = "012345012345012345";
  //Returns: {"000", "111", "222", "333", "444", "555" }
  results = cards.deal(numPlayers, deck);
  
  for(String result : results){
   System.out.print("\""+result+"\" ");
  }
  System.out.println();

  //例2
  numPlayers = 4;
  deck = "111122223333";
  //Returns: {"123", "123", "123", "123" }

  results = cards.deal(numPlayers, deck);
  
  for(String result : results){
   System.out.print("\""+result+"\" ");
  }
  System.out.println();

  //例3  
  numPlayers = 1;
  deck = "012345012345012345";
  //Returns: {"012345012345012345" }

  results = cards.deal(numPlayers, deck);
  
  for(String result : results){
   System.out.print("\""+result+"\" ");
  }
  System.out.println();
  
  //例4
  numPlayers = 6;
  deck = "01234";
  //Returns: {"", "", "", "", "", "" }

  results = cards.deal(numPlayers, deck);
  
  for(String result : results){
   System.out.print("\""+result+"\" ");
  }
  System.out.println();
  
  //例5
  numPlayers = 2;
  deck = "";
  //Returns: {"", "" }

  results = cards.deal(numPlayers, deck);
  
  for(String result : results){
   System.out.print("\""+result+"\" ");
  }
  System.out.println();
 }
}

■ 出力結果

"000" "111" "222" "333" "444" "555" 
"123" "123" "123" "123" 
"012345012345012345" 
"" "" "" "" "" "" 
"" "" 
ソースが無駄に長かった...。
そして別にsubstringする必要が無かった...orz
//プレイヤーに同じ数のカードを配るために、余るカードは抜けておく
int amari = cardNum % numPlayers; 
deck = deck.substring(0, cardNum - amari);
cardNum = deck.length();
上記は無駄。以下でokであることを確認...orz
cardNum -= cardNum % numPlayers;
いちいち文字列を作り直さないで、for文の繰り替えし数で調整すればいいじゃない。という話。うへぇ。

2009/12/05

[普通の日記]レイアウトがひどい

ファイル名とかコマンドとかいっぱいでてくる場合は気をつけないなぁ...。

[Debian]ネットにつながらなくなりました...。

■ ネットにつながらなくなりました...。

 インストール後しばらくは普通に使えていたのですがねぇ...。
dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3
 こんな感じのがひたすら表示されていく感じ。IPを静的割当にしてもつながらない、というかルータへの ping すら通らないという...。
 取り合えず ifconfig。eth0 の認識を確認。それと同時にものすごい勢いで増えていく損失パケット(dropped)を確認。

■ 原因をさぐる

 やっぱり google 検索。「debian ifconfig 損失」で検索。 NIC のドライバがおかしいとこうなるらしい。Debian が NIC 用にロードしたモジュールが、実際はその NIC に対応していなかったって感じ?

■ NIC のドライバをインストールしよう

 今回の本題。
・このノートパソコンの NIC は何だ?
 初めのうちはきちんと動いているみたいだったから特に調べてませんよ? PC の型番で検索をかけて NIC の型番を調べる。
 NIC = Realtek RTL 8168D/8111D Family PCI-E GBE NIC
 (【NVIDIA ION】ドスパラ Prime Note Cresion NA まとめページ【Atom 330】 - スペックより)
 そういえばさっき調べたページでも蟹さんはちょっとアレという話題がでていたなぁ。
・ドライバ入手
 Realteck のホームページから r8168-8.015.00.tar.bz2 をダウンロード。解凍、READMEを読む。ふむ、ビルドにはヘッダやら何やら、新たにパッケージをインストールする必要があるらしい。
・必要なパッケージのダウンロード
 カーネルヘッダーパッケージが必要らしい。自分が使っているカーネルは 2.6.26-2-amd64(?) だから、ダウンロードするのは「linux-headers-2.6.26-2-amd64」。
 もちろん aptitude とか使えないので、別 PC にて手動ダウンロード。debian パッケージの内容を検索(http://www.debian.org/distrib/packages#search_packages) で「linux-headers-2.6.26-2」を検索し、「linux-headers-2.6.26-2-amd64」パッケージをダウンロード。芋づる式に依存パッケージ、依存パッケージの依存パッケージ...とか、全部もってくる。
 もってきたパッケージを USB 経由で debian へ。
・必要なパッケージのインストール
 もってきたパッケージがすべて揃っているディレクトリで、dpkg。
: dpkg -i *
 何か言われると思ったけれどすんなり完了しました。
・ドライバのビルド
 間違ってロードされているモジュールの削除。
: rmmod r8169
 正しいモジュールのビルド
: make clean modules
: make install
 変更の適用(?)
: depmod -a
 正しいモジュールのロード
: modprobe r8168
 確認
: ifconfig -a
・ドライバの自動ロード設定
 mkinitramfs で、起動時に r8168 をロードしてくれる initrd を作成する。
: mkinitramfs -o initrd.img-2.6.26-2-amd64 2.6.26-2-amd64
 元の initrd のバックアップをとったのち、今作った initrd を /boot に突っ込む。
: mv /boot/initrd.img-2.6.26-2-amd64 /boot/initrd.img-2.6.26-2-amd64.bkup
: mv initrd.img-2.6.26-2-amd64 /boot/
 これで、起動時に自動で r8168 をロードしてくれる。...はず。

■ ネットにつながるようになりました!

 めでたしめでたし。