Sen en zayıf halkasın, güle güle.


50

Bu mücadelesi, Weakest Link . Şovu bilmeyenler için, bu zorluğun hamlesi oy verdiğiniz kişiyle ilgilidir :

  • Diğer oyuncular sizden daha zekiyse, potu alma şansınız o kadar azdır.
  • Diğer oyuncular sizden daha aptalsa, elde edeceğiniz daha az pot vardır.

Her turun başında Pot $ 0 ile başlar. 9 oyunculu bir grup oluşturulur ve her oyuncuya 1 ile 9 arasında benzersiz bir Akıllılık verilir .

Her bir Pot += Smartnessturun başında, her oyuncu için hala bir raundda. Ardından oyuncular çıkarmak istedikleri oyuncuya oy verir. En çok oy alan oyuncu kaldırılır. Beraberlik durumunda daha akıllı oyuncu tutulur.

Turda yalnızca 2 oyuncu kaldığında, zeki bir savaşla karşı karşıya kalırlar. Oyuncunun kazanma şansı Smartness/(Smartness+OpponentSmartness). Kazanan oyuncu daha sonra tüm potu alır.

Oyunun sonunda en fazla para alan oyuncu kazanır.

Giriş çıkış

Her turda, mevcut rakiplerin listesini alacaksın. Player sınıfındaki işlevler aracılığıyla akıllılığınıza ve tüm oyuncuların tüm oy verme geçmişine erişebileceksiniz.

Çıktı olarak, oy vermek istediğiniz oynatıcıyı temsil eden (akıllılıklarını temsil eden) tek bir tamsayı döndürmeniz gerekir. Kendiniz için oylama edilir izin (ancak önerilmez).

9 turda tüm oyuncular en az 1000 10000 tur oynayana kadar ve tüm oyuncular aynı sayıda turda oynayana kadar tekrar eder.

Kumandayı burada bulabilirsiniz: https://github.com/nathanmerrill/WeakestLink

Bir oyuncu oluşturmak için, Player sınıfını genişletmeniz ve oynatıcınızı PlayerFactory sınıfına eklemeniz gerekir. Sınıfınız aşağıdaki kurallara uymalıdır:

  1. Başka bir oyuncuyla iletişim kurmak veya parazit (aynı tipteki diğer oyuncuları da dahil olmak üzere) kesinlikle yasaktır.

  2. Yansıma ve statik değişkenlere (sabitler hariç) izin verilmez.

  3. Eğer rastgelelik kullanmak istiyorsanız getRandom(), Player sınıfında bir fonksiyon sağladım. Kullan, simülasyonlar deterministik olabilir.

Player sınıfında verilere kolay erişim için birçok işlev sundum. Onları çevrimiçi olarak Github'da bulabilirsiniz . Oyuncunuz her yeni raundda bir kez hazırlanır. "Aptal / intihar" oyuncularına izin verilir (ancak aynı stratejiye sahip oyuncular değil).

Skorlar

377195  WeakestLink.Players.PrudentSniper
362413  WeakestLink.Players.Sniper
353082  WeakestLink.Players.VengefulSniper
347574  WeakestLink.Players.AntiExtremist
298006  WeakestLink.Players.BobPlayer
273867  WeakestLink.Players.MedianPlayer
247881  WeakestLink.Players.TheCult
240425  WeakestLink.Players.Leech
235480  WeakestLink.Players.SniperAide
223128  WeakestLink.Players.Guard
220760  WeakestLink.Players.Anarchist
216839  WeakestLink.Players.RevengePlayer
215099  WeakestLink.Players.IndependentVoter
213883  WeakestLink.Players.SniperKiller
210653  WeakestLink.Players.MaxPlayer
210262  WeakestLink.Players.Bandwagon
209956  WeakestLink.Players.MeanPlayer
208799  WeakestLink.Players.Coward
207686  WeakestLink.Players.Spy
204335  WeakestLink.Players.Hero
203957  WeakestLink.Players.MiddleMan
198535  WeakestLink.Players.MinPlayer
197589  WeakestLink.Players.FixatedPlayer
197478  WeakestLink.Players.HighOrLowNotSelf
181484  WeakestLink.Players.RandomPlayer
165160  WeakestLink.Players.BridgeBurner

1
Bunu anlamadım: "Her turun başında ... 9 oyunculu bir grup oluşturulur ve her oyuncuya oyun başlangıcında değil, benzersiz bir Akıllılık verilir"?
CSᵠ

1
@ CSᵠ doğru. Akıllılığınız turdan tura değişiyor (aksi takdirde haksızlık olur).
Nathan Merrill,

2
stres ve sevinç olmalı
CSᵠ

1
Bir karınca yapı yapılandırması mı falan mı beklemeliyim? Java için biraz yeniyim ve insanların bunun gibi küçük projeler oluşturduğundan emin değilim.
Dale Johnson,

4
İçinden src\WeakestLinkkullandığım javac Game\*.java Players\*.java Main.javaderlemek ve java -cp .. WeakestLink.Mainçalıştırmak için.
Linus

Yanıtlar:


22

Keskin nisanci

Genel fikir, puanları çekmek için aptal oyunculardan birinin ( yüz yüze vurma ihtimalimiz daha yüksek olan) etrafında durmasıdır. Bundan sonra potu yükseltmek için diğer düşük değerli oyuncuları kaldırmaya çalışırız. Ancak akıllı oyunculara ulaştığımızda , aptal oyuncumuzun çıkarılması ihtimaline karşı en tehlikeli oyuncular için kaldırmayı seçiyoruz. Bu şekilde, eğer çürütecek birisine sahip değilsek, en azından bir şansımız olacak birisini bulmalıyız. Ayrıca, her zaman minimum veya maksimum bir oyuncu ile oy kullandığımızdan, yolumuza çıkmada oldukça etkili olduğumuzu düşünüyorum.

package WeakestLink.Players;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
public class Sniper extends Player {
    @Override
    public int vote(Set<Integer> currentOpponents) {
        int smrt = getSmartness();

        //count number of players smarter/stupider than me
        Iterator<Integer> opps = currentOpponents.iterator();
        int cnt_smrt=0, cnt_stpd=0, opp_smrt, min_stpd=10, max_smrt=0;

        while(opps.hasNext()){
            opp_smrt = opps.next().intValue();
            if(opp_smrt > smrt){
                cnt_smrt++;
                if(opp_smrt > max_smrt) max_smrt = opp_smrt;
            }
            else if(opp_smrt < smrt){
                cnt_stpd++;
                if(opp_smrt < min_stpd) min_stpd = opp_smrt;
            }
        }

        //remove low-value, then dangerous players
        if(cnt_stpd>1)
            return min_stpd;
        else
            return max_smrt;
    }
}

Öyleyse görünüşte geri alma düzenlemeleri kaldırmaz. Mümkünse, düzenlemelerin kaldırılmasını isterim ki, bu, orijinal sürümdür.
Linus

12

PrudentSniper

Keskin nişancı , fakat iki özel davranışla. Birincisi, üç bot kaldıysa ve PrudentSniper en zeki ise, en akıllı olanı yerine ortadaki bot için oy kullanacak olmasıdır. Bu, birkaç tane daha galibiyet kazanmasını sağlar. Diğer davranış, eğer en zeki bot onun için savaşıyorsa (oyuna veya benzer botun son defa oyu kullanılmışsa) ve en az akıllı değilse, kendini savunmada en zeki oy kullanır.

package WeakestLink.Players;
import WeakestLink.Game.Vote;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
public class PrudentSniper extends Player {
    @Override
    public int vote(Set<Integer> currentOpponents) {
        int smrt = getSmartness();

        //count number of players smarter/stupider than me, find max/min
        Iterator<Integer> opps = currentOpponents.iterator();
        int cnt_smrt=0, cnt_stpd=0, opp_smrt, min_stpd=10, max_smrt=0;

        while(opps.hasNext()){
            opp_smrt = opps.next().intValue();
            if(opp_smrt > max_smrt) max_smrt = opp_smrt;
            if(opp_smrt < min_stpd) min_stpd = opp_smrt;
            if(opp_smrt > smrt){
                cnt_smrt++;
            }
            else if(opp_smrt < smrt){
                cnt_stpd++;
            }
        }

        //identify enemies
        Iterator<Vote> votes = getRecentVotes().iterator();
        boolean[] voted_for_me = new boolean[9];

        while(votes.hasNext()) {
          Vote opp_vote = votes.next();
          voted_for_me[opp_vote.getVoter()] = (opp_vote.getVoted() == getSmartness() ||
                                              (opp_vote.getVoted() < getSmartness() && cnt_stpd < 1) ||
                                              (opp_vote.getVoted() > getSmartness() && cnt_smrt < 1));
        }

        if (currentOpponents.size() < 3 || cnt_stpd < 2 || (voted_for_me[max_smrt] && !voted_for_me[min_stpd] && cnt_smrt > 0) )
          return max_smrt;
        else
          return min_stpd;
    }
}

