El hilo de policías se puede encontrar aquí: The Mystery String Printer (Cops)
Tu reto
Tanteo
La puntuación funciona de manera similar para los ladrones, pero es ligeramente diferente:
- Descifrar cualquier programa de ≤8 bytes da 1 punto.
- Romper un programa de ≤16 bytes da 2 puntos. ≤32 bytes da 4 puntos, y así sucesivamente.
- Cada presentación adicional, sin importar la longitud, gana +5 puntos
- La presentación de cada policía solo se puede descifrar una vez, solo la primera persona en descifrar cada presentación obtiene los puntos.
Envíos
Cada respuesta debe incluir
- Un enlace a la presentación del policía.
- Su programa y lenguaje de programación.
- También tenga la longitud del programa del policía (como una potencia de 2) como el último número en su encabezado.
Además, comente el envío del policía con un enlace a su respuesta.
Aquí hay un fragmento de pila para generar tablas de clasificación. Deja un comentario si hay un problema con el fragmento. Si desea ver todos los envíos de policías abiertos, vea el fragmento en el desafío de la policía.
/* 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>
Este concurso está cerrado.
Ganador general: kennytm
La mayoría de las presentaciones: Sp3000
(Tenga en cuenta que la cantidad de envíos no se traduce exactamente en los puntos, ya que la longitud del programa descifrado se cuenta al calcular la puntuación).
Respuestas:
Pyth, Dennis, ≤ 8
Maldición, eso fue divertido: la parte más difícil fue descubrir cómo hacerlo lo suficientemente corto en Pyth.
Análisis
Al
1234
principio, indica que probablemente estamos tratando con una lista de números, impresa sin separador. Intentemos dividir los números de una manera que tenga sentido:Hay algunas pistas de que estamos en el camino correcto:
Sin embargo, hay algunas peculiaridades. El número en el índice 23 es 24, y es el único caso en el que el número en el índice es mayor que el índice mismo. Sin embargo, la pista más importante es que algunos números son claramente más pequeños que sus vecinos, particularmente el 7 en el índice 15, el 8 en el índice 22 y el 9 en el índice 30.
Al observar que esto forma un patrón de 7-8-9, también podemos ver que el último número es un 10 en el índice 42. Dada la reciente pregunta de @Dennis sobre grupos abelianos , una revisión rápida en OEIS revela que
15, 22, 30, 42
es una subsecuencia de la partición los números . Pyth tiene un incorporado para particiones, lo que nos da dos de ocho caracteres:./
Pero tenga en cuenta que el último número es 10, lo que es sospechoso porque 10 es una variable preinicializada en Pyth, como
T
../T
da una lista completa de las 42 particiones del número 10, que parece ser útil.Ahora la impresión se realiza sin un separador, por lo que esto sugiere un uso de
p
. ¿Quizás recorremos cada partición, le hacemos algo y luego imprimimosp
? Esto nos da la siguiente plantilla:donde
V
es un bucle for que recorre un iterable, almacenando cada elemento en la variableN
.Un vistazo rápido a la segunda última partición
(5, 5)
debería hacer obvio que queremos tomar un producto. La forma ingenua de reducir una lista por multiplicación es¿Dónde
d
está la lista en cuestión? Sin embargo, esto es demasiado largo.Desafortunadamente, aquí es donde tuve que sacar un forzador bruto. No me he mantenido al día con Pyth por un tiempo, por lo que no conocía muchas de las características más nuevas. Solo quedaban dos personajes, que parecían completamente factibles.
El forzador bruto luego regresó:
donde
*F
se pliega por*
(multiplicación). No es de extrañar que no lo haya encontrado en mi búsqueda. ¡Estaba buscando la palabra clave "reducir" en lugar de "doblar"!fuente
jk*M./T
<= 7
, estaría condenado. Seguro que ha pasado un tiempo desde que revisé el idioma.Mathematica, alphalpha, ≤ 32
Odio decir esto, pero acabo de reconocer el número en el acto.
fuente
31!10!27079205916672
> <>, VTCAKAVSMoACE, ≤ 64
Irónicamente, no solo es mucho más bajo el límite de alcance, también es portátil y funciona con el intérprete en línea .
Análisis
Comencemos con la cadena de destino:
> <> empuja los caracteres a la pila con
'
o"
en modo de cadena, pero con 63 caracteres para imprimir y solo 64 bytes para trabajar, la presencia de letras mayúsculas (instrucciones no válidas en> <>, para el truco de bucle redondo estándar) hace impresión directa imposible. Por lo tanto, debemos estar haciendo algo con los puntos de código.La conversión a puntos de código da (estoy usando Python aquí):
Tenga en cuenta que los últimos tres números son los mismos que los primeros tres. Esto sugiere un posible bucle de módulo en curso.
Echemos un vistazo a cuántos elementos diferentes tenemos:
Tenemos 63 elementos
L
, los tres primeros coinciden con los últimos tres. Esto significa que, aparte de esta colisión, todos los demás elementos son únicos. Ahora, esto sugiere algo así como tomar poderes módulo un número primo. De hecho,60 + 1 = 61
es primo, lo cual es una buena señal.Intentemos encontrar el elemento más pequeño.
y use eso para escalar todos los elementos hacia abajo para que el elemento min sea 1
Tenga en cuenta cómo el elemento después
1
es51
. Si hay algún tipo de potencia / multiplicación, esta es una buena suposición para nuestro multiplicador.Vamos a intentarlo:
¡Bingo! Ahora podemos dar marcha atrás, dando el siguiente código:
que luego se tradujo a> <>
fuente
Pyth, Maltysen, ≤4
La fuerza bruta tardó tanto que lo hice más rápido manualmente.
Análisis
C
(convertir cadena a base 256 int) es la forma más fácil de generar un gran número en Pyth, por lo que probablemente sea el primer carácter. Si convertimos desde la base 256, obtenemos:Hmm ... no muy esclarecedor.
Ahora
G
es la cadena del alfabeto"abc...z"
, que parece que podría ser una fuente de alimentación para una cadena largaC
. Mirando a través de los documentos encuentro:Si se trata de compresión aquí, no sería sorprendente obtener todo tipo de caracteres ASCII extendidos. Intentando,
C.ZG
entonces dio la respuesta.fuente
Fourier, decadencia beta, ≤ 32
O, alternativamente, en CJam:
Análisis
Al principio podemos ver muchos poderes de 2:
Si tomamos la base de registro 2 de estos números, obtenemos:
que es la serie de Fibonacci, comenzando en
1, 0
.fuente
Caracoles, feersum, ≤2 bytes
Esto es en realidad 2 bytes; El personaje
z
seguido de una nueva línea\n
.No tengo idea de cómo funciona o lo que está haciendo, pero después de probar todas las posibles entradas aparte de
~+
y~,
, este fue el único programa de 2 bytes que se produce8
como salida.Y tomó años obtener este resultado. No es de extrañar que se llame "Caracoles" :-D
Nota personal: la próxima vez que realice una prueba fuzz de software desconocido, hágalo dentro de una máquina virtual.
fuente
Rust, Liam Noronha, ≤128 bytes
Simplemente imprimir la cadena textualmente es de 120 bytes ...
fuente
Macarrones 0.0.2, pomo de la puerta, ≤64
fuente
Python 2, pregunta clara con ejemplos, <= 64
Una posible solución:
(
9**2139
,27**1426
Y729**713
también dar el mismo resultado)fuente
CoffeeScript, usuario2428118, ≤64
(solo funciona en Chrome 46.0.2490.71 como lo describe el policía).
La salida es obviamente una concatenación de cadenas cortas codificadas en base64 debido a todo el "=". Después de decodificarlos, encontramos una lista de cadenas de 2 caracteres como
lo cual no parece tener sentido. Pero encuentro algunos elementos extraños en él, como
nX
ytY
. Después de filtrar estos, obtenemosEstos X e Y parecen indicar el código fuente original utilizado como propiedades de posición
offsetX/Y
. Un elemento particularmente interesante es elnZ
artículo. Para verificar mi suposición, busqué todas las propiedades que terminan con "Z":que muestra toneladas de
CSSStyleDeclaration, "webkitTransformOriginZ"
. A partir de esto, tenemos una fuerte indicación de que la lista está formada por los últimos 2 caracteres de todas las claves de unstyle
objeto, lo que la prueba anterior muestra que es correcta.fuente
Lua <= 4, Egor Skriptunoff
Muchos usuarios se inquietaban por esta respuesta en el chat, por lo que debo aliviarlos de su miseria. No conozco a Lua y no pude probarlo, pero me sorprendería mucho si esto no funciona.
Esto sería bastante obvio, pero probablemente nadie lo entendió porque los operadores bit a bit solo se agregaron en la versión 5.3; ideone.com solo tiene la versión 5.2.
fuente
Python 2, histocrat, ≤16
La pista más importante es la promesa de que no funcionará en Python 3. ¿Qué ha cambiado en Python 3 ? El principal sospechoso es que el operador de división devuelve un
float
en Python 3.Así que supongo que la solución es de la forma ⌊α β / n⌋ = c = 22111101102001, ya que la exponenciación es la única forma corta de crear números enormes.
Si {α, β, n} realmente forma una solución, entonces (cn) 1 / β ≈ α debería estar muy cerca de un número entero. Por lo tanto, uso lo siguiente para intentar forzar la fuerza bruta {α, β} para cada n:
El resultado real sale rápidamente cuando n = 6.
fuente
MATLAB, StewieGriffin, ≤ 16
Huellas dactilares:
fuente
5*'$W'.'*' |'
..73
lugar de 5, do+5
o hacerlo una3x3
matriz, pero pensé que esto era más divertido. Podría haber hecho mucho con los tres bytes restantes..'
antes, pero tiene mucho sentido: se preguntaba cómo transponer una cadena sin recurrir a los corchetes.Matlab, Luis Mendo, ≤16
Lo encontré, yay!
No sabía que Octave también puede hacer esto.
fuente
peaks()
?peaks
.Mathematica, LegionMammal978, ≤64
fuente
Python, spacemanjosh, ≤ 64
Gloriosa calculadora simbólica inversa. No está bien golfizado, pero bueno, encaja.
Editar: lo jugué golf.
fuente
JavaScript ES6, Cᴏɴᴏʀ O'Bʀɪᴇɴ, ≤128 bytes
Dudo que esto sea correcto ya que no necesitaba cerca de 128 bytes, pero encontrar una secuencia repetitiva fue un desafío divertido.
fuente
Thue, ppperry, <= 64
Descompone 2016 en sus factores primos, esencialmente. 62 caracteres, así que supongo que esto es similar a lo que estabas buscando.
fuente
Python, DLosc, ≤32
(Esta solución usa Python 2)
fuente
> <>, Sp3000, <= 8
El puntero de instrucciones se ajusta y suceden los siguientes pasos:
'l(?; o>'
empuja los valores ASCII del(?; o>
a la pilal
empuja el tamaño de la pila en la pila(
compare los dos elementos principales de la pila:size of stack
yord('>')
?;
detiene el programa si el tamaño de la pila era mayoro
muestra el elemento superior de la pila como carácter (esto será siempreo
)>
establece la dirección IP, aquí está sin operaciónLa salida es
oooooooooooo
.Podemos obtener muchas salidas diferentes cambiando
[space]
a algo que empuje o explote en la pila y use otro personaje válido en lugar de>
, que también puede empujar o explotar.fuente
'l=?;o*
JavaScript, ev3commander, ≤ 32
OK, eso fue fácil.
fuente
CJam, Reto Koradi, ≤ 4
Empuja 17 , luego 19 20 = 37589973457545958193355601 .
Pruébalo en línea.
Solo hay tantas cosas que puede hacer en cuatro bytes. Un número entero tan grande tenía que involucrar poderes o factoriales de alguna manera, y un factorial tendría ceros finales.
fuente
Pyth <= 4, Dennis
Esa es la longitud de la unión en las nuevas líneas de todos los subconjuntos del alfabeto.
Prueba de funcionamiento:
Descubrí que el número era
2^27 * 7 - 1
una pista fuerte en la que se basayG
, que es2^26
elementos largos. Entonces supuse que tenía que convertirse en una cadena y su longitud impresa. Sin embargo, la única forma de hacerlo que se me ocurrió por un tiempo fue ``, repr. Entonces penséj
, que encaja perfectamente.fuente
C, tucuxi, ≤64
Los resultados son todos 0 y 1, pero C no puede imprimir binarios directamente, por lo que es muy probable que estos sean resultados booleanos.
Hay más de 1 que 0, así que grabé las posiciones de 0 (
3, 9, 13, 19, …
), que resulta ser OEIS A075318 . Sin embargo, esto no es útil, no existe una fórmula simple para determinar dónde está un número en esta secuencia.Pero notamos que hay números impares, por lo que quizás
(x-1)/2 = {1, 4, 6, 9, 12, …}
tenga más información útil. Y esto es A003622 .A003622 se puede definir como "posiciones de 1 en A003849 ", que es exactamente lo que necesitamos descifrar aquí. Y A003849 se define como " A003714 mod 2", donde A003714 son simplemente todos los enteros que
x & (2*x) == 0
. Así tenemos la solución.OEIS rox.
fuente
Dyalog APL, Dennis, ≤4
Calcula ln (8) ^ ln (8). ¿StackExchange dejaría de convertir mis respuestas? Escribiré un montón de cosas aquí para que no se convierta en un comentario.
fuente
8*⍟⍟8
pero no sabía sobre⍨
. Buen trabajo :)Pegado, @quartata, ≤8
El siguiente programa Pyth :
produce la salida deseada
Método de craqueo: busqué el número en Google.
fuente
Pyth, xnor, ≤ 4
CG
(convertir la cadena"abc...z"
del alfabeto de la base 256) es la forma típica de Pyth de generar un número realmente grande. Después de eso es solo stringify y convertir de base nuevamente.fuente
Python 3, Mego, ≤128
(Utilizando Python 3.5.0, no probado en versiones anteriores.
10598 bytes.)fuente
Ruby, pomo de la puerta, ≤64
fuente
Matlab / Octave, Wauzl, ≤16
Usando la misma idea que la respuesta de Tom Carpenter
(Si no funcionó, intente esto :)
fuente
(1*'234')'*'567'
en mente, porque tu primera respuesta no funciona en Matlab.