善と悪


112

結果-2014年7月19日

丘の現在の王は、傭兵ユーザーによるFabigler!エントリーを提出し続け、彼を王位からノックオフ!

スコアボードを表示するにはここをクリックしてください。

2014年7月19日以前に提出されたプログラムが含まれていました。他のすべての提出物は、将来の試験に含まれます。8月9日頃に新しい結果が投稿されるので、十分な時間が取れます。


兄弟が描いたイラスト 私の兄弟であり、サバンナ芸術大学の新卒者であるクリス・レインボルトによるイラスト

前書き

天使と悪魔は戦っており、いつものように、彼らの戦場として地球を使用しています。人間は真ん中で立ち往生しており、味方につけざるを得ません。未知の中立部隊は、負けた側のために一貫して戦う人々に報いる。

ゲーム

各トライアルでは、擬似ランダムにペアリングされ、その後20〜30件の他のサブミッションとシャッフルされます。各トライアルは1000ラウンドで構成されます。各ラウンドでは、入力が渡され、出力を生成することが期待されます。出力が記録され、スコアリングされます。このプロセスは1000回繰り返されます。

入力

各プレイヤーの過去の投票を表す単一の引数を受け取ります。ラウンドはコンマで区切られます。A 0はそのラウンドで悪に味方したプレイヤーを表します。A 1は、Goodの側にいるプレイヤーを表します。トライアル内では、プレーヤーは常に同じ順序になります。独自の投票が含まれますが、明示的には識別されません。例えば:

101,100,100

この例では、3つのラウンドが完了し、3人のプレイヤーが競います。プレイヤー1は常にGoodの味方です。プレイヤー2は常に邪悪な味方です。プレイヤー3は、ラウンド1のGoodからラウンド2および3のEvilに交換しました。それらのプレイヤーの1人はあなたでした。

出力

Javaの提出

  • goodGoodの側にしたい場合は、文字列を返します。
  • evilEvilを味方にしたい場合は、文字列を返します。

非Java提出

  • goodGoodの側にしたい場合は、文字列をstdoutに出力します。
  • evilEvilを味方にしたい場合は、文字列をstdoutに出力します。

プログラムが他の何かを出力または返す場合、例外をスローする場合、コンパイルしない場合、またはこのマシンで何かを出力するのに1秒以上かかる場合は、失格となります。

得点

スコアはGoogleドキュメントのスプレッドシートに投稿され、現在のすべてのエントリを編集できるようになるとすぐに見やすくなります。心配しないでください-あなたがプログラムを提出し続ける限り、私はトライアルを実行し続けます!

  • ラウンド中に多数派でサイディングする場合、3ポイントを受け取ります。
  • ラウンド中にマイノリティと一緒にサイディングすると、n-1ポイントを受け取ります。ここで、nは、マイノリティと一緒に過ごした連続回数です。

スコアは5回の試行の中央値になります。各試行は1000ラウンドで構成されています。

成果物

非Java提出

一意のタイトル、プログラム、およびプログラムを実行するWindowsコマンドライン文字列を送信する必要があります。引数がその文字列に追加される可能性があることに注意してください。例えば:

  • python Angel.py
    • これには引数がないことに注意してください。これはラウンド1です!これに備えてください。
  • python Angel.py 11011,00101,11101,11111,00001,11001,11001

Javaの提出

一意のタイトルと、以下に記述する抽象Humanクラスを拡張するJavaクラスを提出する必要があります。

public abstract class Human {
    public abstract String takeSides(String history) throws Exception;
}

テスト中

独自の提出をテストする場合は、こちらの手順に従ってください。

その他の注意事項

必要な数の異なる提出物を提出できます。共謀していると思われる提出物は失格となります。この問題の著者は、この課題の唯一の裁判官になります。

プログラムまたはJavaクラスの新しいインスタンスは、呼び出されるたびに作成されます。ファイルに書き込むことで情報を保持できます。独自のクラス以外の構造や動作を変更することはできません。

トライアルが始まる前にプレイヤーはシャッフルされます。デーモンとエンジェルはすべてのトライアルに参加します。プレーヤーの数が偶数の場合、Petyr Baelishも参加します。悪魔は悪を求めて戦い、天使は善を求め、ペティルバエリッシュは擬似ランダム側を選びます。


2
コメントは廃止され、OPの要求に応じて削除されました。削除を取り消す必要があるコメントがある場合は通知してください。
ドアノブ

7
うわー、OPはユーザー名を変更します。では、結果はいつ表示されますか?
2014

6
@Rainboltこれは、このチャレンジを実行する仕事の1つの異常な地獄でなければなりません!このように注意を払う理由は、プロトコルとルールが単純であり、アクセスしやすく、シンプルで作業可能なエントリを許可しているためです。TL; DR:あなたの挑戦は良すぎる!:D
tomsmeding 14

3
@dgel私は、生データ、上位、下位、平均、そしておそらく折れ線グラフを投稿します。そうすれば、競争が進んだときに誰がより良くなったかを見ることができます。
レインボルト14

6
ポッドの1つは、毎回同じ方法で投票する10のエントリになりました。その結果、2人のユーザーが約450,000の完全または「完全に1ラウンド不足」スコアになりました。同じエントリは、他の試験で約1900を記録しました。平均スコアは2000に近い。結果の極端な不均衡のため、より意味のある数を中央値とすることにしました。チャレンジを編集して、5回の試行の後、勝者が最高の中央値を持つ提出物になるようにしました。平均値から中央値への移動が不公平であるか、それ以外の選択肢として不適切だと思う人がいる場合は、コメントしてください。
レインボルト14

回答:


11

Mer兵

常に最後のラウンドで最も多くのお金を払った人のそばにいます。

善良な人々が統計的にもっと稼ぐことを考慮に入れる。

package Humans;
public class Mercenary extends Human {
    public String takeSides(String history) {
        // first round random!
        if (history.length() == 0) {
            return Math.random() >= 0.5 ? "good" : "evil";
        }

        String[] rounds = history.split(",");
        String lastRound = rounds[rounds.length - 1];

        double goodMoneyPaid = 0;
        double evilMoneyPaid = 0;
        for (char c : lastRound.toCharArray()) {
                switch (c) {
                case '0':
                    goodMoneyPaid = goodMoneyPaid + 0.2; //statistically proven: good people have more reliable incomes
                    break;
                case '1':
                    evilMoneyPaid++; 
                    break;
                default:
                    break;
                }
        }

        if (goodMoneyPaid > evilMoneyPaid)
        {
            return "good";
        } else {
            return "evil";
        }
    }
}

2
これはお金について何かを言う2番目の投稿です。参照などがありませんか?
レインボルト

確かに、この男はさらに邪悪な野郎です。お金のためだけに仲間を捨てる。
fabigler

switchステートメントにデフォルトのケースのreturnステートメントが欠落していたため、コンパイルされませんでした。ランダムなものを追加しました。
レインボルト14

4
おめでとう、キングオブザヒル!このエントリーが勝つ方法がわかりません。300の評判バウンティが関連付けられているので、説明を追加してください。
レインボルト14

4
おそらくバグ、または私はコメントと説明を誤解しましたが、Mer兵は実際には意図したことをしていません。最初のランダムラウンドを除き、前のラウンドで1/6未満の人が悪に投票した場合を除き、彼は常に悪の側にいます。
jaybz 14

39

ヒップスター、ルビー

if ARGV.length == 0
    puts ["good", "evil"].sample
else
    last_round = ARGV[0].split(',').last
    n_players = last_round.length
    puts last_round.count('1') > n_players/2 ? "evil" : "good"
end

他のすべてが主流であるという理由だけで、最終ラウンドの少数派に単純になります。

のように走る

ruby hipster.rb

30

ペティル・バエリッシュ

Petyr Baelishが誰の側にいるのか、あなたは決して知りません。

package Humans;

/**
 * Always keep your foes confused. If they are never certain who you are or 
 * what you want, they cannot know what you are likely to do next.
 * @author Rusher
 */
public class PetyrBaelish extends Human {

    /**
     * Randomly take the side of good or evil.
     * @param history The past votes of every player
     * @return A String "good" or "evil
     */
    public String takeSides(String history) {
        return Math.random() < 0.5 ? "good" : "evil";
    }
}

このエントリは、プレーヤーの数が偶数の場合にのみ含まれます。これにより、常に過半数になることが保証されます。


28
Petyr Baelishの側では、明らかに。
クトゥルフ14

2
@Kevinそれは一貫してほとんどのボットを打ち負かしています。通常、27点です。
cjfaure 14

3
@Kevinこのエントリは、チャレンジの作者によって提出されました。うまくやるつもりはなかった。偶数のプレイヤーでは同点になる可能性があるため、常に過半数になるようにするために存在します。
レインボルト14

4
なんてこった、なぜこれが一番票を得たのか?それはただ公平ではありません
tomsmeding

3
@tomsmedingいいえ。Gameof Thronesからの引用です。
レインボルト14

29

C ++、メタサイエンティスト

これは基本的にThe Scientistと同じですが、ラウンド全体ではなく、個々のプレイヤーで動作します。ウェーブ(または定数関数)を各プレイヤーに個別にマッピングし、次のラウンドでの動きを予測しようとします。結果のラウンド予測から、メタサイエンティストは過半数のように見える側を選択します。

#include <iostream>
#include <utility>
#include <cstdlib>
#include <cstring>
#if 0
#define DBG(st) {st}
#else
#define DBG(st)
#endif

#define WINDOW (200)

using namespace std;

