Code Golf:混合坚果,以免碰到任何同种坚果


16

输入:

输入是随机排列的螺母数组(使用您的语言),随后可能是螺母。您的程序必须具有表示每种螺母的方式,例如整数代码。程序必须能够处理任何大小的螺母配置的数组。

可能的坚果:

Kola nut
Macadamia
Mamoncillo
Maya nut
Mongongo
Oak acorns
Ogbono nut
Paradise nut
Pili nut
Pistachio
Walnut

输出:

输出必须以没有相邻螺母种类的方式对数组进行排序。如果这不可能,则输出应为空数组。

输入示例(简体):

["walnut", "walnut", "pistachio"]

示例输出:

["walnut", "pistachio", "walnut"]

解决方案可能不会简单地随机排列数组,直到偶然地使其变得唯一。使用的排序必须是确定性的

混合坚果? 我看到两个杏仁在碰!


4
“您的程序必须具有表示每种螺母的方式,例如整数代码”,这是为什么呢?—“在偶然偶然改变数组之前,可能不会简单地对其进行混洗。所采用的排序必须是确定性的”。混洗仍可以是确定性的。您是要限制程序的时间复杂度吗?

1
我必须同意@leftaroundabout的规定,如果没有很好的理由,则禁止使用特定算法是愚蠢的。像这样的代码游戏最有价值的事情之一就是采用了各种各样的方法。
dmckee ---前主持人小猫,

@dmckee,我认为算法确定性的要求是合理的-如果RNG错误或输入时间过长,则不确定性解决方案可能无法终止。
展位,2012年

@boothby。嗯 我是粒子物理学家。蒙特卡洛本身就是一个重要工具。而且,如果我选择一个固定的PRNG和一个固定的种子,那确定性的。
dmckee ---前主持人小猫,

1
我想我找到了一个包含多个解决方案的示例,但可能会导致某些答案无法找到它们中的任何一个。我可以添加吗?(5,4,4,3,3,2)perl6 -e 'my @a="aaaaabbbbccccdddee".comb;my @b = @a.pick(*) while @b.squish !== @a;say [~] @b' baedcbdacdecbabaca(3,3,2)也可能导致它们失败。
布拉德·吉尔伯特b2gills,2015年

Answers:


8

GolfScript,42 41 37 38个字符

~.`{\`{=}+%1-,}+$.,)2//zip[]*.2<..&=*p

该代码期望在STDIN上输入并将结果打印到STDOUT,例如:

> ["walnut" "walnut" "walnut" "macadamia" "pistachio"]
["walnut" "macadamia" "walnut" "pistachio" "walnut"]

> ["walnut" "walnut" "walnut" "macadamia" "walnut"]
[]

该脚本的时间超出了预期,但我认为仍有改进的空间。

编辑:包含单个项目的列表的情况花费了我1个字符(我能想出的最佳比较与Peter相同)。


1
我还没有坐下来执行此操作,但这$.,)2//zip正是我的初衷。我对规范的解释是,它可以在堆栈上接受输入,然后将其保留在堆栈上,因此也许我们应该进行说明。
彼得·泰勒

@PeterTaylor,很酷。为我工作。
展位,

["walnut"]在“首先比较两个”部分中的输入时崩溃。
彼得·泰勒

@PeterTaylor你是对的。我将不得不处理那个极端情况。
霍华德

6

GolfScript,32个字符

~:x{]x\-,}$.,)2//zip[]*.2<..&=*`

输入和输出格式与霍华德的解决方案相同。


我在排序部分也有相同的想法,但是还没有编写代码:-)很好!
2012年

6

Brachylog v2,10个字节

p.¬{s₂=}∨Ė

在线尝试!

蛮力解决方案。(这是一个功能,允许,因为挑战没有说“完整程序”。)它也是规范的直接翻译(唯一真正的微妙之处在于,我设法安排了所有事情,以便所有隐式约束都准确地到达正确的位置,因此不需要任何多余的字符来消除歧义)。

请注意,这是用于重新排列任何种类的列表的通用算法,因此它没有两个可触动的元素。它可以处理元素的字符串表示形式,也可以处理整数代码。因此,“您的程序必须具有一种表示每种螺母(例如整数代码)的方式”的方法实际上并不重要。从问题的要求被解释。

说明

p.¬{s₂=}∨Ė
p            Find a permutation of {the input}
  ¬{   }     which does not have the following property:
    s₂         it contains a pair of adjacent elements
      =        that are equal
        ∨    {no constraint on what value the equal elements can have}
 .           If you find such a permutation, output it.
        ∨    If no permutation is found, ignore the input and
         Ė     {output} an empty list

1

J,80个字符

]`_:@.(0<2&([:+/=/\))({.~-:@#),((],.|.)~>.@-:@#)<"1;(\:#&.>)(</.])[;.1' ',1!:1[1

在这个比赛中,与Golfscript不在同一个联赛中。我怀疑可以有所收获,但是仅仅为了使列表进入程序所需的14个字符[;.1' ',1!:1[1是一个重大障碍。

基本上,该程序接收列表,将相似的项目组合在一起,按降序排列的项目数量进行排序,并在列表的前一半和后一半之间交替输出。其余的如果代码去除了多余的项目,并确定列表是否有效(输出无​​穷大)_如果不是,则)。

例:

macadamia walnut walnut pistachio walnut

组别(</.])

macadamia walnut walnut walnut pistachio

排序(\:#&.>)

walnut walnut walnut macadamia pistachio

拉夫((],.|.)~>.@-:@#)

walnut macadamia walnut pistachio walnut


0

Stax,10 个字节

│éÿ∞å[zàL⌂

运行并调试

这是解压,解包和注释的同一程序。

|T      get all permutations
{       block to filter by
  :g_=  after dropping repeated elements, it's still equal
f       execute filter
|c      terminate and pop if falsy (no match)
hJ      take the first permutation, and join with spaces

运行这个

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.