Skip to content

Instantly share code, notes, and snippets.

@mshafiee
Last active July 2, 2024 22:11
Show Gist options
  • Save mshafiee/64a5d660c079cca29e06dd8552be7360 to your computer and use it in GitHub Desktop.
Save mshafiee/64a5d660c079cca29e06dd8552be7360 to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Magic Square Generator</title>
<style>
table {
border-collapse: collapse;
margin: 20px 0;
}
table, th, td {
border: 1px solid black;
}
th, td {
padding: 10px;
text-align: center;
}
</style>
</head>
<body>
<h1>Magic Square Generator</h1>
<label for="magicalNumber">Enter magical number:</label>
<input type="number" id="magicalNumber" required>
<br>
<label for="orderType">Enter order type:</label>
<input type="radio" id="fire" name="orderType" value="fire">
<label for="fire">Fire</label>
<input type="radio" id="earth" name="orderType" value="earth">
<label for="earth">Earth</label>
<br>
<button onclick="generateMagicSquare()">Generate</button>
<button onclick="clearResults()">Clear</button>
<div id="result"></div>
<script>
function generateMagicSquare() {
const magicalNumber = parseInt(document.getElementById('magicalNumber').value);
const orderType = document.querySelector('input[name="orderType"]:checked').value;
if (!magicalNumber || (orderType !== 'fire' && orderType !== 'earth')) {
alert("Please enter a valid magical number and select order type ('fire' or 'earth').");
return;
}
const { table, quotient, remainder, cellAdjusted } = createTable(magicalNumber, orderType);
displayTable(table);
let resultText = `Quotient (first cell): ${quotient}<br>`;
if (remainder > 0) {
resultText += `Remaining number: ${remainder}<br>`;
resultText += `Cell ${cellAdjusted} increased by 1<br>`;
}
const isMagicSquare = checkMagicSquare(table, magicalNumber);
resultText += isMagicSquare ?
`The table is a magic square with a magical number of ${magicalNumber}.` :
`The table is not a magic square with a magical number of ${magicalNumber}.`;
document.getElementById('result').innerHTML += resultText;
}
function clearResults() {
document.getElementById('result').innerHTML = '';
}
function createTable(magicalNumber, orderType) {
const quotient = Math.floor((magicalNumber - 30) / 4);
const remainder = (magicalNumber - 30) % 4;
const table = Array.from({ length: 16 }, (_, i) => quotient + i);
let cellAdjusted = null;
if (remainder === 1) {
for (let i = 12; i < 16; i++) table[i]++;
cellAdjusted = 13;
} else if (remainder === 2) {
for (let i = 8; i < 16; i++) table[i]++;
cellAdjusted = 9;
} else if (remainder === 3) {
for (let i = 4; i < 16; i++) table[i]++;
cellAdjusted = 5;
}
const fireOrder = [8, 11, 14, 1, 13, 2, 7, 12, 3, 16, 9, 6, 10, 5, 4, 15];
const earthOrder = [5, 4, 15, 10, 16, 9, 6, 3, 2, 7, 12, 13, 11, 14, 1, 8];
const order = orderType === 'fire' ? fireOrder : earthOrder;
const tableOrdered = Array.from({ length: 16 }, (_, i) => table[order[i] - 1]);
const table2d = Array.from({ length: 4 }, (_, i) => tableOrdered.slice(i * 4, i * 4 + 4));
return { table: table2d, quotient, remainder, cellAdjusted };
}
function displayTable(table) {
const tableElement = document.createElement('table');
table.forEach(row => {
const tr = document.createElement('tr');
row.forEach(cell => {
const td = document.createElement('td');
td.textContent = cell;
tr.appendChild(td);
});
tableElement.appendChild(tr);
});
document.getElementById('result').appendChild(tableElement);
}
function checkMagicSquare(table, magicalNumber) {
let allEqual = true;
for (let i = 0; i < 4; i++) {
const rowSum = table[i].reduce((acc, val) => acc + val, 0);
if (rowSum !== magicalNumber) {
allEqual = false;
console.log(`Row ${i + 1} does not match: ${table[i]} (sum: ${rowSum})`);
}
}
for (let i = 0; i < 4; i++) {
const colSum = table.reduce((acc, row) => acc + row[i], 0);
if (colSum !== magicalNumber) {
allEqual = false;
const colValues = table.map(row => row[i]);
console.log(`Column ${i + 1} does not match: ${colValues} (sum: ${colSum})`);
}
}
const diag1Sum = table.reduce((acc, row, i) => acc + row[i], 0);
const diag2Sum = table.reduce((acc, row, i) => acc + row[3 - i], 0);
if (diag1Sum !== magicalNumber) {
allEqual = false;
const diag1Values = table.map((row, i) => row[i]);
console.log(`Main diagonal does not match: ${diag1Values} (sum: ${diag1Sum})`);
}
if (diag2Sum !== magicalNumber) {
allEqual = false;
const diag2Values = table.map((row, i) => row[3 - i]);
console.log(`Secondary diagonal does not match: ${diag2Values} (sum: ${diag2Sum})`);
}
return allEqual;
}
</script>
</body>
</html>
def create_table(magical_number, order_type):
quotient = (magical_number - 30) // 4
remainder = (magical_number - 30) % 4
# Create the initial table with the correct order
table = [quotient + i for i in range(16)]
# Adjust specific cells based on the remainder
cell_adjusted = None
if remainder == 1:
for i in range(12, 16):
table[i] += 1 # Increment cells starting from the 13th cell
cell_adjusted = 13
elif remainder == 2:
for i in range(8, 16):
table[i] += 1 # Increment cells starting from the 9th cell
cell_adjusted = 9
elif remainder == 3:
for i in range(4, 16):
table[i] += 1 # Increment cells starting from the 5th cell
cell_adjusted = 5
# Print each cell number and value before ordering
for i in range(16):
suffix = "th"
if (i + 1) % 10 == 1 and (i + 1) != 11:
suffix = "st"
elif (i + 1) % 10 == 2 and (i + 1) != 12:
suffix = "nd"
elif (i + 1) % 10 == 3 and (i + 1) != 13:
suffix = "rd"
print(f"{i + 1}{suffix}: {table[i]}")
# Define the orders
fire_order = [8, 11, 14, 1,
13, 2, 7, 12,
3, 16, 9, 6,
10, 5, 4, 15]
earth_order = [5, 4, 15, 10,
16, 9, 6, 3,
2, 7, 12, 13,
11, 14, 1, 8]
# Select the appropriate order based on user input
if order_type.lower() == 'fire':
order = fire_order
elif order_type.lower() == 'earth':
order = earth_order
else:
raise ValueError("Invalid order type. Choose 'fire' or 'earth'.")
# Order the table according to the selected pattern
table_ordered = [0] * 16
for i, pos in enumerate(order):
table_ordered[i] = table[pos - 1]
# Convert the ordered flat list into a 4x4 2D list
table_2d = [table_ordered[i:i + 4] for i in range(0, 16, 4)]
return table_2d, quotient, remainder, cell_adjusted
def print_table(table):
# Find the maximum length of the numbers in the table
max_length = max(len(str(cell)) for row in table for cell in row)
cell_width = max_length + 2 # Add padding for better readability
border = "+" + "+".join("-" * cell_width for _ in range(4)) + "+"
print(border)
for row in table:
print("| " + " | ".join(f"{cell:>{max_length}}" for cell in row) + " |")
print(border)
def check_magic_square(table, magical_number):
size = len(table)
all_equal = True
# Check rows
for i in range(size):
row_sum = sum(table[i])
if row_sum != magical_number:
all_equal = False
print(f"Row {i+1} does not match: {table[i]} (sum: {row_sum})")
# Check columns
for i in range(size):
col_sum = sum(row[i] for row in table)
if col_sum != magical_number:
all_equal = False
col_values = [row[i] for row in table]
print(f"Column {i+1} does not match: {col_values} (sum: {col_sum})")
# Check diagonals
diag1_sum = sum(table[i][i] for i in range(size))
diag2_sum = sum(table[i][size-1-i] for i in range(size))
if diag1_sum != magical_number:
all_equal = False
diag1_values = [table[i][i] for i in range(size)]
print(f"Main diagonal does not match: {diag1_values} (sum: {diag1_sum})")
if diag2_sum != magical_number:
all_equal = False
diag2_values = [table[i][size-1-i] for i in range(size)]
print(f"Secondary diagonal does not match: {diag2_values} (sum: {diag2_sum})")
return all_equal
# Get the magical number and order type from the user
magical_number = int(input("Enter the magical number: "))
order_type = input("Enter the order type ('fire' or 'earth'): ")
# Create the table
table, quotient, remainder, cell_adjusted = create_table(magical_number, order_type)
# Print the table
print_table(table)
# Print the quotient, remaining number, and the adjusted cell
print(f"Quotient (1st cell): {quotient}")
if remainder > 0:
print(f"Remaining number: {remainder}")
print(f"Cell {cell_adjusted} was incremented by +1")
# Check if it's a magic square and print mismatches
if check_magic_square(table, magical_number):
print(f"The table is a magic square with the magical number {magical_number}.")
else:
print(f"The table is NOT a magic square with the magical number {magical_number}.")
def create_table(magical_number, order_type):
quotient = (magical_number - 30) // 4
remainder = (magical_number - 30) % 4
# Create the initial table with the correct order
table = [quotient + i for i in range(16)]
# Adjust specific cells based on the remainder
cell_adjusted = None
if remainder == 1:
for i in range(12, 16):
table[i] += 1 # Increment cells starting from the 13th cell
cell_adjusted = 13
elif remainder == 2:
for i in range(8, 16):
table[i] += 1 # Increment cells starting from the 9th cell
cell_adjusted = 9
elif remainder == 3:
for i in range(4, 16):
table[i] += 1 # Increment cells starting from the 5th cell
cell_adjusted = 5
# Print each cell number and value before ordering
for i in range(16):
suffix = "th"
if (i + 1) % 10 == 1 and (i + 1) != 11:
suffix = "st"
elif (i + 1) % 10 == 2 and (i + 1) != 12:
suffix = "nd"
elif (i + 1) % 10 == 3 and (i + 1) != 13:
suffix = "rd"
print(f"{i + 1}{suffix}: {table[i]}")
# Define the orders
fire_order = [8, 11, 14, 1,
13, 2, 7, 12,
3, 16, 9, 6,
10, 5, 4, 15]
earth_order = [5, 4, 15, 10,
16, 9, 6, 3,
2, 7, 12, 13,
11, 14, 1, 8]
# Select the appropriate order based on user input
if order_type.lower() == 'fire':
order = fire_order
elif order_type.lower() == 'earth':
order = earth_order
else:
raise ValueError("نوع ترتیب نامعتبر است. 'fire' یا 'earth' را انتخاب کنید.")
# Order the table according to the selected pattern
table_ordered = [0] * 16
for i, pos in enumerate(order):
table_ordered[i] = table[pos - 1]
# Convert the ordered flat list into a 4x4 2D list
table_2d = [table_ordered[i:i + 4] for i in range(0, 16, 4)]
return table_2d, quotient, remainder, cell_adjusted
def print_table(table):
# Find the maximum length of the numbers in the table
max_length = max(len(str(cell)) for row in table for cell in row)
cell_width = max_length + 2 # Add padding for better readability
border = "+" + "+".join("-" * cell_width for _ in range(4)) + "+"
print(border)
for row in table:
print("| " + " | ".join(f"{cell:>{max_length}}" for cell in row) + " |")
print(border)
def check_magic_square(table, magical_number):
size = len(table)
all_equal = True
# Check rows
for i in range(size):
row_sum = sum(table[i])
if row_sum != magical_number:
all_equal = False
print(f"سطر {i+1} مطابقت ندارد: {table[i]} (مجموع: {row_sum})")
# Check columns
for i in range(size):
col_sum = sum(row[i] for row in table)
if col_sum != magical_number:
all_equal = False
col_values = [row[i] for row in table]
print(f"ستون {i+1} مطابقت ندارد: {col_values} (مجموع: {col_sum})")
# Check diagonals
diag1_sum = sum(table[i][i] for i in range(size))
diag2_sum = sum(table[i][size-1-i] for i in range(size))
if diag1_sum != magical_number:
all_equal = False
diag1_values = [table[i][i] for i in range(size)]
print(f"قطر اصلی مطابقت ندارد: {diag1_values} (مجموع: {diag1_sum})")
if diag2_sum != magical_number:
all_equal = False
diag2_values = [table[i][size-1-i] for i in range(size)]
print(f"قطر فرعی مطابقت ندارد: {diag2_values} (مجموع: {diag2_sum})")
return all_equal
# Get the magical number and order type from the user
magical_number = int(input("عدد وفق را وارد کنید: "))
order_type = input("نوع ترتیب را وارد کنید ('fire' یا 'earth'): ")
# Create the table
table, quotient, remainder, cell_adjusted = create_table(magical_number, order_type)
# Print the table
print_table(table)
# Print the quotient, remaining number, and the adjusted cell
print(f"خارج قسمت (اولین خانه): {quotient}")
if remainder > 0:
print(f"عدد باقیمانده: {remainder}")
print(f"خانه {cell_adjusted} با مقدار یک واحد افزایش یافت")
# Check if it's a magic square and print mismatches
if check_magic_square(table, magical_number):
print(f"جدول یک مربع وفق با عدد وفق {magical_number} است.")
else:
print(f"جدول یک مربع وفق با عدد وفق {magical_number} نیست.")
@mshafiee
Copy link
Author

