有没有一种方法可以找到两个 5 个字符的字符串之间的 ASCII 距离
Is there an approach to finding the ASCII distance between two strings of 5 characters
我正在尝试找到一种方法来计算和打印用户输入的字符串之间的 Ascii 距离
Scanner scan = new Scanner(System.in);
System.out.print("Please enter a string of 5 uppercase characters:");
String userString = scan.nextLine();
和一个随机生成的字符串
int leftLimit = 65; // Upper-case 'A'
int rightLimit = 90; // Upper-case 'Z'
int stringLength = 5;
Random random = new Random();
String randString = random.ints(leftLimit, rightLimit + 1)
.filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
.limit(stringLength)
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
有没有一种方法可以计算距离,而不必将每个单独的字符与两个字符串分开,比较它们并将它们重新加在一起?
创建一个二维数组,用距离填充数组 - 您可以直接在二维数组中进行索引以拉出字符之间的距离。
所以一个表达式总结了一组数组访问。
流,顾名思义,就是流。它们不能很好地工作,除非您可以严格基于一个输入定义操作:流中的一个元素,不知道其索引或引用整个集合。
在这里,这是一个问题;毕竟,要对输入中的 'H' 进行操作,您需要随机代码中的匹配字符。
我不确定你为什么觉得 'separate each individual character, compare them, and add them back together' 如此令人反感。从问题描述到计算机说明再到 运行,这不是一个非常清晰的映射吗?
备选方案更复杂:您可以尝试创建一个包含字母及其索引的混合对象,对其进行流处理,并使用索引查找第二个字符串中的字符。或者,您可以尝试创建一个包含两个字符的混合对象(因此,对于输入 ABCDE 和 HELLO,一个包含 A 和 H 的对象),但是您将编写更多的代码来进行设置,然后是简单的, no-streams 方式。
所以,让我们从简单的方法开始:
int difference = 0;
for (int i = 0; i < stringLength; i++) {
char a = inString.charAt(i);
char b = randomString.charAt(i);
difference += difference(a, b);
}
您必须自己编写差异方法 - 但它会非常非常简单 one-liner。
尝试获取某种类型的两个集合,并从中创建一个流,其中流中的每个元素都与每个集合中的元素相匹配(因此,["HA", "EB", "LC", "LD", "OE"]
的流)通常称为 'zipping'(与流行的文件压缩算法和产品无关),java 并不真正支持它(还?)。有一些第三方库可以做到这一点,但考虑到上面的内容非常简单,我认为压缩不是您在这里寻找的。
如果你绝对必须,我想我看起来像:
// a stream of 0,1,2,3,4
IntStream.range(0, stringLength)
// map 0 to "HA", 1 to "EB", etcetera
.mapToObj(idx -> "" + inString.charAt(idx) + randomString.charAt(idx))
// map "HA" to the difference score
.mapToInt(x -> difference(x))
// and sum it.
.sum();
public int difference(String a) {
// exercise for the reader
}
使用Edit distance (Levenshtein distance)
你可以
-
- 根据algorithm on wikipedia、
实现自己的编辑距离
-
- 您可以使用现有的源代码,查看 rosetta code。
-
- 使用现有的库,例如 apache LevenshteinDistance
你也可以查看
- Levenshtein Distance on Whosebug
这是我在 MATLAB 中的代码(ASCII 距离)
function z = asciidistance(input0)
if nargin ~= 1
error('please enter a string');
end
size0 = size(input0);
if size0(1) ~= 1
error ('please enter a string');
end
length0 = size0(2);
rng('shuffle');
a = 32;
b = 127;
string0 = (b-a).*rand(length0,1) + a;
x = char(floor(string0));
z = (input0 - x);
ascii0 = sum(abs(z),'all');
ascii1 = abs(sum(z,'all'));
disp(ascii0);
disp(ascii1);
disp(ascii0/ascii1/length0);
end
此脚本还区分了基于每个字符的绝对 ASCII 距离与基于每个字符串的绝对 ASCII 距离,从而导致为 ASCII 距离返回两个整数。
我还包括了这两个值的限制,其值接近被比较字符串长度的倒数。这实际上近似于 运行.
时每个随机字符串生成事件的熵 E
经过标准错误检查后,脚本首先找到输入字符串的长度。 rnd
函数为随机数生成器提供种子。 a
和 b
变量定义 ASCII table 减去非原则 table 字符,以 126 结束,包括在内。 127 实际上用作上限,以便下一行代码可以生成输入长度的随机变量字符串。以下代码行将字符串转换为 ASCII table 提供的字母数字字符。以下代码行按元素减去两个字符串并存储结果。接下来的两行代码以第一段中提到的两种方式总结了 ASCII 距离。最后,打印出这些值,并提供随机字符串生成事件的熵 E。
我正在尝试找到一种方法来计算和打印用户输入的字符串之间的 Ascii 距离
Scanner scan = new Scanner(System.in);
System.out.print("Please enter a string of 5 uppercase characters:");
String userString = scan.nextLine();
和一个随机生成的字符串
int leftLimit = 65; // Upper-case 'A'
int rightLimit = 90; // Upper-case 'Z'
int stringLength = 5;
Random random = new Random();
String randString = random.ints(leftLimit, rightLimit + 1)
.filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
.limit(stringLength)
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
有没有一种方法可以计算距离,而不必将每个单独的字符与两个字符串分开,比较它们并将它们重新加在一起?
创建一个二维数组,用距离填充数组 - 您可以直接在二维数组中进行索引以拉出字符之间的距离。 所以一个表达式总结了一组数组访问。
流,顾名思义,就是流。它们不能很好地工作,除非您可以严格基于一个输入定义操作:流中的一个元素,不知道其索引或引用整个集合。
在这里,这是一个问题;毕竟,要对输入中的 'H' 进行操作,您需要随机代码中的匹配字符。
我不确定你为什么觉得 'separate each individual character, compare them, and add them back together' 如此令人反感。从问题描述到计算机说明再到 运行,这不是一个非常清晰的映射吗?
备选方案更复杂:您可以尝试创建一个包含字母及其索引的混合对象,对其进行流处理,并使用索引查找第二个字符串中的字符。或者,您可以尝试创建一个包含两个字符的混合对象(因此,对于输入 ABCDE 和 HELLO,一个包含 A 和 H 的对象),但是您将编写更多的代码来进行设置,然后是简单的, no-streams 方式。
所以,让我们从简单的方法开始:
int difference = 0;
for (int i = 0; i < stringLength; i++) {
char a = inString.charAt(i);
char b = randomString.charAt(i);
difference += difference(a, b);
}
您必须自己编写差异方法 - 但它会非常非常简单 one-liner。
尝试获取某种类型的两个集合,并从中创建一个流,其中流中的每个元素都与每个集合中的元素相匹配(因此,["HA", "EB", "LC", "LD", "OE"]
的流)通常称为 'zipping'(与流行的文件压缩算法和产品无关),java 并不真正支持它(还?)。有一些第三方库可以做到这一点,但考虑到上面的内容非常简单,我认为压缩不是您在这里寻找的。
如果你绝对必须,我想我看起来像:
// a stream of 0,1,2,3,4
IntStream.range(0, stringLength)
// map 0 to "HA", 1 to "EB", etcetera
.mapToObj(idx -> "" + inString.charAt(idx) + randomString.charAt(idx))
// map "HA" to the difference score
.mapToInt(x -> difference(x))
// and sum it.
.sum();
public int difference(String a) {
// exercise for the reader
}
使用Edit distance (Levenshtein distance)
你可以
-
- 根据algorithm on wikipedia、 实现自己的编辑距离
-
- 您可以使用现有的源代码,查看 rosetta code。
-
- 使用现有的库,例如 apache LevenshteinDistance
你也可以查看
- Levenshtein Distance on Whosebug
这是我在 MATLAB 中的代码(ASCII 距离)
function z = asciidistance(input0)
if nargin ~= 1
error('please enter a string');
end
size0 = size(input0);
if size0(1) ~= 1
error ('please enter a string');
end
length0 = size0(2);
rng('shuffle');
a = 32;
b = 127;
string0 = (b-a).*rand(length0,1) + a;
x = char(floor(string0));
z = (input0 - x);
ascii0 = sum(abs(z),'all');
ascii1 = abs(sum(z,'all'));
disp(ascii0);
disp(ascii1);
disp(ascii0/ascii1/length0);
end
此脚本还区分了基于每个字符的绝对 ASCII 距离与基于每个字符串的绝对 ASCII 距离,从而导致为 ASCII 距离返回两个整数。
我还包括了这两个值的限制,其值接近被比较字符串长度的倒数。这实际上近似于 运行.
时每个随机字符串生成事件的熵 E经过标准错误检查后,脚本首先找到输入字符串的长度。 rnd
函数为随机数生成器提供种子。 a
和 b
变量定义 ASCII table 减去非原则 table 字符,以 126 结束,包括在内。 127 实际上用作上限,以便下一行代码可以生成输入长度的随机变量字符串。以下代码行将字符串转换为 ASCII table 提供的字母数字字符。以下代码行按元素减去两个字符串并存储结果。接下来的两行代码以第一段中提到的两种方式总结了 ASCII 距离。最后,打印出这些值,并提供随机字符串生成事件的熵 E。