Stellen Sie den mutierten Quellcode wieder her

27

Bei einem sehr ungewöhnlichen Unfall mit einer kleinen Radiumprobe, einem durch Stromschlag getöteten Wal und drei Gummibären wurde ein Teil des Quellcodes von The Management ™ mutiert. Wenig weiß der Chef des Managements, es waren tatsächlich die Cops ©, die dafür verantwortlich waren, um die "bösen" Pläne des Managements zu vereiteln. Also wurden die Räuber angeheuert, um den ursprünglichen Code wiederzugewinnen, denn wer mag es nicht, manchmal böse zu sein?

Hinweis: Diese Herausforderung wurde stark von Unscramble the Source Code inspiriert .

Beschreibung

Dies ist eine Herausforderung für .

  • Die Bullen schreiben ein Programm (den mutierten Code), das Aufgabe Nr. 1 ausführt (und schreiben auch ein Programm, das Aufgabe Nr. 2 ausführt, aber geheim gehalten wird).
  • Die Räuber versuchen, die "Mutation" rückgängig zu machen und diesen ursprünglichen Code in Code zu ändern, der Aufgabe 2 ausführt.

In dieser Herausforderung besteht Aufgabe Nr. 1 darin, die ndritte Primzahl und Aufgabe Nr. 2 die ndritte Fibonacci-Zahl auszugeben (was den Cops © zufolge ohnehin irgendwie böse ist). Die Fibonacci-Folge ist definiert als ( n=11; n=21; n=32; ...) und die Primzahlen sind definiert als ( n=12; n=23; n=35; ...).

Das Ziel der Polizei ist es, den Unterschied zwischen den Programmen, die Task 1 und Task 2 abschließen, zu minimieren und gleichzeitig zu verhindern, dass die Räuber den Code, der Task 2 abschließt, neu erstellen.

Cop-Regeln

Die Bullen werden zwei Programme schreiben (eines, das Aufgabe 1 abschließt, und eines, das Aufgabe 2 abschließt) und die folgenden Informationen veröffentlichen:

  • Das erste Programm (das die ndritte Primzahl ausgibt )
  • Der Levenshtein-Bearbeitungsabstand zwischen dem ersten Programm und dem zweiten Programm
  • Die Programmiersprache , in der beide Programme geschrieben sind (muss für beide Programme dieselbe Sprache sein)

Die folgenden Einschränkungen gelten für beide Programme:

  • Sie dürfen maximal 128 Zeichen lang sein.
  • Sie dürfen nur druckbares ASCII verwenden (plus Zeilenumbrüche, die ebenfalls zulässig sind).
  • Die Laufzeit beträgt weniger als 10 Sekunden n=45, und es ist nicht erforderlich, dass sie für alle die richtige Ausgabe liefern n>45.
  • Sie dürfen keine Hashing- oder kryptografischen Funktionen verwenden.

Räuberregeln

Der Räuber versucht, das Programm des Polizisten (das Task 1 abschließt) in ein Programm zu ändern, das Task 2 (nicht unbedingt das vom Polizisten geschriebene Originalprogramm) in der vom Polizisten festgelegten Bearbeitungsentfernung abschließt.

Eine bereits geknackte Einreichung kann nicht erneut geknackt werden (nur der erste Räuber, der eine Einreichung geknackt hat, erhält eine Gutschrift).

Nachdem Sie eine Einsendung geknackt haben, gehen Sie bitte wie folgt vor:

  • Veröffentlichen Sie eine Antwort auf die zugehörige Frage (Link) dieser Herausforderung und geben Sie die Sprache, Ihre Lösung und einen Link zur ursprünglichen Antwort an.
  • Hinterlasse einen Kommentar mit dem Text "Cracked", der auf deine gepostete Antwort verweist.
  • Bearbeiten Sie die Antwort des Polizisten, wenn Sie über Bearbeitungsberechtigungen verfügen (wenn Sie dies nicht tun, warten Sie entweder, bis eine andere Person mit den erforderlichen Berechtigungen dies für Sie tut, oder schlagen Sie eine Bearbeitung vor).

Wertung

Wenn das Programm eines Polizisten eine Woche lang ungerissen bleibt, kann der Polizist den Originalcode, der Aufgabe Nr. 2 abschließt (in der angegebenen Bearbeitungsentfernung), veröffentlichen, und die Einreichung wird fortan als "sicher" betrachtet. Die sichere Einreichung mit der geringsten Bearbeitungsentfernung gewinnt. Im Falle eines Unentschieden gewinnt das kürzeste Programm (das Original, das Aufgabe 1 abschließt). Wenn zwei Einreichungen immer noch unentschieden sind, gewinnt die zuvor veröffentlichte.