mshafiee commented Jun 5, 2024

python3 ./magical_table.py
Enter the magical number: 34
1st: 1
2nd: 2
3rd: 3
4th: 4
5th: 5
6th: 6
7th: 7
8th: 8
9th: 9
10th: 10
11th: 11
12th: 12
13th: 13
14th: 14
15th: 15
16th: 16
+----+----+----+----+
|  8 | 11 | 14 |  1 |
+----+----+----+----+
| 13 |  2 |  7 | 12 |
+----+----+----+----+
|  3 | 16 |  9 |  6 |
+----+----+----+----+
| 10 |  5 |  4 | 15 |
+----+----+----+----+
Quotient (1st cell): 1
The table is a magic square with the magical number 34.
python3 ./magical_table.py
عدد وفق را وارد کنید: 36
نوع ترتیب را وارد کنید ('fire' یا 'earth'): fire
1st: 1
2nd: 2
3rd: 3
4th: 4
5th: 5
6th: 6
7th: 7
8th: 8
9th: 10
10th: 11
11th: 12
12th: 13
13th: 14
14th: 15
15th: 16
16th: 17
+----+----+----+----+
|  8 | 12 | 15 |  1 |
+----+----+----+----+
| 14 |  2 |  7 | 13 |
+----+----+----+----+
|  3 | 17 | 10 |  6 |
+----+----+----+----+
| 11 |  5 |  4 | 16 |
+----+----+----+----+
خارج قسمت (اولین خانه): 1
عدد باقیمانده: 2
خانه 9 با مقدار یک واحد افزایش یافت
جدول یک مربع وفق با عدد وفق 36 است.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment