Wątek gliniarzy można znaleźć tutaj: The Mystery String Printer (Cops)
Twoje wyzwanie
Punktacja
Punktacja działa podobnie dla złodziei, ale jest nieco inna:
- Złamanie dowolnego programu o wielkości ≤ 8 bajtów daje 1 punkt.
- Złamanie programu o wielkości 16 bajtów daje 2 punkty. ≤32 bajtów daje 4 punkty i tak dalej.
- Każde dodatkowe zgłoszenie, bez względu na długość, daje +5 punktów
- Zgłoszenie każdego gliniarza może zostać złamane tylko raz - tylko pierwsza osoba, która złamie każde zgłoszenie, otrzymuje punkty.
Zgłoszenia
Każda odpowiedź musi zawierać
- Link do zgłoszenia policjanta.
- Twój program i język programowania.
- Miej także długość programu policjanta (jako potęgę 2) jako ostatnią liczbę w nagłówku.
Dodatkowo proszę skomentować przesłanie policjanta z linkiem do swojej odpowiedzi.
Oto fragment kodu stosu do generowania tabel wyników. Zostaw komentarz, jeśli występuje problem z fragmentem kodu. Jeśli chcesz zobaczyć wszystkie otwarte zgłoszenia gliniarzy, zobacz fragment w wyzwaniu gliniarzy.
/* Configuration */
var QUESTION_ID = 60329; // 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";
/* App */
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();
var POINTS_REG = /(?:<=|≤|<=)\s?(?:<\/?strong>)?\s?(\d+)/
var POINTS_REG_ALT = /<h\d>.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
var open = [];
answers.forEach(function(a) {
var body = a.body;
var cracked = false;
var points = body.match(POINTS_REG);
if (!points) points = body.match(POINTS_REG_ALT);
if (points) {
var length = parseInt(points[1]);
var crackedpoints = 0;
if (length > 64) crackedpoints = 16;
else if (length > 32) crackedpoints = 8;
else if (length > 16) crackedpoints = 4;
else if (length > 8) crackedpoints = 2;
else crackedpoints = 1;
valid.push({
user: getAuthorName(a),
numberOfSubmissions: 1,
points: crackedpoints
});
}
});
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) pointTotals.push(a);
else {
pointTotals[index].points += a.points;
pointTotals[index].numberOfSubmissions++;
}
});
pointTotals.forEach(function(a) {
a.points += +((a.numberOfSubmissions - 1) * 5);
});
pointTotals.sort(function(a, b) {
var aB = a.points,
bB = b.points;
return (bB - aB != 0) ? bB - aB : b.numberOfSubmissions - a.numberOfSubmissions;
});
pointTotals.forEach(function(a) {
var answer = jQuery("#answer-template").html();
answer = answer
.replace("{{NAME}}", a.user)
.replace("{{SUBMISSIONS}}", a.numberOfSubmissions)
.replace("{{POINTS}}", a.points);
answer = jQuery(answer);
jQuery("#answers").append(answer);
});
}
body {
text-align: left !important
}
#answer-list {
padding: 20px;
width: 240px;
float: left;
}
#open-list {
padding: 20px;
width: 450px;
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>Robber's Leaderboard</h2>
<table class="answer-list">
<thead>
<tr>
<td>Author</td>
<td>Submissions</td>
<td>Score</td>
</tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr>
<td>{{NAME}}</td>
<td>{{SUBMISSIONS}}</td>
<td>{{POINTS}}</td>
</tr>
</tbody>
</table>
Ten konkurs jest teraz zamknięty.
Zwycięzca ogólny: kennytm
Większość zgłoszeń: Sp3000
(Uwaga: liczba zgłoszeń nie przekłada się dokładnie na punkty, ponieważ długość pękniętego programu jest liczona podczas obliczania wyniku).
Odpowiedzi:
Pyth, Dennis, ≤ 8
Cholera, było fajnie - najtrudniej było wymyślić, jak to zrobić wystarczająco krótko w Pyth.
Analiza
1234
Na podpowiedzi startowych że mamy prawdopodobnie do czynienia z listy numerów, drukowane bez separatora. Spróbujmy podzielić liczby w sposób, który ma sens:Jest kilka wskazówek, że jesteśmy na dobrej drodze:
Istnieje jednak kilka osobliwości. Liczba przy indeksie 23 wynosi 24 i jest to jedyny przypadek, w którym liczba przy indeksie jest większa niż sam indeks. Jednak większą wskazówką jest to, że niektóre liczby są wyraźnie mniejsze niż ich sąsiedzi, szczególnie 7 przy indeksie 15, 8 przy indeksie 22 i 9 przy indeksie 30.
Zauważając, że tworzy to wzór 7-8-9, możemy również zobaczyć, że ostatnia liczba to 10 przy indeksie 42. Biorąc pod uwagę ostatnie pytanie @Dennis dotyczące grup abelowych , szybkie sprawdzenie OEIS ujawnia, że
15, 22, 30, 42
jest to podsekwencja podziału numery . Pyth ma wbudowane partycje, które dają nam dwa z ośmiu znaków:./
Ale zauważ, że ostatnia liczba to 10, co jest podejrzane, ponieważ 10 jest zmienną wstępnie zainicjalizowaną w Pyth, as
T
../T
daje pełną listę 42 partycji liczby 10, co wygląda na to, że może się przydać.Teraz drukowanie odbywa się bez separatora, więc to wskazuje na użycie
p
. Być może przeglądamy każdą partycję, coś z tym robimy, a następnie drukujemyp
? To daje nam następujący szablon:gdzie
V
jest pętla for, która zapętla się nad iterowalnym, przechowując każdy element w zmiennejN
.Szybkie spojrzenie na drugą ostatnią partycję
(5, 5)
powinno dać jasno do zrozumienia, że chcemy wziąć produkt. Naiwnym sposobem zmniejszenia listy przez pomnożenie jestgdzie
d
jest lista, o której mowa. To jednak zdecydowanie za długo.Niestety właśnie tutaj musiałem wyciągnąć brutalnego forcera. Przez jakiś czas nie nadążałem za Pyth, więc nie znałem wielu nowszych funkcji. Pozostały tylko dwie postacie, które wyglądały na wykonalne.
Brutalny forcer następnie wrócił:
gdzie
*F
jest fold by*
(mnożenie). Nic dziwnego, że nie znalazłem go podczas wyszukiwania - szukałem słowa kluczowego „zmniejsz” zamiast „pasuj”!źródło
jk*M./T
<= 7
, byłbym skazany na zagładę. Minęło trochę czasu, odkąd sprawdziłem język.Mathematica, alfa, ≤ 32
Nienawidzę tego mówić, ale właśnie rozpoznałem numer na miejscu.
źródło
31!10!27079205916672
> <>, VTCAKAVSMoACE, ≤ 64
Jak na ironię, nie tylko jest to znacznie niższy limit zasięgu, ale także jest przenośny i współpracuje z tłumaczem online .
Analiza
Zacznijmy od ciągu docelowego:
> <> wypycha znaki do stosu za pomocą
'
lub"
w trybie łańcuchowym, ale przy 63 znakach do wydrukowania i tylko 64 bajtach do pracy, obecność wielkich liter (nieprawidłowe instrukcje w> <>, dla standardowej sztuczki z pętlą) powoduje bezpośrednie drukowanie niemożliwy. Dlatego musimy coś robić z punktami kodowymi.Konwersja na punkty kodowe daje (używam tutaj Pythona):
Zauważ, że ostatnie trzy liczby są takie same jak pierwsze trzy. Wskazuje to na możliwą pętlę modulo.
Zobaczmy, ile mamy różnych elementów:
Mamy 63 elementy
L
, z których pierwsze trzy pokrywają się z trzema ostatnimi. Oznacza to, że oprócz tego zderzenia wszystkie inne elementy są unikalne. To sugeruje coś w rodzaju przejęcia modulo mocy liczby pierwszej. Rzeczywiście,60 + 1 = 61
jest liczbą pierwszą, co jest dobrym znakiem.Spróbujmy znaleźć najmniejszy element
i użyj tego, aby przeskalować wszystkie elementy w dół, tak aby element min wynosił 1:
Zwróć uwagę, jak element po
1
to51
. Jeśli dzieje się coś w rodzaju mocy / mnożenia, jest to dobre przypuszczenie dla naszego mnożnika.Spróbujmy:
Bingo! Możemy teraz cofnąć się, podając następujący kod:
który został następnie przetłumaczony na> <>
źródło
Pyth, Maltysen, ≤4
Brutalna siła trwała tak długo, że robiłem to szybciej ręcznie.
Analiza
C
(konwersja łańcucha na podstawową liczbę int 256) jest najprostszym sposobem na wygenerowanie dużej liczby w Pyth, więc prawdopodobnie jest to pierwszy znak. Jeśli dokonamy konwersji z bazy 256, otrzymamy:Hmm ... niezbyt pouczające.
Teraz
G
jest ciąg alfabetu"abc...z"
, który wygląda na to, że może być źródłem długiego ciągu, do którego można się zasilaćC
. Przeglądając dokumenty, znajduję:Jeśli mamy do czynienia z kompresją, nie byłoby zaskoczeniem, aby uzyskać wszelkiego rodzaju rozszerzone znaki ASCII. Próbując
C.ZG
następnie dał odpowiedź.źródło
Fourier, rozpad beta, ≤ 32
Lub alternatywnie w CJam:
Analiza
Na początku możemy zobaczyć wiele potęg 2:
Jeśli weźmiemy log 2 jako podstawę tych liczb, otrzymamy:
która jest serią Fibonacciego, zaczynając od
1, 0
.źródło
Ślimaki, feersum, ≤ 2 bajty
To w rzeczywistości 2 bajty; znak,
z
po którym następuje nowa linia\n
.Nie mam pojęcia, jak to działa ani co robi, ale po przetestowaniu wszystkich możliwych danych wejściowych oprócz
~+
i~,
był to jedyny 2-bajtowy program, który został wygenerowany8
jako dane wyjściowe.Zdobycie tego wyniku zajęło wieki . Nic dziwnego, że nazywa się to „Ślimaki” :-D
Uwaga do siebie: przy następnym fuzzowaniu nieznanego oprogramowania zrób to w maszynie wirtualnej.
źródło
Rdza, Liam Noronha, ≤ 128 bajtów
Zwykłe wydrukowanie napisu ciągłego to 120 bajtów ...
źródło
Macaroni 0.0.2, Klamka, ≤64
źródło
Python 2, Wyczyść pytanie z przykładami, <= 64
Jedno możliwe rozwiązanie:
(
9**2139
,27**1426
a729**713
także dać ten sam wynik)źródło
CoffeeScript, użytkownik2428118, ≤64
(działa tylko w Chrome 46.0.2490.71 zgodnie z opisem Cop.)
Wynik jest oczywiście połączeniem krótkich łańcuchów kodowanych base64 ze względu na wszystkie „=”. Po ich zdekodowaniu znajdujemy listę 2-znakowych ciągów takich jak
co nie wydaje się mieć sensu. Ale znajduję w nim dziwne przedmioty, takie jak
nX
itY
. Po ich odfiltrowaniu otrzymujemyTe X i Y wydają się wskazywać na pierwotny kod pozycji wykorzystujący właściwości pozycji, takie jak
offsetX/Y
. Szczególnie interesujący jestnZ
przedmiot. Aby sprawdzić moje założenie, szukałem wszystkich właściwości, które kończą się na „Z”:który pokazuje mnóstwo
CSSStyleDeclaration, "webkitTransformOriginZ"
. Z tego mamy wyraźne wskazanie, że lista składa się z 2 ostatnich znaków wszystkich kluczystyle
obiektu, co pokazuje powyższy test.źródło
Lua <= 4, Egor Skriptunoff
Wielu użytkowników denerwowało się tą odpowiedzią na czacie, więc muszę uwolnić ich od nędzy. Nie znam Lui i nie mogłem tego przetestować, ale byłbym bardzo zaskoczony, gdyby to nie zadziałało.
Byłoby to dość oczywiste, ale prawdopodobnie nikt tego nie zrozumiał, ponieważ operatory bitowe zostały dodane tylko w wersji 5.3; ideone.com ma tylko wersję 5.2.
źródło
Python 2, histocrat, ≤16
Największą wskazówką jest obietnica, że nie będzie działać w Pythonie 3. Co zmieniło się w Pythonie 3 ? Największym podejrzanym jest to, że operator podziału zwraca a
float
w Pythonie 3.Zakładam więc, że rozwiązanie ma postać ⌊α β / n⌋ = c = 22111101102001, ponieważ potęgowanie jest jedyną krótką drogą do tworzenia wielkich liczb.
Jeśli {α, β, n} rzeczywiście tworzy rozwiązanie, to (cn) 1 / β ≈ α powinno być bardzo zbliżone do liczby całkowitej. Dlatego używam następującego, aby spróbować użyć siły {α, β} dla każdego n:
Rzeczywisty wynik szybko wychodzi, gdy n = 6.
źródło
MATLAB, StewieGriffin, ≤ 16
Wydruki:
źródło
5*'$W'.'*' |'
..73
Zamiast 5, zrób+5
lub uczyń z3x3
matrycy, ale pomyślałem, że to było fajniejsze. Mógłby wiele zrobić z trzema pozostałymi bajtami..'
, ale ma pełny sens - zastanawiałem się, jak transponować ciąg znaków bez uciekania się do nawiasów.Matlab, Luis Mendo, ≤16
Znalazłem to, tak!
Nie wiedziałem, że Octave też może to zrobić.
źródło
peaks()
?peaks
.Mathematica, LegionMammal978, ≤64
źródło
Python, spacemanjosh, ≤ 64
Chwalebny odwrotny symboliczny kalkulator. Nie za dobrze gra w golfa, ale hej, pasuje.
Edycja: Grałem w golfa.
źródło
JavaScript ES6, Cᴏɴᴏʀ O'Bʀɪᴇɴ, ≤128 bajtów
Wątpię, żeby było dokładnie tak, ponieważ nie potrzebowałem prawie 128 bajtów, ale znalezienie powtarzającej się sekwencji było fajnym wyzwaniem.
źródło
Wt, ppperry, <= 64
Zasadniczo rozkłada 2016 na czynniki pierwsze. 62 znaków, więc przypuszczam, że jest to podobne do tego, co chciałeś.
źródło
Python, DLosc, ≤32
(To rozwiązanie wykorzystuje Python 2)
źródło
> <>, Sp3000, <= 8
Wskaźnik instrukcji zawija się i następują następujące kroki:
'l(?; o>'
wypycha wartości ASCIIl(?; o>
na stosl
przesuwa rozmiar stosu na stosie(
porównaj dwa górne elementy stosu:size of stack
iord('>')
?;
zatrzymuje program, jeśli rozmiar stosu był większyo
wypisuje górny element stosu jako znak (będzie to zawszeo
)>
ustawia kierunek IP, tutaj nie ma opcjiDane wyjściowe to
oooooooooooo
.Możemy uzyskać wiele różnych wyników, zmieniając
[space]
na coś, co popycha lub wyskakuje na stosie i używając innego ważnego znaku zamiast>
, który może również popychać lub pop.źródło
'l=?;o*
JavaScript, ev3commander, ≤ 32
OK, to było łatwe.
źródło
CJam, Reto Koradi, ≤ 4
Popycha 17 , a następnie 19 20 = 37589973457545958193355601 .
Wypróbuj online.
Jest tylko tyle rzeczy, które możesz zrobić w czterech bajtach. Tak duża liczba musiała w jakiś sposób obejmować moce lub silnie, a silnia miałaby końcowe zera.
źródło
Pyth <= 4, Dennis
To długość łączenia na nowych liniach wszystkich podzbiorów alfabetu.
Testowe uruchomienie:
Doszedłem do wniosku, że liczba
2^27 * 7 - 1
jest silną wskazówką, na której się opierayG
, która jest2^26
długa. Wtedy domyśliłem się, że trzeba go przekonwertować na sznurek i wydrukować jego długość. Jednak jedynym sposobem na zrobienie tego, o czym mogłem pomyśleć, był ``, repr. Potem pomyślałem o tymj
, co idealnie pasuje.źródło
C, tucuxi, ≤64
Dane wyjściowe to 0 i 1, ale C nie może wydrukować pliku binarnego bezpośrednio, więc jest bardzo prawdopodobne, że są to wyniki logiczne.
Jest więcej niż 1 zera, więc zapisałem pozycje 0s (
3, 9, 13, 19, …
), co okazuje się być OEIS A075318 . Nie jest to jednak przydatne, nie ma prostej formuły określającej, gdzie jest liczba w tej sekwencji.Ale zauważamy, że wszystkie liczby nieparzyste są, więc być może
(x-1)/2 = {1, 4, 6, 9, 12, …}
mają bardziej przydatne informacje. A to jest A003622 .A003622 można zdefiniować jako „pozycje 1 w A003849 ”, i właśnie to musimy tutaj złamać. A A003849 jest zdefiniowany jako „ A003714 mod 2”, gdzie A003714 to po prostu wszystkie liczby całkowite
x & (2*x) == 0
. Tak więc mamy rozwiązanie.OEIS rox.
źródło
Dyalog APL, Dennis, ≤4
Oblicza ln (8) ^ ln (8). Czy StackExchange przestanie konwertować moje odpowiedzi? Napiszę tu kilka rzeczy, żeby nie zamieniły się w komentarz.
źródło
8*⍟⍟8
ale nie wiedziałem o tym⍨
.Stuck, @ quartata, ≤8
Następujący program w języku Pyth :
produkuje pożądaną moc wyjściową
Metoda pękania: przeszukałem numer Google.
źródło
Pyth, xnor, ≤ 4
CG
(konwersja ciągu alfabetu"abc...z"
z bazy 256) jest typowym sposobem Pyth'a na generowanie naprawdę dużej liczby. Po tym to po prostu skreślić i przekonwertować z bazy ponownie.źródło
Python 3, Mego, ≤128
(Przy użyciu Python 3.5.0, nie testowany na poprzednich wersjach.
10598 bajtów.)źródło
Rubin, Klamka, ≤64
źródło
Matlab / Octave, Wauzl, ≤16
Korzystając z tego samego pomysłu, co odpowiedź Toma Carpentera
(Jeśli to nie zadziałało, spróbuj tego :)
źródło
(1*'234')'*'567'
na myśli, ponieważ twoja pierwsza odpowiedź nie działa w Matlabie.