挑战6:运输码头重新贴标!


9

<<上一页 下一页>>

感谢PPCG社区,圣诞老人成功地将礼物分类到正确的顺序,以便搬进运输码头。不幸的是,运输码头的标志坏了,所以他不知道把所有礼物放在哪里!礼物全部归为一组,而不是按照范围分组,Santa承认这是一个更好的主意。

现在,给定礼物的排序顺序,确定所有可能的最小范围配置,以使礼物的顺序正确。也就是说,找到所有最小范围的配置,以使根据挑战#5中的算法对礼物进行排序不会改变顺序。

挑战

最小范围配置是范围的列表,以使范围各自尽可能小。也就是说,如果指定范围覆盖礼物的特定子集,则该范围的最小值和最大值必须与该子集的最小值和最大值相同。换句话说,缩小封面的任何范围将导致它不再是封面。

挑战在于找到适用于当前尺寸的所有可能的最小范围配置。让我们举个例子:[3, 1, 2, 5, 4, 7, 6]

有一个简单的情况,那就是要占据整个当前配置的范围。在这种情况下,[[1, 7]]将是一个解决方案。

对于具有唯一元素的示例,另一种琐碎的情况是[[3], [1], [2], [5], [4], [7], [6]](因为不需要对范围进行排序)。

在此示例中,我们还看到[[1, 3], [4, 7]][[1, 3], [4, 5], [6, 7]]以及与[[1, 3], [5], [4], [6, 7]]和也可以[[1, 3], [4, 5], [7], [6]]

的最终答案[3, 1, 2, 5, 4, 7, 6][[[3], [1], [2], [5], [4], [7], [6]], [[3], [1], [2], [5], [4], [6, 7]], [[3], [1], [2], [4, 5], [7], [6]], [[3], [1], [2], [4, 5], [6, 7]], [[3], [1], [2], [4, 7]], [[3], [1, 2], [5], [4], [7], [6]], [[3], [1, 2], [5], [4], [6, 7]], [[3], [1, 2], [4, 5], [7], [6]], [[3], [1, 2], [4, 5], [6, 7]], [[3], [1, 2], [4, 7]], [[1, 3], [5], [4], [7], [6]], [[1, 3], [5], [4], [6, 7]], [[1, 3], [4, 5], [7], [6]], [[1, 3], [4, 5], [6, 7]], [[1, 3], [4, 7]], [[1, 5], [7], [6]], [[1, 5], [6, 7]], [[1, 7]]]

格式化规格

输入将以您的语言在合理支持的数字范围内以任何合理格式的正整数平面列表形式给出。输入内容可能包含重复元素。输出应该以任何合理格式的正整数3D列表形式给出。

输出中的每个范围(在第二层)都可以表示为[min, max][num]如果它是单值范围,则可以表示为整个范围本身,但是输出格式必须一致。请指定您是否希望使用稍微不同的合理输出格式。

重复的值必须在输出中覆盖单个范围;也就是说,输出中的两个范围都不能有任何重叠。

您的解决方案可以按任何顺序返回范围,而不必确定。

规则

  • 适用标准漏洞
  • 这是 所以最短的答案以字节为单位
  • 没有答案将被接受

包含重复元素的列表的测试用例:

2 3 2 4 -> [[[2, 3], [4]], [[2, 4]]]

参考实施

标头是链接。

注意:我从Advent Of Code汲取灵感来挑战这个系列。我没有与此网站的隶属关系

通过查看此处第一个挑战的“链接”部分,您可以查看该系列中所有挑战的列表。

打高尔夫球快乐!

Answers:


3

Mathematica,106个字节

sSelect[MinMax/@s~TakeList~#&/@Join@@Permutations/@IntegerPartitions@Tr[1^s],Unequal@@Join@@Range@@@#&]


在线尝试!

马丁节省了16个字节


3

Brachylog17 16字节

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ

也适用于具有重复项的列表。范围由它们包含的元素列表表示。 在线尝试!

说明

想法是将列表分成多个块,然后将块转换为范围,然后确认它们没有重叠。

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ  Input is a list.
{             }ᶠ  Compute all possible outputs for this predicate:
 ~c                Break the list into contiguous blocks.
   ⟨    ⟩ᵐ         For each block,
    ⌋  ⌉           take its minimum and maximum,
     ⟦₂            and create the range between them.
          .        This is the output.
           c       Also, if you concatenate the output,
            ≠      its elements are distinct.
             ∧     Prevent the interpreter from thinking this is also the output.

1

的JavaScript(ES6),166个 164字节

编辑:现在支持重复的更新版本

将结果以[min,max]格式直接打印到控制台。

f=(a,r=[],l=0)=>a[l++]?f([...a],r,l,f(a,[...r,[Math.min(...x=a.splice(0,l)),Math.max(...x)]])):a[0]|r.some(([x,y],i)=>r.some(([z])=>i--&&z>=x&z<=y))||console.log(r)

测试用例


0

Python 2,179字节

lambda l:[l for l in[[range(min(x),max(x)+1)for x in P]for P in p(l)]if len(sum(l,[]))==len(set(sum(l,[])))]
p=lambda l:[[l[:i]]+a for i in range(1,len(l))for a in p(l[i:])]+[[l]]

在线尝试!

输出完整范围的列表。

受参考实现的启发。

构建所有分区,然后构建每个分区的最小/最大范围。如果在列表中没有值出现多次,则该范围列表有效。


sum(l,[]) 展平列表列表,并允许我检查重复项:

l=[[1, 2], [2, 3]]
sum(l,[]) = [1,2,2,3]
len([1,2,2,3] == len(set([1,2,2,3]))  -> False (duplicates)

0

Pyth,17个字节

f{IsTmm}hSkeSkd./

在这里尝试!

现在,这是很多更好。输出整个范围。请参阅先前版本的修订历史记录(惊人的31个字节)。

怎么运行的

f {IsTmm} hSkeSkd./〜>完整程序。

               ./〜>列出分区。
     m〜>使用变量d映射。
      md〜>使用变量k在d上映射。
        hSk〜> k的最小值。
           eSk〜> k的最大值。
       }〜>包含整数的范围。
f〜>筛选那些...
   sT〜>将其展平时,
 {I〜>重复数据删除不变。
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.