16
\$\begingroup\$

This is a challenge. For the cops thread, go here.

This challenge involves two OEIS sequences chosen by the cops -- S1, S2 -- and how well those sequences can be golfed and obfuscated.

The cops are constructing code A that produces S1 and giving a number X that they claim is the best Levenshtein distance possible (in characters) to create B that produces S2.

The Robbers' Challenge

To crack a particular cop's submission, robbers must come up with a program C in the same language (and version) as that answer that produces S2(n) and is Y character changes away from A (with Y <= X). Robbers do not necessarily need to find the exact same B code that the cop (secretly) produced. The robbers' submissions must adhere to the same 0-index or 1-index as specified by the cop's submission.

If you manage this, post an answer with the solution, linking to the cop's answer, and leave a comment on the cop's answer linking back to yours.

Each cop answer can only be cracked once, and of course, you're not allowed to crack your own answer. If the cop's answer turns out to be invalid before or after being cracked, it is not counted towards the robber's score.

Winning and Scoring

Robbers are scored by (X - Y)*5 + 5 for each of their cracks, and the robber with the overall highest score wins.

Further Rules

  • You must not use any built-ins for hashing, encryption, or random number generation (even if you seed the random number generator to a fixed value).
  • Either programs or functions are allowed, but the code must not be a snippet and you must not assume a REPL environment.
  • You may take input and give output in any convenient format. The input/output methods must be the same for both sequences.
  • The definitive calculator for the Levenshtein distance for this challenge is this one on Planet Calc.
  • In addition to being a CnR challenge, this is so all usual golfing rules apply.
asked Feb 13, 2017 at 17:26
\$\endgroup\$
1

13 Answers 13

7
\$\begingroup\$

Pyke, Levenshtein distance of 1, A036487, A135628 - score 5

Crack of an entry by muddyfish

wX*e

Try it here!

The original code, X*e, squares the input, X, multiplies that by the input *, and halves then floors the result, e.

The trick is that 'X' is 56 in the base 96 representation of w, so wX yields 56, multiply that by the input then floor and halve and you get 28 times the input as needed.

answered Feb 13, 2017 at 18:41
\$\endgroup\$
2
  • \$\begingroup\$ Exactly what I had. Lasted slightly longer than I expected \$\endgroup\$ Commented Feb 13, 2017 at 18:43
  • \$\begingroup\$ As soon as I saw it I knew it was the intended solution. \$\endgroup\$ Commented Feb 13, 2017 at 18:47
4
\$\begingroup\$

Brain-Flak, 28 bytes, Distance of 4, A002817, A090809

(({(({})[()])}{}){{({}[()])}{}})

This answer was discovered with the help of a brute-forcer, which generated 35,000 possible programs (Lot's of them were imbalanced, and thus invalid brain-flak code, but I rolled with the bug and found the answer anyway). This was around the 20 thousandth program tested, and it took around an hour to find (though I don't know exactly how long since I was away when it finished).

I kind of didn't want to post this answer yet, since I don't yet have a full understanding of how this program works. However, the answer is about to be safe so I don't want it to expire. I hope to update this answer more once I fully understand it, as well as posting the code I used to find this answer. But for now, I'll just post a partial explanation.

#Push the sum of:
(
 #The (n-1)th triangular number, and the range [1, n] (The range doesn't count towards the sum I believe)
 ({(({})[()])}{})
 #Triangulate every number on the stack
 {{({}[()])}{}}
)

This makes sense because OEIS states:

For n>0, the terms of this sequence are related to A000124 by a(n) = sum( i*A000124(i), i=0..n-1 ). [Bruno Berselli, Dec 20 2013]

And A000124 are the triangular numbers + 1. However, I don't know exactly what the forumla is, so I can't fully explain how this works.

answered Feb 19, 2017 at 7:31
\$\endgroup\$
3
\$\begingroup\$

Perl 6, 19 bytes, X = 1, A000045 → A000035

{(0,1,*+<*...*)[$_]}

+> in place of +< would also work.

Try it online!

How it works

infix ... is quite useful for simple recursive sequences. The (0,1,*+*...*) part of the original code, which is a shorthand for

(0, 1, -> $x, $y { $x + $y } ... *)

specifies a sequence that begins with 0 and 1, then adds items by computing the sum of the former two items of the sequence.

In contrast, (0,1,*+<*...*) uses left bit-shift (+>, right bit-shift would also work) to construct the parity sequence. Since shifting 1 zero units to the left is 1, and shifting 0 one unit to the left is 0, we get the desired alternating patterns of ones and zeroes.

answered Feb 14, 2017 at 5:52
\$\endgroup\$
2
\$\begingroup\$

Perl 6, 10 bytes, distance 1 - score 5

Crack of an entry by smls

*[0]o 1***

Becomes:

*[0]o 1*+*

Try It Online!

answered Feb 13, 2017 at 19:48
\$\endgroup\$
3
  • \$\begingroup\$ Good job! I didn't think of this solution, mine was a bit more tricky and actually required the *[0]o to be there. I guess that means I can come up with another challenge based on my "trick" ...:) \$\endgroup\$ Commented Feb 13, 2017 at 19:58
  • \$\begingroup\$ I don't really know Perl, just saw the *** and thought it looks like it could unfold the dyadic multiplication operation, *, with the previous arguments, I really don't know what the code actually does. Feel free to edit in some explanation! \$\endgroup\$ Commented Feb 13, 2017 at 20:01
  • 2
    \$\begingroup\$ 1*** is parsed as 1 ** *, i.e. a lambda that does "1 to the power of x". 1*+* is parsed as 1 * (+*), i.e. a lambda that does "1 multiplied by (x converted to a number)". \$\endgroup\$ Commented Feb 13, 2017 at 20:12
2
\$\begingroup\$

Perl 6, distance 2, smls

Original:

+(*%%2)

Crack:

+(*+0%2)

Try it online!

answered Feb 14, 2017 at 4:25
\$\endgroup\$
1
  • \$\begingroup\$ Darn, again a simple solution I didn't consider... (Mine was the much more obfuscated +(^*Z%2). I guess I'm not very good at drafting these challenges. \$\endgroup\$ Commented Feb 14, 2017 at 9:12
2
\$\begingroup\$

WolframAlpha, Distance 1, Greg Martin, A002378, A000537

(sum1to#of n^1)^2&

How it works

I realized that interestingly, (n*(n+1)/2)^2 is a formula for the second sequence. Since sum(1 to n) is equivalent to n*(n+1)/2, I just had to switch the * to a ^.

answered Feb 14, 2017 at 18:54
\$\endgroup\$
2
  • \$\begingroup\$ You should inform him that you have cracked his answer \$\endgroup\$ Commented Feb 14, 2017 at 19:11
  • \$\begingroup\$ Well spotted! :) \$\endgroup\$ Commented Feb 14, 2017 at 20:21
2
\$\begingroup\$

Brain-Flak, 20 bytes, DJMcMayhem

({({})({}[()])()}{})

Try it online!

Added a ({}) at the beginning of the loop to double the value in each iteration.

answered Feb 14, 2017 at 23:05
\$\endgroup\$
1
  • \$\begingroup\$ Nice! FWIW, the 18 byte solution I had was ({(({}[()])){}}{}) \$\endgroup\$ Commented Feb 14, 2017 at 23:07
1
\$\begingroup\$

JavaScript, Distance 4, LliwTelracs

Original:

f=x=>{return x?2*x-1+f(x-1):0}

Crack:

f=x=>{return x?2*(-0+f(x-1)):1}

Try it online!

answered Feb 13, 2017 at 20:03
\$\endgroup\$
1
\$\begingroup\$

JavaScript(ES6), Distance 1, Advancid

Original:

as=function(){ return 2*2**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Crack:

as=function(){ return 0*2**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Try it online!

or

as=function(){ return 2*1**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Try it Online!

Somehow I was able to get it to behave differently between TIO and repl.it (absolutely no clue why 2*1^... would be equal to 0 as according to repl.it)

answered Feb 13, 2017 at 21:12
\$\endgroup\$
1
  • \$\begingroup\$ I'm too dumb, I didn't think about changing the 2 to a 0. Here is the B function: as=function(){ return 2*2**((1^1)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}. \$\endgroup\$ Commented Feb 14, 2017 at 6:54
1
\$\begingroup\$

Javascript, 41 bytes, Distance of 3, A061313, A004526

f=x=>{return x>>1;0?x%2?f(x+1)+1:f(x/2)+1:0}

Try it online!

answered Feb 13, 2017 at 21:25
\$\endgroup\$
1
\$\begingroup\$

Java, Distance 4, Peech, A094683, A000290

Original:

int x{double r=1;for(int i=0;i<42;i++)r=r/2+n/r/2;int k=(int)((int)n*(float)n/Math.pow(n,(Math.sin(n)*Math.sin(n)+Math.cos(n)*Math.cos(n))/2));return n%4%2==(int)Math.log10(Math.E)/Math.log((double)'H'-'@')?(int)r:k;}

Crack:

int x{double r=1;for(int i=0;i<42;i++)r=r/2+n/r/2;int k=(int)((int)n*(float)n/Math.pow(n,(Math.sin(n)*Math.sin(n)+Math.cos(n)*Math.cos(n))/2));return n%4%1==(int)Math.log10(Math.E)/Math.log((double)'H'-'@')?(int)n*n:k;}
 ^ ^^^

returns n*n

answered Feb 14, 2017 at 16:57
\$\endgroup\$
0
1
\$\begingroup\$

Javascript, Advancid, distance of 2, A059841 and A000004

Only leaving the code behind the TIO link because it seems to be breaking the site.

Thanks to @nderscore, whose code I used to decrypt the initial code

There was some redundant code such as using !![]+[]+[] instead of !![]+[].

The addition of !+[]-(!+[]) (+1-1) initially prevented decryption.

Try it Online

answered Feb 14, 2017 at 20:59
\$\endgroup\$
1
\$\begingroup\$

Pyke, Levenshtein distance of 2, A008788, A007526

'SS^

Try it here!

How it works

This does mixed base conversion.

'S grabs the input n and applies, pushing [1, ..., n] on the stack. The next S takes input n and pushes the same array once more. ' seems to cause the next command to be applied to the previous top on the stack; I'm a little fuzzy on the details.

Finally, ^ applies mixed base conversion, so [1, ..., n] [1, ..., n] f computes
a(n) := [1]n + n + (n)(n-1)... + [n!]1 where the brackets indicate the place value and the number to their right the digit.

Now, a(n) = (1 + (1)(n-1) + (n-1)(n-2)(n-3) + ... + (n-1)!)n = n(a(n) + 1), which is the same recursive formula that defines a(n) in [A007526]. Since an empty sum is zero, a(0) = 0 and the base case matches as well.

answered Feb 14, 2017 at 21:19
\$\endgroup\$
2
  • \$\begingroup\$ How did you get it with so few attempts? I'm interested in your thought processes \$\endgroup\$ Commented Feb 14, 2017 at 21:26
  • \$\begingroup\$ Mixed base conversion is a rather common golfing trick. It's not the first time I used it. \$\endgroup\$ Commented Feb 14, 2017 at 21:49

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.