Merhaba,
İlginç bir soru. Daha doğrusu, bulmacada kullanılan bazı sabit sayıların özellikle seçilme nedeni var mı öğrenmek isterim. Nedir bu sabit sayılar?
- Birinci hedef toplam 113
- Çarpan sayısı 19
- 7x2’lik bir matris.
- Birinci sütunda yer alan 2 basamaklı sayılar (Matris içinde 09 gibi sayıların yer alması da bulmacayı çözebilir.)
- İkinci sütunda yer alan 3 basamaklı sayılar (Matris içinde 009 gibi sayıların yer alması da bulmacayı çözebilir.)
Şimdi, bulmacada yer alan bu özelliklerin, bulmacayı çözülebilir kılan özellikler olup olmadığı konusunda şüphelerim var. Belki yanılıyorum, bilemiyorum gerçekten. Sizin paylaştığınız ilk bulmacayı çözen ve bu yukardaki özelliklere sahip alternatif matrisler oluşturan bir algoritma yazdım. Ancak tesadüfen mi çözüyor yoksa uygun değerler bunlar olduğu için mi çözülüyor emin olamıyorum. Daha sonra da yukardaki özellikleri değiştirerek, hangi özellik kombinasyonunda bulmacaların çözülebilir olduğunu araştırmaya giriştim.
import time
import numpy as np
def random_arr_with_target_sum(targets, timeout):
array = np.random.randint(1, 9, targets[0] * 5).reshape(targets[0], 5)
start = time.perf_counter()
while diff := targets[2] - array.sum():
if time.perf_counter() - start >= timeout:
return []
step = 1 if diff > 0 else -1
if np.all((array[:, 3] == 0) | (array[:, 0] == 1) | (array[:, 2] == 1)):
array = np.random.randint(1, 9, targets[0] * 5).reshape(targets[0], 5)
row = np.random.choice(range(targets[0]))
if abs(diff) >= 100:
col = 2
condition = array[row][col] != (1 if diff < 0 else 9)
elif 100 > abs(diff) >= 10:
col = np.random.choice([0, 3])
condition = array[row][col] != ((0 if col else 1) if diff < 0 else 9)
else:
col = np.random.choice([1, 4])
condition = array[row][col] != (0 if diff < 0 else 9)
if condition:
array[row][col] += step
return array
def merge_columns(arr, col_groups):
if len(arr):
return np.column_stack(
tuple(
np.array(tuple(map(lambda i: int("".join(map(str, i))), arr[:, group]))).reshape(-1, 1)
for group in col_groups
)
)
def change_random_arr_with_target_sums(targets, timeout):
array = random_arr_with_target_sum(targets, timeout)
if not len(array):
return []
target_sum = np.prod(targets[1:])
start = time.perf_counter()
while diff := target_sum - merge_columns(array, [(0, 1), (2, 3, 4)]).sum():
if time.perf_counter() - start >= timeout:
return []
if np.all((array[:, 0] == 1) & (array[:, 3] == 0) & (array[:, 2])):
array = random_arr_with_target_sum(targets, timeout)
if isinstance(array, list):
return []
step = 1 if diff > 0 else -1
if abs(diff) >= 100:
row1, col1 = np.random.randint(0, targets[0]), 2
row2, col2 = np.random.randint(0, targets[0]), np.random.choice([1, 4])
condition = (
array[row1][col1] != (1 if diff < 0 else 9)
and
array[row2][col2] != (9 if diff < 0 else 0)
)
else:
row1, col1 = np.random.randint(0, targets[0]), np.random.choice([0, 3])
row2, col2 = np.random.randint(0, targets[0]), np.random.choice([1, 4])
condition = (
array[row1][col1] != ((0 if col1 else 1) if diff < 0 else 9)
and
array[row2][col2] != (9 if diff < 0 else 0)
)
if condition:
array[row1][col1] += step
array[row2][col2] -= step
return array
Şimdi, change_random_arr_with_target_sums
fonksiyonunu aşağıdaki argümanlarla çağırıyorum:
result = change_random_arr_with_target_sums(targets=[7, 19, 113], timeout=.1)
print(result)
print(merge_columns(result, col_groups=[(0, 1), (2, 3, 4)]))
Şöyle bir çıktı aldım:
[[1 5 5 0 9]
[1 5 1 0 6]
[1 9 3 2 9]
[3 3 1 3 4]
[1 3 1 0 4]
[1 4 1 0 3]
[4 5 7 0 8]]
[[ 15 509]
[ 15 106]
[ 19 329]
[ 33 134]
[ 13 104]
[ 14 103]
[ 45 708]]
Bu parametreler ile fonksiyonu çağırdığımızda, bulmaca her zaman çözülebiliyor. Başlangıçta verdiğimiz koşulları sağlayan, birçok alternatif listeyi hızlıca oluşturuyor.
Mesela bu da, targets=[7, 19, 113]
parametrelerine göre üretilen başka bir matris:
[[5 2 6 0 3]
[1 4 1 0 8]
[4 5 1 0 6]
[2 4 7 5 5]
[2 0 1 0 5]
[6 6 1 0 7]
[3 5 1 0 7]]
[[ 52 603]
[ 14 108]
[ 45 106]
[ 24 755]
[ 20 105]
[ 66 107]
[ 35 107]]
Aynı deneyi, targets=[7, 12, 113]
parametreleri için tekrarladığımızda boş bir liste alıyoruz.
Peki, targets=[7, 12, ?]
listesindeki soru işareti yerine ne gelebilir diye merak ettim. Bunun için aşağıdaki gibi bir kod ekledim:
for i in range(75, 200):
targets = [7, 12, i]
result = change_random_arr_with_target_sums(targets=targets, timeout=.5)
if isinstance(result, np.ndarray):
print(f"targets = {targets}")
Algoritmanın çözebildiği matrisler için hangi parametreler kullanıldı aşağıda paylaşıyorum:
targets = [7, 12, 81]
targets = [7, 12, 90]
targets = [7, 12, 99]
targets = [7, 12, 108]
targets = [7, 12, 117]
targets = [7, 12, 126]
targets = [7, 12, 135]
targets = [7, 12, 144]
targets = [7, 12, 153]
targets = [7, 12, 162]
targets = [7, 12, 171]
targets = [7, 12, 180]
targets = [7, 12, 189]
targets = [7, 12, 198]
Son parametrede, düzenli bir artış var.
Problem beni, izlediğim algoritmanın farklı parametrelerle oluşturulan matrisleri çözememesinin nedenini düşünmeye itiyor. Yani, targets=[7, 12, 113]
'ün oluşturulamaz bir matris olduğunu iddia etmiyorum ama mesela targets=[7, 12, 40]
koşullarına uyan bir 7x2’lik matris oluşturmak imkansız. Yani bu sayıların rakamlarını topladığınızda 40 yapacak, 7x2’lik matrisin değerlerini topladığımızda da 12 * 40
olacak. Bu parametreleri verirsek, çözülemez. targets=[7, 12, 113]
için durumun böyle olup olmadığından emin olamıyorum. Şu yukardaki parametrelerle, 1000 kez çağırın, 1000 kez de çözülebiliyorlar. Algoritma optimizasyona da ihtiyaç duyuyor olabilir. Hedef toplama ulaşmak için rastgele üretilen matrisler üzerinde düzenleme işlemi başlıyor. Düzenleme çıkmaza girdiğinde de hedef toplama ulaşılamıyor. Çıkmaza girdiği durumları kontrol etmeye çalıştım ancak, değişerek bize ulaşan son matristeki elemanların toplamı ile, hedef toplam arasında öyle bir fark oluşuyor ki, matristeki sayıların ne birler basamağını, ne onlar basamağını, ne de yüzler basamağını değiştirmek, istenen sonucu bir türlü vermiyor. Yani toplam hedeften 1 sayı gerideysek, o hep 1, -8, 1, -8, 1, -8 şeklinde değer almaya devam ediyor. Aldığı değerler arasındaki fark 9
olacak şekilde sonsuz bir döngüde değerler sürekli değişiyor.
Mesela çözülebilir hedeflere göre, toplamın, hedef toplamdan sapma miktarını an ve an izlediğimde, diff
, her defasında 9’un katları olacak şekilde yeni bir değer alıyor. En sonunda da 0 oluyor. Ve bulmaca çözülmüş oluyor.
target = [7, 19, ?]
için de şöyle çıktılar geldi:
targets = [7, 19, 75]
targets = [7, 19, 76]
targets = [7, 19, 77]
targets = [7, 19, 78]
targets = [7, 19, 79]
targets = [7, 19, 81]
targets = [7, 19, 82]
targets = [7, 19, 84]
targets = [7, 19, 85]
targets = [7, 19, 86]
targets = [7, 19, 87]
targets = [7, 19, 88]
targets = [7, 19, 89]
targets = [7, 19, 90]
targets = [7, 19, 92]
targets = [7, 19, 93]
targets = [7, 19, 94]
targets = [7, 19, 95]
targets = [7, 19, 97]
targets = [7, 19, 98]
targets = [7, 19, 99]
targets = [7, 19, 100]
targets = [7, 19, 101]
targets = [7, 19, 102]
targets = [7, 19, 103]
targets = [7, 19, 104]
targets = [7, 19, 105]
targets = [7, 19, 106]
targets = [7, 19, 108]
targets = [7, 19, 109]
targets = [7, 19, 110]
targets = [7, 19, 111]
targets = [7, 19, 112]
targets = [7, 19, 113]
targets = [7, 19, 114]
targets = [7, 19, 115]
targets = [7, 19, 116]
targets = [7, 19, 117]
targets = [7, 19, 118]
targets = [7, 19, 119]
targets = [7, 19, 120]
targets = [7, 19, 121]
targets = [7, 19, 122]
targets = [7, 19, 123]
targets = [7, 19, 124]
targets = [7, 19, 125]
targets = [7, 19, 126]
targets = [7, 19, 127]
targets = [7, 19, 128]
targets = [7, 19, 129]
targets = [7, 19, 130]
targets = [7, 19, 131]
targets = [7, 19, 132]
targets = [7, 19, 133]
targets = [7, 19, 134]
targets = [7, 19, 135]
targets = [7, 19, 136]
targets = [7, 19, 137]
targets = [7, 19, 138]
targets = [7, 19, 139]
targets = [7, 19, 140]
targets = [7, 19, 141]
targets = [7, 19, 142]
targets = [7, 19, 143]
targets = [7, 19, 144]
targets = [7, 19, 145]
targets = [7, 19, 146]
targets = [7, 19, 147]
targets = [7, 19, 148]
targets = [7, 19, 149]
targets = [7, 19, 150]
targets = [7, 19, 151]
targets = [7, 19, 152]
targets = [7, 19, 153]
targets = [7, 19, 154]
targets = [7, 19, 155]
targets = [7, 19, 156]
targets = [7, 19, 157]
targets = [7, 19, 158]
targets = [7, 19, 159]
targets = [7, 19, 160]
targets = [7, 19, 161]
targets = [7, 19, 162]
targets = [7, 19, 163]
targets = [7, 19, 164]
targets = [7, 19, 165]
targets = [7, 19, 166]
targets = [7, 19, 167]
targets = [7, 19, 168]
targets = [7, 19, 169]
targets = [7, 19, 170]
targets = [7, 19, 171]
targets = [7, 19, 172]
targets = [7, 19, 173]
targets = [7, 19, 174]
targets = [7, 19, 175]
targets = [7, 19, 176]
targets = [7, 19, 177]
targets = [7, 19, 178]
targets = [7, 19, 179]
targets = [7, 19, 180]
targets = [7, 19, 181]
targets = [7, 19, 182]
targets = [7, 19, 183]
targets = [7, 19, 184]
targets = [7, 19, 185]
targets = [7, 19, 186]
targets = [7, 19, 187]
targets = [7, 19, 188]
targets = [7, 19, 189]
targets = [7, 19, 190]
targets = [7, 19, 191]
targets = [7, 19, 192]
targets = [7, 19, 193]
targets = [7, 19, 194]
targets = [7, 19, 195]
targets = [7, 19, 196]
targets = [7, 19, 197]
targets = [7, 19, 198]
targets = [7, 19, 199]
75
ile 200
arasındaki her i
hedef toplam değeri için bulmaca çözülebiliyor.
@keyshout’un izlediği algoritmada da, istenen_deger
ve karakter_toplamı
eşitleniyor eşitlenmesine ancak targets=[7, 12, 113]
parametreleriyle if istenen_sayi == sayi_toplami:
sorgusunun henüz True
verdiğini görmedim.
Enteresan bir konu gerçekten. Henüz çözülemedi. 