import pandas as pd
import matplotlib.pyplot as plt
from collections import Counter
# Lista de valores en porcentaje
percentages = [
100, 100, 100, 0, 33.33, 54.84, 19.05, 75.59, 82.75, 0.39, 12.81, 31.02, 27.35,
28.71, 63.99, 57.2, 46.21, 51.57, 36.39, 64.66, 72.78, 43.41, 33.49, 72, 97.8,
62.54, 66.82, 69.6, 49.28, 92.44, 95.8, 44.05, 66.18, 64.53, 17.07, 23.36, 45.89,
6.94, 17.77, 82.56, 32.63, 31.67, 68.48, 75.13, 13.67, 46.11, 70.06, 35.86, 45.35,
8.56, 82.86, 87.25, 50.18, 10.74, 66.79, 22.73, 91.85, 38.76, 82.17, 96.9, 23.67,
69.5, 95.01, 92.98, 65.71, 25.62, 64.4, 19.32, 82.89, 9.03, 40.23, 28.87, 36.98,
43.39, 67.98, 51.49, 38.33, 77.03, 62.2
]
# Contar frecuencia de valores
counter = Counter(percentages)
most_common_value, most_common_count = counter.most_common(1)[0]
# Crear un histograma de las distribuciones
plt.figure(figsize=(10, 5))
plt.hist(percentages, bins=20, edgecolor="black", alpha=0.7)
plt.xlabel("Porcentaje de rango de solución")
plt.ylabel("Frecuencia")
plt.title("Distribución de los valores de porcentaje en los puzzles resueltos")
plt.grid(axis='y', linestyle='--', alpha=0.7)
# Mostrar el histograma
plt.show()
# Determinar el intervalo donde más soluciones caen
df = pd.DataFrame(percentages, columns=["Porcentaje"])
df["Intervalo"] = pd.cut(df["Porcentaje"], bins=[0, 20, 40, 60, 80, 100], labels=["0-20%", "20-40%", "40-60%", "60-80%", "80-100%"])
interval_counts = df["Intervalo"].value_counts()
# Mostrar los resultados
most_common_value, most_common_count, interval_counts
Resultado
(100,
3,
60-80% 20
20-40% 17
80-100% 16
40-60% 14
0-20% 11
Name: Intervalo, dtype: int64)
https://drive.google.com/file/d/1mh24LpF-iJl6odVHM8jFmeHbHP7yf9RI/view?usp=sharingEl intervalo donde más soluciones caen es: 60-80%, con 20 soluciones dentro de ese rango.
# Definir los límites en decimal del rango del puzle 67
start_decimal = int("40000000000000000", 16) # Inicio del rango en decimal
end_decimal = int("7ffffffffffffffff", 16) # Fin del rango en decimal
# Calcular el rango total
range_size = end_decimal - start_decimal
# Calcular los límites del 60-80% del rango
start_60 = start_decimal + int(range_size * 0.60)
end_80 = start_decimal + int(range_size * 0.80)
# Convertir los valores de vuelta a hexadecimal
start_60_hex = hex(start_60)
end_80_hex = hex(end_80)
(start_60_hex, end_80_hex)
Resultado;
('0x66666666666666000', '0x73333333333334000')
Hexadecimal Range to Search in Puzzle 67 (60-80%)
To find the solution to puzzle 67 within the 60-80% of its search space, you should search between:
Start (60% of the range): 0x66666666666666000
End (80% of the range): 0x73333333333334000
LQQD 730fc235c1942c1ae (79.78%)
This is the hexadecimal interval where the probability of finding the solution is highest based on the data from the solved puzzles.
Since many of the remaining puzzles are expected to fall within the 60-80% range by pure statistics, you could focus only on this 20% and disregard the other 80% of the search space.
Subsequently, as there are 20 puzzles solved (already 21), in the interval 60% - 80%, we can divide that range in turn into 5 key subranges based on the previous solutions that appeared in that range.
import numpy as np
# Filtrar los valores que están en el rango 60-80%
filtered_values = [p for p in percentages if 60 <= p <= 80]
# Dividir el rango 60-80 en 5 sub-intervalos basados en los valores más comunes
num_intervals = 5
percentile_bins = np.linspace(60, 80, num_intervals + 1) # Crear 5 sub-rangos dentro del 60-80%
# Contar cuántos valores caen en cada sub-intervalo
interval_counts = {}
for i in range(num_intervals):
lower, upper = percentile_bins[i], percentile_bins[i + 1]
count = sum(1 for p in filtered_values if lower <= p < upper)
interval_counts[(lower, upper)] = count
# Ordenar por los intervalos con más valores y seleccionar los 5 más relevantes
best_intervals = sorted(interval_counts.items(), key=lambda x: x[1], reverse=True)[:5]
# Convertir estos intervalos de porcentaje a los rangos en hexadecimal dentro del puzzle 67
best_hex_ranges = []
for (lower, upper), _ in best_intervals:
start_hex = hex(start_decimal + int(range_size * (lower / 100)))
end_hex = hex(start_decimal + int(range_size * (upper / 100)))
best_hex_ranges.append((start_hex, end_hex))
# Show the top 5 sub-ranges to search in puzzle 67
best_hex_ranges
Solution:
Optimal Ranges to Search for Puzzle 67 (Based on Success Data from Other Puzzles)
To increase your chances of finding the solution, here are the top 5 ranges within the 60-80% where you should focus your search:
from 0x68f5c28f5c28f6000 to 0x6b851eb851eb86000
from 0x6b851eb851eb86000 to 0x6e147ae147ae14000
from 0x6e147ae147ae14000 to 0x70a3d70a3d70a4000
from 0x66666666666666000 to 0x68f5c28f5c28f6000
from 0x70a3d70a3d70a4000 to 0x73333333333334000 --in this range -- LQQD 730fc235c1942c1ae (79.78%)