警察与强盗:编辑原始性(警察线)


19

最初由Magic Octopus Urn沙盒挑战;我在他的允许下通过并发布了它。

这是警察的话题。强盗的线索在这里

挑战

  • 第一步:编写一段检查素数的代码(函数或完整程序)。
  • 第二步:通过将符号替换为符号来删除代码段
  • 第三步:将已编辑的代码发布到警察线程上。
  • 第四步:等待您的代码被破解,然后尝试破解其他人的代码。

例如,Groovy代码{it.isPrime()}可能变为{██.is█████()}。(这很容易破解;我知道,.isPrime()这也不是Groovy方法。)


计分

您必须在提交的程序中包含程序的分数。分数定义为编辑字符与字符的比率。因此,如果您的程序有20个字符,其中有5个被删节,则您的分数将为0.25。上面的Groovy代码的得分为0.5。


规则

  • 您的程序只需要处理正整数。如果数字是素数,则应输出真实值,否则应输出虚假值。请在您的答案中指定输出的内容。
  • 您的代码不得包含任何注释或不必要的空格。
  • 没有哈希或加密混淆。
  • 您的代码可能未编辑超过50%(必须显示至少1/2个字符)。这意味着可能的最高分是0.5。
  • 如果您的答案在一周内仍未破解,则可以将其标记为安全,然后编辑预期的破解。

获奖

获胜者将是发布后两周内得分最低的完整答案。如果是平局,则以得票最多的人为准。该主题始终对更多作品开放,但是两周后选择的获胜者将是永久的。


输入的范围是什么?(即是全部n >= 1还是全部整数?)
Conor O'Brien

1
@FryAmTheEggman 状态完成的
MD XF

1
同样,如果一种计分方法很容易被利用,它就会被打破。
user202729 '18


1
请摘录?
user202729

Answers:


3

Functoid,得分= 14/223≈0.062780 [安全]

Y(yG(BK██)(B(S(BS(C(BC(C(BB(B(v
S(CB█)(█C█B>vK  BSBB())█K(BS(S?
>(KZ)(C(C(Bv>██        >   v██<
█)Sg3I)$; @>B(BS(b(C(BBI)Iv>(█g
())I)))I)IBB(C(b(CB(C())))<v)█C
I))I))0)))(C(BC(B(BB)(C(BBv>)))
]I))))I))>    >)█   $;@   >I)(B

将输入作为命令行参数并输出True(质数)或False在线尝试!

提示(发布后4天添加):

第一个和第四个是一个红色的鲱鱼:预期的(并且很可能是每个解决方案)解决方案的IP将遵循第一行并到达?字符。

Y(yG(BKL2)(B(S(BS(C(BC(C(BB(B(v
S(CBO)( C B>vK  BSBB())OK(BS(S?
>(KZ)(C(C(Bv>O)        >   vY <
^)Sg3I)$; @>B(BS(b(C(BBI)Iv>(yg
())I)))I)IBB(C(b(CB(C())))<v)-C
I))I))0)))(C(BC(B(BB)(C(BBv>)))
]I))))I))>    >)2   $;@   >I)(B

在线尝试!

说明

由于产生随机性,?因此无法展平程序。这是带有问号的平面程序,其中的随机表达式将是:

Y(yG(BKL2)(B(S(BS(C(BC(C(BB(B(?(yg(KZ)(C(C(BB(BS(b(C(BBI)I))))(C(BC(b(C(BBI)I)))I))(C-))))I))I))0)))(C(BC(B(BB)(C(BBI)(B]I))))I)))2$;@

完整程序:

Y{trial_division}      --  fix-point of {trial_division}
                 2     --  apply 2 (begin division with 2)
                  $    --  apply argument (work with the supplied input)
                   ;   --  print result as boolean
                    @  --  terminate program

{trial_division}

y                         -- recursive function with two arguments x,y
 G                        -- | base predicate: x >= y
  (BKL2)                  -- | base function:  BKL2 x y
                             |  ->             K(L2) x y
                             |  ->             L2 y
                             |  ->             2 <= y
        {recursive_call}  -- | recursive call

