升序矩阵


17

“升序矩阵”是整数(包括0)的无限矩阵,其中任何元素是最小的可用元素,之前尚未在相应的行和列上使用:

  | 1 2 3 4 5 6 ...
--+----------------
1 | 0 1 2 3 4 5 ...
2 | 1 0 3 2 5 4 ...
3 | 2 3 0 1 6 7 ...
4 | 3 2 1 0 7 6 ...
5 | 4 5 6 7 0 1 ...
6 | 5 4 7 6 1 0 ...
. | ...............

您的任务是编写一个程序,该程序将输出在输入指定的行和列中找到的元素。(标准输入和输出)

测试用例:

5 3 -> 6
2 5 -> 5

适用高尔夫规则,最短的规则为赢。

PS即使具有算法性质,代码也可以非常简洁。

编辑:我没想到这么早就可以看到xor解决方案。我真的很希望看到10条采用算法方法的帖子,然后是xor解决方案。现在,请记住,看如何用不同的语言编写xor并不太有趣,我建议您也尝试一种算法方法。

因此,是的,我认为现在没有人能超过5个字符,因此我祝贺Ilmari Karonen提供了最聪明,最快捷的解决方案。但是,还有一个新的挑战:编写最短的算法解决方案


5
Xor是算法的。
彼得·泰勒

Answers:


10

GolfScript,5个字符

~(\(^

确实,一旦您识别出模式,此任务就非常简单。唯一尴尬的是基于1的索引-如果输入索引基于零,则此2字符解决方案就足够了:

~^

为了向不熟悉GolfScript的读者解释这一点,该~命令评估输入,将两个数字保留在堆栈中。 ^然后对堆栈上的两个最高数字进行异或运算,然后将结果输出。要处理基于1的输入,还需要另外两个命令:(将堆栈中最上面的数字减1,同时\交换堆栈上最上面的两项。


1
您能解释一下^吗?我提到了GolfScript内置页面对称差异;将此操作与两组数组一起使用是有道理的,但我不明白它对于两个单独的数字如何工作。
罗布2012年

1
@Mike:应用于数字时,^运算符返回其按位XOR
Ilmari Karonen 2012年

那是一个非常酷的关系:)
beary605

1
您对我的回答的评估是正确的,此后我因为对挑战的误读而将其删除。
DavidC 2012年

2

Mathematica 10 44

编辑

正如Ilmari所说,我的第一反应是基于对挑战性质的误解。这是另一种尝试。

用法

f[n___, 1, n___] := n - 1;
j_~f~k_ := BitXor[j - 1, k - 1]

@IlmariKaronen我想这次我做对了。但是,它甚至与解决方案的规模还差得远。
DavidC 2012年

2

K,31

{0b/:{(x|y)&~x~y}. 0b\:'-1+x,y}

偷走了Ilmari Karonen的XOR逻辑,我永远不会发现自己。


2

PHP,38

只是Ilmari Karonen的XOR的简单实现

<?php echo --$_GET['a']^--$_GET['b']?>

用法:

... / xor.php?a = 4&b = 7

将打印6


2

哈斯克尔174

想通了我会做一个不依赖XOR的解决方案。懒得正确打高尔夫球。

a 0 0=0
a b c
 |m==n=a(b-m)(c-n)
 |m>n=m+a(b-m)c
 |m<n=n+a b(c-n)
 where{g f=until(>f)(*2)1`div`2;m=g b;n=g c;}
main=do
 [x,y]<-fmap(map read.words)getLine
 print$a(x-1)(y-1)

编辑:一天后,我意识到这只是在计算XOR。因此,如果将此视为算法解决方案,那么Ilmari Karonen的算法也应如此。


2
懒得正确打高尔夫球。-请认真对待您提交的内容,以使其成为真正的竞争者。
乔纳森·

2

蟒蛇2,36

我认为,因为我刚刚开始学习Python,这将是使用它提交我的第一个答案的最佳时机(而且没有人使用Python回答过),也许我可以收到一些反馈。

感谢@IlmariKaronen提供的非常酷的快捷方式。

感谢@Gareth提供以下代码。

import sys
print(input()-1^input()-1)

Python 3、56

我写的原始程序。

import sys
x=int(input())
y=int(input())
x-=1
y-=1
print(x^y)

具有2和5的IDEONE

具有3和3的IDEONE


我假设您使用的是Python 2而不是Python 3-如果不忽略此注释。input已经评估了输入,因此int()不必要。另外,由于您直接从int获取int,input()因此可以-1直接进行。您也可以完全摆脱中介变量,然后继续进行print(input()-1^input()-1)。关于是否需要导入-该站点上的其他Python用户在使用的程序中不包括该导入input(),但是我不是Python程序员,所以我无法确定是否需要导入。
Gareth 2012年

@Gareth实际上我正在使用Python 3,但是我喜欢您的使用建议print(input()-1^input()-1)。感谢您的帮助!
罗布(Rob)2012年

请问您为什么要进口sys
乔纳森·弗雷希

2

MATL,2个字节

Z~

在线尝试!

MATL将挑战的发布日期推迟了几年,但是,自然的基于1的索引和按位的xor函数使这一过程变得美观而整洁!




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.