Her iki ilerlemenin de eşit olduğuna emin değilim. Bunları ayrı ayrı denediniz mi?
Linus

Yaptım ve üç bot davası açık bir gelişme olsa da (en azından repoda usta olan botlara karşı), intikam net olarak nötr. Bir çeşit belirsiz caydırıcı olarak bıraktım, suikastçilere karşı bir önlem.
Histocrat


Geçenlerde akıllılığın 1-9 yerine 0-8 olduğu bir hatayı düzelttim. Bu kodunuzu kırdı, ben de düzelttim (güncellenmiş kodu depoda bulabilirsiniz): github.com/nathanmerrill/WeakestLink/blob/master/src/…
Nathan Merrill

12

Kült

Kült oyuncularının, sadece oylama kayıtlarını kullanarak birbirlerini tanımlamaya ve grup olarak oy kullanmaya çalıştıkları hafif ezoterik bir oylama şeması vardır. Her tarikat üyesi nasıl oy kullanacağını bildiğinden, farklı oy kullananlar üye olamayacak ve sonuçta elenmeyi hedefliyorlar.

Bir bakışta oylama şeması:

  • ilk dönüşte en zayıf yarışmacının oyu, min ve keskin nişancı ile birlikte çalışmak kültün güç kazanmasına yardımcı oluyor
  • sonraki sıralarda, yalnızca kült kalana kadar tanınan üyeler oy kullanır (kontrolde olduğumuzu düşündüğümüz sürece üye olmayan üyelere puan vermek için en düşük değerli oy kullanırız).
  • sadece üyeler kaldığında, puanları düşük olan üyelere oy verin (gerçekten de kültün iyiliği için fedakarlıkta bulunun).

Kod:

package WeakestLink.Players;
import WeakestLink.Game.Vote;
import java.util.Iterator;
import java.util.Set;
public class TheCult extends Player {
    private int cult_vote;
    private boolean[] isMember = null;
    @Override
    public int vote(Set<Integer> currentOpponents) {
        //on first turn, vote the code
        if(isMember == null){
            isMember = new boolean[10];
            for(int i=10; --i!=0;) isMember[i]=true; //runs 9-1
            return cult_vote = 1;
        }
        //on all other turn, assess who is not voting with the cult
        Vote opp_vote;
        int cult_cnt=0;
        Iterator<Vote> votes = getRecentVotes().iterator();
        while(votes.hasNext()){
            opp_vote = votes.next();
            if(opp_vote.getVoted() != cult_vote)
                isMember[opp_vote.getVoter()] = false;
            else
                cult_cnt++;
        }
        //find weakest and stongest non-members, and weakest members
        Iterator<Integer> opps = currentOpponents.iterator();
        int opp_smrt, min_mem=10, min_non=10, max_non=0;
        while(opps.hasNext()){
            opp_smrt = opps.next().intValue();
            if(isMember[opp_smrt]){
                if(opp_smrt < min_mem) min_mem = opp_smrt;
            }else{
                if(opp_smrt < min_non) min_non = opp_smrt;
                if(opp_smrt > max_non) max_non = opp_smrt;
            }
        }
        if(cult_cnt>2 && min_non!=10) cult_vote = min_non;
        else if(max_non!=0)           cult_vote = max_non;
        else                          cult_vote = min_mem;
        return cult_vote;
    }
}

Son düşünceler:

Kült şimdi yüz yüze kalan sadece iki veya daha az kült üyesi olduğunda en tehlikeli oyunculara oy veriyor. Birkaç kez cult_cnt>1ve cult_cnt>2koşullar ile test ettim ve daha sonra daha sık kazanır.

Yine de, bu bir önlemdir ve kült gerçekten yalnız bir oyuncu olarak çalışmak için tasarlanmamıştır, bu nedenle yeni oyuncuların sayısı arttıkça kültün kaybedilmesi gerekir.


İlk önce en akıllı üye olmayanları oy kullanmak daha iyi olmaz mıydı?
agweber

Kontrolör kodunu, rastgele değişkenin statik olması için (ve Game.random ile erişilebilir) güncelledim. Ayrıca github'daki
Nathan Merrill

1
@NathanMerrill Teşekkürler, ancak eğer tarikatın ilgisini oylayan bilinmeyen üye olmayanlara karşı daha hoşgörülü olma (şekil gitme) izin verirsem daha iyi sonuçlar elde ediyorum.
Linus

@ agweber, Öneri için teşekkürler. Bu muhtemelen daha iyi bir tek oyuncu olma şansını arttırıyor, ancak sayıları olduğu sürece potu çalıştırmaya çalışmalı. Yeni sürümümün her iki dünyanın en iyisi olduğunu düşünüyorum.
Linus

2
TheCult istemek için beni teklif unusedPlayers.addAll(allPlayers);... tüm oyuncular (birlikte kartların birden deste karıştırma gibi) çeşitli çokluğu meydana böylece Game.java içinde, dokuz kez etrafında çoğaltılabilir hayır tabii, bu tamamen önyargılı bir istek var yok ama Ekip temelli stratejinin hala bir araya gelme şansı olsa bile ne kadar güçlü olabileceğini görmek ilginç.
Linus

7

BridgeBurner

Değil bir yerde, bunu şimdi test edebilirsiniz ve bu gerçekten çirkin / dilsiz kod gibi duygu geldi, ancak işe nereden gerektiğini çalışır.

Bu bot sadece nefret edilmek istiyor. Buna en az oy veren kişilere oy verir . Beraberlik durumunda, oy vermeden en uzun süren kişiyi seçer. Başka bir bağ olması durumunda, en akıllılarını alır (muhtemelen en kötü düşmanı yapacakları için). Kendisine oy vermeyecek, çünkü etrafta olmadığında kimse ondan nefret etmeyecek.

package WeakestLink.Players;

import WeakestLink.Game.Vote;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class BridgeBurner extends Player{
    @Override
    public int vote(Set<Integer> currentOpponents) {
        List<Integer> votes_against = Stream.generate(() -> 0).limit(9).collect(Collectors.toList());
        List<Integer> last_voted_against = Stream.generate(() -> 0).limit(9).collect(Collectors.toList());
        Iterator<Vote> votes_against_me = getVotesForSelf().iterator();

        for (int c = 0; c < 9; c++){
            if (!currentOpponents.contains(c)){
                votes_against.set(c,-1);
                last_voted_against.set(c,-1);
            }
        }

        while(votes_against_me.hasNext()){
            Vote vote = votes_against_me.next();

            int voter = vote.getVoter();
            int round = vote.getRound();

            if (currentOpponents.contains(voter)){
                votes_against.set(voter, votes_against.get(voter)+1);
                last_voted_against.set(voter, Math.max(round, last_voted_against.get(voter)));
            } else {
                votes_against.set(voter, -1);
                last_voted_against.set(voter, -1);
            }
        }

        int min_tally = Collections.max(votes_against);
        for (int c = 0; c < 9; c++){
            int current_tally = votes_against.get(c);
            if (current_tally != -1 && current_tally < min_tally){
                min_tally = current_tally;
            }
        }

        if (Collections.frequency(votes_against, min_tally) == 1){
            return votes_against.indexOf(min_tally);
        } else {
            List<Integer> temp_last_against = new ArrayList<>();
            for (int c = 0; c < 9; c++){
                if (votes_against.get(c) == min_tally){
                    temp_last_against.add(last_voted_against.get(c));
                }
            }
            return last_voted_against.lastIndexOf(Collections.min(temp_last_against));
        }
    }
}