{recursive_call},接受参数f(自我参考)xy(注意0与相同False

  B (S(BS(C(BC(C(BB(B{divides}I))I))0))) (C(BC(B(BB)(C(BBI)(B]I))))I) f x y
->       (C(BC(C(BB(B{divides}I))I))0) x y (BC(B(BB)(C(BBI)(B]I)))) f I x y)
->       (C(BC(C(BB(B{divides}I))I))0) x y (BC(B(BB)(C(BBI)(B]I)))) f I x y)
->            (C(BB(B{divides}I))I) x y 0  (BC(B(BB)(C(BBI)(B]I)))) f I x y)
->            (C(BB(B{divides}I))I) x y 0  (   B(BB)(C(BBI)(B]I))   f x I y)
->                   {divides}      x y 0  (         C(BBI)(B]I)    f x y  )
->              if x `divides` y then 0 else         C(BBI)(B]I)    f x y
->                                                    f (B]I x)  y
->                                                    f (] x) y
->                                                    f (x+1) y

{divides}?(yg(KZ)(C(C(BB(BS(b(C(BBI)I))))(C(BC(b(C(BBI)I)))I))(C-)))从以下?位置随机选择的位置(取决于随机方向):

  • Y
  • S(CBO)(CBO)
  • S(SB(KO))(BBSBKO)

这些都是彼此等效的,因此{divides}成为以下方面的固定点:

y                       -- recursive function with two arguments x,y
 g                      -- | base predicate: x > y
  (KZ)                  -- | base function:  KZ x y
                        -- |  ->              0 == y
      {recursive_call}  -- | recursive call

{recursive_call} 是一个相当模糊的表达,基本上只是 f x (y-x)


5

8086 DOS COM,87字节,得分19/87〜= 0.2183

NieDzejkob 破解

1└╣██1█╛ü ¼<█t<< u≈¼<█t█,0|/<██+ô≈ßô☺├δδâ√█|█╞█S█Y╣██9┘t█ë╪1╥≈±○╥t█Aδ∩╞█S█N┤█║S█═!├A
$

这是一个COM程序;期望将number作为命令行参数,输出Y或N。限制:65535,因为16位处理器(sizeof(int)为2)。在此平台上,换行符为0x0D 0x0A。是的,您数为20█,而不是19█。其中一个是真实的█,尚未被替代。穆哈哈哈

位置10中的空格实际上是一个NUL字节。NUL的符号与旧VGA字体中的空格相同。


1
因为汇编(操作码)和机器代码之间的关系大约为0,所以将永远破解。/此代码页是437吗?
user202729'2

@ user202729:正确的代码页。除非另有说明,否则DOS为CP437。
约书亚

您是在使用晦涩的DOS怪癖从$ 5881而不是$ 0081读取命令行参数,还是一个错误?我需要真正的DOS安装吗?
NieDzejkob

@NieDzejkob:等什么?我非常确定它会从DS:0081读取其命令行。到家时,我会仔细检查hexdump,但我什么也没找到。
约书亚

@Joshua好,一╛üX开始就是mov si, 0x5881
NieDzejkob

5

迅捷4,得分26/170≈0.153,安全

func p(n:Int)->Bool{func(_:Int,_:Int)->Int{var h=(1...l).map{$0██m██
while(m=h.count,m██).1{h=[Int](h[...])};return m}
return>██&(.███).index█j█n██0)>=0}=██l}

在线尝试!

预期裂纹

func p(n:Int)->Bool{func j(_ l:Int,_ k:Int)->Int{var h=(1...l).map{$0},m=l
while(m=h.count,m>k).1{h=[Int](h[k...])};return m}
return n>1&&(2..<n).index{j(n,$0)>=$0}==nil}

不打高尔夫球

func p(n:Int)->Bool{
  func j(_ l:Int,_ k:Int)->Int{    // Modulus function (l mod k)
    var h=(1...l).map{$0},m=l      //  Create an array h of size l
    while(m=h.count,m>k).1{        //  While h has more than k elements:
      h=[Int](h[k...])             //   Remove k elements from h
    }
    return m                       //  Return the length of h (equal to k if l divides k)
  }
  return n>1&&                     // Test if n > 1
  (2..<n).index{j(n, $0)>=$0}==nil //  and no number from 2 to n-1 divides n
}

