Das ist der Faden der Bullen. Den Räuberfaden finden Sie hier .
Einführung
Für diese Cops / Robbers-Herausforderung schreiben die Cops Output-produzierende Programme und verweben sie miteinander. Es ist die Aufgabe des Räubers, die Programme der Polizisten herauszusuchen, um die gewünschten Ergebnisse zu erzielen.
Cop-Regeln
Die Cops können insgesamt bis zu 256 Byte verwenden, um zwischen 2 und 8 (einschließlich) Programme zu schreiben, von denen alle eine Ausgabe erzeugen müssen . Alle geschriebenen Programme müssen in derselben Sprache sein. Die Bullen "verweben" ihre Programme miteinander, um es den Räubern zu erschweren, herauszufinden, was die Programme sind.
Nun zu einer Beschreibung der Verflechtung. Betrachten Sie die Zeichenfolgen, die die verschiedenen Programme darstellen. Der Prozess des Verwebens ist das wiederholte Abziehen des ersten Zeichens eines beliebigen Programms und Verketten dieses Zeichens mit dem Ende einer neuen Zeichenfolge, bis in keinem der Programme Zeichen übrig sind. Zum Beispiel, wenn zwei Programme lion
und sind TIGER
, ist eine mögliche Verflechtung TIliGoEnR
. Die Programme können jedoch in keiner Weise verschlüsselt werden und sind daher RoITEnlGi
nicht akzeptabel.
Es ist zu beachten, dass, wenn die Zeichen aller außer einem Programm aus den Ergebnissen einer Verflechtung entfernt werden, das verbleibende Programm intakt angezeigt wird. Entfernen der Buchstaben TIGER
aus den TIliGoEnR
Ergebnissen in lion
.
Alle Programme und Ausgaben der Polizei dürfen nur druckbare ASCII-Zeichen (20-7E) und Zeilenumbrüche enthalten. Programme dürfen keine Fehler enthalten und müssen auf einem vernünftigen Computer in 10 Sekunden ausgeführt werden. Für jede Einreichung muss irgendwo ein kostenloser Dolmetscher für die Sprache vorhanden sein. Das Hinzufügen von Kommentaren zu den Einsendungen ist ebenso wie das Hashing und andere Formen der Kryptografie nicht zulässig. Leere Programme sind nicht erlaubt (Sorry Stuck ).
Der Cop gibt den verwobenen Code, die Sprache, die Anzahl der verwendeten Programme und die Ausgabe für jedes Programm bekannt. Ein großes Dankeschön an Martin für das Schreiben dieses CJam-Skripts zum automatischen Verweben Ihrer Programme.
Programme gelten nach Ablauf einer Woche ab dem Zeitpunkt der Veröffentlichung als sicher. Zu diesem Zeitpunkt müssen die Polizisten die einzelnen Programme veröffentlichen, um Punkte zu erhalten.
Wertung
Es gibt zwei Komponenten, die beim Bewerten einer sicheren Einreichung zusammenaddiert werden.
- 256 dividiert durch die Menge 2, die durch die Anzahl der verwendeten Programme erhöht wird.
- Rund um die Anzahl von Bytes in der Verwebung bis zur nächsten Potenz von 2 und teilen sie in 256.
Wenn der Eintrag TIliGoEnR
(9 Byte) beispielsweise sicher wäre, würde er 256/2 ^ 2 + 256/16 = 80 Punkte erhalten.
Wenn der Beitrag eines Polizisten geknackt wird, verliert der Polizist 16 Punkte. Der Polizist muss angeben, dass sein Beitrag geknackt wurde.
Der Gewinner der Cops Challenge ist die Person mit den meisten Punkten nach einer ausreichenden Zeitspanne, damit die Teilnehmer teilnehmen können.
Bestenliste
Dies ist ein laufendes Werk, das von intrepidcoder aus dieser Frage heraus adaptiert wurde .
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift unter Verwendung der genauen Markdown-Vorlage:
# Language Name, N programs, M bytes; Score ###/### (if safe/cracked)
Alles, was nach einem Semikolon steht, wird ignoriert, sodass Sie Ihre Punktzahl dort ablegen können.
Wenn Ihre Eingabe sicher ist, geben Sie eine Überschrift wie folgt ein:
# Language Name, safe, N programs, M bytes; Score ###
Wenn es geknackt ist, setzen Sie einen Header wie folgt:
# Language Name, [cracked](link-to-crack), N programs, M bytes; Score -16
/* Configuration */
var QUESTION_ID = 64520; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 43444; // This should be the user ID of the challenge author.
var SECONDSINDAY = 86400;
var SAFECUTOFFDAYS = 7;
var SORTBYTIME = true;
var SUBTRACTCRACKEDPOINTS = true;
var EXPIREDTIME = 1448232502000;
/* App */
var SAFE_REG = /<h\d>.*?[sS][aA][fF][eE].*<\/\h\d>/;
var POINTS_REG = /<h\d>.*(\d+)\s*program.*<\/h\d>/i; // /(?:<=|≤|<=)\s?(?:<\/?strong>)?\s?(\d+)/
// var POINTS_REG_ALT = /<h\d>.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var LENGTH_REG = /<h\d>.*?((\d+)\s*byte).*<\/h\d>/i;
var CRACKED_HEADER_REG = /<h\d>.*[Cc][Rr][Aa][Cc][Kk][Ee][Dd].*<\/h\d>/;
var CRACKED_COMMENT_REG = /(.*[Cc][Rr][Aa][Cc][Kk][Ee][Dd].*<a href=.*)|(.*<a href=.*[Cc][Rr][Aa][Cc][Kk][Ee][Dd].*)/
var OVERRIDE_REG = /^Override\s*header:\s*/i;
var LANGUAGE_REG = /<h\d>\s*(.+?),.*<\/h\d>/;
var LANGUAGE_REG_ALT = /<h\d>\s*(<a href=.+<\/a>).*<\/h\d>/
var LANGUAGE_REG_ALT_2 = /<h\d>\s*(.+?)\s.*<\/h\d>/;
var LANGUAGE_REG_ALT_3 = /<h\d>(.+?)<\/h\d>/;
var answers = [],
answers_hash, answer_ids, answer_page = 1,
more_answers = true,
comment_page;
function answersUrl(index) {
return "//api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "//api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function(data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function(data) {
data.items.forEach(function(c) {
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
var open = [];
answers.forEach(function(a) {
var body = a.body.replace(/(<h\d>.*);.*(<\/h\d>)/,"$1$2"); // Ignore all text after a semicolon.
var cracked = false;
a.comments.forEach(function(c) {
var was_safe = (c.creation_date + (SECONDSINDAY * SAFECUTOFFDAYS) > a.creation_date);
if (CRACKED_COMMENT_REG.test(c.body) && !was_safe)
cracked = true;
});
if (CRACKED_HEADER_REG.test(body)) cracked = true;
// if (SUBTRACTCRACKEDPOINTS||!cracked) {
var createDate = a.creation_date;
var currentDate = Date.now() / 1000;
var timeToSafe = (createDate + (SECONDSINDAY * SAFECUTOFFDAYS) - currentDate) / SECONDSINDAY;
var SafeTimeStr = (timeToSafe > 2) ? (Math.floor(timeToSafe) + " Days") :
(timeToSafe > 1) ? ("1 Day") :
(timeToSafe > (2 / 24)) ? (Math.floor(timeToSafe * 24) + " Hours") :
(timeToSafe > (1 / 24)) ? ("1 Hour") :
"<1 Hour";
var expired = createDate > (EXPIREDTIME);
var safe = timeToSafe < 0;
var programs = body.match(POINTS_REG);
var length = body.match(LENGTH_REG);
safe = safe && !cracked
isOpen = !(cracked || safe);
if (programs && length) {
var safepoints = (256/Math.pow(2,parseInt(programs[1],10)) +
256/Math.pow(2,Math.ceil(Math.log2(parseInt(length[1],10)))));
var crackedpoints = Math.pow(2, parseInt(programs[1],10),2) +
Math.pow(2,Math.floor(Math.log2(parseInt(length[1],10))));
valid.push({
user: getAuthorName(a),
numberOfSubmissions: (safe && !expired) ? 1 : 0,
points: (safe && !expired) ? safepoints : 0,
open: (isOpen && !expired) ? 1 : 0,
cracked: (cracked && !expired) ? 1 : 0,
expired: (expired) ? 1 : 0
});
}
if ((isOpen || expired) && programs) {
var language = body.match(LANGUAGE_REG);
if (!language) language = body.match(LANGUAGE_REG_ALT);
if (!language) language = body.match(LANGUAGE_REG_ALT_2);
if (!language) language = body.match(LANGUAGE_REG_ALT_3);
open.push({
user: getAuthorName(a),
safePts: programs ? safepoints : "???",
crackedPts: programs ? crackedpoints : "???",
language: language ? language[1] : "???",
link: a.share_link,
timeToSafe: timeToSafe,
timeStr: (expired) ? "Challenge closed" : SafeTimeStr
});
}
// }
});
if (SORTBYTIME) {
open.sort(function(a, b) {
return a.timeToSafe - b.timeToSafe;
});
} else {
open.sort(function(a, b) {
var r1 = parseInt(a.length);
var r2 = parseInt(b.length);
if (r1 && r2) return r1 - r2;
else if (r1) return r2;
else if (r2) return r1;
else return 0;
});
}
var pointTotals = [];
valid.forEach(function(a) {
var index = -1;
var author = a.user;
pointTotals.forEach(function(p) {
if (p.user == author) index = pointTotals.indexOf(p);
});
if (index == -1) {
if (SUBTRACTCRACKEDPOINTS && a.cracked) a.points -= 16;
pointTotals.push(a);
}
else {
pointTotals[index].points += a.points;
pointTotals[index].numberOfSubmissions += a.numberOfSubmissions;
pointTotals[index].cracked += a.cracked;
pointTotals[index].expired += a.expired;
pointTotals[index].open += a.open;
if (SUBTRACTCRACKEDPOINTS && a.cracked) pointTotals[index].points -= 16;
}
});
pointTotals.sort(function(a, b) {
if (a.points != b.points)
return b.points - a.points;
else if (a.numberOfSubmissions != b.numberOfSubmissions)
return b.numberOfSubmissions - a.numberOfSubmissions;
else if (a.open != b.open)
return b.open - a.open;
else if (a.cracked != b.cracked)
return a.cracked - b.cracked;
else return 0;
});
pointTotals.forEach(function(a) {
var answer = jQuery("#answer-template").html();
answer = answer
.replace("{{NAME}}", a.user)
.replace("{{SAFE}}", a.numberOfSubmissions)
.replace("{{OPEN}}", a.open)
.replace("{{CLOSED}}", a.expired)
.replace("{{CRACKED}}", a.cracked)
.replace("{{POINTS}}", a.points);
answer = jQuery(answer);
jQuery("#answers").append(answer);
});
open.forEach(function(a) {
var answer = jQuery("#open-template").html();
answer = answer
.replace("{{NAME}}", a.user)
.replace("{{SAFE}}", a.safePts)
.replace("{{CRACKED}}", a.crackedPts)
.replace("{{LANGUAGE}}", a.language)
.replace("{{TIME}}", a.timeStr)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#opensubs").append(answer);
});
}
body {
text-align: left !important
}
#answer-list {
padding: 10px;
width: 350px;
float: left;
}
#open-list {
padding: 10px;
width: 470px;
float: left;
}
table thead {
font-weight: bold;
vertical-align: top;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr>
<td>Author</td>
<td>Safe</td>
<td>Open</td>
<td>Cracked</td>
<td>Late Entry</td>
<td>Score</td>
</tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<div id="open-list">
<h2>Open submissions</h2>
<table class="open-list">
<thead>
<tr>
<td>Author</td>
<td>Points if Safe</td>
<td>Points if Cracked</td>
<td>Language</td>
<td>Time Remaining</td>
<td>Link</td>
</tr>
</thead>
<tbody id="opensubs">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr>
<td>{{NAME}}</td>
<td>{{SAFE}}</td>
<td>{{OPEN}}</td>
<td>{{CRACKED}}</td>
<td>{{CLOSED}}</td>
<td>{{POINTS}}</td>
</tr>
</tbody>
</table>
<table style="display: none">
<tbody id="open-template">
<tr>
<td>{{NAME}}</td>
<td>{{SAFE}}</td>
<td>{{CRACKED}}</td>
<td>{{LANGUAGE}}</td>
<td>{{TIME}}</td>
<td><a target="_parent" href="{{LINK}}">Link</a>
</td>
</tr>
</tbody>
</table>
|||
) und dann dasN
im Code durch eine Zeichenfolge ersetzen, die Ihr Trennzeichen enthält, z"|||"
. (@Eridan zögern Sie nicht, dies in die Herausforderung aufzunehmen.)Antworten:
Hexagony , 6 Programme, 53 Bytes; Score 8/96 (wenn sicher / rissig)
Selbst wenn dies sicher geht, gibt es nur sehr wenige Punkte für mich, aber ich dachte, ich würde den Räubern ein nettes Rätsel geben, um ein paar Punkte einzulösen. :) Ich habe keine Ahnung, wie einfach oder schwer das eigentlich ist.
Hier sind die Ausgaben:
quelle
[
Schalter den Befehlszeiger steuern, der@
in der linken Ecke beginnt .JavaScript, geknackt , 2 Programme, 110 Bytes; Ergebnis -16
😈 viel Glück mit diesem.
Hinweis: Ich empfehle die Verwendung eines modernen Browsers (im Grunde genommen nicht IE).
Ausgabe, erstes Programm:
Ausgabe, zweites Programm:
quelle
BitShift , geknackt , 2 Programme, 110 Bytes; Ergebnis -16
Verflochtene Programme
Ausgabe, erstes Programm
Ausgabe, zweites Programm
Es tut mir Leid
quelle
Vitsy , geknackt , 2 Programme, 15 Bytes; Ergebnis -16
Verflochtene Programme
Vitsy ist so hübsch, so sauber. Schau in seine Quelle und sei beeindruckt.
Ausgabe, erstes Programm
Ausgabe, zweites Programm
Das sind 121 Zeilen.
quelle
Java, geknackt , 2 Programme, 155 Bytes; Ergebnis -16
Interleaved-Programme
Ausgabe, erstes Programm
Und hinter Newline.
Ausgabe, zweites Programm
Und hinter Newline.
Ursprüngliche Programme
Zuerst
Zweite
quelle
interface
statt setzen konnten,class
bis ich Ihre Antwort auf dem Hallo, Welt! Herausforderung. Ich werde versuchen, dies während meines Mittagessens zu knacken.Pyth, sicher, 2 Programme, 63 Bytes; Ergebnis 68
Verflochtene Programme
Erstes Programm
Ausgabe:
Programm:
Zweites Programm
Ausgabe
Programm:
quelle
# Pyth, safe, 2 programs, 63 bytes; Score 68
CJam, safe, 2 Programme, 250 Bytes; Ergebnis 65
Verflochtene Programme
Ausgabe, erstes Programm
Ausgabe, zweites Programm
Lösung
Erstes Programm
Probieren Sie es online!
Zweites Programm
Probieren Sie es online!
Wie es funktioniert
Beide Programme haben folgendes Format:
Das De-Interweaving der Programme sollte entweder Brute Force oder das Faktorisieren der Semi-Primzahlen erfordern.
quelle
Befunge, Safe, 2 Programme, 228 Bytes; Ergebnis 65
Verflochtene Programme
Ausgabe, erstes Programm
Ausgabe, zweites Programm
Ich bezweifle, dass dies leicht zu knacken sein wird. Tatsächlich solltest du jetzt einfach aufgeben. Wer braucht schon 132 Punkte?
Antworten
Programm 1:
Programm 2:
quelle
PHP, geknackt , 2 Programme, 71 Bytes; Ergebnis -16
Interleaved
Ausgabe
1. Programm
2. Programm
Hinweis :
Notices
sollte unterdrückt werden.quelle
JavaScript ES6, geknackt , 2 Programme, 255 Bytes; Ergebnis -16
Gute Arbeit @Bas! GG.
Ausgang 1:
Ausgang 2:
quelle
JavaScript (ES6), sicher, 2 Programme, 255 Bytes; Ergebnis 65
Interleaved-Programme
Ausgabe des ersten Programms
Ausgabe des zweiten Programms
Ich habe versucht, die Zeichen
(l)+=<>
so oft wie möglich zu verwenden. Der Rest ist nur Typkonvertierung.Erstes Programm
Zweites Programm
quelle
Ruby, geknackt , 2 Programme, 64 Bytes; Ergebnis -16
Interleaved
Ausgabe
1. Programm
2. Programm
Beide Ausgänge haben nachgestellte Zeilenumbrüche.
quelle
Perl, safe, 2 Programme, 102 Bytes; Ergebnis 66
Erste Ausgabe
Zweiter Ausgang
Lösung
Erstes Programm:
Zweites Programm:
quelle
Pyth, 2 Programme, 61 Bytes; Score 68/36 (wenn sicher / rissig)
Interleaved-Programme
Ausgabe, erstes Programm
Ausgabe, zweites Programm
Sollte nicht zu schwer sein.
quelle
PHP, geknackt , 3 Programme, 31 Bytes; Ergebnis -16
Dies sollte mit 3 Programmen einfach sein.
Interleaved
Ausgabe
1. Programm
2. Programm
3. Programm
Hinweis :
Notices
sollte unterdrückt werden.quelle
JavaScript ES6, 2 Programme, 225 Bytes; Punktzahl 65/132 (wenn sicher / rissig)
Verwoben:
Erste Ausgabe:
Zweiter Ausgang:
quelle
Brainfuck, 4 Programme, 251 Bytes; 17/144 (wenn sicher / rissig)
Verflochtene Programme
Ausgabe, erstes Programm
Eridan
Ausgabe, zweites Programm
Ampora
Ausgang, drittes Programm
PPCG
Ausgang, viertes Programm
Code Golf
quelle
Mikroskript II , sicher, 2 Programme, 44 Bytes; Ergebnis 68
Verschachtelte Quellen:
Ausgabe, erstes Programm:
Ausgabe, zweites Programm:
Und hier ist die Antwort:
Programm 1:
Programm 2:
quelle
Malbolge, 2 Programme, 194 Bytes; Ergebnis 65
Verwoben
Ausgang 1
Ausgang 2
Es war nur eine Frage der Zeit.
Programme
O1
O2
quelle
Javascript, sicher, 2 Programme, 106 Bytes; Ergebnis 66
Ausgang 1
Ausgang 2
Lösung
Programm 1
Programm 2
quelle
Japt , sicher, 3 Programme, 63 Bytes; Ergebnis 36
Die Version des Interpreters, für den dies geschrieben wurde, finden Sie hier . Leider habe ich die Originale verloren, also muss ich sehen, ob ich sie selbst knacken kann ...
Verflochtene Programme
Ausgang 1
Das sind 222 Stellen, falls Sie sich fragen.
Ausgang 2
Ausgang 3
quelle
JavaScript, 2 Programme, 255 Bytes; Punktzahl 65/132 (wenn sicher / rissig)
Erste Programmausgabe:
Zweite Programmausgabe:
Die zweite Programmausgabe ist Text und nicht JavaScript:
null
Dies sollte für die Räuber einfach sein.
quelle
Vitsy , 4 Programme, 228 Bytes; Punktzahl 17
(Verwendet eine ältere Version, die verlinkt ist)
Heeeyyyy @VoteToClose. Ich erwarte nicht, dass dieser lange wach sein wird, aber du weißt nie ... Ich liebe deine Sprache, jetzt wo ich sie oft benutze!
Verwobenes Programm
Ausgang 1
Ausgang 2
Ausgang 3
Ausgang 4
Viel Glück! Ich habe den Online-Dolmetscher verwendet, aber er sollte im sicheren Glas funktionieren.
Programme
O1
O2
O3
O4
quelle
Candy, Safe, 2 Programme, 85 Bytes; Ergebnis 66
Siehe: Süßigkeiten
Ausgänge:
51450000
1609944
Update: Dies sind die beiden Programme, denen das Interleaving folgt:
quelle
Foo , 6 Programme, 197 Bytes; Score 5/192 (wenn sicher / rissig)
Verwobener Code:
Ausgabe vom 1. Programm:
Beachten Sie den Tabulator in der ersten Zeile und das Leerzeichen in der zweiten Zeile
Ausgabe vom 2. Programm:
Beachten Sie, dass die erste Zeile leer ist
Ausgabe vom 3. Programm:
Ausgabe vom 4. Programm:
Ausgabe vom 5. Programm:
Ausgabe vom 6. Programm:
Es gibt nur einen Dolmetscher für Foo, den ich kenne. Sie finden ihn hier
quelle
@wizzwizz4
in Ihren Kommentar aufnehmen.Python 2, 8 Programme, 92 Bytes; Ergebnis: -16
Ein weiteres einfaches:
8 Ausgänge:
quelle
print
in Python 2 keine Leerzeichen mehr einfügen.JavaScript, 8 Programme, 233 Bytes; Score 2/384 (wenn sicher / rissig)
OK, jetzt bin ich böse:
1. Ausgabe:
2. Ausgabe:
3. Ausgabe:
4. Ausgabe:
5. Ausgabe:
6. Ausgabe:
7. Ausgabe:
8. Ausgabe:
quelle
Python 2, sichere 2 Programme, 148 Bytes; Ergebnis 65
Ausgang 1:
Ausgang 2:
Programm 1:
Programm 2:
quelle