源排列


14

集合S = { s 1s 2s n }置换是一个双射函数π S S。例如,如果小号= { 1 2 3 4 }那么函数小号={s1个s2sñ}π小号小号小号={1个234}π:x1+(x+1mod4)是一个置换:

π1个=3π2=4π3=1个π4=2

我们还可以对无穷集进行置换,让我们以ñ为例:函数π:xx1+2(xmod2)是置换,交换奇数和偶数以两个为单位的整数。第一个元素如下:

2,1,4,3,6,5,8,7,10,9,12,11,14,13,16,15,

挑战

解决此难题的任务是编写一个在正自然数上实现任意1排列的函数/程序。解决方案的分数是将代码点与实现的置换映射后的总和。

假设我们采用上述Python实现的排列方式:

def pi(x):
    return x - 1 + 2*(x % 2)

在线尝试!

字符的d代码点为,。如果我们对每个角色执行此操作,则会得到:100pi(100)=99

99,102,101,31,111,106,39,119,42,57,9,31,31,31,31,113,102,115,118,113,109,31,119,31,46,31,50,31,44,31,49,41,39,119,31,38,31,49,42

所有这些映射字符的总和为,这将是该函数的分数。2463

规则

您将通过功能或程序实现置换π

  • 给定自然数,返回/输出xπ(x)
  • 对于这一挑战的目的并包含N0
  • 排列必须非平凡地排列的无限子集N
  • 您的函数/程序不允许读取其自身的源代码

计分

得分是由该排列下所有代码点的总和得出的(零字节可能不是源代码的一部分)(这些代码点取决于您的语言2,您可以自由使用SBCS,UTF-8等)您的语言支持)。

得分最低的提交者获胜,最早的提交者打破了联系。


  1. 除了仅置换N的有限子集的置换,这意味着集合{x|π(x)x}必须是无限的。

  2. 如果可以提高分数,则可以例如使用UTF-8编码的Jelly提交而不是通常的SBCS。


1
@JoKing“零字节可能不是源代码的一部分” re:第二个问题
纯ASCII,

Answers:


6

果冻,得分 288 250 212  199

-38感谢大公埃里克(Erik the Outgolfer)!

C-*+

交换偶数。

得分是67+45+44+43=199请参阅此处的自我得分

在线尝试!


显然,Leaky Nun的-*ạ得分为300 ...但是,-*_@得分为250。也许我应该将其发布为我自己的,尽管它是相同的排列。
暴民埃里克(Erik the Outgolfer)

啊,Leaky Nun的观察不错,所以-*N+得分212
Jonathan Allan


3
C-*+听起来像是未来的变种C++
瓦尔说莫妮卡(Monica)


4

Perl 6,得分:201

*-!0+^40+!0

在线尝试!

阿诺尔德港口的答案。这得益于xor(+^)的优先级与-+,并且使用了任意lambda来减少整体字符。除此之外,我找不到找到更好分数的不同表示方法。

Perl 6的,得分804 702

{{(++$ords(q[!$%()+-2?[]_doqrsx{}∉])??++$+22-$++%2-$++%2!!++$)xx$_}()[-!$+$_]}

在线尝试!

这里的第一个quiny型答案,我认为它的得分很好。

23222524 ...1个234 ... 215053521个5554!


O_o是一项巨大的改进
仅使用ASCII


2

视网膜0.8.2,6个字节,得分260

T`O`RO

在线尝试!链接包括自动计分页脚。只需将数字1937十进制表示形式交换,这样不包含以数字互质为首的数字10就不会受到影响。


2

C#(Visual C#中交互式编译器),22个字节,得分247 245

A=>A>65?A-1+A%2*2:66-A

在线尝试!

很简单,如果小于66,则返回66减输入,否则使用问题中的公式交换偶数和奇数。


以前的版本有A=>A<66?66-A:A什么问题?
乔·金

2
@JoKing 除了仅置换有限子集的置换ñ,表示该集合 {X|πXX}必须是无限的。集合不是无限的,因为集合中的唯一值是1-65,因为65之上,所以A的所有值都映射到A
无知的体现

哦,该死,我没注意到。那也意味着我自己的回答也是无效的:(
乔·金

2

TI-BASIC,9个字节,得分1088 1051 1000

Ans-cos(π2fPart(2⁻¹Ans

交换偶数。偶数映射到Ans-1,奇数映射到Ans+1

TI-BASIC是标记化的,因此此程序将具有以下十六进制值:

Ans   -    cos(  π    2    fPart(  2   ⁻¹  Ans
72    71   C4    AC   32   BA      32  0C  72

因此得分是: 113+114+195+171+49+185+49+11+113=1000

输出测试程序:

For(I,1,10
I
Ans-cos(π2fPart(2⁻¹Ans
Disp Ans
Pause
End

哪个输出:

2
1
4
3
6
5
8
7
10
9

笔记:

  • TI-BASIC的令牌值可在此处找到。

  • Pause由于计算器只有8行,因此在输出程序中使用可以更好地查看排列。按[ENTER]查看下一个排列。


1

木炭,13字节,得分681

⁻⁺²³²ι⊗﹪⊖ι²³³

在线尝试!链接是带有标题的自计分版本,可以在字节码数组上进行映射。(木炭有一个自定义代码页,因此我在输入中手动插入了正确的字节代码。)通过反转233个数字的范围来工作,从而使117、350、583 ...不变。说明:

     ι          Value
 ⁺              Plus
  ²³²           Literal 232
⁻               Minus
         ι      Value
        ⊖       Decremented
       ﹪        Modulo
          ²³³   Literal 233
      ⊗         Doubled

1

Haskell,得分985

(\((.),(-))->(.)*200+mod(-39+(-))200+1).(\(*)->divMod((*)-1)200)

在线尝试!


我不认为这是一个排列,因为添加a*200对200取模没有影响,所以a 没关系。
xnor19年

@xnor好抓住。那应该在mod之外。在打高尔夫球的某个时候,我一定弄错了操作顺序。立即修复,谢谢!
约瑟夫·西布尔-恢复莫妮卡

我认为还有另一个问题,即40映射为0,但是挑战要求使用正整数,这使得这种方法非常棘手。
xnor19

1
使用sum[1|...]if..then..else应该有所帮助。
ბიმო



0

Brainfuck,47个字节,得分2988

,[-<+<+>>]<[->[>+<[-]]+>[<->-]<<]>[-<<++>>]<<-.

在线尝试!

我使用了介绍中给出的排列。由于这是双射,因此可以将其用作类似于ROT13或Atbash的简单对称密码。我的解决方案适用于无界单元。然而,通过限制自己的8位单元,您可以通过更换节省2点[-][+]

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.