比赛挑战:
我有一个二维数组N x N。我们需要编写一个函数,以顺时针方向围绕二维数组循环,如图所示。
示例4x4:
输入是一个二维数组:
entryArray = [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]
遍历后的输出是一维数组:
exitArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
语言可以是任何东西。主要条件:函数必须对任何等边二维数组都能正常工作,包括1х1,空数组返回空数组。
获奖者的定义:
获胜者将由以下参数决定:
- 最少的代码字符数
- 票数
- 在第一个给出的答案之后不超过 2 次编辑
选择获胜者时不考虑作者的回答。
获胜者将在 2 周内(10 月 26 日)确定。
请在响应头中注明语言和缩小函数的字符数,用逗号分隔。
我希望看到Ruby、Haskell和Scalaad infinitum 的解决方案。非常感谢您的活动!
获奖者结论:
execute("ru.stackoverflow.com", "892196");
.cssload-container,.cssload-cube{width:97px;height:97px;transform-style:preserve-3d}.cssload-container,.cssload-cube,.cssload-half1,.cssload-half2{transform-style:preserve-3d}.cssload-container{position:relative;margin:23px 84px;perspective:292px}.cssload-cube{animation:cube 11.5s forwards infinite;transform-origin:center 49px}.cssload-half1,.cssload-s1{top:0;transform-origin:50% 100%}.cssload-half1{height:39px;position:absolute;animation:half-fold 11.5s forwards infinite}.cssload-side{width:19px;height:19px;background:#ddd;position:absolute}.cssload-s1{left:39px;animation:s1ani 11.5s forwards infinite}.cssload-s2,.cssload-s3,.cssload-s4{left:39px;transform-origin:50% 0}.cssload-s2{top:19px;animation:s2ani 11.5s forwards infinite}.cssload-s3{top:39px;animation:s3ani 11.5s forwards infinite}.cssload-s4{top:58px;animation:s4ani 11.5s forwards infinite}.cssload-s5{left:19px;top:19px;transform-origin:100% 50%;animation:s5ani 11.5s forwards infinite}.cssload-s6{left:58px;top:39px;transform-origin:0 50%;animation:s6ani 11.5s forwards infinite}@keyframes cube{0%,30%{transform:rotateX(0)}40%{transform:rotateX(45deg) rotateY(0) rotate(45deg)}60%{transform:rotateX(60deg) rotateY(0) rotate(45deg)}65%,70%{transform:rotateX(60deg) rotate(45deg) rotate(180deg)}75%,80%{transform:rotateX(60deg) rotate(45deg) rotate(1turn)}90%{transform:rotateX(0) rotate(0) rotate(0)}}@keyframes s1ani{0%{opacity:1;transform:translateY(0);background:#ddd}40%{transform:rotateX(0);background:#ddd}50%{transform:rotateX(-90deg);background:#ddd}90%{transform:rotateX(-90deg)}}@keyframes s2ani{0%{opacity:0;transform:rotateX(-179deg)}10%{opacity:1;transform:rotateX(0)}40%{background:#ddd}45%,80%{background:#b4b4b4}65%{opacity:1;background:#b4b4b4}90%{opacity:1}to{opacity:0}}@keyframes s3ani{0%,10%{opacity:0;transform:rotateX(-179deg)}20%,90%{opacity:1;transform:rotateX(0)}40%{background:#ddd}45%{background:#969696}to{opacity:0}}@keyframes s4ani{0%,20%{opacity:0;transform:rotateX(-179deg)}10%,to{opacity:0}30%{opacity:1;transform:rotateX(0)}40%{transform:rotateX(0);background:#ddd}50%{transform:rotateX(90deg);background:#b4b4b4}80%{background:#b4b4b4}90%{opacity:1;transform:rotateX(90deg)}}@keyframes s5ani{0%,10%{opacity:0;transform:rotateY(-179deg)}20%{opacity:1;background:#ddd;transform:rotateY(0)}40%{transform:rotateY(0)}50%{transform:rotateY(90deg)}55%{background:#ddd}60%{background:#c8c8c8}90%{transform:rotateY(90deg);opacity:1}to{opacity:0}}@keyframes s6ani{0%,20%{opacity:0;transform:rotateY(179deg)}30%{opacity:1;transform:rotateY(0)}40%{transform:rotateY(0)}50%{transform:rotateY(-90deg);background:#ddd}60%,80%{background:#c8c8c8}90%{opacity:1;transform:rotateY(-90deg)}to{opacity:0}}@keyframes half-fold{0%,50%{transform:rotateX(0)}60%,90%{transform:rotateX(-90deg)}}
<script src="https://mayorovp.github.io/codegolf/table-8c505e68f1349e4c69e7.js"></script>
<div class=cssload-container><div class=cssload-cube><div class=cssload-half1><div class="cssload-side cssload-s1"></div><div class="cssload-side cssload-s2"></div><div class="cssload-side cssload-s5"></div></div><div class=cssload-half2><div class="cssload-side cssload-s3"></div><div class="cssload-side cssload-s4"></div><div class="cssload-side cssload-s6"></div></div></div></div>
比赛结果:
第一名 Andrew NOP用Haskell回答40 字节
非常感谢大家的参与,所有的评论都将被考虑到以后的比赛中。

Haskell, 40
Решение эксплуатирует всё ту же идею отрезания первой строки от матрицы и поворота оставшегося куска против часовой стрелки.
https://ideone.com/FHeJAx
蟒蛇,
886560这是我第一次用 Python 编写代码,所以我还不知道如何缩短(长度)代码。
Возникла следующая идея: берем матрицу, отрезаем от нее первую строку, оставшуюся часть поворачиваем против часовой стрелки на 90 градусов и рекурсивно применяем этот же алгоритм. В итоге потребовалось лишь выбрать ЯП, умеющий такие операции из коробки, им оказался Python ¯\_(ツ)_/¯
https://ideone.com/5qasui
Бонусом — алгоритм работает с любыми прямоугольными матрицами (не только с квадратными).
正因为如此,嗯……“谁少”的要求,天生就是这样的怪物……
C++,155 字节
232 字节
如果我们允许(并无视)公平标准
然后我们得到 217 个字节...
这是偶数和奇数 N 的测试:https ://ideone.com/OEHTLS
如果您只需要将其推入一个数组 - 14 个字节以上:
首先允许的更改:) 用于填充到数组中
230 字节
验证 - https://ideone.com/86YkY4
第二个允许的变化
与优化一样 - 有必要更改算法。我们改变……我们得到 196 个字节。
https://ideone.com/rDXdbh
但是您不仅可以更改算法,还可以更改使用的数据结构!让我们继续讨论
int**,因为问题的条件并没有说明应该如何创建数组。然后我们得到155字节的最终解https://ideone.com/vukXQG
您只需要稍微不同地准备输入数组。
在这一点上,也许,我们会停下来。
PS 其实,在这样的比赛中,还需要一些其他的规则……因为从头开始写一个算法是一回事,另一个有点夸张的是调用现成的库函数。或者使用更“短”的语言——再次夸大其词,想象一种语言,其中增量看起来完全像
summation(a,1),没有别的:(Python 2,
6059 байтРешил разбавить немного
python'ом.Логика как у @Андрей NOP, но код короче:
Подтверждение:
https://ideone.com/4Xmy7W
Небольшое добавление:
Пример выше реализован для Python второй версии. Для того чтобы функция работала должным образом в 3 версии нужно обернуть
zipвlist:list(zip(...)). Разница в том, что во второй версииzipвозвращает список, а в третьей возвращает итерируемый объект.JS,125 个字符
正确性证明:
PHP 7.4, 124
https://3v4l.org/JDGfH
JS,
12110781在不改变算法的情况下进行编辑,考虑到@Andrey NOP 的意见和建议。我将函数更改为 lambda,并将其替换
b.length为b[0],并将[]其替换为b.演示:
Ruby,
6159https://ideone.com/SYmf7W
C#,
320280Потестить можно вот тут на deck.net
Внес небольшие исправления не меняя алгоритм, что бы уменьшить длину кода
Потестить можно вот тут на deck.net
Смысл в том, что я делаю реверс булевых флагов, которые показывают какие индексы в какую сторону двигать и на основании этого я обхожу массив.
Вроде бы, это должно быть эффективно нежеле алгоритмы, через повороты матриц, которые ИМХО будут не так эффективны на больших матрицах.
C、
193191178175 字节您可以在Ideone上查看代码。
第一次编辑
使除
m静态之外的所有变量都摆脱了零初始化,并i从以下位置删除了变量声明for:再次链接到 Ideone。
第二次编辑
删除了不必要的大括号,替换
if为三元运算符,删除了int静态变量声明中的显式类型:你可以在这里查看第三个版本。
第三次编辑
据我了解,不更改算法的编辑不被视为“修复”,因此我将对代码进行另一项调整:我将
m其设为静态并将其初始化为for:让我们检查第四个版本。