Wenn ein Räuber die Vorlage eines Polizisten erfolgreich knackt, steigt die Punktzahl des Räubers um die Bearbeitungsentfernung dieser Vorlage. Zum Beispiel erhält ein Räuber, der eine Vorlage mit einer Bearbeitungsentfernung von 3 und eine mit einer Entfernung von 5 knackt, 8 Punkte. Der Räuber mit der höchsten Punktzahl gewinnt. Bei einem Unentschieden gewinnt der Räuber, der zuerst das Ergebnis erzielt hat.

Bestenliste

  1. Ruby, 6 (Histokrat)

Ein kleines Tool zur Berechnung der Levenshtein-Distanz

Türknauf
quelle
1
Was ist die 1. Fibonacci-Zahl? 0 oder 1? Oder spielt es keine Rolle
kukac67
@ kukac67 Es ist 1; Ich habe den Beitrag bearbeitet.
Türklinke
Wie soll die Ausgabe der Programme im Falle eines Überlaufs sein?
Es1024
Muss es ein volles Programm sein oder kann es eine Funktion sein? Was ist mit einer anonymen Funktion?
Tyilo
2
Was zählt als "Hashing oder kryptografische Funktion"? Kann ich Sachen mit Base-Konvertierung machen? Kann ich große Exponentiale modulo große Primzahlen nehmen?
Martin Ender

Antworten:

6

Python 2, Abstand = 8 [ geknackt ]

from fractions import*
n=input()
k,=P=[2]
while n>len(P):k+=1;z=reduce(lambda x,y:x*y,P,1);P+=[k]*(gcd(z,k)<2)
print P[-1]

Endlich ist dieser unter dem Zeichenlimit. Sollte nicht zu schwer sein, aber ich fand die Idee interessant.


Beabsichtigte Lösung:

from fractions import* n=input() k,=P=[1] while n>len(P):k+=1;z=reduce(lambda x,y:x+y,P[:-1],1);P+=[z]*(gcd(z,k)<2) print P[-1]

Die Idee war, das zu benutzen F(n+2) = 1 + (sum over F(k) from k = 1 to n), und die Tatsache, dass fortlaufende Fibonacci-Zahlen Koprime sind. Das 1im Reduce-Argument sollte das liefern +1.

Es sieht so aus, als hätte feersum eine andere Angriffslinie gefunden!

Sp3000
quelle
Cracked
feersum
5

J, Abstand = 5 [ Gebrochen ]

f=:3 :'{.p:|.i.y'

Verwendung:

> f 45
197
grc
quelle
1
Gebrochen
zufällig
4

Rubin, Abstand 6 [sicher]

require'prime';p Prime.take(n=gets.to_i)[-1]
#p (((807462154311276410)**n/(5**0.5)).round)

Das Aufstellen von Formelpaaren mit kurzen Bearbeitungsdistanzen macht Spaß, aber es scheint, als wäre dieser Ansatz effektiver / ärgerlicher. Sie verstehen vielleicht genau, was ich getan habe, aber das heißt nicht, dass Sie es rückgängig machen können.

Lösung:

require'prime';p=Prime.take(n=gets.to_i)[-1] p (((0742154311276/4e10)**n/(5**0.5)).round)

Erläuterung:

Der Code generiert den Goldenen Schnitt mit 11 Dezimalstellen und berechnet daraus direkt die Fibbonaci-Sequenz. Es ist gerade genug Präzision, um die erforderliche Anzahl von Begriffen richtig zu machen. Dieser Teil war überhaupt nicht verschleiert, wenn Sie die Formel kennen. Um es schwieriger zu machen, meine Mutationen mit Brute-Force umzukehren und die Konstante wiederherzustellen, habe ich die Oktalnotation (die führende 0) und die wissenschaftliche Notation (4e10) verwendet. Das Teilen durch 4e10 anstelle von 1e11 lässt es eher so aussehen, als würde ich durch eine Lösung dividieren, indem ich statt in der zweiten Zeile verwende, aber ich habe nicht daran gedacht..0 , um die Float-Division zu erzwingen, wenn tatsächlich etwas in wissenschaftlicher Notation aus irgendeinem Grund immer ein Float in Ruby ist, selbst wenn ein Bignum sinnvoller zu sein scheint. Ich dachte, ich wäre schlau mit dem p=Zeug, aber so wie ich es geschrieben habe, kannst du es einfach löschen p. Ich könntep=p&&#

Histokrat
quelle
Ich habe nicht daran gedacht e, dort unten eine einzufügen, wenn ich brachiale Gewalt praktiziere. Wirklich hinterhältige Lösung. :)
Vectorized
3