Bu botun çalışmasını sağlayamadım. Birkaç hata düzelttim ve şu anda var olmayan bir oyuncuya oy veriyor. Doğru olup olmadığından emin olamadığım tek değişiklik, "last_round_voted" in tanımlanmadığı, bu yüzden "last_voted_against" olarak değiştirdim. Değişikliklerimi burada bulabilirsiniz: github.com/nathanmerrill/WeakestLink/blob/master/src/…
Nathan Merrill

@NathanMerrill Bu kod görünüşte düşündüğümden daha da kötüydü. Artık test edebildiğim için, her iki sürüme de bakacağım ve çalışmayı deneyeceğim.
SnoringFrog

@NathanMerrill Birkaç sorun bulundu. Yani, bulunmayan ve bot için oy kullanmayan oyuncuları görmezden gelmedim, bu yüzden her zaman kendilerine oy vermeye çalıştı. Ayrıca yanlış listeden bir noktadan indeks almak için kullanıldı, bu da oyuncunun -1oy kullanmasına neden oldu. Ancak şimdi düzeltilmelidir.
SnoringFrog

1
İşe yarıyor ama korkunç. Rasgele oyuncu yenerek tebrikler!
Nathan Merrill,

1
Bazen
@NathanMerrill

6

çoğunluk partisi

Hedeflenen o olmadığı sürece, oylamada kalabalığı takip eder.

package WeakestLink.Players;

import WeakestLink.Game.Vote;
import java.util.Map;
import java.util.Set;

/**
 * Votes for the currently most voted bot in the game. Or the lowest one.
 */
public class Bandwagon
        extends Player {

    @Override
    public int vote(Set<Integer> currentOpponents) {
        int self = getSmartness(), vote = -1;
        java.util.Map<Integer, Integer> votes = new java.util.TreeMap<>();
        getVotingHistory().stream().map((Vote v)-> v.getVoted()).filter((Integer i)-> !i.equals(self)).forEach((Integer tgt)-> {
            if(!votes.containsKey(tgt)) {
                votes.put(tgt, 1);
            } else {
                votes.put(tgt, votes.get(tgt) + 1);
            }
        });

        do {
            if(votes.entrySet().isEmpty()) {
                vote = currentOpponents.stream().filter((Integer i)-> !i.equals(self)).sorted().findFirst().get();
            } else {
                if(votes.containsKey(vote)) {
                    votes.remove(vote);
                    vote = -1;
                }

                for(Map.Entry<Integer, Integer> vv: votes.entrySet()) {
                    Integer key = vv.getKey();
                    Integer value = vv.getValue();

                    if((vote == -1) || (value > votes.get(vote))) {
                        vote = key;
                    }
                }
            }
        } while(!currentOpponents.contains(vote));

        return vote;
    }
}

Bunun keskin nişancıları takip ederek daha da güçlendireceğini tahmin ediyorum, ama aynı zamanda kült ve keskin nişancıların biraz etkili bir şekilde hedef almasını da önlüyorum. Keskin nişancı katilleri için bir engel olabilir veya daha fazlası varsa onlara yardım edebilir. (En son güncellemelerle test etmeniz gerekir).

Java 8 özelliklerini kullanmak çünkü oyunun yine de çalışması gerekiyor.


1
Bazı iyi yazılmış bir kod görmek güzel :)
Nathan Merrill

6

RevengePlayer

Bu bot en çok oy veren kişiye oy verecek, tiebreaker en zeki oyuncu. Teori, geçmişte size oy veren bir oyuncunun muhtemelen size tekrar oy vermesidir.

package WeakestLink.Players;
import java.util.Collections;
import java.util.Set;
import java.util.Iterator;
import WeakestLink.Game.Vote;
public class RevengePlayer extends Player{

    @Override
    public int vote(Set<Integer> opponents) {
        int[] A;
        A = new int[10];
        for(int i = 1;i < 10;i++)
            A[i] = opponents.contains(i)? i+1 : 0;
        Set<Vote> H = getVotingHistory();
        Iterator<Vote> I = H.iterator();
        while(I.hasNext()){
            Vote v = I.next();
            if(v.getVoted() == getSmartness())
                A[v.getVoter()] += A[v.getVoter()] != 0?10:0;
        }
        int maxI = 0;
        for(int i = 1;i < 10;i++)
            if(A[i] > A[maxI])
                maxI = i;
        return maxI;
    }
}

Geçenlerde akıllılığın 1-9 yerine 0-8 olduğu bir hatayı düzelttim. Bu kodunuzu kırdı, ben de düzelttim (güncellenmiş kodu depoda bulabilirsiniz): github.com/nathanmerrill/WeakestLink/blob/master/src/…
Nathan Merrill

@NathanMerrill koduma yaptığınız düzeltmede küçük bir hata vardı. Kodumu daha iyi hale getirmek için düzenledim.
MegaTom

5

MeanPlayer

Ne aptal ne de en zeki oyunculara oy verin ve silah taşıyor (güvenlikten gizlice geçti)

public class MeanPlayer extends Player{

    @Override
    public int vote(Set<Integer> currentOpponents) {
        int mid = currentOpponents.size() / 2;
        Object[] sortedOpponents = currentOpponents.toArray();
        Arrays.sort(sortedOpponents);
        return (int) sortedOpponents[mid];
    }
}

Bu oyuncunun diğerlerinden / nedenlerinden herhangi bir anlam ifade ettiğini anlamıyorum
Nathan Merrill

Dikkat edin @NathanMerrill, silahı var! Eğer yerinde olsam sözlerimi dikkatlice
seçerdim

10
@ CSᵠ Endişeli değilim. Ortalama bir oyuncu olduğunda, silahı kendi üzerinde kullanır.
quintopia

14
Bu oyuncu olabileceğinden daha az kaba. O ortalamadan daha medyan görünmektedir.
Yakk

7
Hah .... bana bir dakika sürdü
Monica

5

AntiExtremist

Bu aşırı sosyalist, tüm insanların eşit derecede akıllı olması gerektiğine inanıyor. Ondan daha akıllı ya da daha zeki olanları öldürmeye çalışıyor. İkisini de düşünüyor ama genel olarak aptalca davranıyor. Aptal insanlara başlangıçta zekice ve sonunda zekice davranıyor, ancak bu insanların ne kadar aşırı olduğuna bağlı olarak ağırlıklandırılıyor.

package WeakestLink.Players;
import java.util.Arrays;
import java.util.Set;

public class AntiExtremist extends Player {

    Object[] currentPlayers;

    @Override
    public int vote(Set<Integer> currentOpponents) {

        currentPlayers = (Object[]) currentOpponents.toArray();
        Arrays.sort(currentPlayers);

        int smartness = getSmartness();
        int turns = getTurnNumber();

        //// Lets get an idea of who's smart and who's dumb ////

        int smarter = 0, dumber = 0;

        int max_smart = 0, min_smart = 10;

        currentOpponents.toArray();

        for (int i = 0; i < currentPlayers.length; i++) {
            int osmart = (int)currentPlayers[i];

            if (osmart == smartness)
                continue;

            if (osmart > smartness) {
                smarter++;

                if (osmart > max_smart)
                    max_smart = osmart;
            }
            else if (osmart < smartness) {
                dumber++;

                if (osmart < min_smart)
                    min_smart = osmart;
            }

        }

        // int total = smarter+dumber;

        double smarter_ratio = smarter > 0 ? (max_smart-smartness)/4.5 : 0; 
        double dumber_ratio = dumber > 0 ? (smartness-min_smart)/3.0 : 0;//Favor dumber

        smarter_ratio*=.25+(turns/9.0*.75);
        dumber_ratio*=1-(turns/8.0*.75);

        return smarter_ratio > dumber_ratio ? max_smart : min_smart;

    }

}

NOT: Linus'a göre bu, keskin nişancı ile aynı zamanın çoğunu oylayacaktır (525602: 1228).


Şu an için mevcut çalışmayı 10K olarak tutacağım (daha hızlı testler için). Son ödevimi yaptığımda, muhtemelen daha büyük hale getireceğim.
Nathan Merrill

Seni hiçbir şeyle suçlamaya çalışmıyorum, ama bu Sniper’in zamanın ~% 99.7’sinin yapacağı gibi oy veriyor, temelde aynı stratejiye çok yakın olduklarından, kazananlar için bir jeton çevirisi olacak.
Linus

