对警察和强盗(强盗)进行硬编码


12

这是挑战。警察应对这一挑战的思路在这里

需要考虑的一个有趣问题是:

如果我有一个数字序列,那么在清楚我在说什么序列之前,我必须提供几个数字?

例如,如果我想谈的正整数,以便从开始,我可以说,1 2 3 ......,但事实是否真的足够了吗?11,2,3,

我有一个回答这个问题的方法,并且是一名代码窃贼,它涉及代码高尔夫球。如果产生这些术语的最短代码产生了序列的所有术语,则您已提供了足够的序列术语。如果我们以代码高尔夫的方式来考虑这一点,那意味着您已经提供了足够的测试用例,从而使通过测试用例的最短代码可以完成所需的任务。

挑战

这个挑战是挑战。警察将在其中展示测试用例,强盗将不得不寻找一种比预期序列更短的欺骗测试用例的方法。警察将提出以下内容:

  • 一段代码,将一个正整数作为输入并产生一个整数作为输出。该代码可以是零或一个索引,但是应该清楚什么是索引。此代码将定义您的顺序。

  • 任何可能影响输出的相关平台或语言要求,例如longint的大小。

  • 一个数字,以及该代码计算出的序列的前n个项。这些将充当“测试用例”。nn

强盗将使用比所介绍的语言短的语言来找到一个程序,并通过所有测试用例(对于前输入产生与警察代码相同的输出)。强盗的代码在输出上也必须与警察的程序有所不同,且必须大于nnn

计分

强盗会根据他们发现的裂缝数量进行评分,裂缝越多越好。可以通过找到比原始裂纹短的有效答案来再次破解答案。如果答案第二次被破解,则将分数给予第二个饼干,而不是第一个。


2
我们是否不让强盗为破解答案而相互殴打(即赢得语言的最短破解)
fəˈnɛtɪk

@ fəˈnɛtɪk听起来不错,我补充说了。
Ad Hoc Garf Hunter

Answers:



5

JavaScript,fəˈnɛtɪk的答案(17个字节)

x=>"11237"[x]||22

那么很容易硬编码,以获得更低的分数......不同于任何条目参考实现,0索引。这使用了一个非常著名的JS打高尔夫球技巧:在一个序列中索引一个超出其界限的整数会返回一个伪造的值(),因此可以通过使用逻辑OR()将其简单地强制为默认值。case ,处理序列的最后一项,还要处理后续项。x6undefined||22

测试中

let f=x=>"11237"[x]||22

for (x of [1,2,3,4,5,6,7]) {
  console.log(x + ' -> ' + f(x))
}

或者,在线尝试!


4

HaskellLaikoni的答案,15个字节

b n=n*div(n+1)2

在线尝试!

我通常会在评论中指出类似这样的内容,但是后来我认为,警察和强盗的作用更加尖锐。

这只是BMO的答案减去的特殊情况b 42。因为Laikoni的原始语言是通过浮点数进行的,所以没有必要:只需找到一个足够大的数字就可以产生舍入误差,而无需精确的Integer算术运算。例如:

a 100000000000000000000000 = 4999999999999999580569600000000000000000000000
b 100000000000000000000000 = 5000000000000000000000000000000000000000000000

我以为这是可能的(因此我写了它可以根据要求的术语进行重写),但是找不到适合它的值。
ბიმო

4

Python 2xnor的答案,43个字节

n=69

f=lambda n,p=2:n<1or-~f(n-(~-2**p%p<2),p+1)

在线尝试!

学分

必须为@ Mr.Xcoder贡献很多功劳,他首先发布了有关使用此方法可能发生的攻击的评论,并感谢@PoonLevi找到了44字节的解决方案。

怎么样?

理论

pap

(1)ap11(modp)

a=2

2p11(modp)

k

2p1=kp+1

这导致:

2p=2kp+2
2p1=2kp+1
(2)2p11(modp)

p=22

an11(modn)na

2n=341=11×31

234111(mod341)
234111(mod341)

341347

实作

(2)

f=lambda n,p=1:n and-~f(n-(~-2**p%p==1),p+1)

<2==112110(mod1)

f=lambda n,p=1:n and-~f(n-(~-2**p%p<2),p+1)

在线尝试!

p=2

f=lambda n,p=2:n and-~f(n-(~-2**p%p<2),p+1)

在线尝试!

最后一个技巧是使用n<1or而不是n and。长度一样长,但是使最后一次迭代返回True而不是0,因此将缺失的偏移量添加到每个项。


恭喜大家!这是我想到的解决方案。我觉得很可笑,从挑战动机“如果我有一个数字序列,在清楚我要说的是哪个序列之前,我必须提供多少个数字?”,头50个素数显然不够- Python打高尔夫球的外星人会假设您正在谈论不同的顺序。
xnor

@xnor我喜欢“ Python高尔夫外星人”的想法
dylnan



2

HaskellLaikoni的答案26 22字节

-4字节不使用infix div,多亏了Laikoni

b 42=0;b n=n*div(n+1)2

在线尝试!

说明

0n20ceiling(realToFrac n/2)div(n+1)2n>20

b 42=0

啊,我没想到。我有另一种方法,如果您想进一步困惑,则会导致20字节的破解。也((n+1)`div`2)-> div(n+1)2
Laikoni

@Laikoni:是的,还没有透露!糟糕,是的,因为我打高尔夫球已经有一段时间了,所以我会进行更新。
ბიმო

2

> <>rashoz的答案为 203个字节

:l2-$g:0=?;n:





M
-
B
"
BM
",
7M
!"
BBM
!",
7CM
!"-
BBBM
!!",
7BBMM
!!,,
7BBBMM
!!,,
7BBBMM
!!!,,
7BBBBMM
!!!,,
7BBBBMM
!!!!,,
7BBBBBMM
!!!!,,
7BBBBBMM
!!!!!,,
7BBBBBBMM

在线尝试!

我将对上面的奇/偶数n=20相同的事实(在中心重复的元素)进行一些巧妙的处理,但是对每个元素进行硬编码会更容易。

通过-v标志输入。对于34以上的元素不打印任何内容。


2

Pascal(FPC)AlexRacer的答案,80个字节

var n,m:word;begin read(n);while n<>0 do begin n:=n div 2;m:=m+n;end;write(m)end.

在线尝试!

0n120n=128127126

这似乎是一个很晚的答案,但无论如何都要感谢@AlexRacer的一个好谜题!


1
哇,这比我的还短。欢迎来到PPCG!
AlexRacer



1

稻壳,开裂BMO的5 byter 3个  2字节

-1感谢BMO(LdΣ-> 因为,当给定a时TnumL执行“字符串表示的长度”)

在线尝试!

a(0)a(23)a(24)
3←d+164

T(0)=010


恭喜,那是我的确切解决方案!不过,我只是指出,TNum小号LLd 等价节省您一个字节;)
ბიმო

啊,我在Wiki中搜索了“数字”以尝试找到数字长度,但没有发现该L替代为“字符串表示长度” Tnum
乔纳森·艾伦,

(请注意,它们仅等效于非负整数-足以满足要求。)
Jonathan Allan


0

JavaScript,fəˈnɛtɪk的答案,23个字节

0n14

x=>14-`${73211e9}`[x]|0

在线尝试!

怎么样?

该表达式`${73211e9}`扩展为字符串"73211000000000",提供一个从14减去14个值的查找表,从而给出了预期的序列。

n14

(14 - undefined) | 0
=== NaN | 0
=== 0

21字节

NaNn14

x=>14-`${73211e9}`[x]

在线尝试!

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.