Python 2 - LD = 13 Gebrochen

n=1;j=input();
while j>0:
    n+=1;j-=1;
    while~-all(n%i for i in range(2,n)):n+=1;
print n

Ein schönes, einfaches (hoffentlich nicht zu einfaches), um die Dinge anzufangen :)

Sieht so aus, als wäre es zu einfach gewesen;) Ich finde es ziemlich dumm, dass ich vergessen habe, dass du Kommentare verwenden könntest: /

FryAmTheEggman
quelle
Geknackt
Sp3000,
3

Haskell, Abstand = 13

import Data.List
x=id=<<snd(mapAccumL(\m n->(,)=<<(++m)$[n|and[n`mod`m1/=0|m1<-m]])[1+1][3..])
main=print.(!!)(0:2:x)=<<readLn

Das könnte besser lesbar sein, aber die haben importzu viele Bytes gefressen, also musste ich ein bisschen Golf spielen.

Zgarb
quelle
2

Rubin, Abstand 14 ( Gebrochen )

p [x=2,y=1,*(1..200).map{|i|y==(y*x**(i-1)+x%2).divmod(i)[x-1]?i:1}].-([x-1])[gets.to_i-1]
Histokrat
quelle
Geknackt?
Vectorized
Hm, deine Fibbonaci-Sequenz beginnt mit 0, wobei die Regeln sagen, dass sie mit 1 beginnen sollen.
Histokrat
Ok, behoben. Gute Verwendung von Fermat's übrigens.
Vectorized
2

CJam, Abstand 10 (geknackt)

1l~{{)_mp!}g}*

Einfach setzen n STDIN aufsetzen. Teste es hier.

Als Referenz diente die Originallösung der seltenen j .

Original:

T1]l~\{(_j\(j+}j

Martin Ender
quelle
1
Cracked
Optimizer
2

J, Abstand = 4 [sicher]

f =: 3 :  '{. (p:) (+) / 0 , y - 1x'

Lösung:

f =: 3: '{. 2 (x :) (+%) / 0, y $ 1x '

Methode:

Nenner {. 2(x:)der fortgesetzten Fraktion (+%)1 + 1 / (... (1 + 1 / (1 + 1 / (1 + 1 / (1)))).

randomra
quelle
1

Python 3, Abstand = 14 [ geknackt ]

n = int(input())
P = [2]
k = 2
while n > len(P):
 k += 1
 for x in P:
  if k%x == 0: break
 else: P += [k]
print(k)

Ich hatte ein paar freie Zeichen, deshalb habe ich zur Klarheit ein paar Leerzeichen eingefügt :)

Sp3000
quelle
Cracked
feersum
1

JAGL Alpha 1.2 - Abstand = 16 [ Gebrochen ]

T~2S]{]S1{D[dmn}wDS}wSP

Sollte nicht zu schwer sein, werden wir sehen, was passiert ...

schelmisch
quelle
Geknackt ?
Matsjoyce
1

TI-BASIC , Entfernung 38

Input N:{2>L1:For(A,3,E99:If min(1=gcd(A,seq(A,A,2,$(A:A>L1(1+dim(L1:End:L1(N

>repräsentiert den STO→Schlüssel und $repräsentiert das Quadratwurzelsymbol.

Timtech
quelle
4
Einige dieser Zeichen scheinen kein druckbares ASCII zu sein.
Feersum
@feersum Danke, korrigiert. Die Entfernung beträgt noch 38.
Timtech
1

Python 2 - Abstand = 12 [ Gebrochen ]

Ich bin ein bisschen glücklich darüber, wie sich das herausgestellt hat.

f=lambda p,i:p if p[45:]else f(p+[i]if all(i%q for q in p[1:])else p,-~i)
print f([1,2,3],2)[input()]

Mal sehen, wie lange es dauert ... Ich nehme an, es wird immer noch geknackt.

Bearbeiten: Code etwas verkürzt, keine Auswirkung auf Bedienung / Entfernung.

Beabsichtigte Lösung

Ich habe versucht, keine Kommentare oder Zeilenumbrüche zu machen.

f=lambda p,i:p if p[45:]else f(p+[p[i]+p[-2]]if all(i|q for q in p[1:])else p,-~i) print f([1,1,1],2)[input()]

PurkkaKoodari
quelle
Cracked
feersum
0

Python 3 - Abstand = 14 [ Gebrochen ]


a,c,n=1,2,int(input())
while n-1:
 c+=1
 while 1!=list(map(c.__mod__,range(2,46))).count(0):
  c,a=a+c,a
 n-=1
print(c)

Mal sehen, wie lange das dauert ...

Matsjoyce
quelle
Cracked
feersum