Codegolf Rainbow:使用反射对颜色进行排序


9

介绍:

在我发布了两个与Rainbow 相关的挑战:Codegolf Rainbow:使用整数数组1Codegolf Rainbow:以黑白绘制 2之后@ ChrisM在ASCII中做出了以下评论Draw in Black-and-White)挑战

也许您知道这一点,这是设计使然的(我知道彩虹也不是菱形或ascii,并且更高阶的位置会变得更加复杂),但是第二个彩虹中的颜色不是颠倒了吗?

他的确是正确的。当您看到两条彩虹时,第二条实际上是第一条的反射,因此颜色是相反的。有三个彩虹,这是实际的双彩虹,第三个彩虹是其他两个彩虹之一的反映。并且有四个,有两个彩虹,以及两个彩虹。
在此处输入图片说明

因此,让我们利用这个事实提出第三个相关挑战。

挑战:

输入:一个正整数n,为>=2,以及一个size的整数列表>= n+1
输出:相同的列表顺序如下:

  1. 首先将输入列表分为大小子列表n(尾随子列表可以是范围内的任何大小[1,n])。
  2. 然后,根据子列表的数量执行以下操作m
    • m - m//2子列表的第一数量从最低到最高(其中//是整数除法)进行排序。(即具有6个子列表,前三个将按从低到高的顺序排序;具有5个子列表时,前三个按从低到高的顺序排序。)
    • m//2子列表的最后数量从最高到最低排序(其中//是整数除法)。(即具有6个子列表,后三个将按从高到低的顺序排序;具有5个子列表,后两个将按从高到低的顺序排序。)
  3. 将所有子列表合并在一起,再次形成一个列表

例子:

输入:n=7[3,2,1,-4,5,6,17,2,0,3,5,4,66,-7,7,6,-5,2,10]
步骤1:[[3,2,1,-4,5,6,17],[2,0,3,5,4,66,-7],[7,6,-5,2,10]]
步骤2:[[-4,1,2,3,5,6,17],[-7,0,2,3,4,5,66],[10,7,6,2,-5]]
步骤3 /输出:[-4,1,2,3,5,6,17,-7,0,2,3,4,5,66,10,7,6,2,-5]

输入:n=4[7,4,-8,9,3,19,0,-23,-13,13]
步骤1:[[7,4,-8,9],[3,19,0,-23],[-13,13]]
步骤2:[[-8,4,7,9],[-23,0,3,19],[13,-13]]
步骤3 /输出:[-8,4,7,9,-23,0,3,19,13,-13]

挑战规则:

  • 整数输入n保证大于1。
  • 整数列表的大小保证大于n
  • 尾随子列表可以小于n(可以在示例和测试用例中看到)。
  • I / O格式在任何合理的格式中都是灵活的。可以是整数或小数的列表/数组,逗号/空格/换行符分隔的字符串,整数流等。(输出可能不是步骤2的列表的2D列表。步骤3将其展平为单个列表是这项挑战所必需的。)

通用规则:

  • 这是 ,因此以字节为单位的最短答案会获胜。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能简短的答案。
  • 标准规则适用于您的答案,因此您可以使用STDIN / STDOUT,具有正确参数的函数/方法和返回类型的完整程序。您的来电。
  • 默认漏洞是禁止的。
  • 如果可能的话,请添加一个带有测试代码的链接。
  • 另外,强烈建议为您的答案添加说明。

测试用例:

Inputs: n=7 and [3,2,1,-4,5,6,17,2,0,3,5,4,66,-7,7,6,-5,2,10]
Output: [-4,1,2,3,5,6,17,-7,0,2,3,4,5,66,10,7,6,2,-5]

Inputs: n=4 and [7,4,-8,9,3,19,0,-23,-13,13]
Output: [-8,4,7,9,-23,0,3,19,13,-13]

Inputs: n=2 and [7,-3,1]
Output: [-3,7,1]

Inputs: n=3 and [1,6,99,4,2]
Output: [1,6,99,4,2]

Inputs: n=2 and [5,2,9,3,-5,-5,11,-5,4,12,9,-2,0,4,1,10,11]
Output: [2,5,3,9,-5,-5,-5,11,4,12,9,-2,4,0,10,1,11]

Inputs: n=3 and [5,2,9,3,-5,-5,11,-5,4,12,9,-2,0,4,1,10,11]
Output: [2,5,9,-5,-5,3,-5,4,11,12,9,-2,4,1,0,11,10]

Answers:


5

Brachylog18 17 16字节

ġ₎↔ḍ↔{izo₎ᵐ↔}ᶠcc

在线尝试!

-1个字节感谢@sundar

预期输入为[<integer list>, n]。请注意,负整数用_Brachylog的“低减”表示。输出变量为R

第一次尝试Brachylog,因此我想它在减少字节数方面是次优且成熟的。

说明

分区,分叉,根据索引排序(0:asc,1:desc),展平。

ġ₎               | split head of input into groups of length n (last of list)
  ↔              | reverse so that...
   ḍ             | dichotomize splits in two, attaching any additional element to the second list
    ↔            | reverse so first half of partitions corresponds to the 0 index
     {      }    | apply
      i          | : append index
       z         | : zip each sublist with the index of its parent
        o₎ᵐ      | : map over sublists, ordering by the zipped index
           ↔     | : undo earlier reverse
             ᶠ   | find all outputs
              cc | flatten two levels

对您的第二个解决方案进行细微调整,以获取17个字节:在线尝试!
sundar-恢复莫妮卡

@sundar我有一个偷偷摸摸的怀疑,我映射了太多,谢谢!
冗余

这个语言是做什么用的?
山姆·奥罗佐

@SamOrozco Terse声明式逻辑编程。尝试单击语言名称!
亚当




2

05AB1E(旧版),9个字节

ô€{2ä`í«˜

在线尝试!

在线尝试!05AB1E中(Elixir重写) –期望输入在堆栈上,这是默认的I / O方法。

凯文想出了自己的11乘以10字节,然后我又想出了9字节。


好一个。这是我最初的11字节替代方案:ô€{2äRć€R)˜
凯文·克鲁伊森

1
@KevinCruijssen使用您的方法达到10哈哈。编辑:9现在!
Xcoder先生18年

很好。完全忘记了í。还有不错的附加高尔夫。
凯文·克鲁伊森

2

JavaScript(ES6),82 81字节

@redundancy节省了1个字节

将输入作为(list)(n)

a=>n=>(g=z=>a+a?[...a.splice(0,n).sort((x,y)=>1/z?x-y:y-x),...g(a[i+=n])]:a)(i=0)

在线尝试!


由于a是一维的,我相信你可以更换a>[]a+a检查非空的情况下,并节省1个字节。分区和确定何时反转排序的非常聪明的递归策略!
冗余

@redundancy确实应该是安全的。谢谢!
Arnauld
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.