Bu istatistiği nereden aldın? Yarı benzer bir stratejisi olduğunu itiraf ediyorum, ancak amacım benden çok daha zeki olanlar için çok akıllı olan insanlara oy vermeyi seçerek sizinki kadar basit olan bir şeyi geliştirmeye çalışmaktı. eğer hayatta kalırlarsa saksıya)
csga5000

1
Ben senin sınıf a verdi static Sniper S = new Sniper()ve static long agrees=0, disagrees=0;. Oylama yönteminizde, S.setSmartness(getSmartness()); int sniper_answer=S.vote(currentOpponents);bir keskin nişancı'nın pozisyonunuzda nasıl oy kullanacağını hesaplayan ekledim, sonra cevabınızı, cevabını iade etmeden önce kararlaştırıp onaylamadığını saymak için cevabınızı bir değişkene koyun. Oyun bittikten sonra yazdırabilirsiniz: 525602: 1228 olan anlaşmazlık.
Linus

1
@Linus Bu mantıklı geliyor, okunaklı geliyor. Bununla ilgili bir not ekleyeceğim.
csga5000

5

Casus

Casus saklıdır. En zeki insanlar için silah kullanmayı sevmiyor. Aynı şekilde, quartata savunmasız salakları seçmekten de hoşlanmaz . Bu yüzden, akıllıca kendisine en yakın olanları elemekten hoşlanır.

package WeakestLink.Players;

import java.util.Iterator;
import java.util.Set;

public class Spy extends Player{
  @Override
  public int vote(Set<Integer> currentOpponents) {
    int selfIntel = getSmartness();
    int closestIntel = 100; // default
    // get closest player
    Iterator<Integer> enemies = currentOpponents.iterator();
    while(enemies.hasNext()){
      int enemyIntel = enemies.next().intValue();
      if(Math.abs(enemyIntel - selfIntel) < closestIntel) closestIntel = enemyIntel;
    }
    return closestIntel;
  }
}

Az önce geri çekildin, mes amis . Kazanması umrunda değil. Sırf bıçağın sesini beğenir ve seni başarılı bir şekilde oy verir.

Daha yeni geri çekildin.


4
Bu görüntü olsa da. +1
Addison Crump,

Bunun bir böceği olduğunu düşünüyorum. Math.abs(enemyIntel - selfIntel) < closestIntelolmalı Math.abs(enemyIntel - selfIntel) < Math.abs(closestIntel - selfIntel).
MegaTom

@ MegaTom Sanırım haklısın. Java kullanabildiğimde bunu daha da kontrol edeceğim. Olası avlanma için teşekkürler!
Conor O'Brien,

4

MedianPlayer

Bu oyuncu bir soldaki en kötü (iyi, ortancalık) olmaya çalışıyor.

En zeki ve en aptal rakipleri ortadan kaldırmak için oy kullanır (kendinden daha zeki / daha aptal olmasına rağmen).

package WeakestLink.Players;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
public class MedianPlayer extends Player {
  @Override
  public int vote(Set<Integer> currentOpponents) {
    int smrt = getSmartness();

    //count number of players smarter/stupider than me
    Iterator<Integer> opps = currentOpponents.iterator();
    int cnt_smrt=0, cnt_stpd=0, min_stpd=10, max_smrt=0;

    while(opps.hasNext()){
      int opp_smrt = opps.next().intValue();
      if(opp_smrt > smrt){
        cnt_smrt++;
        if(opp_smrt > max_smrt)
          max_smrt = opp_smrt;
      } else if(opp_smrt < smrt){
        cnt_stpd++;
        if(opp_smrt < min_stpd)
          min_stpd = opp_smrt;
      }
    }

    // the middle must hold
    if(cnt_stpd>cnt_smrt)
      return min_stpd;
    else
      return max_smrt;
  }
}

çerçeve yukarıda Lusus'tan açıkça çalındı.


IDE'mi kopya kod hakkında şikayet ettin!
Nathan Merrill

@NathanMerrill Kopyala-makarna saldırısı! Not Gönderdiğimden beri sınıfın adını değiştirdim. Sanırım, onlara karşı çıkamayacağınızdan emin olmak için başka birinin sınıf adını çoğaltmak kuralların ruhuna aykırı olacaktır.
Yakk

2
Çalışmamı açıkça çaldığın için ya da en azından kabul ettiğin için teşekkürler.
Linus

2
@Linus Rica ederim! Taklit en iyi iltifattır, umarım.
Yakk

2
@ csga5000 açıkça çaldı şakasıydı ve ben sadece oynuyordum. Herhangi bir yarı yetkin kodlayıcı (örneğin, kendim gibi) döngüyü aynı şekilde yazardı, bu yüzden yaptığı tek şey değişken isimlerimi çalmaktı. Onları telif hakkıyla düşünmeyi düşündüm, belki telif ücretlerini talep edebilirdim; )
Linus

4

Ödlek

package WeakestLink.Players;
import WeakestLink.Game.Vote;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
public class Coward extends Player {
  @Override
  public int vote(Set<Integer> currentOpponents) {

    boolean[] currentOpponent = new boolean[10];

    Iterator<Integer> opps = currentOpponents.iterator();
    while(opps.hasNext()){
      currentOpponent[opps.next().intValue()] = true;
    }

    int[] voteCounts = new int[9];
    for(int i=0; i<9; i++) {
        voteCounts[i] = 0;
    }

    Iterator<Vote> votes = getRecentVotes().iterator();

    while(votes.hasNext()){
      Vote opp_vote = votes.next();
      if(currentOpponent[opp_vote.getVoter()])
        voteCounts[opp_vote.getVoted()] += 1;
      else
        voteCounts[opp_vote.getVoter()] += 100;
    }

    int previous_weakest = -1;
    int max_votes_gotten = 0;
    for(int i=0;i<9;i++){
      if (voteCounts[i] > max_votes_gotten) {
        max_votes_gotten = voteCounts[i];
        previous_weakest = i;
      }
    }
    int min_closeness = 10;
    int to_vote = -1;
    int opp;
    int closeness;
    opps = currentOpponents.iterator();
    while(opps.hasNext()){
      opp = opps.next();
      closeness = Math.abs(opp - previous_weakest);
      if(closeness <= min_closeness) {
        to_vote = opp;
        min_closeness = closeness;
      }
    }

    return to_vote;

  }
}

Sadece oy kullanmak istemiyor, bu yüzden kazanan takımda kalma şansını en üst düzeye çıkarmak için son turda oy alan oyuncuya en çok benzeyen rakibe oy veriyor.

Şu anda özellikle iyi yapmıyor, ancak karışımın içine de atabilir.


Geçenlerde akıllılığın 1-9 yerine 0-8 olduğu bir hatayı düzelttim. Bu kodunuzu kırdı, ben de düzelttim (güncellenmiş kodu depoda bulabilirsiniz): github.com/nathanmerrill/WeakestLink/blob/master/src/…
Nathan Merrill

4

Kahraman

Zayıf olanı seçenlere ... ... oy verir ya da onu kızdırır.

package WeakestLink.Players;

import WeakestLink.Game.Game;
import WeakestLink.Game.Vote;

import java.util.*;

/**
 * Created by thenumberone on 12/2/15.
 * @author thenumberone
 */
public class Hero extends Player{

    @Override
    public int vote(Set<Integer> currentOpponents) {
        int me = getSmartness();
        Set<Vote> history = getVotingHistory();
        history.removeIf(vote -> !currentOpponents.contains(vote.getVoter()) || vote.getVoter() == me);
        int[] evilnessLevel = new int[Game.NUMBER_PLAYERS_PER_ROUND];
        for (Vote vote : history){
            evilnessLevel[vote.getVoter()] += vote.getVoted() == me ? 1_000_000 : Game.NUMBER_PLAYERS_PER_ROUND - vote.getVoted();
        }
        int mostEvilOpponent = -1;
        for (int opponent : currentOpponents){
            if (mostEvilOpponent == -1 || evilnessLevel[opponent] > evilnessLevel[mostEvilOpponent]){
                mostEvilOpponent = opponent;
            }
        }
        return mostEvilOpponent;
    }
}

Geçenlerde akıllılığın 1-9 yerine 0-8 olduğu bir hatayı düzelttim. Bu kodunuzu kırdı, ben de düzelttim (güncellenmiş kodu depoda bulabilirsiniz): github.com/nathanmerrill/WeakestLink/blob/master/src/…
Nathan Merrill

