To jest wątek gliniarzy. Przejdź do wątku rabusiów tutaj .
Wprowadzenie
W tym wyzwaniu dla gliniarzy / rabusiów gliniarze napiszą programy produkcyjne i przeplatają je razem. Zadaniem rabusia jest rozróżnienie programów gliniarzy w celu uzyskania pożądanych rezultatów.
Zasady gliny
Policjanci mogą użyć do 256 bajtów łącznie do zapisu od 2 do 8 (włącznie) programów, z których wszystkie muszą generować dane wyjściowe. Wszystkie napisane programy muszą być w tym samym języku. Gliny „przeplatają” swoje programy razem, aby utrudnić złodziejom ustalenie, jakie są programy.
Teraz opis przeplatania. Rozważ ciągi znaków reprezentujące różne programy. Proces przeplatania polega na wielokrotnym pobieraniu pierwszego znaku dowolnego programu i łączeniu go do końca nowego ciągu znaków, dopóki nie pozostaną żadne znaki w żadnym programie. Na przykład, jeśli dwa programy są lion
i TIGER
, możliwe jest przeplatanie TIliGoEnR
. Jednak programów nie można w żaden sposób zaszyfrować, więc RoITEnlGi
jest to niedopuszczalne.
Należy zauważyć, że gdy znaki wszystkich programów oprócz jednego zostaną usunięte z wyników przeplatania, pozostały program będzie wyświetlany w stanie nienaruszonym. Usuwanie liter TIGER
z TIliGoEnR
wyników w lion
.
Wszystkie programy i dane wyjściowe gliniarzy muszą zawierać tylko drukowalne znaki ASCII (20-7E) i znaki nowej linii. Programy nie mogą zawierać błędów i muszą działać w ciągu 10 sekund na rozsądnej maszynie. W przypadku każdego zgłoszenia musi być gdzieś bezpłatny tłumacz języka. Dodawanie komentarzy do zgłoszeń jest niedozwolone, podobnie jak mieszanie i inne formy kryptografii. Puste programy nie są dozwolone (Przepraszamy, utknął ).
Policjant opublikuje przepleciony kod, język, liczbę różnych używanych programów i dane wyjściowe dla każdego programu. Ogromne podziękowania dla Martina za napisanie tego skryptu CJam do automatycznego przeplatania twoich programów.
Programy uznaje się za bezpieczne po upływie tygodnia od momentu opublikowania. W tym momencie policjanci muszą opublikować poszczególne programy, aby otrzymać punkty.
Punktacja
Istnieją dwa elementy, które są dodawane do siebie, aby uzyskać bezpieczne przesłanie.
- 256 podzielone przez liczbę 2 podniesioną do potęgi liczby użytych programów.
- Zaokrąglij liczbę bajtów w przeplataniu w górę do najbliższej potęgi 2 i podziel ją na 256.
Na przykład, jeśli wpis TIliGoEnR
(9 bajtów) byłby bezpieczny, otrzymałby 256/2 ^ 2 + 256/16 = 80 punktów.
Gdy zgłoszenie gliniarza zostanie złamane, policjant traci 16 punktów. Policjant musi zaznaczyć, że ich zgłoszenie zostało złamane.
Zwycięzcą wyzwania gliniarzy będzie osoba, która zdobędzie najwięcej punktów po upływie wystarczającego czasu na uczestnictwo.
Tabela liderów
Jest to praca w toku, która została zaadaptowana przez intrepidcoder z tego pytania .
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, używając dokładnego szablonu Markdown:
# Language Name, N programs, M bytes; Score ###/### (if safe/cracked)
Wszystko po średniku zostanie zignorowane, więc możesz tam wpisać swój wynik.
Jeśli przesłanie jest bezpieczne, umieść taki nagłówek:
# Language Name, safe, N programs, M bytes; Score ###
Jeśli jest pęknięty, umieść taki nagłówek:
# 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>
|||
powiedzmy), a następnie zastąpićN
kod w ciągu zawierającym separator, np"|||"
. (@Eridan może włączyć to do wyzwania.)Odpowiedzi:
Sześciokąt , 6 programów, 53 bajty; Ocena 8/96 (jeśli bezpieczny / pęknięty)
Nawet jeśli stanie się to bezpieczne, będzie to dla mnie bardzo mało punktów, ale pomyślałem, że zapewnię dobrą łamigłówkę dla złodziei, aby zgromadzić kilka punktów. :) Nie mam pojęcia, jak to jest łatwe czy trudne.
Oto wyniki:
źródło
[
przełącza się na wskaźnik instrukcji, który zaczyna się@
w lewym rogu.JavaScript, cracked , 2 programy, 110 bajtów; Wynik -16
😈 powodzenia z tym.
Uwaga: zalecam korzystanie z nowoczesnej przeglądarki (w zasadzie nie IE)
Wyjście, pierwszy program:
Wyjście, drugi program:
źródło
BitShift , cracked , 2 programy, 110 bajtów; Wynik -16
Programy z przeplotem
Wyjście, pierwszy program
Wyjście, drugi program
tak mi przykro
źródło
Vitsy , cracked , 2 programy, 15 bajtów; Wynik -16
Programy przeplatane
Vitsy jest taka ładna, taka czysta. Spójrz na jego źródło i zachwyć się.
Wyjście, pierwszy program
Wyjście, drugi program
To 121 nowych linii.
źródło
Java, cracked , 2 programy, 155 bajtów; Wynik -16
Programy z przeplotem
Wyjście, pierwszy program
I końcowy znak nowej linii.
Wyjście, drugi program
I końcowy znak nowej linii.
Oryginalne programy
Pierwszy
druga
źródło
interface
zamiast,class
dopóki nie zobaczyłem twojej odpowiedzi w Hello, World! wyzwanie. Spróbuję to rozwalić podczas lunchu.Pyth, bezpieczny, 2 programy, 63 bajty; Ocena 68
Programy z przeplotem
Pierwszy program
Wynik:
Program:
Drugi program
Wynik
Program:
źródło
# Pyth, safe, 2 programs, 63 bytes; Score 68
CJam, bezpieczny, 2 programy, 250 bajtów; Ocena 65
Programy z przeplotem
Wyjście, pierwszy program
Wyjście, drugi program
Rozwiązanie
Pierwszy program
Wypróbuj online!
Drugi program
Wypróbuj online!
Jak to działa
Oba programy mają ten format:
Odplatanie programów powinno wymagać brutalnej siły lub faktoryzacji półpierwszych liczb.
źródło
Befunge, Safe, 2 programy, 228 bajtów; Ocena 65
Programy z przeplotem
Wyjście, pierwszy program
Wyjście, drugi program
Wątpię, czy będzie to łatwe do złamania. W rzeczywistości powinieneś się teraz poddać. Kto i tak potrzebuje 132 punktów?
Odpowiedź
Program 1:
Program 2:
źródło
PHP, cracked , 2 programy, 71 bajtów; Wynik -16
Interleaved
Wynik
1. program
2. program
Uwaga :
Notices
należy pominąć.źródło
JavaScript ES6, cracked , 2 programy, 255 bajtów; Wynik -16
Dobra robota @Bas! GG
Wyjście 1:
Wyjście 2:
źródło
JavaScript (ES6), bezpieczny, 2 programy, 255 bajtów; Ocena 65
Programy z przeplotem
Rezultat pierwszego programu
Rezultat drugiego programu
Starałem się używać znaków w
(l)+=<>
jak największym stopniu. Reszta to po prostu konwersja typów.Pierwszy program
Drugi program
źródło
Rubinowy, crackowany , 2 programy, 64 bajty; Wynik -16
Interleaved
Wynik
1. program
2. program
Oba wyjścia mają końcowe znaki nowej linii.
źródło
Perl, bezpieczny, 2 programy, 102 bajty; Ocena 66
Pierwsze wyjście
Drugie wyjście
Rozwiązanie
Pierwszy program:
Drugi program:
źródło
Pyth, 2 programy, 61 bajtów; Ocena 68/36 (jeśli bezpieczny / pęknięty)
Programy z przeplotem
Wyjście, pierwszy program
Wyjście, drugi program
Nie powinno być zbyt trudne.
źródło
PHP, cracked, 3 programs, 31 bytes; Score -16
This should be an easy one using 3 programs.
Interleaved
Output
1st program
2nd program
3rd program
Note:
Notices
should be suppressed.źródło
JavaScript ES6, 2 programs, 225 bytes; Score 65/132 (if safe/cracked)
Interweaved:
First output:
Second output:
źródło
Brainfuck, 4 programs, 251 bytes; 17/144 (if safe/cracked)
Interweaved programs
Output, first program
Eridan
Output, second program
Ampora
Output, third program
PPCG
Output, fourth program
Code Golf
źródło
Microscript II, safe, 2 programs, 44 bytes; score 68
Interleaved sources:
Output, first program:
Output, second program:
And here's the answer:
Program 1:
Program 2:
źródło
Malbolge, 2 programs, 194 bytes; Score 65
Interweaved
Output 1
Output 2
It was only a matter of time.
Programs
O1
O2
źródło
Javascript, safe, 2 programs, 106 bytes; Score 66
Output 1
Output 2
Solution
Program 1
Program 2
źródło
Japt, safe, 3 programs, 63 bytes; Score 36
The version of the interpreter that this was built for can be found here. Unfortunately, I've lost the originals, so I'll have to see if I can crack it myself...
Interweaved programs
Output 1
That's 222 digits, in case you were wondering.
Output 2
Output 3
źródło
JavaScript, 2 programs, 255 bytes; Score 65/132 (if safe/cracked)
First program output:
Second Program output:
The second programs output is text and not JavaScript's:
null
This should be easy for the robbers.
źródło
Vitsy, 4 programs, 228 bytes; Score 17
(Uses an older version, which is linked)
Heeeyyyy @VoteToClose. I don't expect this one to be up long, but you never know… I love your language, now that I'm using it a lot!
Interweaved program
Output 1
Output 2
Output 3
Output 4
Good luck! I used the online interpreter, but it should work in the safe jar.
Programs
O1
O2
O3
O4
źródło
Candy, safe, 2 programs, 85 bytes; Score 66
See: Candy
Outputs:
51450000
1609944
Update: This is the two programs followed by their interleaving:
źródło
Foo, 6 programs, 197 bytes; Score 5/192 (if safe/cracked)
Interweaved code:
Output from 1st program:
Note the tab on first line and trailing space on second line
Output from 2nd program:
Note that the first line is blank
Output from 3rd program:
Output from 4th program:
Output from 5th program:
Output from 6th program:
There is only one interpreter for Foo which i know of, you can find it here
źródło
@wizzwizz4
in your comment.Python 2, 8 programs, 92 bytes; Score: -16
Another easy one:
8 outputs:
źródło
print
in Python 2.JavaScript, 8 programs, 233 bytes; Score 2/384 (if safe/cracked)
OK, now I'm being evil:
1st Output:
2nd Output:
3rd Output:
4th Output:
5th Output:
6th Output:
7th Output:
8th Output:
źródło
Python 2, safe 2 programs, 148 bytes; Score 65
Output 1:
Output 2:
Program 1:
Program 2:
źródło