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!
Nathan Merrill
fuente

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)
}
Dave
fuente
¡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.

ETHproducciones
fuente
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.

DLosc
fuente
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

MATL, Luis Mendo , Calcule el peso de hamming con bajo peso de hamming

dP7EGn:q^1J2/h)ts_hX=Gs[BE]Wd=~>~GBz*

Probé poniendo números, y encontré la cuestión del peso hamming en OEIS .

Luego busqué en PPCG, intenté poner cadenas y funcionó.

boboquack
fuente
Como comenté en el desafío de la policía, esto en realidad no rompe mi sumisión. Desafortunadamente, supongo que esta respuesta debe ser eliminada
Luis Mendo
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.

DLosc
fuente
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.

Stewie Griffin
fuente
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.

Maltysen
fuente
¡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
0

Mathematica, JHM , Construcción natural

El operador unario ±calcula una representación basada en la teoría de conjuntos de los números naturales.

Martin Ender
fuente
0

Ruby, wat , 400th Question Celebration / Challenge

Eso fue lo primero que encontré al buscar "400". Dicho esto, el desafío parece estar equivocado y debería ser un popcon y probablemente también debería cerrarse por no tener requisitos objetivos.

Martin Ender
fuente