@NathanMerrill Eyvallah :)
TheNumberOne

4

şilin

Bob sadece daha zeki olduğunu düşünen ortalama bir adam, daha sonra gerçekten. Keskin nişancı ailesini kazanamıyorum ama çoğu zaman simülasyonlarımda ilk 5'e giriyorum.

package WeakestLink.Players;

import java.util.Collections;
import java.util.Set;

import WeakestLink.Game.Vote;

public class BobPlayer extends Player {


    @Override
    public int vote(Set<Integer> currentOpponents) {
        int smartness;

        // Bob sometimes thinks he is smarter than he really is
        if (getRandom().nextInt(10) == 0) {
            smartness = 10;
        } else {
            smartness = getSmartness();
        }

        // If there is still some competition
        if (currentOpponents.size() > 3) {
            // And Bob is the dumbest
            if (smartness < Collections.min(currentOpponents)) {
                // Go for the smartest one
                return Collections.max(currentOpponents);
                // But if he is the smartest
            } else if (smartness > Collections.max(currentOpponents)) {
                // Go for the weak link
                return Collections.min(currentOpponents);
            } else {
                // Else revenge!
                for (Vote v : getRecentVotes()) {
                    if (v.getVoted() == smartness && currentOpponents.contains(v.getVoter())) {
                        return v.getVoter();
                    }
                }
            }
            return Collections.min(currentOpponents);
        } else {
            //If there are few opponents just revenge!
            for (Vote v : getRecentVotes()) {
                if (v.getVoted() == smartness && currentOpponents.contains(v.getVoter())) {
                    return v.getVoter();
                }
            }
            return Collections.max(currentOpponents);
        }
    }



}

4

FixatedPlayer

Rastgele bir hedef seçer, sonra gidene kadar onlara oy verir. Yine de kendisi için oy kullanmayacak.

package WeakestLink.Players;

import WeakestLink.Game.Vote;

import java.util.*;

public class FixatedPlayer extends Player{
    @Override
    public int vote(Set<Integer> currentOpponents) {
        int self = getSmartness();
        Vote previous_vote = getLastVote();
        if (previous_vote == null || !currentOpponents.contains(previous_vote.getVoted())){
            return (int) currentOpponents.toArray()[getRandom().nextInt(currentOpponents.size())];
        }
        else {
            return previous_vote.getVoted();
        }
    }
}

Bu kod da işe yaramadı, ancak kolay bir düzeltme yapıldı. Yapma zamanınız aslında gerekli değil, çünkü aktüel bileşenlerinizi geçtiğimde size akıllılığınızı vermiyorum. Sabit kod burada bulunabilir: github.com/nathanmerrill/WeakestLink/blob/master/src/…
Nathan Merrill

@NathanMerrill Düzeltilen kodu cevabımı düzenlemiştim, bu yüzden burada görünen herkes gerçekte neyin çalıştırıldığını
görüyor

4

İstatistik

Bu yarışmaya bir giriş değil. Bu sadece bir oyunun istatistiklerini elde etmenin bir yoludur. Bu istatistikler, belirli bir oyuncunun bir raundda oy kullanma olasılığını yüzde olarak gösterir.

Bunu yapmak için, aşağıdaki satırları Round.javadosyanın üst kısmının şöyle görünmesi için ekleyin :

package WeakestLink.Game;

import WeakestLink.Players.Player;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Round {

    private static int[][] statistics = new int[Game.NUMBER_PLAYERS_PER_ROUND - 2][Game.NUMBER_PLAYERS_PER_ROUND + 1];
    private static int[] counts = new int[Game.NUMBER_PLAYERS_PER_ROUND - 2];

    static {
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            for (int i = 0; i < Game.NUMBER_PLAYERS_PER_ROUND - 2; i++){
                System.out.println();
                System.out.println("For " + (i+1) + "th round:");
                for (int j = 1; j <= Game.NUMBER_PLAYERS_PER_ROUND; j++){
                    System.out.println(String.format("%f%% voted for %d", 100.0*statistics[i][j]/counts[i], j));
                }
            }
        }));
    }

...

Ardından şöyle görünecek şekilde oylama yöntemini değiştirin:

private Vote vote(Player player){
    player.setVotingHistory(new HashSet<>(votes));
    player.setTurnNumber(currentTurn);
    player.setPot(pot);
    Set<Integer> players = currentPlayers.stream()
            .filter(p -> p != player)
            .map(playerToSmartness::get)
            .collect(Collectors.toSet());
    int vote = player.vote(players);
    if (!currentPlayers.contains(smartnessToPlayer.get(vote))){
        throw new RuntimeException(player.getClass().getSimpleName()+" voted off non-existent player");
    }
    Vote v = new Vote(playerToSmartness.get(player), vote, currentTurn);
    counts[v.getRound()]++;
    statistics[v.getRound()][v.getVoted()]++;
    return v;
}

Örnek çıktı:

For 1th round:
55.554756% voted for 1
4.279166% voted for 2
1.355189% voted for 3
1.778786% voted for 4
3.592771% voted for 5
3.952368% voted for 6
1.779186% voted for 7
6.427149% voted for 8
21.280630% voted for 9

For 2th round:
2.889877% voted for 1
34.080927% voted for 2
6.826895% voted for 3
4.990010% voted for 4
5.914753% voted for 5
4.985510% voted for 6
3.302524% voted for 7
11.304360% voted for 8
25.705144% voted for 9

For 3th round:
2.152783% voted for 1
13.005153% voted for 2
21.399772% voted for 3
7.122286% voted for 4
6.122008% voted for 5
6.761774% voted for 6
11.687049% voted for 7
19.607500% voted for 8
12.141674% voted for 9

For 4th round:
2.122183% voted for 1
10.105719% voted for 2
11.917105% voted for 3
17.547460% voted for 4
8.626131% voted for 5
12.079103% voted for 6
18.819449% voted for 7
11.065111% voted for 8
7.717738% voted for 9

For 5th round:
1.689826% voted for 1
7.364821% voted for 2
9.681763% voted for 3
11.704946% voted for 4
20.336237% voted for 5
20.691914% voted for 6
13.062855% voted for 7
9.332565% voted for 8
6.135071% voted for 9

For 6th round:
1.456188% voted for 1
6.726546% voted for 2
10.154619% voted for 3
16.355569% voted for 4
22.985816% voted for 5
17.777558% voted for 6
11.580207% voted for 7
7.757938% voted for 8
5.205558% voted for 9

For 7th round:
1.037992% voted for 1
6.514748% voted for 2
15.437876% voted for 3
22.151823% voted for 4
17.015864% voted for 5
14.029088% voted for 6
11.907505% voted for 7
7.957136% voted for 8
3.947968% voted for 9

1
1., 2., 3.? "Tur 1" için vb. Yazdırmayı değiştirmenizi öneririm
Skyler

3

Maksimum oyuncu

Her şeyi bilen bir şey. Zekası yüksek olan birini çıkarmayı tercih eder (bu nedenle eşsiz aklına meydan okuyabilir)

public class MaxPlayer extends Player{

    @Override
    public int vote(Set<Integer> currentOpponents) {
        return Collections.max(currentOpponents);
    }
}

3

bekçi

Güçlü olanları veya onu kızdıranları oylar.

package WeakestLink.Players;

import WeakestLink.Game.Game;
import WeakestLink.Game.Vote;

import java.util.Set;

/**
 * Created by thenumberone on 12/2/15.
 * @author thenumberone
 */
public class Guard extends Player{

    @Override
    public int vote(Set<Integer> currentOpponents) {
        int me = getSmartness();
        Set<Vote> history = getVotingHistory();
        history.removeIf(vote -> !currentOpponents.contains(vote.getVoter()) || vote.getVoter() == me);
        int[] evilnessLevel = new int[Game.NUMBER_PLAYERS_PER_ROUND];
        for (Vote vote : history){
            evilnessLevel[vote.getVoter()] += vote.getVoted() == me ? 1_000_000 : vote.getVoted();
        }
        int mostEvilOpponent = -1;
        for (int opponent : currentOpponents){
            if (mostEvilOpponent == -1 || evilnessLevel[opponent] > evilnessLevel[mostEvilOpponent]){
                mostEvilOpponent = opponent;
            }
        }
        return mostEvilOpponent;
    }
}

Geçenlerde akıllılığın 1-9 yerine 0-8 olduğu bir hatayı düzelttim. Bu kodunuzu kırdı, ben de düzelttim (güncellenmiş kodu depoda bulabilirsiniz): github.com/nathanmerrill/WeakestLink/blob/master/src/…
Nathan Merrill

3

Sülük

En zeki ve en aptal adamlara oy vermek için diğer botlara güvenir ...

Ortada bir yerlere gelmekten ve sonunda potu kazananla bölmekten memnun (çünkü gerçekten çok iyi bir erkek botu).

package WeakestLink.Players;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Set;

public class Leech extends Player {
    /**
     * Copyrighted (not really, use this however you want friends) by Sweerpotato :~)!
     */
    @Override
    public int vote(Set<Integer> currentOpponents) {
        int mySmartness = getSmartness();

        ArrayList<Integer> opponentSmartness = new ArrayList<Integer>();
        opponentSmartness.addAll(currentOpponents);
        opponentSmartness.add(mySmartness);
        Collections.sort(opponentSmartness);

        if(mySmartness > 4 && mySmartness > Collections.min(opponentSmartness)) {
            //There's somebody dumber than me, vote that dude off
            return opponentSmartness.get(opponentSmartness.indexOf(mySmartness) - 1);
        }
        else {
            //Vote off the smartest guy, so we have a better chance to win
            if(mySmartness == Collections.max(opponentSmartness)) {
                //Apparently, we're the smartest guy
                return opponentSmartness.get(opponentSmartness.indexOf(mySmartness) - 1);
            }
            else {
                return Collections.max(opponentSmartness);
            }
        }
    }
}

2
Severim. Ancak bunun iyi sonuç vermeyeceğinden endişeliyim, çünkü çoğu kişi sizinle aynı oyu kullanmayacak. Bu rekabetin bir kusuru, diğer botların sizi belirli bir strateji türüne uymaya zorladığını gösteriyor.
csga5000

3
Yine de eğlenceli! Kazanmak her şey değildir: ~)!
tatlı patates

3

SniperKiller

Linus'un kodundan utanmadan çalınan bir başka cevap . Bu, tüm keskin nişancıları öldürecek, onları koruyamayacak. Keskin nişancı kalmadığını biliyorsa keskin nişancı gibi davranır.

package WeakestLink.Players;
import WeakestLink.Game.Vote;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;

public class SniperKiller extends Player {
    boolean[] sniperish;
    int[] sniperwouldvote;

    @Override
    public int vote(Set<Integer> currentOpponents) {
        int smrt = getSmartness();
        currentOpponents.add(smrt);
        if(sniperish==null){
            sniperish = new boolean[10];
            sniperwouldvote = new int[10];
            for(int i=10;--i!=0;){
                sniperish[i] = true;
                sniperwouldvote[i] = 1;
            }
            sniperish[smrt]=false; //knows we are not the sniper
            return 1;
        }
        //figure out who isn't a sniper
        Vote opp_vote;
        int opp_smrt;
        Iterator<Vote> votes = getRecentVotes().iterator();
        while(votes.hasNext()){
            opp_vote = votes.next();
            opp_smrt = opp_vote.getVoter();
            if(opp_vote.getVoted() != sniperwouldvote[opp_smrt])
                sniperish[opp_smrt] = false;
        }
        //figure out how snipers would vote this round
        Iterator<Integer> opps = currentOpponents.iterator();
        int cnt_opp=0, min_opp=10, max_opp=0;
        int[] snpr_votes = new int[10];
        while(opps.hasNext()){
            opp_smrt = opps.next().intValue();
            if(smrt == opp_smrt) continue;
            sniperwouldvote[opp_smrt] = hypothetically(opp_smrt, currentOpponents);
            cnt_opp++;
            if(sniperish[opp_smrt]){
                snpr_votes[sniperwouldvote[opp_smrt]]++;
            }
            if(opp_smrt<min_opp) min_opp=opp_smrt;
            if(opp_smrt>max_opp) max_opp=opp_smrt;
        }
        for(int i = 1;i<10;i++){//hit the weakest sniper.
            if(sniperish[i] && currentOpponents.contains(i))
                return i;
        }
        return hypothetically(smrt, currentOpponents);
    }

    private int hypothetically(int smrt, Set<Integer> currentOpponents) {
        Iterator<Integer> opps = currentOpponents.iterator();
        int cnt_smrt=0, cnt_stpd=0, opp_smrt, min_stpd=10, max_smrt=0;
        while(opps.hasNext()){
            opp_smrt = opps.next().intValue();
            if(opp_smrt > smrt){
                cnt_smrt++;
                if(opp_smrt > max_smrt) max_smrt = opp_smrt;
            }
            else if(opp_smrt < smrt){
                cnt_stpd++;
                if(opp_smrt < min_stpd) min_stpd = opp_smrt;
            }
        }
        if(cnt_stpd>1) return min_stpd;
        return max_smrt;
    }
}

1
Fikir hoşuma gidiyor, ancak en az veya en fazla oyuncuya oy verme kültürü var gibi görünüyor. başkası için oy kullanmak oyunuzu çöpe atıyor olabilir . Belki bir başkasına oy vermeden önce makaranın keskin nişancı olup olmadığını kontrol edersen biraz yakalarsın ... (Telefonda kontrol edemiyorum)
Linus

2

RandomPlayer

public class RandomPlayer extends Player{

    @Override
    public int vote(Set<Integer> currentOpponents) {
        return (int) currentOpponents.toArray()[getRandom().nextInt(currentOpponents.size())];
    }
}

2

MinPlayer

Bir Elitist. Zekası düşük olan birini çıkarmayı tercih eder.

public class MinPlayer extends Player {

    @Override
    public int vote(Set<Integer> currentOpponents) {
        return Collections.min(currentOpponents);
    }
}

2

VengefulSniper

Bu , orjinal olarak adlandırdığım (vazgeçmekten nefret ettiğim bir isim) diye düşündüğüm bir şey olarak başladı StupidBuffering, ardından hedeflenip hedeflenmediğini umursamayan sadece bir PrudentSniper oldu. Bu aynı zamanda PrudentSniper'ı yenememesinin tek sebebi gibi görünüyordu, bu yüzden odaklanmasını sağlamak için işleri biraz düzelttim.

Şimdi, bu temel olarak bir keskin nişancı, ama en zeki ya da en aptal bot onu hedefliyorsa, hangisinin en son oyu aldığını hedefleyecektir. Her ikisi de aynı sayıda oy aldıysa ve her ikisi de onu hedef aldıysa, normal keskin nişancı-davranışına geri döner. Testlerimde, bu gerçek bazen PrudentSniper'i yener.

package WeakestLink.Players;

import java.util.*;

import WeakestLink.Game.Vote;

public class VengefulSniper extends Player{
    @Override
    public int vote(Set<Integer> currentOpponents) {
        int me = getSmartness();
        int smartOpp = Collections.max(currentOpponents);
        int dumbOpp = Collections.min(currentOpponents);
        int votesAgainstSmart=0, votesAgainstDumb=0;
        Boolean targetedBySmart = false, targetedByDumb = false;

        Set<Vote> votesForMe = getRecentVotes();
        Iterator<Vote> votes = votesForMe.iterator();
        while(votes.hasNext()){
            Vote vote = votes.next();
            int voter = vote.getVoter();
            int voted = vote.getVoted();

            if(voted == me){
                if(voter == smartOpp){
                    targetedBySmart = true;
                }
                if(voter == dumbOpp){
                    targetedByDumb = true;
                }
            } else if (voted == smartOpp){
                votesAgainstSmart++;
            } else if (voted == dumbOpp){
                votesAgainstDumb++;
            }
        }

        // If being targeted by smartest or dumbest, take them out
        // Try to go with the rest of the crowd if they both targeted me
        if(targetedBySmart ^ targetedByDumb){
            return targetedBySmart ? smartOpp : dumbOpp;
        } else if (targetedBySmart && targetedByDumb){
            if (votesAgainstSmart > votesAgainstDumb){
                return smartOpp;
            } else if (votesAgainstDumb > votesAgainstSmart){
                return dumbOpp;
            }
        }

        Iterator<Integer> opps = currentOpponents.iterator();
        int cnt_stpd=0;
        while(opps.hasNext()){
            int opp_smrt = opps.next().intValue();
            if(opp_smrt < me){
                cnt_stpd++;
            }
        }

        if (cnt_stpd < 2 || (currentOpponents.size() < 4)){ //buffer is small, protect myself
            return smartOpp;
        } else {
            return dumbOpp;
        }
    }
}