int main(int argc,char **argv){
    if(argc==1){
        cout<<(rand()%2?"good":"evil")<<endl;
        return 0;
    }
    DBG(cerr<<"WINDOW="<<WINDOW<<endl;)
    int nump,numr;
    nump=strchr(argv[1],',')-argv[1];
    numr=(strlen(argv[1])+1)/(nump+1);
    int period,r,p;
    int score,*scores=new int[WINDOW];
    int max; //some score will always get above 0, because if some score<0, the inverted wave will be >0.
    int phase,phasemax;
    int predicted=0; //The predicted number of goods for the next round
    int fromround=numr-WINDOW;
    if(fromround<0)fromround=0;
    pair<int,int> maxat; //period, phase
    DBG(cerr<<"Players:"<<endl;)
    for(p=0;p<nump;p++){
        DBG(cerr<<" p"<<p<<": ";)
        for(r=fromround;r<numr;r++)if(argv[1][r*(nump+1)+p]!=argv[1][p])break;
        if(r==numr){
            DBG(cerr<<"All equal! prediction="<<argv[1][p]<<endl;)
            predicted+=argv[1][(numr-1)*(nump+1)+p]-'0';
            continue;
        }
        max=0;
        maxat={-1,-1};
        for(period=1;period<=WINDOW;period++){
            scores[period-1]=0;
            phasemax=-1;
            for(phase=0;phase<2*period;phase++){
                score=0;
                for(r=fromround;r<numr;r++){
                    if(argv[1][r*(nump+1)+p]-'0'==1-(r+phase)%(2*period)/period)score++;
                    else score--;
                }
                if(score>scores[period-1]){
                    scores[period-1]=score;
                    phasemax=phase;
                }
            }
            if(scores[period-1]>max){
                max=scores[period-1];
                maxat.first=period;
                maxat.second=phasemax;
            }
            DBG(cerr<<scores[period-1]<<" ";)
        }
        DBG(cerr<<"(max="<<max<<" at {"<<maxat.first<<","<<maxat.second<<"})"<<endl;)
        DBG(cerr<<"     prediction: 1-("<<numr<<"+"<<maxat.second<<")%(2*"<<maxat.first<<")/"<<maxat.first<<"="<<(1-(numr+maxat.second)%(2*maxat.first)/maxat.first)<<endl;)
        predicted+=(1-(numr+maxat.second)%(2*maxat.first)/maxat.first);
    }
    DBG(cerr<<"Predicted outcome: "<<predicted<<" good + "<<(nump-predicted)<<" evil"<<endl;)
    if(predicted>nump/2)cout<<"evil"<<endl; //pick minority
    else cout<<"good"<<endl;
    delete[] scores;
    return 0;
}

デバッグステートメントを有効にする場合は、行の読み取り値#if 0をに変更し#if 1ます。

コンパイルしてg++ -O3 -std=c++0x -o MetaScientist MetaScientist.cpp(警告は必要ないのでno -Wall)実行しますMetaScientist.exe(もちろん引数を含めることもできます)。本当にいい質問をしたら、Windows実行可能ファイルを提供できます。

編集:どうやら、以前のバージョンはゲームに約600ラウンドの時間を使い果たしたようです。これはそうすべきではありません。その時間の消費は#define WINDOW (...)回線によって制御され、より多くはより遅くなりますが、さらに後方に見えます。


2
負けた側を選んでみてください。常に正しく推測できる場合は、ラウンドごとに3ポイント以上を獲得できます。
ケビン14

1
@Kevinそれは本当ですが、間違った側をかなり早く推測する可能性があると考えました。そして、常に過半数を正しくするよりも改善するためには、負けている側を連続して7回以上正しく推測する必要があります。でも変更するかもしれません。
tomsmeding

1
@Kevinまた、Rusherがこの週末にスコアボードを獲得したとき、彼がOPへのコメントで示したように、これらがどうなるか(科学者とメタ科学者)を最初に見たいです。ラッシャー、申し訳ありませんが、私はすべてのものを自分でコンパイルするのが
面倒

3
心配ない!とにかくこれらを実行することはおそらく安全ではありません。インターネット上の50人の見知らぬ人によって書かれたコードでマシンを台無しにさせてください。
レインボルト14

1
@Kevinしかし、それはそうだMANY!確かにできますが、好きではありません。これらがどうなるか見てみます。
tomsmeding

26

天使

すべての中で最も純粋なプレーヤー。

プログラム

print "good"

コマンド

python Angel.py

22
Pythonは良い言語です。天使がそれを使用するのは当然のことのようです。
jpmc26 14

23
Pythonがヘビであることを人々に思い出させてください。蛇。
ミスターリスター14

3
@MrLister神が彼を天から追い出す前にルシファーは偉大な天使だったことを思い出させてください。
ジボブズ14

1
@Zibbobzうん...本当に残念なことに、彼らは落ちた。彼らは一緒に多くを達成することができたかもしれません。
ミスターリスター14

24

アルテミス・ファウル

package Humans;

public class ArtemisFowl extends Human {
    public final String takeSides(String history) {
        int good = 0, evil = 0;
        for(int i = 0; i < history.length(); i++)   {
            switch(history.charAt(i))   {
                case '0': evil++; break;
                case '1': good++; break;
            }
        }
        if(good % 5 == 0){
           return "good";
        } else if (evil % 5 == 0){
           return "evil";
        } else {
           if(good > evil){
              return "good";
           } else if(evil > good){
              return "evil";
           } else {
              return Math.random() >= 0.5 ? "good" : "evil";
           }
        }
    }
}

ブック7、アトランティス・コンプレックスではアルテミス・ファウルは心理的疾患(アトランティス・コンプレックスと呼ばれる)にかかったため、5の倍数ですべてを行うことを余儀なくされました(話す、行動など)。5の倍数でそれができなかったとき、彼はパニックに陥りました。私は基本的にそれをします:善か悪(意図的なバイアス)が5で割り切れるかどうかを確認し、どちらもそうでない場合、私はパニックし、どちらが大きいかを見て、それで実行するか、さらにパニックし、ランダムに選択します。


4
中学でアルテミス・ファウルを読んだとき、2冊の本しかありませんでした。現在7つあり、ディズニーが映画になっているのは嬉しいことです。
レインボルト14

1
実際には8冊の本があります。
カイルカノス14

7
もっと陽気(あなたは時の車輪を読んでいる場合を除き)
Rainbolt

1
そして、あなたはあなたの忘れていbreak;switch
johnchen902 14

1
@ johnchen902、@ Manu:私はJavaの経験があまりありません(Fortran90 +を使用していますが、ここではJavaしか表示されません)。1時間以内にオフィスに着いたら、それらを修正します。
カイルカノス14

19

嫌気性

奇数は恐ろしいです。

package Humans;

public class Disparnumerophobic extends Human {
    public final String takeSides(String history) {
        int good = 0, evil = 0;
        for(int i = 0; i < history.length(); i++)   {
            switch(history.charAt(i))   {
                case '0': evil++; break;
                case '1': good++;
            }
        }
        if(good%2 == 1 && evil%2 == 0)  return "evil";
        if(evil%2 == 1 && good%2 == 0)  return "good";
        // well shit.... 
        return Math.random() >= 0.5 ? "good" : "evil";
    }
}

17
コメントは私を笑わせた。
phyrfox 14

17

ライナス、ルビー

常にパターンを壊すことにより、アナリストを混乱させようとします

num_rounds = ARGV[0].to_s.count(',')
LINUS_SEQ = 0xcb13b2d3734ecb4dc8cb134b232c4d3b2dcd3b2d3734ec4d2c8cb134b234dcd3b2d3734ec4d2c8cb134b23734ecb4dcd3b2c4d232c4d2c8cb13b2d3734ecb4dcb232c4d2c8cb13b2d3734ecb4dc8cb134b232c4d3b2dcd3b2d3734ec4d2c8cb134b234dcd3b2d3734ec4d2c8cb134b23734ecb4dcd3b2c4d2c8cb134b2
puts %w[good evil][LINUS_SEQ[num_rounds]]

名前を付けて保存しlinus.rbて実行ruby linus.rb


16

バックパッカー

一致する少数派を最も多く選択したプレイヤーを決定し、最後の投票を選択します。

package Humans;

public class BackPacker extends Human {
    // toggles weather the BackPacker thinks majority is better vs. minority is better
    private static final boolean goWithMajority = false;

    @Override
    public final String takeSides(String history)  {
        if (history == null || history.equals(""))
            return "evil";
        String[] roundVotes = history.split(",");
        int players = roundVotes[0].length();
        int[] winningPlayers = new int[players];
        for (String nextRound : roundVotes) {
            boolean didGoodWin = didGoodWin(nextRound, players);
            for (int player = 0; player < nextRound.length(); player++) {
                boolean playerVotedGood = nextRound.charAt(player) == '1';
                winningPlayers[player] += didPlayerWin(didGoodWin, playerVotedGood);
            }
        }
        int bestScore = -1;
        for (int nextPlayer : winningPlayers)
            if (bestScore < nextPlayer)
                bestScore = nextPlayer;
        int bestPlayer = 0;
        for (int ii = 0; ii < players; ii++) {
            if (winningPlayers[ii] == bestScore) {
                bestPlayer = ii;
                break;
            }
        }
        if (roundVotes[roundVotes.length - 1].charAt(bestPlayer) == '1')
            return "good";
        return "evil";
    }

    private int didPlayerWin(boolean didGoodWin, boolean playerVotedGood) {
        if(goWithMajority) {
            return ((didGoodWin && playerVotedGood) || (!didGoodWin && !playerVotedGood)) ? 1 : 0;
        } else {
            return ((!didGoodWin && playerVotedGood) || (didGoodWin && !playerVotedGood)) ? 1 : 0;
        }
    }

    private boolean didGoodWin(String round, int players) {
        int good = 0;
        for (char next : round.toCharArray())
            good += next == '1' ? 1 : 0;
        return (good * 2) > players;
    }
}

CrowdFollower

一致する過半数を最も多く選択したプレイヤーを決定し、最後の投票を選択します。

package Humans;

public class CrowdFollower extends Human {
    // toggles weather the FrontPacker thinks majority is better vs. minority is better
    private static final boolean goWithMajority = true;

    @Override
    public final String takeSides(String history)  {
        if (history == null || history.equals(""))
            return "evil";
        String[] roundVotes = history.split(",");
        int players = roundVotes[0].length();
        int[] winningPlayers = new int[players];
        for (String nextRound : roundVotes) {
            boolean didGoodWin = didGoodWin(nextRound, players);
            for (int player = 0; player < nextRound.length(); player++) {
                boolean playerVotedGood = nextRound.charAt(player) == '1';
                winningPlayers[player] += didPlayerWin(didGoodWin, playerVotedGood);
            }
        }
        int bestScore = -1;
        for (int nextPlayer : winningPlayers)
            if (bestScore < nextPlayer)
                bestScore = nextPlayer;
        int bestPlayer = 0;
        for (int ii = 0; ii < players; ii++) {
            if (winningPlayers[ii] == bestScore) {
                bestPlayer = ii;
                break;
            }
        }
        if (roundVotes[roundVotes.length - 1].charAt(bestPlayer) == '1')
            return "good";
        return "evil";
    }

    private int didPlayerWin(boolean didGoodWin, boolean playerVotedGood) {
        if(goWithMajority) {
            return ((didGoodWin && playerVotedGood) || (!didGoodWin && !playerVotedGood)) ? 1 : 0;
        } else playerVotedGood                return ((!didGoodWin && good) || (didGoodWin && !playerVotedGood)) ? 1 : 0;
        }
    }

    private boolean didGoodWin(String round, int players) {
        int good = 0;
        for (char next : round.toCharArray())
            good += next == '1' ? 1 : 0;
        return (good * 2) > players;
    }
}

非常にきれいなプログラム!
レインボルト14

おっと、あなたのプログラムを別の言語でコピーしたかもしれません。
PyRulez

@Rusher私は、コードを更新し、2つのエントリを持つ1としてこれを追加したいgoWithMajority = trueと1そのfalse。大丈夫ですか、またはこのために2つ目のBackPackerを追加する必要がありますか?
アンジェロフックス14

@AngeloNeuschitzerこの投稿を編集しました。このように、両方の提出物を追加することを忘れません。私が与えた本当に創造的ではない名前を変更することをお勧めします。必要に応じて両方に説明を追加することもできます。
レインボルト14

1
@Rainbolt実際、FrontPackerの方が好きです。笑
tomsmeding

15

占い師

これはまだ進行中の作業です。まだテストしていません。OPがルールに違反しているかどうかを確認したかっただけです。

アイデアは、他のすべての参加者を数回実行して結果の確率を取得し、それに応じて行動することにより、次のラウンドをシミュレートすることです。

package Humans;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import sun.net.www.protocol.file.FileURLConnection;

public class FortuneTeller extends Human {

/**
 * Code from http://stackoverflow.com/a/22462785 Private helper method
 *
 * @param directory The directory to start with
 * @param pckgname The package name to search for. Will be needed for
 * getting the Class object.
 * @param classes if a file isn't loaded but still is in the directory
 * @throws ClassNotFoundException
 */
private static void checkDirectory(File directory, String pckgname,
        ArrayList<Class<?>> classes) throws ClassNotFoundException {
    File tmpDirectory;

    if (directory.exists() && directory.isDirectory()) {
        final String[] files = directory.list();

        for (final String file : files) {
            if (file.endsWith(".class")) {
                try {
                    classes.add(Class.forName(pckgname + '.'
                            + file.substring(0, file.length() - 6)));
                } catch (final NoClassDefFoundError e) {
                // do nothing. this class hasn't been found by the
                    // loader, and we don't care.
                }
            } else if ((tmpDirectory = new File(directory, file))
                    .isDirectory()) {
                checkDirectory(tmpDirectory, pckgname + "." + file, classes);
            }
        }
    }
}

/**
 * Private helper method.
 *
 * @param connection the connection to the jar
 * @param pckgname the package name to search for
 * @param classes the current ArrayList of all classes. This method will
 * simply add new classes.
 * @throws ClassNotFoundException if a file isn't loaded but still is in the
 * jar file
 * @throws IOException if it can't correctly read from the jar file.
 */
private static void checkJarFile(JarURLConnection connection,
        String pckgname, ArrayList<Class<?>> classes)
        throws ClassNotFoundException, IOException {
    final JarFile jarFile = connection.getJarFile();
    final Enumeration<JarEntry> entries = jarFile.entries();
    String name;

    for (JarEntry jarEntry = null; entries.hasMoreElements()
            && ((jarEntry = entries.nextElement()) != null);) {
        name = jarEntry.getName();

        if (name.contains(".class")) {
            name = name.substring(0, name.length() - 6).replace('/', '.');

            if (name.contains(pckgname)) {
                classes.add(Class.forName(name));
            }
        }
    }
}

/**
 * Attempts to list all the classes in the specified package as determined
 * by the context class loader
 *
 * @param pckgname the package name to search
 * @return a list of classes that exist within that package
 * @throws ClassNotFoundException if something went wrong
 */
private static ArrayList<Class<?>> getClassesForPackage(String pckgname)
        throws ClassNotFoundException {
    final ArrayList<Class<?>> classes = new ArrayList<Class<?>>();

    try {
        final ClassLoader cld = Thread.currentThread()
                .getContextClassLoader();

        if (cld == null) {
            throw new ClassNotFoundException("Can't get class loader.");
        }

        final Enumeration<URL> resources = cld.getResources(pckgname
                .replace('.', '/'));
        URLConnection connection;

        for (URL url = null; resources.hasMoreElements()
                && ((url = resources.nextElement()) != null);) {
            try {
                connection = url.openConnection();

                if (connection instanceof JarURLConnection) {
                    checkJarFile((JarURLConnection) connection, pckgname,
                            classes);
                } else if (connection instanceof FileURLConnection) {
                    try {
                        checkDirectory(
                                new File(URLDecoder.decode(url.getPath(),
                                                "UTF-8")), pckgname, classes);
                    } catch (final UnsupportedEncodingException ex) {
                        throw new ClassNotFoundException(
                                pckgname
                                + " does not appear to be a valid package (Unsupported encoding)",
                                ex);
                    }
                } else {
                    throw new ClassNotFoundException(pckgname + " ("
                            + url.getPath()
                            + ") does not appear to be a valid package");
                }
            } catch (final IOException ioex) {
                throw new ClassNotFoundException(
                        "IOException was thrown when trying to get all resources for "
                        + pckgname, ioex);
            }
        }
    } catch (final NullPointerException ex) {
        throw new ClassNotFoundException(
                pckgname
                + " does not appear to be a valid package (Null pointer exception)",
                ex);
    } catch (final IOException ioex) {
        throw new ClassNotFoundException(
                "IOException was thrown when trying to get all resources for "
                + pckgname, ioex);
    }

    return classes;
}

private static boolean isRecursiveCall = false;
private static ArrayList<Class<?>> classes;

static {
    if (classes == null) {
        try {
            classes = getClassesForPackage("Humans");
        } catch (ClassNotFoundException ex) {

        }
    }    
}

private String doThePetyrBaelish() {
    return Math.random() >= 0.5 ? "good" : "evil";
}

@Override
public String takeSides(String history) {
    if (isRecursiveCall) {
        return doThePetyrBaelish();
    }
    isRecursiveCall = true;

    int currentRoundGoodCount = 0;
    float probabilityOfGood = 0;
    int roundCount = 0;
    int voteCount = 0;



    do {
        for (int i = 0; i < classes.size(); i++) {
            try {
                if (classes.get(i).getName() == "Humans.FortuneTeller") {
                    continue;
                }

                Human human = (Human) classes.get(i).newInstance();
                String response = human.takeSides(history);
                switch (response) {
                    case "good":
                        currentRoundGoodCount++;
                        voteCount++;
                        break;
                    case "evil":
                        voteCount++;
                        break;
                    default:
                        break;
                }
            } catch (Exception e) {
            }
        }

        probabilityOfGood = (probabilityOfGood * roundCount
                + (float) currentRoundGoodCount / voteCount) / (roundCount + 1);

        roundCount++;
        currentRoundGoodCount = 0;
        voteCount = 0;

    } while (roundCount < 11);

    isRecursiveCall = false;
    if (probabilityOfGood > .7) {
        return "evil";
    }
    if (probabilityOfGood < .3) {
        return "good";
    }

    return doThePetyrBaelish();
}

}

ボットが応答する前に各ターンで他のすべてのボットを実行する場合、応答するのに1秒以上かかりませんか?
plannapus

@plannapusこのボットの前提は、他の全員が注意を怠って1秒近く待つことを避けるということです。提出する価値があり、0.9秒間の待機で構成されるエントリが、「良い」を返す前に、彼を混乱させるだけの価値があると考えています。実際には、SBossは私にそれを打ち負かしました:D
scragar 14

うん!次に、そのボットをコードにブラックリストに追加する必要があります。それはイライラするでしょう...また、PythonやPerlのような異なる環境の異なるエントリでは、インタプリタの再ロードはこのコードを制限時間を超えるのに十分かもしれません。
アンドリス14

16
他の誰かがこれと同じことをすると、無限ループになります。
ブリリアンド14

4
提出がタイムアウトしました。プロファイラーを添付しましたが、半秒近くが提出物の呼び出しに費やされています。ただし、少なくとも動作しますので、おめでとうございます。
レインボルト

15

C ++、科学者

これは、ラウンドごとに多数派が選択したものの歴史wave(ラウンドでmajority()の多数派の選択を可能にします)で、波長2*periodと位相のデータに波を当てはめようとしphaseます。したがって、()0,1,1,1,0,1,0,1,1,1,0,0,0,1,0を選択すると、そのスコアはになります。すべての可能な期間にわたってループし、その期間のスコアが現在の最大値よりも高い場合、それが発生した対象を保存します。period=3, phase=5maxat=={3,5}9 3 11 5 5 3 5 7 9 7 7 7 7 7 7{period,phase}

次に、見つかった波を次のラウンドに外挿し、予測される多数決を取ります。

#include <iostream>
#include <utility>
#include <cstdlib>
#include <cstring>
#if 0
#define DBG(st) {st}
#else
#define DBG(st)
#endif

#define WINDOW (700)

using namespace std;

int majority(const char *r){
    int p=0,a=0,b=0;
    while(true){
        if(r[p]=='1')a++;
        else if(r[p]=='0')b++;
        else break;
        p++;
    }
    return a>b;
}

int main(int argc,char **argv){
    if(argc==1){
        cout<<(rand()%2?"good":"evil")<<endl;
        return 0;
    }
    DBG(cerr<<"WINDOW="<<WINDOW<<endl;)
    int nump,numr;
    nump=strchr(argv[1],',')-argv[1];
    numr=(strlen(argv[1])+1)/(nump+1);
    int fromround=numr-30;
    if(fromround<0)fromround=0;
    int period,r;
    int *wave=new int[WINDOW];
    bool allequal=true;
    DBG(cerr<<"wave: ";)
    for(r=fromround;r<numr;r++){
        wave[r-fromround]=majority(argv[1]+r*(nump+1));
        if(wave[r-fromround]!=wave[0])allequal=false;
        DBG(cerr<<wave[r]<<" ";)
    }
    DBG(cerr<<endl;)
    if(allequal){
        DBG(cerr<<"All equal!"<<endl;)
        if(wave[numr-1]==1)cout<<"evil"<<endl; //choose for minority
        else cout<<"good"<<endl;
        return 0;
    }
    int score,*scores=new int[WINDOW];
    int max=0; //some score will always get above 0, because if some score<0, the inverted wave will be >0.
    int phase,phasemax;
    pair<int,int> maxat(-1,-1); //period, phase
    DBG(cerr<<"scores: ";)
    for(period=1;period<=WINDOW;period++){
        scores[period-1]=0;
        phasemax=-1;
        for(phase=0;phase<2*period;phase++){
            score=0;
            for(r=fromround;r<numr;r++){
                if(wave[r]==1-(r+phase)%(2*period)/period)score++;
                else score--;
            }
            if(score>scores[period-1]){
                scores[period-1]=score;
                phasemax=phase;
            }
        }
        if(scores[period-1]>max){
            max=scores[period-1];
            maxat.first=period;
            maxat.second=phasemax;
        }
        DBG(cerr<<scores[period-1]<<" ";)
    }
    DBG(cerr<<"(max="<<max<<" at {"<<maxat.first<<","<<maxat.second<<"})"<<endl;)
    DBG(cerr<<" max: ("<<numr<<"+"<<maxat.second<<")%(2*"<<maxat.first<<")/"<<maxat.first<<"=="<<((numr+maxat.second)%(2*maxat.first)/maxat.first)<<endl;)
    if(1-(numr+maxat.second)%(2*maxat.first)/maxat.first==1)cout<<"evil"<<endl; //choose for minority
    else cout<<"good"<<endl;
    delete[] wave;
    delete[] scores;
    return 0;
}

コンパイルしてg++ -O3 -std=c++0x -o Scientist Scientist.cpp(警告は必要ないのでno -Wall)実行しますScientist.exe(もちろん引数を含めることもできます)。本当にいい質問をしたら、Windows実行可能ファイルを提供できます。

ああ、入力フォーマットをいじらないでください。そうでなければ、奇妙なことをします。

編集:どうやら、以前のバージョンはゲームに約600ラウンドの時間を使い果たしたようです。これはそうすべきではありません。その時間の消費は#define WINDOW (...)回線によって制御され、より多くはより遅くなりますが、さらに後方に見えます。


8
インターネット上の60人以上の見知らぬ人によって書かれた実行可能ファイルをダウンロードするのは、悪い考えのようです。
レインボルト

@Rusher私は完全に同意します。問題が必要な場合は、「ダミー」ガイドのステップ1です。私の申し出も:)
tomsmeding 14

2
これをコンパイルして(そして競争して)うまくいきました。
レインボルト14

14

コードランナー

そのため、面白くするために、投稿されたすべての回答からコードを自動的にダウンロードし、必要に応じてコンパイルし、ルールに従ってすべてのソリューションを実行するスクリプトを作成しました。この方法で、人々は彼らがどのように行っているかをチェックできます。このスクリプトをrun_all.py(BeautifulSoupが必要)に保存してから、次のようにします。

usage:
To get the latest code: 'python run_all.py get'
To run the submissions: 'python run_all.py run <optional num_runs>'

いくつかのこと:

  1. さらに多くの言語のサポートを追加する場合、または一部の言語のサポートを削除する場合は、を参照してくださいdef submission_type(lang)
  2. コンパイルが必要な言語であっても、スクリプトの拡張はかなり簡単です(参考文献を参照CPPSubmission)。言語タイプはメタコードタグから< !-- language: lang-java -- >取得されるため、コードを実行する場合は必ず追加してください(<>の前後の余分なスペースを削除します)。 更新:言語が定義されていない場合、言語を試行および検出するための非常に基本的な推論がいくつかあります。
  3. コードの実行にまったく失敗した場合、または割り当てられた時間内に終了しない場合、コードはblacklist.text将来のトライアルに自動的に追加され、削除されます。コードを修正する場合は、ブラックリストからエントリを削除して、再実行してくださいget

現在サポートされている言語:

 submission_types =  {
    'lang-ruby': RubySubmission,
    'lang-python': PythonSubmission,
    'lang-py': PythonSubmission,
    'lang-java': JavaSubmission,
    'lang-Java': JavaSubmission,
    'lang-javascript': NodeSubmission,
    'lang-cpp': CPPSubmission,
    'lang-c': CSubmission,
    'lang-lua': LuaSubmission,
    'lang-r': RSubmission,
    'lang-fortran': FortranSubmission,
    'lang-bash': BashSubmission
}

難しい話は抜きにして:

import urllib2
import hashlib
import os
import re
import subprocess
import shutil
import time
import multiprocessing
import tempfile
import sys
from bs4 import BeautifulSoup

__run_java__ = """
public class Run {
    public static void main(String[] args) {
        String input = "";
        Human h = new __REPLACE_ME__();
        if(args.length == 1)
            input = args[0];
        try {
            System.out.println(h.takeSides(input));
        }
        catch(Exception e) {
        }
    }
}
"""

__human_java__ = """
public abstract class Human {
    public abstract String takeSides(String history) throws Exception;
}
"""

class Submission():
    def __init__(self, name, code):
        self.name = name
        self.code = code

    def submissions_dir(self):
        return 'submission'

    def base_name(self):
        return 'run'

    def submission_path(self):
        return os.path.join(self.submissions_dir(), self.name)

    def extension(self):
        return ""

    def save_submission(self):
        self.save_code()

    def full_command(self, input):
        return []

    def full_path(self):
        file_name = "%s.%s" % (self.base_name(), self.extension())
        full_path = os.path.join(self.submission_path(), file_name)
        return full_path

    def save_code(self):    
        if not os.path.exists(self.submission_path()):
            os.makedirs(self.submission_path())

        with open(self.full_path(), 'w') as f:
            f.write(self.code)

    def write_err(self, err):
        with open(self.error_log(), 'w') as f:
            f.write(err)

    def error_log(self):
        return os.path.join(self.submission_path(), 'error.txt')

    def run_submission(self, input):
        command = self.full_command()
        if input is not None:
            command.append(input)
        try:
            output,err,exit_code = run(command,timeout=1)
            if len(err) > 0:
                self.write_err(err)
            return output
        except Exception as e:
            self.write_err(str(e))
            return ""

class CPPSubmission(Submission):
    def bin_path(self):
        return os.path.join(self.submission_path(), self.base_name())

    def save_submission(self):
        self.save_code()
        compile_cmd = ['g++', '-O3', '-std=c++0x', '-o', self.bin_path(), self.full_path()]
        errout = open(self.error_log(), 'w')
        subprocess.call(compile_cmd, stdout=errout, stderr=subprocess.STDOUT)

    def extension(self):
        return 'cpp'

    def full_command(self):
        return [self.bin_path()]

class CSubmission(Submission):
    def bin_path(self):
        return os.path.join(self.submission_path(), self.base_name())

    def save_submission(self):
        self.save_code()
        compile_cmd = ['gcc', '-o', self.bin_path(), self.full_path()]
        errout = open(self.error_log(), 'w')
        subprocess.call(compile_cmd, stdout=errout, stderr=subprocess.STDOUT)

    def extension(self):
        return 'c'

    def full_command(self):
        return [self.bin_path()]

class FortranSubmission(Submission):
    def bin_path(self):
        return os.path.join(self.submission_path(), self.base_name())

    def save_submission(self):
        self.save_code()
        compile_cmd = ['gfortran', '-fno-range-check', '-o', self.bin_path(), self.full_path()]
        errout = open(self.error_log(), 'w')
        subprocess.call(compile_cmd, stdout=errout, stderr=subprocess.STDOUT)

    def extension(self):
        return 'f90'

    def full_command(self):
        return [self.bin_path()]

class JavaSubmission(Submission):   
    def base_name(self):
        class_name = re.search(r'class (\w+) extends', self.code)
        file_name = class_name.group(1)
        return file_name

    def human_base_name(self):
        return 'Human'

    def run_base_name(self):
        return 'Run'

    def full_name(self, base_name):
        return '%s.%s' % (base_name, self.extension())

    def human_path(self):
        return os.path.join(self.submission_path(), self.full_name(self.human_base_name()))

    def run_path(self):
        return os.path.join(self.submission_path(), self.full_name(self.run_base_name()))

    def replace_in_file(self, file_name, str_orig, str_new):
        old_data = open(file_name).read()
        new_data = old_data.replace(str_orig, str_new)

        with open(file_name, 'w') as f:
            f.write(new_data)

    def write_code_to_file(self, code_str, file_name):
        with open(file_name, 'w') as f:
            f.write(code_str)

    def save_submission(self):
        self.save_code()
        self.write_code_to_file(__human_java__, self.human_path())
        self.write_code_to_file(__run_java__, self.run_path())

        self.replace_in_file(self.run_path(), '__REPLACE_ME__', self.base_name())
        self.replace_in_file(self.full_path(), 'package Humans;', '')

        compile_cmd = ['javac', '-cp', self.submission_path(), self.run_path()]
        errout = open(self.error_log(), 'w')
        subprocess.call(compile_cmd, stdout=errout, stderr=subprocess.STDOUT)

    def extension(self):
        return 'java'

    def full_command(self):
        return ['java', '-cp', self.submission_path(), self.run_base_name()]

class PythonSubmission(Submission):
    def full_command(self):
        return ['python', self.full_path()]

    def extension(self):
        return 'py'

class RubySubmission(Submission):
    def full_command(self):
        return ['ruby', self.full_path()]

    def extension(self):
        return 'rb'

class NodeSubmission(Submission):
    def full_command(self):
        return ['node', self.full_path()]

    def extension(self):
        return 'js'

class LuaSubmission(Submission):
    def full_command(self):
        return ['lua', self.full_path()]

    def extension(self):
        return 'lua'

class RSubmission(Submission):
    def full_command(self):
        return ['Rscript', self.full_path()]

    def extension(self):
        return 'R'

class BashSubmission(Submission):
    def full_command(self):
        return [self.full_path()]

    def extension(self):
        return '.sh'

class Scraper():
    def download_page(self, url, use_cache = True, force_cache_update = False):
        file_name = hashlib.sha1(url).hexdigest()

        if not os.path.exists('cache'):
            os.makedirs('cache')

        full_path = os.path.join('cache', file_name)
        file_exists = os.path.isfile(full_path)

        if use_cache and file_exists and not force_cache_update:
            html = open(full_path, 'r').read()
            return html

        opener = urllib2.build_opener()
        opener.addheaders = [('User-agent', 'Mozilla/5.0')]
        response = opener.open(url)
        html = response.read()

        if use_cache:
            f = open(full_path, 'w')
            f.write(html)
            f.close()

        return html

    def parse_post(self, post):
        name = post.find(text=lambda t: len(t.strip()) > 0)
        pre = post.find('pre')
        lang = pre.attrs['class'][0] if pre.has_attr('class') else None
        code = pre.find('code').text
        user = post.find(class_='user-details').find(text=True)
        return {'name':name,'lang':lang,'code':code,'user':user}

    def parse_posts(self, html):
        soup = BeautifulSoup(html)
        # Skip the first post
        posts = soup.find_all(class_ = 'answercell')
        return [self.parse_post(post) for post in posts]

    def get_submissions(self,  page = 1, force_cache_update = False):
        url = "http://codegolf.stackexchange.com/questions/33137/good-versus-evil?page=%i&tab=votes#tab-top" % page
        html = self.download_page(url, use_cache = True, force_cache_update = force_cache_update)
        submissions = self.parse_posts(html)
        return submissions

class Timeout(Exception):
    pass

def run(command, timeout=10):
    proc = subprocess.Popen(command, bufsize=0, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    poll_seconds = .250
    deadline = time.time()+timeout
    while time.time() < deadline and proc.poll() == None:
        time.sleep(poll_seconds)

    if proc.poll() == None:
        if float(sys.version[:3]) >= 2.6:
            proc.terminate()
        raise Timeout()

    stdout, stderr = proc.communicate()
    return stdout, stderr, proc.returncode


def guess_lang(code):
    if re.search(r'class .* extends Human', code):
        return 'lang-java'
    if re.search(r'import sys', code):
        return 'lang-python'
    if re.search(r'puts', code) and (re.search(r'ARGV', code) or re.search(r'\%w', code)):
        return 'lang-ruby'
    if re.search(r'console\.log', code):
        return 'lang-javascript'
    if re.search(r'program', code) and re.search(r'subroutine', code):
        return 'lang-fortran'
    if re.search(r'@echo off', code):
        return 'lang-bash'
    return None


def submission_type(lang, code):
    submission_types =  {
        'lang-ruby': RubySubmission,
        'lang-python': PythonSubmission,
        'lang-py': PythonSubmission,
        'lang-java': JavaSubmission,
        'lang-Java': JavaSubmission,
        'lang-javascript': NodeSubmission,
        'lang-cpp': CPPSubmission,
        'lang-c': CSubmission,
        'lang-lua': LuaSubmission,
        'lang-r': RSubmission,
        'lang-fortran': FortranSubmission,
        'lang-bash': BashSubmission
    }

    klass = submission_types.get(lang)

    if klass is None:
        lang = guess_lang(code)
        klass = submission_types.get(lang)

    return klass

def instantiate(submission):
    lang = submission['lang']
    code = submission['code']
    name = submission['name']

    klass = submission_type(lang, code)
    if klass is not None:
        instance = klass(name, code)
        return instance
    print "Entry %s invalid - lang not supported: %s" % (name, lang)
    return None

def get_all_instances(force_update):
    scraper = Scraper()

    print 'Scraping Submissions..'

    pages = [1,2,3]
    submissions_by_page = [scraper.get_submissions(page=i, force_cache_update=force_update) for i in pages]
    submissions = [item for sublist in submissions_by_page for item in sublist]

    # Get instances
    raw_instances = [instantiate(s) for s in submissions]
    instances = [i for i in raw_instances if i]

    print "Using %i/%i Submissions" % (len(instances), len(submissions))

    return instances

def save_submissions(instances):
    print 'Saving Submissions..'

    for instance in instances:
        instance.save_submission()

def init_game(save=True, force_update=False):
    instances = get_all_instances(force_update)
    if save:
        save_submissions(instances)
    return instances

def one_run(instances, input):
    valid = {
        'good': 1,
        'evil': 0
    }

    disqualified = []
    results = []

    for instance in instances:
        out = instance.run_submission(input)
        res = out.strip().lower()
        if res not in valid:
            disqualified.append(instance)
        else:
            results.append(valid[res])

    return (results, disqualified)

def get_winner(scores, instances):
    max_value = max(scores)
    max_index = scores.index(max_value)
    instance = instances[max_index]
    return (instance.name, max_value)

def update_scores(results, scores, minority_counts, minority_num):
    for i in range(len(results)):
        if results[i] == minority_num:
            minority_counts[i] += 1
            scores[i] += (minority_counts[i] - 1)
        else:
            minority_counts[i] = 0
            scores[i] += 3

def try_run_game(instances, num_runs = 1000, blacklist = None):
    current_input = None
    minority_str = None
    num_instances = len(instances)
    scores = [0] * num_instances
    minority_counts = [0] * num_instances

    print "Running with %i instances..." % num_instances

    for i in range(num_runs):
        print "Round: %i - Last minority was %s" % (i, minority_str)
        results, disqualified = one_run(instances, current_input)

        if len(disqualified) > 0:
            for instance in disqualified:
                print "Removing %s!" % instance.name
                instances.remove(instance)

                if blacklist is not None:
                    with open(blacklist, 'a') as f:
                        f.write("%s\n" % instance.name)

            return False

        latest_result = "".join(map(str,results))
        current_input = "%s,%s" % (current_input, latest_result)

        minority_num = 1 if results.count(1) < results.count(0) else 0
        minority_str = 'good' if minority_num == 1 else 'evil'

        update_scores(results, scores, minority_counts, minority_num)
        name, score = get_winner(scores, instances)
        print "%s is currently winning with a score of %i" % (name, score)

    print "The winner is %s with a score of %i!!!" % (name, score)
    return True

def find_instance_by_name(instances, name):
    for instance in instances:
        if instance.name == name:
            return instance
    return None

def maybe_add_or_remove_baelish(instances, baelish):
    num_instances = len(instances)

    if num_instances % 2 == 0:
        print 'There are %i instances.' % num_instances
        try:
            instances.remove(baelish)
            print 'Baelish Removed!'
        except:
            instances.append(baelish)
            print 'Baelish Added!'

def remove_blacklisted(blacklist, instances):
    blacklisted = []

    try:
        blacklisted = open(blacklist).readlines()
    except:
        return

    print 'Removing blacklisted entries...'

    for name in blacklisted:
        name = name.strip()
        instance = find_instance_by_name(instances, name)
        if instance is not None:
            print 'Removing %s' % name
            instances.remove(instance)

def run_game(instances, num_runs):
    blacklist = 'blacklist.txt'
    remove_blacklisted(blacklist, instances)

    baelish = find_instance_by_name(instances, 'Petyr Baelish') 
    maybe_add_or_remove_baelish(instances, baelish)

    while not try_run_game(instances, num_runs = num_runs, blacklist = blacklist):
        print "Restarting!"
        maybe_add_or_remove_baelish(instances, baelish)

    print "Done!"

if __name__ == '__main__':
    param = sys.argv[1] if len(sys.argv) >= 2 else None

    if param == 'get':
        instances = init_game(save=True, force_update=True)
    elif param == 'run':
        instances = init_game(save=False, force_update=False)
        num_runs = 50
        if len(sys.argv) == 3:
            num_runs = int(sys.argv[2])
        run_game(instances, num_runs)
    else:
        self_name = os.path.basename(__file__)
        print "usage:"
        print "To get the latest code: 'python %s get'" % self_name
        print "To run the submissions: 'python %s run <optional num_runs>'" % self_name


@KyleKanos-サポートを追加しました。すぐにコードを更新します。
WhatAWorld 14

わーい!私(ソルタ)はFortranの提出に一生懸命取り組みましたが、ラッシャーはそれを機能させることができませんので、誰かにそれを入手してほしいです:)
カイルカノス14

1
@Rusher:これについてはPeterTaylorに同意します:唯一の提案された編集としての構文の強調表示は拒否されるべきです。編集は、重要な修正ではなく、マイナーなものに使用する必要があります
カイルカノス14

1
あなたはこれに値するに値しますが、これは質問への正確な答えではないので(そしておそらく他の言語用のものをコミュニティが追加することで利益を得ることができます)、これは技術的にコミュニティwikiであると思います
マーティンエンダー14

13

美しい心、ルビー

最終ラウンドのビット表現における重要性が疑わしいパターンに基づいて決定を下します

require 'prime'

if ARGV.length == 0
    puts ["good", "evil"].sample
else
    last_round = ARGV[0].split(',').last
    puts Prime.prime?(last_round.to_i(2)) ? "good" : "evil"
end

のように走る

ruby beautiful-mind.rb

13

Piustitious、ルア

サインと不思議を信じる迷信的なプログラム。

history = arg[1]

if history == nil then
    print("good")
else
    local EvilSigns, GoodSigns = 0,0
    local SoulSpace = ""

    for i in string.gmatch(history, "%d+") do
         SoulSpace = SoulSpace .. i 
    end

    if string.match(SoulSpace, "1010011010")  then -- THE NUBMER OF THE BEAST!
        local r = math.random(1000)
        if r <= 666 then print("evil") else print("good") end
    else
        for i in string.gmatch(SoulSpace, "10100") do -- "I'M COMING" - DEVIL
            EvilSigns = EvilSigns + 1
        end
        for i in string.gmatch(SoulSpace, "11010") do -- "ALL IS WELL" - GOD
            GoodSigns = GoodSigns + 1
        end

        if EvilSigns > GoodSigns then 
            print("evil")
        elseif GoodSigns > EvilSigns then
            print("good")
        elseif GoodSigns == EvilSigns then
            local r = math.random(1000)
            if r <= 666 then print("good") else print("evil") end
        end
    end
end

以下で実行します:

lua Piustitious.lua

入力が続きます。


11

ウィンチェスターズ

サムとディーンは良いです(ほとんどの場合)。

package Humans;

public class TheWinchesters extends Human {

    @Override
    public String takeSides(String history) throws Exception {
        return Math.random() < 0.1 ? "evil" : "good";
    }

}

本当によろしいです9:1右の比率は?データマイニングを行い、より正確な比率を取得する必要があるかもしれません。
recursion.ninja 14

1
@awashburn私はスーパーナチュラル2ヶ月前(今シーズン9で立ち往生)見始めたと9:1私には思えるOK;)
CommonGuy

10

統計学者

public class Statistician extends Human{
    public final String takeSides(String history) { 
        int side = 0;
        String[] hist = history.split(",");
        for(int i=0;i<hist.length;i++){
            for(char c:hist[i].toCharArray()){
                side += c == '1' ? (i + 1) : -(i + 1);
            }
        }
        if(side == 0) side += Math.round(Math.random());
        return side > 0 ? "good" : "evil";
    }
}

5
その最後から二番目の行はとても素晴らしいです
cjfaure

5
@Undeservedあなたの代わりにMath.ceil(Math.random()-Math.random())を行うこともできますMath.round(Math.random())
tomsmeding

10

R、ややベイジアンボット

他のユーザーが出力する事前確率として、各ユーザーの頻度表を使用します。

args <- commandArgs(TRUE)
if(length(args)!=0){
    history <- do.call(rbind,strsplit(args,","))
    history <- do.call(rbind,strsplit(history,""))
    tabulated <- apply(history,2,function(x)table(factor(x,0:1)))
    result <- names(which.max(table(apply(tabulated, 2, function(x)sample(0:1,1, prob=x)))))
    if(result=="1"){cat("good")}else{cat("evil")}
}else{
    cat("good")
    }

を使用しRscript BayesianBot.Rて呼び出され、その後に入力が続きます。

編集:これが何をしているのかを明確にするために、ここに入力例の手順を示します。

> args
[1] "11011,00101,11101,11111,00001,11001,11001"
> history #Each player is a column, each round a row
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    0    1    1
[2,]    0    0    1    0    1
[3,]    1    1    1    0    1
[4,]    1    1    1    1    1
[5,]    0    0    0    0    1
[6,]    1    1    0    0    1
[7,]    1    1    0    0    1

> tabulated #Tally of each player previous decisions.
  [,1] [,2] [,3] [,4] [,5]
0    2    2    4    5    0
1    5    5    3    2    7

次に、で始まる行result<-は、各プレイヤーについて、この最後のテーブルを重みとして0または1のいずれかをランダムに選択します(つまり、プレイヤー1の場合、0を選択する確率は2 / 7、1を選択する5/7など)。各プレーヤー/列ごとに1つの結果を選択し、最後に最も一般的な終了した番号を返します。


10

スイス人

常に中立性を維持します。絶対に勝てない運命。

package Humans;

/**
 * Never choosing a side, sustaining neutrality
 * @author Fabian
 */
public class Swiss extends Human {   
    public String takeSides(String history) {
        return "neutral"; // wtf, how boring is that?
    }
}

私はこれを書きませんでした!
レインボルト14

それは皮肉です。中立性は決して勝たない
fabigler 14

2
@Rusherああ私は今それを得た:D
fabigler 14

1
コンパイルすらできません。セミコロンが欠落しています。
パエロエベルマン14

9

HAL 9000

#!/usr/bin/env perl
print eval("evil")

編集:多分これはHAL 9000により適していますが、注意してください!それは非常に悪です。cd実行する前にディレクトリを空にすることをお勧めします。

#!/usr/bin/env perl
print eval {
    ($_) = grep { -f and !/$0$/ } glob('./*');
    unlink;
    evil
}

これによりcwd、呼び出しごとに1つのファイルが削除されます!

それほど明白ではない呼び出し:

M $

D:\>copy con hal_9000.pl
#!/usr/bin/env perl
print eval("evil")
^Z
        1 file(s) copied.

D:>hal_9000.pl
evil

* nixで

[core1024@testing_pc ~]$ tee hal_9000.pl
#!/usr/bin/env perl
print eval("evil")
# Press C-D here
[core1024@testing_pc ~]$ chmod +x $_
[core1024@testing_pc ~]$ ./$_
evil[core1024@testing_pc ~]$

プログラムを実行するために使用できるコマンドを提供する必要があります。詳細については、チャレンジの「成果物」セクションを参照してください。
レインボルト14

@Rusher完了;)
core1024 14

9

大多数の意志

import sys
import random

if len(sys.argv)==1:
    print(random.choice(['good','evil']))
else:
    rounds=sys.argv[1].split(',')
    last_round=rounds[-1]
    zeroes=last_round.count('0')
    ones=last_round.count('1')
    if ones>zeroes:
        print('good')
    elif zeroes>ones:
        print('evil')
    elif ones==zeroes:
        print(random.choice(['good','evil']))

として保存し、入力に従ってWotM.py実行しpython3 WotM.pyます。

単純なプログラム、それがどうなるかを見るために。過半数が前回言ったこと、またはランダムに行く。


プログラムを実行するために使用できるコマンドを提供する必要があります。詳細については、チャレンジの「成果物」セクションを参照してください。
レインボルト14

くそー、それは私の複製になります。:D鉱山をマイノリティに変更しました。
マーティンエンダー14

@Rusherコマンドを追加しました。あなたが探していたもの?
isaacg 14

@isaacgパーフェクト!
レインボルト14

1
スコアボードのスコアから平均ランキングを計算しましたが、このエントリがこのエントリを獲得します。
ブリリアンド14

9

アラン・シアラー

彼が隣に座っている人が言ったことを繰り返します。その人が間違っていることが判明した場合、彼は次の人に進み、代わりに彼らが言うことを繰り返します。

package Humans;

/**
 * Alan Shearer copies someone whilst they're right; if they get predict
 * wrongly then he moves to the next person and copies whatever they say.
 *
 * @author Algy
 * @url http://codegolf.stackexchange.com/questions/33137/good-versus-evil
 */
public class AlanShearer extends Human {

    private char calculateWinner(String round) {
        int good = 0, evil = 0;

        for (int i = 0, L = round.length(); i < L; i++) {
            if (round.charAt(i) == '1') {
                good++;
            } else {
                evil++;
            }
        }

        return (good >= evil) ? '1' : '0';
    }

    /**
     * Take the side of good or evil.
     * @param history The past votes of every player
     * @return A String "good" or "evil
     */
    public String takeSides(String history) {
        String[] parts = history.split(",");
        String lastRound = parts[parts.length() - 1];

        if (parts.length() == 0 || lastRound.length() == 0) {
            return "good";
        } else {
            if (parts.length() == 1) {
                return lastRound.charAt(0) == '1' ? "good" : "evil";
            } else {
                int personToCopy = 0;

                for (int i = 0, L = parts.length(); i < L; i++) {
                    if (parts[i].charAt(personToCopy) != calculateWinner(parts[i])) {
                        personToCopy++;

                        if (personToCopy >= L) {
                            personToCopy = 0;
                        }
                    }
                }
            }

            return lastRound.charAt(personToCopy) == '1' ? "good" : "evil";
        }
    }
}

lastRound宣言する前に呼び出される変数を参照します。また、すべてに括弧を追加しましたString.lengthが、それは関数ではありません。提出物をコンパイルするところまで取得できますか?
Rainbolt 14

@Rusher-完了:)
Algy Taylor

@Algy:lastRound.lengthは(最初のifで)アクセスされる前にlastRound(そのifで)宣言されます。ここに送信する前に、コードをコンパイル(および実行)してみてください。
パエロエベルマン14

@PaŭloEbermann -謝罪が、私はそれを実行できる環境ではないんだけど-改正作られ、しかし
Algyテイラー

これで、スコープから外れたときに「personToCopy」という変数を参照しています。私はそれをコンパイルするためにelseブロック内に移動しましたが、それがあなたが望んでいたかどうかはわかりません。
レインボルト14

8

後で悪、JavaScript(node.js

実行間の時間を測定します。時差が前回よりも大きい場合、それは悪であるに違いありません。そうでなければ、良い。

var fs = require('fs'),
currentTime = (new Date).getTime();

try {
    var data = fs.readFileSync('./laterisevil.txt', 'utf8');
} catch (e) { data = '0 0'; } // no file? no problem, let's start out evil at epoch

var parsed = data.match(/(\d+) (\d+)/),
lastTime = +parsed[1],
lastDifference = +parsed[2],
currentDifference = currentTime - lastTime;

fs.writeFileSync('./laterisevil.txt', currentTime + ' ' + currentDifference, 'utf8');
console.log(currentDifference > lastDifference? 'evil' : 'good');

で実行: node laterisevil.js


8

パターンファインダー、Python

繰り返しパターンを探します。パターンが見つからない場合は、大多数のパターンにのみ適用されます。

import sys

if len(sys.argv) == 1: 
    print('good')
    quit()

wins = ''.join(
    map(lambda s: str(int(s.count('1') > s.count('0'))),
        sys.argv[1].split(',')
    )
)

# look for a repeating pattern
accuracy = []

for n in range(1, len(wins)//2+1):
    predicted = wins[:n]*(len(wins)//n)
    actual    = wins[:len(predicted)]
    n_right = 0
    for p, a in zip(predicted, actual):
        n_right += (p == a)
    accuracy.append(n_right/len(predicted))

# if there's a good repeating pattern, use it
if accuracy:
    best = max(accuracy)
    if best > 0.8:
        n = accuracy.index(best)+1
        prediction = wins[:n][(len(wins))%n]
        # good chance of success by going with minority
        if prediction == '1':
            print('evil')
        else:
            print('good')
        quit()

# if there's no good pattern, just go with the majority
if wins.count('1') > wins.count('0'):
    print('good')
else:
    print('evil')

と走る

python3 pattern_finder.py

1
私はこのコードが大好きで、実行すると常に3000ポイントを取得します。
Realdeo

8

ターンコート

ターンコートは、これまでのところ他の戦闘員のために、大多数は同じ側にとどまるよりも頻繁に善と悪の間で各ラウンドの後に交互になると考えています。したがって、彼は最初のラウンドを勝手にサイディングで開始し、それから勝ち負けチームにとどまることを頻繁に繰り返すために、すべてのラウンドを交互に繰り返します。

package Humans;

public class Turncoat extends Human {
    public final String takeSides(String history) {
        String[] hist = history.split(",");

        return (hist.length % 2) == 0 ? "good" : "evil";
    }
}

これを書いた後、統計分析に基づいたエントリのために、より多くのラウンドが完了すると、勢いが大部分のサイド切り替えを少なくすることに気付きました。したがって、レイジーターンコート。

レイジーターンコート

レイジーターンコートはターンコートと同じように始まりますが、ラウンドが進むと、彼はレイジーになりレイジーになって反対側に切り替わります。

package Humans;

public class LazyTurncoat extends Human {
    public final String takeSides(String history) {
        int round = history.length() == 0 ? 0 : history.split(",").length;
        int momentum = 2 + ((round / 100) * 6);
        int choice = round % momentum;
        int between = momentum / 2;

        return choice < between ? "good" : "evil";
    }
}

2
Lazy Turncoatは素晴らしいです!
アンジェロフックス14

よろしければ両方を含めます。
レインボルト14

どうぞ。特に投票統計をコンパイルするものと比べて、両方がどうなるか興味があります。
jaybz 14

@Rainboltターンコートのバカなバグに気付いた。ただし、修正する必要はありません。まだ完全に機能しているわけではなく、修正するのに手遅れではない場合でも、修正すると新しいエントリの1つとまったく同じように動作します。必要に応じて自由に追加/除外してください。
jaybz 14

8

伝記作家、ルビー

rounds = ARGV[0].split(',') rescue []

if rounds.length < 10
  choice = 1
else
  outcome_history = ['x',*rounds.map{|r|['0','1'].max_by{|s|r.count s}.tr('01','ab')}]
  player_histories = rounds.map{|r|r.chars.to_a}.transpose.map{ |hist| outcome_history.zip(hist).join }
  predictions = player_histories.map do |history|
    (10).downto(0) do |i|
      i*=2
      lookbehind = history[-i,i]
      @identical_previous_behavior = history.scan(/(?<=#{lookbehind})[10]/)
      break if @identical_previous_behavior.any?
    end
    if @identical_previous_behavior.any?
      (@identical_previous_behavior.count('1')+1).fdiv(@identical_previous_behavior.size+2)
    else
      0.5
    end
  end
  simulations = (1..1000).map do
    votes = predictions.map{ |chance| rand < chance ? 1 : 0 }
    [0,1].max_by { |i| votes.count(i) }
  end
  choice = case simulations.count(1)/10
    when 0..15
      1
    when 16..50
      0
    when 51..84
      1
    when 85..100
      0
  end
end

puts %w[evil good][choice]

ほぼインテリジェントなエントリでの私の試み(実際にインテリジェントなエントリでは、フィールドに対するテストが必要です)。Rubyで書かれているので、これは遅すぎる可能性がありますが、私のマシンではとにかく、ランダムなプレイヤーが40人いる最後のラウンドを計算するのに.11秒かかりますので、十分にうまくいくことを願っています。

名前を付けて保存biographer.rb、実行ruby biographer.rb

アイデアは、各プレイヤーについて、過去10ラウンドの自分の選択と全体的な結果の両方を調べ、同じ状況(彼らの投票+全体的な結果)が発生しました。前例があるように、最大​​10ラウンドまでの最長の後ろ読みを選択し、それを使用して周波数を作成します(ラプラスの継承の法則に従って調整され、だれにも100%自信がないようにします)。

その後、いくつかのシミュレーションを実行し、グッドが勝つ頻度を確認します。シミュレーションの結果がほぼ同じである場合、一般的に予測がうまくいくため、予測される少数派が選択されます。自信がない場合は、予測される多数派を選びます。


8

ユダ

ユダは本当にいい人です。彼が数ペニーのために善良な人を裏切ることは残念です。

package Humans;

public class Judas extends Human {

    private static final String MONEY = ".*?0100110101101111011011100110010101111001.*?";

    public String takeSides(String history) {
       return history != null && history.replace(",","").matches(MONEY) ? "evil" : "good";
    }
}

1
これは、十分な参加者がいる場合にのみ悪を投票します。Rusherがグループに分けてゲームを分割するため、,out of historyをさらに削除することもできます。
アンジェロフックス

彼がグループでゲームを分割することを知りませんでした。文字列のサイズが大きいため、実際にこの質問が十分な提出を待ってから回答を投稿するのを待っていました。知らせてくれてありがとうございます。
ウィリアムバルボサ

Windowsのプロセスに60000文字の引数を渡す方法を知っているなら、教えてください。それ以外の場合は、エントリを台無しにして申し訳ありません、それを修正していただきありがとうございます!私はそれほど多くの提出物を受け取ることを予期していませんでした。
レインボルト

7

The Fallacious Gambler(Python)

一方が連続して多数回勝った場合、ギャンブラーは反対側が次のラウンドでより多くの可能性が高いことを認識し(右?)、これは彼の投票に影響します。彼が少数派を目指しているのは、一度少数派になると、何度もそこに着いて(正しい?)多くのポイントを獲得できるからです。

import sys
import random

def whoWon(round):
    return "good" if round.count("1") > round.count("0") else "evil"

if len(sys.argv) == 1:
    print random.choice(["good", "evil"])
else:
    history = sys.argv[1]
    rounds = history.split(",")
    lastWin = whoWon(rounds[-1])
    streakLength = 1
    while streakLength < len(rounds) and whoWon(rounds[-streakLength]) == lastWin:
        streakLength += 1
    lastLoss = ["good", "evil"]
    lastLoss.remove(lastWin)
    lastLoss = lastLoss[0] 
    print lastWin if random.randint(0, streakLength) > 1 else lastLoss  

使用法

最初のラウンドの場合:

python gambler.py

そしてその後:

python gambler.py 101,100,001 etc.

4
私はあなたがあなたのコードについてどのように確信しているのが好きですか?:P
IEatBagels

7

セルラーオートマトン

これは、ConwayのGame of Lifeの従来のルールを使用して、どちらかを選択します。最初に、以前の投票から2Dグリッドが作成されます。次に、「世界」が1段階進み、残りの生細胞の総数が計算されます。この数がセルの総数の半分より大きい場合、「良好」が選択されます。それ以外の場合、「悪」が選択されます。

間違いを許してください。これは私の昼休み中に壊されました。;)

package Humans;

public class CellularAutomaton extends Human {

    private static final String GOOD_TEXT = "good";

    private static final String EVIL_TEXT = "evil";

    private int numRows;

    private int numColumns;

    private int[][] world;

    @Override
    public String takeSides(String history) {
        String side = GOOD_TEXT;

        if (history.isEmpty()) {
            side = Math.random() <= 0.5 ? GOOD_TEXT : EVIL_TEXT;
        }

        else {
            String[] prevVotes = history.split(",");

            numRows = prevVotes.length;

            numColumns = prevVotes[0].length();

            world = new int[numRows][numColumns];

            for (int i = 0; i < numColumns; i++) {
                for (int j = 0; j < numRows; j++) {
                    world[j][i] =
                        Integer.parseInt(Character.toString(prevVotes[j].charAt(i)));
                }
            }

            int totalAlive = 0;
            int total = numRows * numColumns;
            for (int i = 0; i < numColumns; i++) {
                for (int j = 0; j < numRows; j++) {
                    totalAlive += getAlive(world, i, j);
                }
            }
            if (totalAlive < total / 2) {
                side = EVIL_TEXT;
            }
        }

        return side;
    }

    private int getAlive(int[][] world, int i, int j) {
        int livingNeighbors = 0;

        if (i - 1 >= 0) {
            if (j - 1 >= 0) {
                livingNeighbors += world[j - 1][i - 1];
            }
            livingNeighbors += world[j][i - 1];
            if (j + 1 < numRows) {
                livingNeighbors += world[j + 1][i - 1];
            }
        }
        if (j - 1 >= 0) {
            livingNeighbors += world[j - 1][i];
        }
        if (j + 1 < numRows) {
            livingNeighbors += world[j + 1][i];
        }
        if (i + 1 < numColumns) {
            if (j - 1 >= 0) {
                livingNeighbors += world[j - 1][i + 1];
            }
            livingNeighbors += world[j][i + 1];
            if (j + 1 < numRows) {
                livingNeighbors += world[j + 1][i + 1];
            }
        }

        return livingNeighbors > 1 && livingNeighbors < 4 ? 1 : 0;
    }
}

1
テストのためにコードから印刷行を削除しました。Javaエントリは、善悪を返すだけで、印刷はできません。
レインボルト14

7

リッジ教授

ライブラリの使用が許可されることを望みます。1つなしでこれを行う気はありません=)

基本的な考え方は、特徴として各ラウンドの前に30の結果を使用して、最後のラウンドで各参加者のリッジ回帰分類器をトレーニングすることです。元々、すべてのプレイヤーの結果の最終ラウンドも含めて各プレイヤーの結果を予測していましたが、参加者の数が増えた場合(たとえば50人程度)にかなり近い結果になりました。

#include <iostream>
#include <string>
#include <algorithm>
#include "Eigen/Dense"

using Eigen::MatrixXf;
using Eigen::VectorXf;
using Eigen::IOFormat;
using std::max;

void regress(MatrixXf &feats, VectorXf &classes, VectorXf &out, float alpha = 1) {
    MatrixXf featstrans = feats.transpose();
    MatrixXf AtA = featstrans * feats;

    out = (AtA + (MatrixXf::Identity(feats.cols(), feats.cols()) * alpha)).inverse() * featstrans * classes;
}

float classify(VectorXf &weights, VectorXf &feats) {
    return weights.transpose() * feats;
}

size_t predict(MatrixXf &train_data, VectorXf &labels, VectorXf &testitem) {
    VectorXf weights;
    regress(train_data, labels, weights);
    return (classify(weights, testitem) > 0 ? 1 : 0);
}

static const int N = 30;
static const int M = 10;
// use up to N previous rounds worth of data to predict next round
// train on all previous rounds available
size_t predict(MatrixXf &data, size_t prev_iters, size_t n_participants) {
    MatrixXf newdata(data.rows(), data.cols() + max(N, M));
    newdata << MatrixXf::Zero(data.rows(), max(N, M)), data;

    size_t n_samples = std::min(500ul, prev_iters);
    if (n_samples > (8 * max(N, M))) {
        n_samples -= max(N,M);
    }
    size_t oldest_sample = prev_iters - n_samples;
    MatrixXf train_data(n_samples, N + M + 1);
    VectorXf testitem(N + M + 1);
    VectorXf labels(n_samples);
    VectorXf averages = newdata.colwise().mean();
    size_t n_expected_good = 0;
    for (size_t i = 0; i < n_participants; ++i) {
        for (size_t iter = oldest_sample; iter < prev_iters; ++iter) {
            train_data.row(iter - oldest_sample) << newdata.row(i).segment<N>(iter + max(N, M) - N)
                                  , averages.segment<M>(iter + max(N, M) - M).transpose()
                                  , 1; 
        }
        testitem.transpose() << newdata.row(i).segment<N>(prev_iters + max(N, M) - N)
                  , averages.segment<M>(prev_iters + max(N, M) - M).transpose()
                  , 1;
        labels = data.row(i).segment(oldest_sample, n_samples);
        n_expected_good += predict(train_data, labels, testitem);
    }
    return n_expected_good;
}


void fill(MatrixXf &data, std::string &params) {
    size_t pos = 0, end = params.size();
    size_t i = 0, j = 0;
    while (pos < end) {
        switch (params[pos]) {
            case ',':
                i = 0;
                ++j;
                break;
            case '1':
                data(i,j) = 1;
                ++i;
                break;
            case '0':
                data(i,j) = -1;
                ++i;
                break;
            default:
                std::cerr << "Error in input string, unexpected " << params[pos] << " found." << std::endl;
                std::exit(1);
                break;
        }
        ++pos;
    }
}

int main(int argc, char **argv) {
    using namespace std;

    if (argc == 1) {
        cout << "evil" << endl;
        std::exit(0);
    }

    string params(argv[1]);
    size_t n_prev_iters = count(params.begin(), params.end(), ',') + 1;
    size_t n_participants = find(params.begin(), params.end(), ',') - params.begin();

    MatrixXf data(n_participants, n_prev_iters);
    fill(data, params);

    size_t n_expected_good = predict(data, n_prev_iters, n_participants);

    if (n_expected_good > n_participants/2) {
        cout << "evil" << endl;
    } else {
        cout << "good" << endl;
    }
}

コンパイルする

ソースコードをというファイルに保存しridge_professor.ccEigenライブラリをダウンロードして、内部にあるEigenフォルダーをソースファイルと同じフォルダーに解凍します。でコンパイルしg++ -I. -O3 -ffast-math -o ridge_professor ridge_professor.ccます。

走る

ridge_professor.exeを呼び出して、必要に応じて引数を指定します。

質問

私はまだどこにもコメントできないので、ここで質問します。ウィンドウの引数サイズの制限により、結果のバイナリを数百ターンで履歴全体で呼び出すことはできませんか?引数に最大9000文字を含めることはできないと思います...


これに注意してくれてありがとう。Javaでまだ正常に動作しない場合に動作させる方法を考えます。Javaでできない場合は、C ++でできることが調査でわかっており、C ++を再学習する機会があります。すぐにテスト結果に戻ります。
レインボルト14

結局のところ、Javaはコマンドプロンプトの制限を受けません。32kを超えるコマンドのみが問題を引き起こすようです。ここに私の証明である(私はそれを自分で書きました):docs.google.com/document/d/...を。繰り返しますが、明日試用が始まる前にこれを取り上げてくれて本当に感謝しています。
レインボルト14

@Rusherすでに57のボットがあり、各ラウンドを1000ラウンドで構成することを計画しています。それはあなたの文字列を57k文字にします(したがって> 32k)、そうではありませんか?
plannapus

1
@Rusherタイムラインをもう1週間延長し、引数文字列を使用する代わりに、stdinを読むようにプログラムを変更するよう参加者に依頼する方がよいと思います。ほとんどのプログラムを変更するために些細なことだろう
dgel

@dgelチャレンジのタイムラインは無限に長いですが、誰もが答えを書き直さなければならないような方法でルールを変更したくありません。昨夜追加したルールは、1つの提出物にのみねじ込むことになると確信しており、その人がプログラムをコンパイルするポイントに到達した場合、その人を助けるつもりです。
レインボルト14

6

クローリー

なぜならウィンチェスターはこの仲間なしでは面白くないからです。彼は明らかに悪の側にいます...より大きな悪の世話をする必要がない限り。

package Humans;

public class Crowley extends Human {
public String takeSides(String history) {
    int gd = 0, j=history.length(), comma=0, c=0, z=0;
    while(comma < 2 && j>0)   {
        j--;
        z++;
        if (history.charAt(j) == ',') {
            comma++;
            if(c> z/2) {gd++;}
            z=0;
            c=0;
        } else if (history.charAt(j)=='1') {
            c++;
        } else {
        }
    }
    if(gd == 0){
        return "good";
    } else {
        return "evil";
    }
}}

最後の2ターン(これまでに0コンマと1コンマ)を見て、両方が悪に勝った場合、私は良い投票をします。そうでなければ、私は悪に投票します。


これは正しいですか?あなたは最後のターンを見て、50%未満が「良い」票であるなら、あなたは「悪い」と「良い」他を支持しますか?(好奇心から:不可解な変数名を好むか、それは偶然ですか?)
アンジェロフックス14

1
@AngeloNeuschitzer最後の2ターン(これまでに0個のコンマとこれまでに1個のコンマ)を見て、両方が悪に勝った場合、私は良い投票をします。そうでなければ、私は悪に投票します。コードが短く、コードの目的が混乱しない場合は、入力するのに短い変数名を好みます。私はプロのプログラマーではありません。これは、Javaでプログラミングしたのは初めてで、他の誰かが6.5年ぶりにコードを見ました。記憶をリフレッシュするためにこれを書きました。(TLDRは私にとって不可解ではなく、私が普段コーディングするのは私だけです。)
kaine 14

明確にするために...クロウリーは人間として始まったので、彼は意図的に善良に始めました...しかし、彼がすべてのラウンドで
うまくいくとは思わ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.