4

brainfuck,37/540字节(得分:0.06851)(Nitrodon 破解

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

在线尝试!

如果是素数,则输出“素数”;如果是合成物,则输出“非素数”。技术上适用于任意整数,但对于6000以上的数字,在TIO上超时


2
经过几天的努力后破解了。
Nitrodon

3

Mathematica,97字节,得分0.2989690722(破解

f[x_]:=(██ToString███████████████;StringMatchQ[████Infinity,RegularExpression@"█\█\█{█\█+, ███"])

弦!正则表达式!素数?

还有就是这样的事,作为一个素性检查正则表达式,但是这不是什么发生在这里。

这已经破解了,但是我打算的方式却大不相同,因此我不会透露预期的解决方案。



3

果冻,得分0.(142857)(破裂

25██26█966836897364918299█0█1█65849159233270█02█837903312854349029387313█ị██v

在线尝试!

重新发布我的其他答案,这次显示了更多字节,以避免意外作弊。


我可以按字符或您的两个答案来获取一些字节...可能我不会。
user202729'2

@ user202729呃,发生了一些奇怪的事情,我并不想涵盖更多的字符……
Outgolfer的Erik,18年


3

八度,得分:0.15(86字节)

我还透露了几个角色。我认为获胜的标准是最高分,而不是最低分

@(x)eval([(str2num(cell2mat([cellstr(reshape('0█1███1█0█0█00',████))])')'█')','(x)'])

在线尝试!

祝你好运=)


1
破解!这很有趣。
朱塞佩

3

Python 3,388字节,.155,破解

最后一刻。是的,这是Miller-Rabin检验。

我想允许概率测试,不确定性2 ^ -100

好吧,尽管在前一句话中有一个很好的暗示

将返回值0设为COMPOSITE,将1设为PROBABLY PRIME

* 368> 388:解决了z <4时的问题

import ██████
def f(z):
 if z<4:return z>>1
 d,s,n,e,c=██z,0,z,0,50
 while not ██1:d//=2;s+=1
 while n>0:n//=2;e+=1
 ███████████()
 while c>0:
  a=0
  while a<2or a>z-█:
   a,b=0,e
   while b>0:a=a*2+██████████████(0,1);b-=█
  x,r=███(█,█,z),██s
  if ██x and x!=██z:
   while r>0:
    x,r=███(█,█,z),██r
    if not ██x:return 0
    elif x==██z:break
   else:return 0
  c-=█
 else:return 1

解:

import random
def f(z):
 if z<4:return z>>1
 d,s,n,e,c=~-z,0,z,0,50
 while not d&1:d//=2;s+=1
 while n>0:n//=2;e+=1
 random.seed()
 while c>0:
  a=0
  while a<2or a>z-1:
   a,b=0,e
   while b>0:a=a*2+random.randint(0,1);b-=1
  x,r=pow(a,d,z),~-s
  if ~-x and x!=~-z:
   while r>0:
    x,r=pow(x,2,z),~-r
    if not ~-x:return 0
    elif x==~-z:break
   else:return 0
  c-=1
 else:return 1

1
我认为具有类似字符串的长字符串"COMPOSITE"违反了规则的精神,即“您的代码可能不包含任何注释或不必要的空格”。
帕维尔

@Pavel编辑。好吧,我认为返回值虽然不是注释或不必要的空格
Shieru Asakoto

1
技术上讲是有效的。真便宜。
帕维尔

我认为这不会在z = 2时终止。
Nitrodon

@Nitrodon糟糕,当z = 3时它也没有终止。固定
Shieru Asakoto

3

095,得分0.20512820512 [安全]

1id#█#=(DD#█#█{d_█%(█D0█]D}██s]D1.=[1s]

如果是素数则输出1,如果是合成则输出0

解:

1id#2#=(DD#2#-{d_.%(rD0R]D}drs]D1.=[1s]

2

Node JavaScript,得分:0.4

这是它的工作原理。完整程序,它从第一个命令行参数获取输入,然后输出到stdout。

希望这不是一个困难的解决方案。

使用此代码段计算分数。

require███████████2<<2██>n█████rin█(b████████x)█████(92116830)██(a,c)=>a[c[0]██████████(c)]███████);d=███+n;q=████27775██9564,[50259,█6])[█]);a=██q>0████r(n=qa█&█-q-██)a██n%q?██0██(1371528270,22288)(a)


2

JavaScript,103字节,得分0.1923

x=>{if(x<4)return(!0);for(y=x>>>Math.log10(p=████;--y-1;(p=x/y%1)████if(██&&(███))break████return(███)}

返回一个布尔值。

意外的裂缝



2

Javascript,得分0.1894093686354379

let t=[2,3,3,3,3,3,3,5,7,5,7,5,7,7,11,12,13,11,13,13,1,2,17,13,2,3,17,19,23,29,19,19,41,23,23,29,23,"","",29,7,31,31,524,31,37,33,34,41]; function r(a, b) {█████████████████████████████████████████████████████████████};function l(t){let a=0;let b=[];while(true){b.push(t[a]);█████████████;if(!t[a]){return█████};function p(v) {let i=0;let a=r(2,v██);for (i in a){if(v%(█████████a█i██)==0){return false;}};return true;};function f(v){if(l(t).indexOf(v)!=-1){return true;}else{return p(v)};};

祝好运。:p

用您要检查的素数呼叫f。


不到30分钟内意外破裂。甚至不使用数组t
user202729'2

哼。我想我没有考虑过那个。无论如何,这仅仅是初步的准备工作:
moonheart08


2

Brain-Flak,得分:35/134 = 0.2612(破解!

(({████){██[████)█>(({}))<>}<>{}███{}((██({}))█████{}]██)({}(<>))<>{(({})){({}[()])<>}{}}{}<>([{}()]{})██[██()██(()█[()]██{}██}{}<>{})

返回1表示质数,0表示复合数。

这是一种非常难于尝试的语言,因为格式受到严格限制,以致于无法使丢失的字符清晰可见。

这是很难解决的语言,因为很难理解。



2

Java 1.4 +,24/145(0.16551724137)

class X{public static void main(String[]args){System.out.println(new String(████████[Integer.parseInt(args[0])]).matches("█████████████")?███);}}

在线尝试!


到目前为止,我所见过的最奇怪的方法是在Java中启动检查。



2

Japt,19个字节,0.315789 ...得分,安全

我不知道我是否比自己需要的更多,从而使自己的得分更高。

█h8575¥█
█UâÊ█Ê█ █2

View solution (说明即将推出)


2

C,34/76 = 0.447368,安全

int p(int n){int r███████2;██r███r++)███+███n;████&███r));return███████n██;}

拥有这么多的空白意味着我比预期的要容易获得意外的裂纹。

解:

int p(int n){int r=1,e=n%2;for(;(r++)*(r++)<n;e=e&&(n%r));return e?n>1:n<3;}

说明:

e保留一个布尔值,该数字是否为质数(有一些特殊情况例外)。r遍历小于或等于平方根的奇数nreturn e?n>1:n<3;处理nis 1或时的特殊情况2


2

M,得分:4/22 = .1818 ...,由丹尼斯破解

███“;;█»VOḣ2S⁵++3Ọ;”Pv

我们必须看到,这最终可能会导致意想不到的裂缝。它做了。

丹尼斯的解决方案是

ÆPø“;;“»VOḣ2S⁵++3Ọ;”Pv

在线尝试!

我将隐藏我的解决方案以供他人破解。我向丹尼斯提出的强盗建议是“动物园”一词。


@ user202729我认为您也许可以破解
dylnan '18


1

C,66字节,已编辑29,得分0.439

i;p(n){█████2███████ 0███████2;███;███)if(████)return 0;return 1;}

只是一个简单的C提交;在发布真正的恶意代码之前,我会先看看这需要多长时间。


您确定最后一个块应该是4个字符长吗?
NieDzejkob

@NieDzejkob是的。
MD XF


1

sh + coreutils,得分19/143〜= 0.1328

破解

e█ec█s█ █c "██████WyAkKHNoIC1jICJg█WNobyBabUZqZEc5eWZIUnlJQ2█2SnlBblhHNG5m██JoYVd3Z0t6SjhkMk1nTFhjSyB8YmFzZTY0IC1kYCIpIC1lcSAxIF0K█b█se6███d`"

蒂奥


1
@MDXF:Base64是编码,不是加密。没有破解的钥匙。
约书亚

可以包含TIO链接吗?(可能是bash)
user202729

破解(3小时前)。
user202729'2

1

Brain-Flak得分29/140 = 0.207

({}██()██<>){██({}[()])██{}{}███({<({}[()])><>({})<>}{}██████{}██){(({})){({}[()])<>}{}}<>([{}()]{}<>{})<>}(<>██{}({}████)((){[()]██{}██}{})

在线尝试!

输出1为质数,0为非质数。


1

坦皮奥(必须),得分:24/51 = 0.5

Luku on alkuluku,jos ████████████e███████ on █████.

这是一个显而易见的解决方案,我希望这里没有人能理解芬兰语。


1

坦皮奥(必须),得分:26/223 = 0.11659 ...

Luvun kokonaislukuarvot ovat riippuen siitä,onko se yksi,joko listan,jonka alkioita ovat yksi █████████████████████,alkiot tai █████ liitettynä sen alkutekijöihin.Luku on alkuluku,jos sen kokonaislukuarvojen summa on nolla.

1

Pyt,得分:0.288288 ... [安全]

Đ2⇹█ŘĐĐŁ███⇹ʀĐ↔Đ5Ș↔⇹██=█ŕĐ↔Đ5Ș↔Đř█⇹█████↔Đ4Ș5Ș⇹██⇹3Ș°04Ș↔█3ȘĐŁ█3Ș05Ș↔█⇹04Ș0↔⇹██=█ŕ↔ŕĐĐŁ██↔██↔ŕŕŕŕ█↔████↔ŕŕŕ██¬¬


如果为素数则输出“ True”,否则为“ False”

忘了说这是一个概率测试。

解:

Đ2⇹⁻ŘĐĐŁ₂`⁻⇹ʀĐ↔Đ5Ș↔⇹Ǥ1=?ŕĐ↔Đ5Ș↔Đř²⇹%∈2*⁻↔Đ4Ș5Ș⇹⁻₂⇹3Ș°04Ș↔+3ȘĐŁ⁺3Ș05Ș↔+⇹04Ș0↔⇹%+=?ŕ↔ŕĐĐŁ⁺⁺↔ł:↔ŕŕŕŕ;↔⁺⁻±?↔ŕŕŕ:;¬¬

这实现了Solovay-Strassen素数测试。

在这里在线尝试!


1

红宝石,27/73 = 0.369863

def p n;███████(██n.times████a[2..-1].map{|s|█.██n████s}██.█*█|██})█);end

这应该是有趣的。


1

Python 3,得分:0.386363,破解

p=lambda x,i=2:█████or(x%i and ████████)████

首先要去取得真正的成功。我很快就会提出厚脸皮的答案。

user71546使它与

p=lambda x,i=2:i>=x or(x%i and p(x,i+1))or 0

...但是那是意想不到的。原代码为

p=lambda x,i=2:i>x/2or(x%i and p(x,i+1))or 0

事实证明,x <2都不起作用。哎呀。


1
破解了吗 当x <2时不起作用。
Shieru Asakoto

0

JavaScript(ES7),297字节,已编辑103,.347

M=(N,X=N,F=(n,a=█████)=>a>1e-20?█████+F(n,█████████):1,G=(n,a=█████)=>a>1e-20?█████+G(n,███████):n==2?0:G(n-1),H=(n,a=█████)=>a>1e-20?█████-H(n,███████):0,I=n=>████████I(████),J=n=>I(n)*████+H(█████████-1),K=(n,l=n|0)=>(n-l>=.5)+l,L=(a,b)=>██████████(a)+█(b)████,Z=L(--N,N)██)=>L(Z,████M(N,X)██)██

我以前的Python答案太简单了,所以这是一个邪恶的;)

不过,背后的逻辑很简单。

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.