円で距離を保つ


9

これは、この課題とそれを改善するGeobits / CarpetPythonのアイデアに基づいています。

距離を置く!

この課題では、2つの数値間の距離はループで測定されるため、たとえば、0と999の間の距離は1です。これにより、常に最小または最大の数値を選択するような戦略がほぼ毎回勝つことを防ぐ必要があります。他の唯一の変更は、選択できる最小数が1ではなく0になったことです。

ここで要約します。

  • 3つの引数を取る関数をJava、Python、またはRubyで記述します。
    • これまでに行われたラウンドの数
    • プレーヤーの数
    • スペースで区切られた文字列の配列として、前のラウンドで選択された数
  • 0から999までの整数を返す必要があります
  • 各ラウンドのプログラムのスコアは、他の各プログラムが選択した数値への距離の平方根の合計です
  • 100ラウンド後に最高スコアを獲得したプログラムが勝利します。
  • 1人につき1つの回答

制御プログラムはここにあります:

https://github.com/KSFTmh/src/

リーダーボード

TheBestOneによるNumberOneが勝利しています。

  • NumberOne-9700
  • NumberOnePlusFourNineNine-9623
  • AncientHistorian-9425
  • FindCampers-9259
  • WowThisGameIsSoDeep-9069
  • サンプラー-9014
  • SabotageCampers-8545

どうやら、私のキャンピングカーサボタージュ... er(?)はあまりうまく機能しません。

以下が完全な結果です:https : //github.com/KSFTmh/src/blob/master/results-3

これは、重複しないように十分に異なると思います。

ちなみに、Stack Exchangeについて質問するのは今回が初めてなので、何か問題があった場合はお知らせください。


4
このような質問を本当にしたいですか?
オプティマイザ

5
@オプティマイザーコメントの数人がこれは良いアイデアだと思っているようです。元の回答はここではまったく異なる動作をするため、重複しているとは思わない。
KSFT 2015年

1
チャレンジを提案した功績は@Geobitsに送られるべきです。私は彼に同意しました。
ロジックナイト

1
うーん。定数が再び勝ったようです。それがなぜかについて、私は興味があります。質問、またはgithubやpastebinに600の出力番号が表示されますか?一部の予測因子にはバグがあると思います。おそらく私のもの:-(
Logic Knight

1
@CarpetPython単純な変更は、このラウンドのポイントに加えて、最後からのポイント間の距離を計算することです。
TheNumberOne 2015

回答:


3

Python 2、サンプラー

このエントリーは、「キープ・ユア・ディスタンス、サンプラー・エントリー」と同じコードに基づいています。ここでは、1と999の利点が存在しない場合に、それがうまくいくことを願っています。

場所のリストから、最近使用した数字から最も離れた場所を選択し、前のターンを無視します(他のエントリは前のターンだけに基づいて予測する可能性があるため)。

def choose(turn, players, history):
    sample = map(int, (' '.join( history[-5:-1] )).split())
    def distance(x):
        return sum(min(1000-abs(x-y), abs(x-y))**0.5 for y in sample)
    score, place = max((distance(x), x) for x in range(1000))
    return place

これは勝ったようですが、コントローラを正しくコンパイルしていないために他のすべてがクラッシュしている可能性があります。
KSFT、2015

2

Number OnePlusFourNineNine、Java

public static int choose(int round, int players, String[] args) {
    return 500;
}

ロジックは本当にシンプルです。以前のスコアを考慮に入れる実際のアルゴリズムを誰かが見つけない限り、この答えはかなり最適化されています。

円内の距離を数えると、2点の最大距離は500になります。すべてのエントリが乱数(またはアルゴリズムに基づく疑似乱数)を生成している場合、この答えはまったく有利ではありませんでした。 。しかし、ほぼ最大の距離である一定の回答を生成する少なくとも1つのエントリがあります。各ラウンドで可能な最大距離の固定ソースがあるため、スコアは500に有利になります:)


あなたは私の答えを最適化しました。;)
TheNumberOne 2015

@TheBestOne haha
オプティマイザ、

2

AncientHistorian-Python

これは前のアルゴリズムと同じアルゴリズムですが、潜在的なスコアを計算するときは、円形距離を使用します。私はひどく負けており、コントローラーをコンパイルすることができないので、私は新しい戦略を試しているだけで、前回のラウンドの最悪のものを使用しています。

def choose(round, players, scores):
    calc = lambda n, scores: sum([min(abs(int(i)-n), 1000-max(int(i),n)+min(int(i),n))**.5 for i in scores.split(' ')])
    return min(range(1000), key=lambda n: sum([calc(n, j) for j in scores[1:]])) if round>1 else 250

これは機能しません。iの要素ですscores.split(' ')。つまり、intではなく文字列であることを意味します。
KSFT 2015

@KSFTああシュート、私は本当にテスト、更新する必要がありました。
Maltysen 2015

2

SabotageCampers-Python

def choose(rounds, players, previous):
    if rounds<3:
        return 1
    prevchoices=[int(i) for i in " ".join(previous[-5:]).split(" ")]
    remove=[]
    for i in prevchoices:
        if prevchoices.count(i)<3:
            remove.append(i)
    campers=[i for i in prevchoices if i not in remove]
    return random.choice(campers)

キャンパーはまだ勝利しています。これについて何か提案があれば教えてください。


2

FindCampers-Python 2

過去10ラウンドのキャンパーをすべて見つけて、近づかないようにします。予測変数が私から実行されることを期待しています。私は今私の古い選択を無視します。

def choose(rounds, players, previous):
    from collections import Counter

    def distance(x, y):
        return min(1000 - abs(x-y), abs(x-y))

    pastRounds = list(map(lambda x: Counter(map(int, x.split())), previous))
    me = 751
    for (index, round) in enumerate(pastRounds):
        round.subtract((me,))
        pastRounds[index] = set(round.elements())
        campers = reduce(lambda x,y: x.intersection(y), pastRounds[max(1, index-9):index], pastRounds[max(0,index-10)])
        if campers:
            dist, me = max(min((distance(x, y), x) for y in campers) for x in range(1000))
        else:
            me = 751
    return me

名前...私は名前を見たときにこれがキャンパーのに行くことを望んでいた...
KSFT

笑。キャンパーを妨害するエントリを追加できます。
Jmac、2015

残念ながら、私は1人につき1つのエントリしか許可しませんでした。
KSFT、2015

私はサボタージュキャンピングカーに自分でエントリーを投稿しました。
KSFT、2015

以前の結果が並べ替えられていることに気付かなかったため、鉱山は機能しません。あなたはどのようにキャンパーを検出しますか?
KSFT 2015


1

WowThisGameIsSoDeep、Java

100万コアのクラスターで10年間ゲームを分析し、最適なソリューションを見つけました。

public static int choose(int round, int players,String[]spam) { return(int)(Math.random()*1e3); }


5
そのソリューションは最適ではありません。均一な分布が必要な場合は、を使用する必要がありますRandom.nextInt(int)
Peter Taylor

これは、常に1を返すように見える
KSFT

@KSFT私はそれをテストし、多くの異なる数を得ました。たぶんそれはサボタージュなのでしょうか?
feersum 2015

4
ああ!それを私が直した!誤って「WowThisGameIsSoDeep.py」と入力して、それをPythonファイルとして実行しようとしました。
KSFT

1

周線形外挿、Ruby

def choose(round, players, previous_choices)
  previous_rounds = previous_choices.map{ |round| round.split.map(&:to_i) }
  optimal_past_choices = previous_rounds.map do |choices|
    (0..999).max_by { |i| choices.map{ |c| root_distance(i,c) }.inject(:+) }
  end
  if (last_round = optimal_past_choices.last)
    (last_round + average_delta(optimal_past_choices).round) % 1000
  else
    750
  end
end

def root_distance(i,j)
  dist = (i-j).abs
  dist = [dist, 1000 - dist].min
  dist ** 0.5
end

def directed_distance(i,j)
  dist = j - i
  if dist > 500
    dist - 1000
  elsif dist < -500
    dist + 1000
  else
    dist
  end
end

def average_delta(ary)
  ary.each_cons(2).map{ |x,y| directed_distance(x,y) }.inject(0,:+)/ary.count
end

これは、このエラーを与えている:NoMethodError: undefined method `split' for #<Array:0x720f56e2> choose at CircilinearExtrapolator.rb:2
KSFT

ああ、previous_choices値の配列は["1 6 500","2 8 503"]
ヒストクラート2015

そうです。それは別のことだと思いましたか?そうでない場合、おそらく私はそれを実行している何かを台無しにしただけでしょう。
KSFT、2015

すみません、ただの紐だと思いました。編集します。
ヒストクラート2015

編集。誰もが私がそれをテストせずに何かを投稿したことを知っています...
ヒストクラート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.