from itertools import permutations
n, k = map(int, input().split())
ans = 100000000
l = [input() for _ in range(n)]
p = []
for i in range(n):
s = ''
p.append([int(s.join(k)) for k in permutations(l[i])])
for i in range(len(p[0])):
maxn = 0
minn = 100000000
for j in range(len(p)):
if p[j][i] > maxn:
maxn = p[j][i]
if p[j][i] < minn:
minn = p[j][i]
if ans > maxn - minn:
ans = maxn - minn
print(ans)
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main() {
ll n, k; cin >> n >> k;
char m[8][8], ind[8];
for (int i = 0; i < n; i++)
for (int j = 0; j < k; j++)
cin >> m[i][j];
for(int i = 0; i < k; i++)
ind[i] = i;
ll rpta = 1e9+10;
do{
ll mx = 0, mn = 1e9+10;
for (int i = 0; i < n; i++) {
ll x = 0;
for (int j = 0; j < k; j++) {
x = x * 10 + (m[i][ind[j]]-'0');
}
// cout<<":>"<<x<<":asd\n";
mx = max(x, mx);
mn = min(x, mn);
}
rpta = min(rpta, mx - mn);
}
while(next_permutation(ind,ind + k));
cout << rpta;
}
437. Path Sum III | 436. Find Right Interval |
435. Non-overlapping Intervals | 406. Queue Reconstruction by Height |
380. Insert Delete GetRandom O(1) | 332. Reconstruct Itinerary |
368. Largest Divisible Subset | 377. Combination Sum IV |
322. Coin Change | 307. Range Sum Query - Mutable |
287. Find the Duplicate Number | 279. Perfect Squares |
275. H-Index II | 274. H-Index |
260. Single Number III | 240. Search a 2D Matrix II |
238. Product of Array Except Self | 229. Majority Element II |
222. Count Complete Tree Nodes | 215. Kth Largest Element in an Array |
198. House Robber | 153. Find Minimum in Rotated Sorted Array |
150. Evaluate Reverse Polish Notation | 144. Binary Tree Preorder Traversal |
137. Single Number II | 130. Surrounded Regions |
129. Sum Root to Leaf Numbers | 120. Triangle |
102. Binary Tree Level Order Traversal | 96. Unique Binary Search Trees |