PPCG Jeopardy: ladrones


18

¿Qué tan bien conoces el sitio? Vamos a averiguar.

Este es un desafío de . Hilo de policía .

Como ladrón, necesitas:

  1. Encuentre un desafío no eliminado y no cerrado que coincida con el envío de un policía. El desafío no puede tener las siguientes etiquetas: , , , , , , , . El desafío debe tener restricciones en la salida válida.
  2. Publique el desafío aquí y enlace al policía que está descifrando
  3. Agregue un comentario "Agrietado" a la publicación de la policía, con un enlace a esta respuesta

Recibirá 1 punto, más 1 punto por cada período de 24 horas que el envío haya permanecido sin descifrar (máximo 7). Tiebreaker es el número total de sumisiones agrietadas.

Notas:

  • Si un desafío requiere un resultado de X, y usted genera un resultado XYo YXdónde Yhay algo más que un espacio en blanco, el envío no es válido para ese desafío.
  • Un desafío más nuevo que el 2016-11-17 no está permitido.
  • Me reservo el derecho de prohibir ciertos desafíos si son ampliamente aplicables (podrían aplicarse a la mayoría de todas las presentaciones).
  • Asegúrese de agregar una o dos oraciones como explicación (también ayuda a que su envío no se convierta en un comentario)
  • ¡Gracias a Daniel por la idea inicial!


Respuestas:


5

Calcule la probabilidad de obtener la mitad de caras que arrojar monedas.

Entrada de policías (publicada por Conor O'Brien): /codegolf//a/100521/8927

Pregunta original: Calcule la probabilidad de obtener la mitad de caras que arrojar monedas.


La solución publicada tuvo un par de técnicas de ofuscación aplicadas, seguidas de múltiples capas de la misma técnica de ofuscación. Una vez pasados ​​los primeros trucos, se convirtió en una tarea simple (¡aunque tediosa!) Extraer la función real:

nCr(a,b) = a! / ((a-b)! * b!)
result = nCr(x, x/2) / 2^x

Me tomó un tiempo darme cuenta de lo que estaba mirando (durante un tiempo sospeché algo que tenía que ver con la entropía), pero una vez que se movió, logré encontrar la pregunta fácilmente buscando "probabilidad de lanzamiento de monedas".


Dado que Conor O'Brien desafió una explicación en profundidad de su código, aquí hay un resumen de los bits más interesantes:

Comienza por ofuscar algunas llamadas a funciones incorporadas. Esto se logra codificando los nombres de las funciones en base-32 y luego asignándolos a nuevos nombres de espacios de nombres globales de un solo carácter. Solo se usa 'atob'; los otros 2 son solo pistas falsas (eval toma la misma taquigrafía que atob, solo para anularse, y btoa simplemente no se usa).

_=this;
[
    490837, // eval -> U="undefined"       -> u(x) = eval(x) (but overwritten below), y = eval
    358155, // atob -> U="function (M,..." -> u(x) = atob(x)
    390922  // btoa -> U="function (M,..." -> n(x) = btoa(x), U[10] = 'M'
].map(
    y=function(M,i){
        return _[(U=y+"")[i]] = _[M.toString(2<<2<<2)]
    }
);

A continuación, hay un par de mezclas triviales de cadenas para ocultar el código. Estos se revierten fácilmente:

u(["","GQ9ZygiYTwyPzE6YSpk","C0tYSki","SkoYSkvZChhLWIpL2QoYikg"].join("K"))
// becomes
'(d=g("a<2?1:a*d(--a)"))(a)/d(a-b)/d(b) '

u("KScpKWIsYShFLCliLGEoQyhEJyhnLGM9RSxiPUQsYT1D").split("").reverse().join("")
// becomes
"C=a,D=b,E=c,g('D(C(a,b),E(a,b))')"

La mayor parte de la ofuscación es el uso de la gfunción, que simplemente define nuevas funciones. Esto se aplica de forma recursiva, con funciones que devuelven nuevas funciones, o que requieren funciones como parámetros, pero eventualmente se simplifica de inmediato. La función más interesante que resulta de esto es:

function e(a,b){ // a! / ((a-b)! * b!) = nCr
    d=function(a){return a<2?1:a*d(--a)} // Factorial
    return d(a)/d(a-b)/d(b)
}

También hay un truco final con esta línea:

U[10]+[![]+[]][+[]][++[+[]][+[]]]+[!+[]+[]][+[]][+[]]+17..toString(2<<2<<2)
// U = "function (M,i"..., so U[10] = 'M'. The rest just evaluates to "ath", so this just reads "Math"

Aunque como el siguiente bit es ".pow (T, a)", ¡siempre fue bastante probable que tuviera que ser "Math"!

Los pasos que tomé a lo largo de la ruta de las funciones de expansión fueron:

// Minimal substitutions:
function g(s){return Function("a","b","c","return "+s)};
function e(a,b,c){return (d=g("a<2?1:a*d(--a)"))(a)/d(a-b)/d(b)}
function h(a,b,c){return A=a,B=b,g('A(a,B(a))')}
function j(a,b,c){return a/b}
function L(a,b,c){return Z=a,Y=b,g('Z(a,Y)')}
k=L(j,T=2);
function F(a,b,c){return C=a,D=b,E=c,g('D(C(a,b),E(a,b))')}
RESULT=F(
    h(e,k),
    j,
    function(a,b,c){return _['Math'].pow(T,a)}
);


// First pass
function e(a,b){
    d=function(a){return a<2?1:a*d(--a)}
    return d(a)/d(a-b)/d(b)
}
function h(a,b){
    A=a
    B=b
    return function(a){
        return A(a,B(a))
    }
}
function j(a,b){ // ratio function
    return a/b
}
function L(a,b){ // binding function (binds param b)
    Z=a
    Y=b
    return function(a){
        return Z(a,Y)
    }
}
T=2; // Number of states the coin can take
k=L(j,T); // function to calculate number of heads required for fairness
function F(a,b,c){
    C=a
    D=b
    E=c
    return function(a,b,c){return D(C(a,b),E(a,b))}
}
RESULT=F(
    h(e,k),
    j,
    function(a){return Math.pow(T,a)}
);


// Second pass
function e(a,b){...}
function k(a){
    return a/2
}
function F(a,b,c){
    C=a
    D=b
    E=c
    return function(a,b,c){return D(C(a,b),E(a,b))}
}
RESULT=F(
    function(a){
        return e(a,k(a))
    },
    function(a,b){
        return a/b
    },
    function(a){return Math.pow(2,a)}
);


// Third pass
function e(a,b) {...}
C=function(a){ // nCr(x,x/2) function
    return e(a,a/2)
}
D=function(a,b){ // ratio function
    return a/b
}
E=function(a){return Math.pow(2,a)} // 2^x function
RESULT=function(a,b,c){
    return D(C(a,b),E(a,b))
}

La estructura de la función de anidamiento se basa en la utilidad; la función más externa "D" / "j" calcula una relación, luego las funciones internas "C" / "h" y "E" (en línea) calculan los recuentos de monedas necesarios. La función "F", eliminada en el tercer paso, es responsable de conectarlos en un todo utilizable. Del mismo modo, la función "k" es responsable de elegir el número de cabezas que deben observarse; una tarea que delega a la función de relación "D" / "j" a través de la función de enlace de parámetros "L"; se usa aquí para fijar el parámetro ba T(aquí siempre 2, es el número de estados que puede tomar la moneda)

Al final, obtenemos:

function e(a,b){ // a! / ((a-b)! * b!)
    d=function(a){return a<2?1:a*d(--a)} // Factorial
    return d(a)/d(a-b)/d(b)
}
RESULT=function(a){
    return e(a, a/2) / Math.pow(2,a)
}

¡Buen trabajo! Esto es ligeramente incorrecto: eval está configurado en f. ¡Pero el resto es correcto! Además, un poco de elaboración sobre cómo RESULTse deriva puede ser digno;)
Conor O'Brien

@ ConorO'Brien seguro; Agregué mis notas y una explicación de la utilidad de cada función antes de contraerlas todas.
Dave

@ ConorO'Brien gracias por la recompensa!
Dave

Siempre es un placer :)
Conor O'Brien

3

MATL, Luis Mendo , cuenta el número de decimales fuertes entre 2 números

&:"@FYAYm7>vs

Me di cuenta de lo que hace jugando con las entradas, pero no pude averiguar qué desafío tendrías que calcular el número de enteros en un rango cuya suma era mayor que 7 veces el número de dígitos. Después de leer los documentos de MATL, armé una explicación aproximada de lo que esto hace:

&    % Change default input format
:    % Implictly input two integers, create inclusive range
"    % For each item in this range:
  @    % Push the item
  F    % Push false
  YA   % Convert to base N digits; N is false, so this produces base-10 digits
  Ym   % Calculate arithmetic mean
  7>   % Push 1 if this is greater than 7, 0 otherwise
  v    % Concatenate result into array with previous result
  s    % Sum
     % Implicitly end loop and output

Luego pasé de buscar "suma de dígitos mayor que 7 veces la longitud" a "dígito promedio mayor que 7", lo que arrojó el desafío que estaba buscando.





2

Perl, Gabriel Benamy , conveniente corrector de palíndromo

El código era obviamente una especie de palíndromo. Una vez que escogí la y- - -estructura y noté lo que se estaba transcribiendo, supe qué desafío era.


Me ganaste unos segundos ... pero tardó mucho en descargar Perl.
Laikoni

@Laikoni Honestamente, después de que una pareja se probara Ideone, dejé de ejecutar el código e intenté leerlo. ;)
DLosc





1

Ruby, histocrat , implementa una máquina de la verdad

El código define un sistema de funciones iteradas f(n) = n*(3*n-1)/2que se ejecuta hasta que el nmod 7 sea 0. 0Por lo tanto, la entrada termina inmediatamente (después de imprimir 0una vez). Entrada de 1donaciones 1, lo que lleva a un bucle infinito de impresión 1. Otra entrada termina después de 1-3 pasos si la inicial nes congruente con 0, 2, 3, 5 o 6 mod 7, o crece para siempre si es congruente con 1 o 4 mod 7. Pero eso es irrelevante.


1

Hexagonía, 548 bytes, Martin Ender

¡Este es el desafío " Imprime todos los personajes que tu programa no tiene "!

Huellas dactilares:

Elizabeth obnoxiously quoted (just too rowdy for my peace): "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG," giving me a look

Lo cual es muy similar a la salida en este . La pista aquí era que lo último .no estaba impreso. Además, el código en sí no tenía letras, y todos sabemos que las frases en la salida contienen todas las letras del alfabeto.



0

Python 3, /codegolf//a/100381/31343

Use la fórmula de xkcd para aproximar la población mundial

Solo busqué desafíos que involucraran años bisiestos (debido a la divisibilidad decodificada por cuatro correctores) y que no tuvieron ninguna entrada.


¡Sí! Sabía que sería obvio por el %4y el strftime, pero buen trabajo para detectar las partes importantes del código (la mayor parte era galimatías)
FlipTack

Ah, maldita sea, yo también me estaba acercando. Me di cuenta de que tenía algo que ver con las fechas, estaba obteniendo 2005 y 2016/2017. Buen trabajo.
Yodle

Me sorprende que ninguno de ustedes simplemente haya ejecutado el código, que genera la salida 7.3 328, y haya buscado eso. El desafío surge de inmediato.
FlipTack



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.