Beş oyuncu için Briç fixtürü
Muhtemel tüm eşleşme ve karşılaşmaları kapsayan ve mükerrer yapmayan bir fixtürü hazırlarken Github Copilot ve ChatGPT'nin program yazma becerisini denemiş oldum
Son Cuma briç gecesinde oyuncu sayısı 5 de kaldı. Altı kişi olduğunda kağıt çekerek üç takıma eşleşiyoruz. Yedi kişi geldiğinde de yine aynı şekilde ama son takım (en küçük kağıtları çekenler) üç kişi oluyor ve sırayla her turda sırayla üçten biri dışarıda kalıyor. Sık olmasa da arada bir sekiz oyuncu varsa o zaman dört takım oluyoruz.
Beş kişi olunca, fikstür tablosunu hazırlamak, yani ne zaman kimin kiminle eş kiminle rakip olacağını ayarlamak zor oluyor. Bu Cuma Mehmet bir sistem önerdi. En küçük kağıt çeken oyuncunun avare kasnak gibi değişik takımlarda oynadığı karışık bir sistemdi. Tekrar edeceğimizi sanmıyorum.
Dün beş kişilik briç fikstürü hazırlamak için bir python programı yazayım dedim.
Github Copilot
Önce VS Code github Copilot’dan yardım alayım dedim. Github Copilot yardımı ile yazmak istediğiniz fonksiyonun ne yapacağını comment olarak yazıyorsunuz, Copilot satır satır fonksiyonun kendisini yazıyor.
# The following function is used to create a bridge fixture
# The function takes ia single argument:
# A list of the player names as strings separated by commas
# There could be 4 or more players
# It creates a bridge fixture and writes into a CSV file
# This fixture will be a table where the first column is the player names
# The subsequent columns will show the players to play against in each round
# Each column after the first column will be a round
# The first round will be the first column after the first column
# The second round will be the second column after the first column
# If the player is to play against themselves, the cell will be blank
# The CSV file is named bridgefixture.csv
# The CSV file is written to the current directory
# The CSV file is overwritten if it already exists
# The CSV file is written in the following format:
# The first row is the column headings
# The first column heading is the word "Player"
# The subsequent column headings are the words "Round" followed by the round number
# The first column is the player names
# The subsequent columns are the players to play against in each round
# If the player is to play against themselves, the cell will be blank
# The function returns the number of rounds
# The number of rounds is the number of columns after the first column
# The number of rounds is the number of rounds in the fixture
# The number of rounds is the number of rounds in the tournament
# The function does not return anything else
(Tercüme notu1)
Ben ilk beş satırı yazdım sadece, sonrakileri Copilot yazdı ama gerisi gelmedi. Bekle bekle bir sürü program satırları başlamadı. O zaman bir de ChatGPT’ye sorayım dedim.
Programcı ChatGPT
Yukarıdaki comment satırlarını ChatGPT’ye kopyaladım, uyan bir program yazsın diye. Hemen cevap verdi:
Certainly! Here's a Python function that should achieve the task as defined in the comments you provided:
(Tercüme Notu
2
Verdiği program kodunu burada kopyalamaya gerek yok çünkü çok daha basit, eşleşme olmayan ama her oyuncunun birbiriyle oynadığı bir tablo hazırladı. Yanlış oldu deyip yanlışın nerde olduğunu açıklamaya çalıştım. OK dedi,
I apologize for the mistake in my previous implementation. Here is a revised implementation of the create_bridge_fixture function that should produce the correct output as per your specifications:
(Tercüme Notu
3)
ChatGPT’nin yeni program da çalışmadı. Böyle gittik geldik. ChatGPT’nin 6. çabası da çalışmayınca, ben bu belki bir Large Language Model (LLM) için zor bir ödev, öylemi dedim. Yok yok dedi.
I think it is possible to create a bridge fixture with a large language model, but it might be challenging to get it right without some additional information and constraints.
For example, do the players have any preferences or restrictions on who they want to play with or against? Are there any rules about how many times a player can play with or against another player? Also, the function may need to handle cases where the number of players is odd and there is an "odd player out" in each round.
Without these additional constraints, it is possible to generate a fixture that satisfies the basic requirement of each player playing with every other player an equal number of times. However, the fixture may not be optimal in terms of minimizing repeated matchups or satisfying any preferences or restrictions the players may have.
If you can provide more information on the specific requirements and constraints for the bridge fixture, I can try to help you modify the function to meet those requirements.
(Tercüme Notu4)
ChatGPT nin henüz konuyu anlamamış olduğu bu cevaptan belli oldu. O zaman Plan B’ye geçtim. ChatGPT’ye problemi algoritma olmaya karar verdim.
Briç Fikstürü algoritması
N üyeli bir set varsa. bu N üyeden kaç tane çift çıkar diye sordum. Cevabını hemen verdi:
(Tercüme Notu
5)
O zaman dedim, en baştaki briç programı problemini, bu 10 çiftten oluşan set için kaç tane çiftlerin eşleşmesi çıkar deyip. aynı oyuncunun iki kere olduğu sonuçları silerek çözebiliriz dedim. Bunu ChatGPT anladı ve programı yazdı.
(Tercüme Notu6)
Bu sefer yazdığı program doğru çalıştım. Bir de çıkan sonucu bir CSV dosyasına yaz lütfen dedim. Onu da sorunsuz becerdi. Ben bir kaç tane ufak değişiklikler yaptım. CSV dosyasında çıkan tablonun formatı ile ilgili. Sonuç şu program:
import csv
import itertools
def create_bridge_fixture(players):
# Step 1: Form all possible teams
teams = list(itertools.combinations(players, 2))
# Step 2: Pair the teams against each other to form a second set of unordered pairs
pairs = list(itertools.combinations(teams, 2))
# Step 3: Eliminate pairs where a player appears twice
valid_pairs = [pair for pair in pairs if len(set().union(*pair)) == 4]
# Create the fixture by assigning teams to rounds
num_rounds = len(valid_pairs)
fixture = [[] for _ in range(num_rounds)]
for round_idx, pair in enumerate(valid_pairs):
fixture[round_idx].append(pair[0][0])
fixture[round_idx].append(pair[0][1])
fixture[round_idx].append(pair[1][0])
fixture[round_idx].append(pair[1][1])
fixture[round_idx].append([player for player in players if player not in pair[0] and player not in pair[1]][0])
return num_rounds, fixture
players = ["A", "B", "C", "D", "E"]
num_rounds, fixture = create_bridge_fixture(players)
sorted_fixture = sorted(fixture, key=lambda x: x[-1])
sorted_fixture = sorted(fixture, key=lambda x: x[-1], reverse=True)
# Print the fixture
for i, round in enumerate(sorted_fixture):
print("Round", i+1, ":", round)
# Create the array
arr = [[' ' for _ in range(num_rounds)] for _ in range(len(players))]
# Fill in the array
for i, row in enumerate(sorted_fixture):
for j, player in enumerate(row):
if j < 2:
arr[players.index(player)][i] = '+'
elif j < 4:
arr[players.index(player)][i] = 'o'
else:
arr[players.index(player)][i] = '-'
# your code to generate the sorted_fixture array
with open('bridge_fixture.csv', mode='w', newline='') as csv_file:
writer = csv.writer(csv_file)
# write the header row
row=['Players']
for i in range(num_rounds):
row.append('Round {}'.format(i+1))
writer.writerow(row)
# write the data rows
for i, round_data in enumerate(arr):
row = ['ABCDE'[i]]+arr[i] # Round number
writer.writerow(row)
Bu programın hazırladığı fikstür için tıklayın.
Sonuç
ChatGPT henüz pratik bir problemi anlayıp ona göre önce bir algoritma yaratıp ondan sonra da programını yazacak düzeyde değil. Ama algoritma açık olarak verildiğinde, programı saniyesinde ve hatasız olarak yaratabiliyor.
# Bir briç fikstürü oluşturmak için aşağıdaki fonksiyon kullanılır
# İşlev tek bir bağımsız değişken alır:
# Oyuncu adlarının virgülle ayrılmış dizeler halinde bir listesi
# 4 veya daha fazla oyuncu olabilir
# Bir briç fikstürü oluşturur ve bir CSV dosyasına yazar
# Bu fikstür, ilk sütunun oyuncu adlarının olduğu bir tablo olacaktır.
# Sonraki sütunlar, her turda karşı oynayacak oyuncuları gösterecek
# İlk sütundan sonraki her sütun bir tur olacaktır
# İlk tur, ilk sütundan sonraki ilk sütun olacak
# İkinci tur, ilk sütundan sonraki ikinci sütun olacak
# Oyuncu kendisine karşı oynayacaksa, hücre boş olacaktır
# CSV dosyası, bridgefixture.csv olarak adlandırılır
# CSV dosyası geçerli dizine yazılır
# CSV dosyası zaten varsa üzerine yazılır
# CSV dosyası aşağıdaki formatta yazılmıştır:
# İlk satır sütun başlıklarıdır
# İlk sütun başlığı "Oyuncu" kelimesidir
# Sonraki sütun başlıkları "Tur" kelimeleri ve ardından Tur sayısı
# İlk sütun oyuncu adlarıdır
# Sonraki sütunlar, her turda karşı oynayacak oyunculardır
# Oyuncu kendisine karşı oynayacaksa hücre boş olacaktır
# Fonsiyon tur sayısını döndürür
# Tur sayısı, ilk sütundan sonraki sütun sayısıdır
# Tur sayısı fikstürdeki tur sayısıdır
# Tur sayısı, turnuvadaki tur sayısıdır
# Fonksiyon başka bir şey döndürmez
Kesinlikle! Sağladığınız yorumlarda tanımlandığı şekilde görevi gerçekleştirmesi gereken bir Python işlevi:
Önceki uygulamamdaki hata için özür dilerim. Burada, belirtimlerinize göre doğru çıktıyı üretmesi gereken create_bridge_fixture işlevinin gözden geçirilmiş bir uygulaması yer almaktadır:
Büyük bir dil modeliyle bir briç fikstürü oluşturmanın mümkün olduğunu düşünüyorum, ancak bazı ek bilgiler ve kısıtlamalar olmadan bunu doğru yapmak zor olabilir.
Örneğin, oyuncuların kiminle veya kiminle oynamak istedikleri konusunda herhangi bir tercihi veya kısıtlaması var mı? Bir oyuncunun başka bir oyuncuyla veya ona karşı kaç kez oynayabileceğine dair herhangi bir kural var mı? Ayrıca, fonksiyonun, oyuncu sayısının tek olduğu ve her turda dışarıda bir oyuncu olduğu durumları ele alması gerekebilir.
Bu ek kısıtlamalar olmadan, her oyuncunun diğer oyuncularla eşit sayıda oynamasının temel gereksinimlerini karşılayan bir fikstür oluşturmak mümkündür. Ancak fikstür, tekrarlanan eşleşmeleri en aza indirmek veya oyuncuların sahip olabileceği herhangi bir tercihi veya kısıtlamayı karşılamak açısından ideal olmayabilir.
Özel gereksinimler ve kısıtlamalar hakkında daha fazla bilgi verebilirseniz, bu gereksinimleri karşılamak için fonksiyonu değiştirmenize yardımcı olabilirim.
Bu soruyu kombinatorikte deneyelim. N üyeli bir kümeniz varsa, kaç tane sırasız farklı çift oluşturabilirsiniz?
N üyeli bir kümeniz varsa, sırasız farklı çiftler oluşturabilirsiniz (N 2 seçin). Bu, iki terimli katsayı gösterimi kullanılarak şu şekilde ifade edilebilir:
(N 2'yi seçin) = N! / (2! * (N - 2)!)
Sembol "!" faktöriyel işlevi gösterir.
Örneğin, N=5 ise, {1, 2, 3, 4, 5} kümesinden oluşturulabilen (5 2'yi seç) = 10 olası sırasız farklı çift vardır:
(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3 , 5), (4, 5)
Öyleyse, belki briç fikstürfonksiyonu algoritmasını aşağıdaki gibi yeniden ifade edebiliriz:
(1) 5 oyuncudan (A, B, C, D ve E) tüm olası takımları oluştur (sırasız çiftler)
Böyle sıralanmamış 10 çift olacak.
(2) Bu 10 sırasız çiftten oluşan yeni setten, çiftleri birbirine karşı eşleştirin ve tüm kombinasyonları kapsayan ikinci bir sırasız çift seti oluşturun. Bu sette 45 tane olacak.
(3) Bu ikinci setten, bir oyuncunun iki kez göründüğü set üyelerini eleyin, örneğin [("A","B"), ("A","C")] geçerli bir üye değildir çünkü bir oyuncu aynı turda iki takım halinde oynayamaz.
Bu, orijinal sorunu yeniden denemeyi mümkün kılmalıdır. Tekrar deneyebilir misin?
Evet, önerdiğiniz yaklaşımı anlıyorum. Python'da revize edilmiş algoritmanın olası bir uygulaması: