是否可以使用这组非常有限的运算符对整数进行排序?

沃尔特·斯塔博斯

背景

我正在使用一种工具集非常有限的奇怪编程语言。

我想对一个整数列表进行排序,但我无法找出在给定工具的情况下有效的算法。我不知道这是否可能。

运营商

这是一些记录可用运算符的 JavaScript 代码。

// 1. you can create new variables
// javascript quirk: in order to pass-by-reference, you must store an integer in an object
const v = (value) => {
    return { value: value };
}

// 2. you can set A to B, if B is larger than A
const max = (a,b) => {
    if(b.value > a.value)
        a.value = b.value;
};

// 3. you can set A to B, if B is less than A
const min = (a,b) => {
    if(b.value < a.value)
        a.value = b.value;        
};

// 4. you can swap the values of A and B
const swap = (a,b) => {
    let t = a.value;
    a.value = b.value;
    b.value = t;
};

// 5. you can set A to B
const set = (a,b) => {
    a.value = b.value;
};

// 6. you can add B to A
const add = (a,b) => {
    a.value = a.value + b.value;
};

// 7. you can subtract B from A
const subtract = (a,b) => {
    a.value = a.value - b.value;
};

// 8. you can multiply A by B
const multiply = (a,b) => {
    a.value = a.value * b.value;
};

// 9. you can divide A by B, losing the remainder
// if B == 0, then A is not modified
const divide = (a,b) => {
    if (b.value == 0) return;
    a.value = Math.floor(a.value/b.value);
};

// 10. you can set A to the remainder of A divided by B
// if B == 0, then A is not modified
const mod = (a,b) => {
    if (b.value == 0) return;
    a.value = a.value % b.value;
};

// 11. you can test if A falls within a range of integers, and if true, call a function 
// (see next section for function rules). You cannot do anything with a false
//
// min and max must be hard coded integers (i.e. you cannot pass in variables)
const in_range = (a,min,max) => {
    return (a >= min && a <= max);
};

// 12. you can add an integer to A
// x must be a hard-coded integer, you cannot pass in variables
const add2 = (a,x) => {
    a.value = a.value + x;
};

// 13. you can set A to an integer
// x must be a hard-coded integer, you cannot pass in variables
const set2 = (a,x) => {
    a.value = x;
};

输入

    var a = v(2);
    var b = v(1);
    var c = v(3);

    // you may create as many extra variables as you want
    var temp = v(0);

想要的结果

    a.value == 1
    b.value == 2
    c.value == 3

仅使用上面列出的操作,可以对整数进行排序吗?

语言非常有限:

没有可用的循环或其他比较/逻辑流程。

没有数组。

您可以编写函数,但它们必须遵循上述规则。您不能将变量传递给函数,必须从全局范围访问它们。

马特·蒂默曼斯

现在的定义max,并min已得到修复,你可以做这样的:

var sum = v(0);
add(sum ,a);
add(sum ,b);
add(sum ,c);

//remember a and set a to min
var olda = v(0);
set(olda,a);
min(a,b);
min(a,c);

//set c to max
max(c,olda);
max(c,b);

//calculate b
set(b,sum);
subtract(b,a);
subtract(b,c);

您有比您需要的更多的可用操作。显然,仅对 2 个变量进行排序比这更容易,如果您可以对 2 进行排序,那么您可以使用排序网络对任意数量的变量进行排序

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

PHP非常有限吗?

std :: iota非常有限

是否可以使用自定义相等运算符进行模式匹配?

是否可以使用“?” 范围内的运算符?

用有限的按位运算符将无符号整数乘以10

是否可以使用运算符映射自动生成指定的运算符?

如果仅实现了运算符<,是否可以使用运算符==?

是否使用 c++ && (AND) 运算符进行排序

Haskell中是否有任何运算符可以使用(>>)折叠动作列表?

是否存在数量有限的GroupedFlux <T>创建的groupBy运算符

Firebase 应用:Google Analytics 非常有限

如果整数> = 1,而没有使用任何关系运算符,是否可以将整数转换为1?

“ in”运算符是否使用“ ==”或“ is”进行比较?

可以使用哪些运算符来限制整数除法?

对于列表排序,是否有一种方法可以使具有相同参数的多个运算符重载?

在Menhir中,如果没有运算符,是否可以使规则左关联?

使用正确应用的合成运算符是否暗示可以使用对照图?

gcloud 数据存储:我可以使用 IN 或 Contains 运算符进行过滤吗?

如何在使用中的IP地址配额非常有限的Google Cloud Platform上创建大型(dataproc)集群?

是否可以使用扩展运算符更新对象,而不是创建新对象?

是否可以使用VALUE运算符将表数据转换为相似类型

是否可以使std容器使用默认的新运算符?

是否可以使用&&和|| Java中相同的if语句中的运算符?

perl 中的“eq”或“ne”比较中是否可以使用“or”或“and”运算符?

函数调用后是否可以使用管道运算符调用返回?

是否可以使用nameof运算符隐含params数组的参数名称?

TypeScript:是否可以使用typeof运算符获取类型数组?

是否可以使用动态运算符创建动态算术表达式?

除特定键外,是否可以使用扩展运算符(三个点)?