2

Aracı

MiddleMan, karı en üst düzeye çıkarmak için elinden gelenin en iyisini yapmaya çalışırken, oyunda kesilmediğine dikkat edin. Bir sonraki tura çıkma şansını artırmak (ve kolay bir bitiş yapmak) için daha az sayıda yarışmacı tutuyor. Kendisinden daha akıllı birine, sadece daha az yarışmacıdan daha akıllı yarışmacılar varsa oy kullanacaktır. İki gruptan hangisi olursa olsun, potu tırmanmaya devam etmek için daima en düşük gruba oy verir.

package WeakestLink.Players;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
public class MiddleMan extends Player {
    @Override
    public int vote(Set<Integer> currentOpponents) {
        int smrt = getSmartness();

        //count number of players smarter/stupider than me
        Iterator<Integer> opps = currentOpponents.iterator();
        int cnt_smrt=0, cnt_stpd=0, opp_smrt, min_stpd=9, min_smrt=9;

        while(opps.hasNext()){
            opp_smrt = opps.next().intValue();
            if(opp_smrt > smrt){
                cnt_smrt++;
                if(opp_smrt < min_smrt) min_smrt = opp_smrt;
            }
            else if(opp_smrt < smrt){
                cnt_stpd++;
                if(opp_smrt < min_stpd) min_stpd = opp_smrt;
            }
        }

        //Keep myself in the middle of the pack, favoring the point earners
        if(cnt_stpd>cnt_smrt)
            return min_stpd;
        else
            return min_smrt;
    }
}

PS umarım derler, ben bir Java adamı değilim.

Diğer girişleri okumadan önce bu şemayı düşündüm. Sonra ne kadar yakın (ama eleştirel farklı) şaşırdı Sniper yüzden devam ettim ve bir atlama noktası olarak Java sözdizimi bilmiyorum beri kullanıldı. Teşekkürler @Linus


1
Lütfen kodunuzu test edin. bilmediğiniz dillerde cevap yazmaya çalışmayın
TanMath

@TanMath - Girişiniz için teşekkürler. C / Java benzeri dillerde çok deneyimim var, ancak özellikle Java değil, kodumun gerçekten doğru olduğundan ve çalışacağından eminim. Bu, içinde bir hata varsa ve çalışmazsa, oyun ustası girişi diskalifiye ederse kırılmayacağım.
tbernard

Haklısın. @Linus'a teşekkürler. Düzenlenen.
tbernard

1
@tbernard Hataları düzeltmekten mutluyum, ancak kodunuzda hiç yoktu :)
Nathan Merrill

Ahh. Umduğum gibi yapmadım. Keskin nişancıya yardım etmiş gibiydim, bu yüzden haha ​​sanırım.
tbernard

2

ApproximatePosition

Bu bot, grubun aynı düzende devam edeceğini, yani aynı tipte bir hedefi hedef alacağını varsayarsak, yaklaşık olarak akıllılık değerlerinin etrafında çekim yapmaya çalışıyor. Bir seçim olduğunda her zaman en zeki iki oyuncuya oy verir.

Uzun zamandır Java'yı kullanmadım ve şu anda işteyim bu yüzden ... Test edemiyorum, umarım çok paralı değildir, lütfen nazik olun :).

Bu arada, sadece bir n_n tuple'ı uygulamak için fazla tembel olduğum için awt.Point kullanıyor.

package WeakestLink.Players;
import WeakestLink.Game.Vote;

import java.util.*;
import java.awt.Point;

public class ApproximatePosition extends Player
{

    @Override
    public int vote(Set<Integer> currentOpponent)
    {
        List<Integer> present = new ArrayList<>(currentOpponent);
        List<Integer> emptyPosition = new ArrayList<Integer>();
        Collections.sort(present);

        //If it is the first round, vote for the smartest buddy
        if(present.size()==8)
            return present.get(present.size()-1);


        int lastCheck=present.get(0);
        if(lastCheck>0)
            for(int i=0;i<lastCheck;i++)
                if(i!=getSmartness()&&!emptyPosition.contains(i))
                    emptyPosition.add(i);
        for(int i=1;i<present.size();i++)
        {
            if(present.get(i)-lastCheck>1)
                for (int j=lastCheck+1;j<present.get(i);j++)
                    if(j!=getSmartness()&&!emptyPosition.contains(j))
                        emptyPosition.add(j);
            lastCheck=present.get(i);
        }
        //untill there's at least 3 excluded members, we continue with this behaviour
        if(emptyPosition.size()<=2)
        {
            if(emptyPosition.isEmpty()) return present.get(present.size()-1);
            return decide(emptyPosition.get(0),present.get(present.size()-1),present.get(0),present);
        }

        Point maxRangeOfBlank=new Point(present.get(present.size()-1),present.get(present.size()-1));
        for (int i=0;i<emptyPosition.size()-1;i++)
            if(emptyPosition.get(i+1)-emptyPosition.get(i)==1)
            {
                int size=0;
                while(i+size+1<emptyPosition.size() && emptyPosition.get(i+size+1)-emptyPosition.get(i+size)==1)
                    size++;
                if(size>=sizeOfRange(maxRangeOfBlank))
                    maxRangeOfBlank=new Point(emptyPosition.get(i),emptyPosition.get(size));
                i+=size;
            }

        return decide(maxRangeOfBlank,present.get(present.size()-1),present.get(0),present);
    }

    private int decide(int blankSeat, int smartest,int dumbest,List<Integer> present)
    {
        return decide(new Point(blankSeat,blankSeat),smartest,dumbest,present);
    }

    private int decide(Point rangeBlankSeat, int smartest,int dumbest,List<Integer> present)
    {
        int target= smartest;
        if (rangeBlankSeat.getY()==smartest||((int)rangeBlankSeat.getY()+1)==getSmartness()){
            if ((rangeBlankSeat.getX()==dumbest||(int)rangeBlankSeat.getX()-1==getSmartness())){
                target= smartest; //should not happen
            } else {
                target= (int) rangeBlankSeat.getX()-1; //Vote for dumber than the missing
            }
        } else {
            target= (int) rangeBlankSeat.getY() +1; //Vote for smarter than the missing, default comportment
        }
        if(present.contains(target))
            return target;
        return smartest;
    }
    //Return the number of consecutive values between X and Y (included)
    private int sizeOfRange(Point range)
    {
        return (int)(range.getY()-range.getX())+1;
    }

}

Yani, bazı hatalar vardı. :) Öncelikle, ne yazık ki, Integer [] cast çalışmıyor, bir Object [] cast olmalı (ki sevmiyorum). Bu yüzden hepsini bir dizi yerine ArrayList'e sardım. İkincisi, bu satır: emptyPosition[emptyPosition.length]=j;her zaman sınırların dışına çıkar. Sonunda, neden olduğundan emin değilsiniz ancak raundda olmayan oyuncuları oylayacaksınız.
Nathan Merrill

Oh, ayrıca, üçlü blokunuz int yerine iki katına dönüyordu ve süper katlandı, onu / / eğer başka bir standart haline getirdim. Değişikliklerimin hepsini Github'da
Nathan Merrill

@NathanMerrill Wow, çok teşekkürler. Çünkü, emptyPosition[emptyPosition.length]aptalca bir hata, uzunluk her zaman son dizinin üstündedir. Değişiklikler için teşekkürler, düzeltmek için bu yeni sürümü kullanacağım. Üçlü blok hakkında ... evet, onu kullanmak gibi hissettim ve belki de kendim için yazmanın bir yolu, sanırım okumak için kullanışlı değildi. Düzeltmeleri yapmak ve güncellemek.
Katenkyo

2

SniperAide

İlavesiyle önce PrudentSniper ben yardım etmek için bir bot yazdım nişancı yendi AntiExtremist ve diğer sahtekarlıkların (Ben sevgiyle kelimeyi kullanın). SniperAide botu, keskin nişancı gibi oy veren ve bir fikir birliği olduğunda ne olacağını düşündüğü gibi oy veren oyuncuları arar. Eğer tüm oyuncular keskin nişancılar gibi görünüyorsa, maksimum oylamaya oy verir, kendisi de olsa, daha düşük Keskin Nişancıları korur (bu noktada maks.

Kod :

package WeakestLink.Players;
import WeakestLink.Game.Vote;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;

public class SniperAide extends Player {
    boolean[] sniperish;
    int[] sniperwouldvote;

    @Override
    public int vote(Set<Integer> currentOpponents) {
        int smrt = getSmartness();
        if(sniperish==null){
            sniperish = new boolean[10];
            sniperwouldvote = new int[10];
            for(int i=10;--i!=0;){
                sniperish[i] = true;
                sniperwouldvote[i] = 1;
            }
            sniperish[smrt]=false; //knows we are not the sniper
            return 1;
        }
        //figure out who might isn't a sniper
        Vote opp_vote;
        int opp_smrt;
        Iterator<Vote> votes = getRecentVotes().iterator();
        while(votes.hasNext()){
            opp_vote = votes.next();
            opp_smrt = opp_vote.getVoter();
            if(opp_vote.getVoted() != sniperwouldvote[opp_smrt])
                sniperish[opp_smrt] = false;
        }
        //include ourself in the simulation of other snipers.
        currentOpponents.add(smrt);
        //figure out how snipers would vote this round
        Iterator<Integer> opps = currentOpponents.iterator();
        int cnt_snpr=0, cnt_opp=0, min_opp=10, max_opp=0;
        int[] snpr_votes = new int[10];
        while(opps.hasNext()){
            opp_smrt = opps.next().intValue();
            if(smrt == opp_smrt) continue;
            sniperwouldvote[opp_smrt] = hypothetically(opp_smrt, currentOpponents);
            cnt_opp++;
            if(sniperish[opp_smrt]){
                cnt_snpr++;
                snpr_votes[sniperwouldvote[opp_smrt]]++;
            }
            if(opp_smrt<min_opp) min_opp=opp_smrt;
            if(opp_smrt>max_opp) max_opp=opp_smrt;
        }
        //figure out how to vote in sniper's intrest when not identified
        if(cnt_snpr == cnt_opp)
            return max_opp;
        if(cnt_snpr == 0)
            return hypothetically(smrt, currentOpponents);
        //if multiple hypothetical snipers only vote how they agree
        int onlyvote = -1;
        for(int i=10; --i!=0;){
            if(onlyvote>0 && snpr_votes[i]!=0) onlyvote=-2;
            if(onlyvote==-1 && snpr_votes[i]!=0) onlyvote=i;
        }
        if(onlyvote>0) return onlyvote;
        return max_opp;
    }

    private int hypothetically(int smrt, Set<Integer> currentOpponents) {
        Iterator<Integer> opps = currentOpponents.iterator();
        int cnt_smrt=0, cnt_stpd=0, opp_smrt, min_stpd=10, max_smrt=0;
        while(opps.hasNext()){
            opp_smrt = opps.next().intValue();
            if(opp_smrt > smrt){
                cnt_smrt++;
                if(opp_smrt > max_smrt) max_smrt = opp_smrt;
            }
            else if(opp_smrt < smrt){
                cnt_stpd++;
                if(opp_smrt < min_stpd) min_stpd = opp_smrt;
            }
        }
        if(cnt_stpd>1) return min_stpd;
        return max_smrt;
    }
}

O şu anda PrudentSniper'a çok yardım etmiyor.


Açıklamanıza ve teorisinize dayanarak, bunun keskin nişancı benzeri herhangi bir botun diğer keskin nişancıları yenmesine nasıl yardımcı olacağını anlamıyorum. Üzgünüm kodunuzu kazmak ve kendim için gerçekten anlamak için daha fazla zamanım yok.
csga5000

@ csga5000, Keskin Nişancı'yı şimdi oy kullanarak nadiren tespit edebileceğiniz için hepsini biraz koruyor. Ancak bir fark açık olduğunda, Keskin Nişancıların çıkarına her zaman etki eder, bu yüzden çoğunlukla bir tür bağlayıcıdır. Kazanmaya odaklanma, bireysel turlar değil, makroskopik oyunlardır, çoğu turda madeni para çevirme durumunu sürdürmekten başka bir şey yapamaz.
Linus

1

HighOrLowNotSelf

Rasgele en düşük veya en yüksek istihbarat oyuncusunu (ancak kendi kendine değil) kaldırır.

public class HighOrLowNotSelf extends Player{
    @Override
    public int vote(Set<Integer> ops) {
        int b=Math.round(Math.random()*1);
        int p;
        if(b==1) p=Collections.max(ops) else p=Collections.min(ops);
        if(p==getSmartness()) {
            return vote(ops);
        }
        return p;
    }
}

Yani, bu başvuru ile bir kaç hata var. İlk olarak, Math.round () longdeğil, a döndürür int. İkincisi, opskendinizi içermez. (Kendiniz için oy kullanmak istiyorsanız, açıkça eklemeniz gerekir). Son olarak, eklediğiniz if / else geçerli Java değil. Kodunuzu düzelttim ve github'a
Nathan Merrill

1

Anarşist

Anarşist rejimleri sevmez.
Anarşist mevcut cumhurbaşkanı öldürmeye çalışacak.
Anarşist cumhurbaşkanı ise, gücünü kötüye kullanmaya ve işe yaramaz köylüler öldürmeye karar verir. Aşağılarından biri tarafından hedef alınmadığı sürece, bunun yerine yanmaları gerekir.

package WeakestLink.Players;

import WeakestLink.Game.Vote;

import java.util.LinkedList;
import java.util.Set;

public class Anarchist extends Player {

    LinkedList<Integer> opponents;

    @Override
    public int vote(Set<Integer> currentOpponents) {
        opponents = new LinkedList();
        opponents.addAll(currentOpponents);
        opponents.sort(Integer::compare);

        int me = getSmartness();

        if (getPresident() != me) {
            return getPresident();
        } else {
            // treason ?
            Vote voteForMe = getRecentVotes().stream().filter(v -> v.getVoted() == me).findAny().orElse(null);
            if (voteForMe == null) {
                // No treason ! Hurray. Kill the peagants.
                return getPeagant();
            } else {
                // TREASON!
                return opponents.get(opponents.indexOf(voteForMe.getVoter()));
            }
        }
    }

    private int getPresident() {
        return opponents.getLast();
    }

    private int getPeagant() {
        return opponents.getFirst();
    }

}

1

IndependentVoter

Bu bot, genel popülasyonun her zaman yanlış olduğunu biliyor! Bu yüzden en az oy alan kişi oy kullanır.

Kod, SolarAaron'un "Bandwagon" u ile hemen hemen aynıdır, ancak son mantık çevrildi.

package WeakestLink.Players;

import WeakestLink.Game.Vote;
import java.util.Map;
import java.util.Set;

/**
 * Votes for the currently lest voted bot in the game.
 * Or the lowest one.
 */
public class IndependentVoter
        extends Player {

    @Override
    public int vote(Set<Integer> currentOpponents) {
        int self = getSmartness(), vote = -1;
        java.util.Map<Integer, Integer> votes = new java.util.TreeMap<>();
        getVotingHistory().stream().map((Vote v)-> v.getVoted()).filter((Integer i)-> !i.equals(self)).forEach((Integer tgt)-> {
            if(!votes.containsKey(tgt)) {
                votes.put(tgt, 1);
            } else {
                votes.put(tgt, votes.get(tgt) + 1);
            }
        });

        do {
            if(votes.entrySet().isEmpty()) {
                vote = currentOpponents.stream().filter((Integer i)-> !i.equals(self)).sorted().findFirst().get();
            } else {
                if(votes.containsKey(vote)) {
                    votes.remove(vote);
                    vote = -1;
                }

                for(Map.Entry<Integer, Integer> vv: votes.entrySet()) {
                    Integer key = vv.getKey();
                    Integer value = vv.getValue();

                    if((vote == -1) || (value < votes.get(vote))) {
                        vote = key;
                    }
                }
            }
        } while(!currentOpponents.contains(vote));

        return vote;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.