PPCG Jeopardy: Voleurs


18

Connaissez-vous bien le site? Découvrons-le.

C'est un défi de . Fil de flic .

En tant que voleur, vous devez:

  1. Trouvez un défi non supprimé et non fermé qui correspond à la soumission d'un policier. Le défi ne peut pas avoir les balises suivantes: , , , , , , , . Le défi doit avoir des restrictions sur une sortie valide.
  2. Postez le défi ici et liez le flic que vous craquez
  3. Ajoutez un commentaire "Cracké" au post des flics, avec un lien vers cette réponse

Vous recevrez 1 point, plus 1 point pour chaque période de 24 heures pendant laquelle la soumission était restée non fissurée (max 7). Tiebreaker est le nombre total de sous-crises fissurées.

Remarques:

  • Si un défi nécessite une sortie de X, et que vous produisez XYou YXoù se Ytrouve autre chose qu'un espace, la soumission n'est pas valide pour ce défi.
  • Un défi plus récent que 2016-11-17 n'est pas autorisé.
  • Je me réserve le droit d'interdire certaines contestations si elles sont largement applicables (pourrait s'appliquer à la majorité de toutes les soumissions).
  • Assurez-vous d'ajouter une ou deux phrases comme explication (cela aide également votre soumission à être convertie en commentaire)
  • Merci à Daniel pour l'idée initiale!

Meta

Réponses:


5

Calculez la probabilité d'obtenir deux fois moins de têtes que de lancers de pièces.

Entrée des flics (publiée par Conor O'Brien): /codegolf//a/100521/8927

Question initiale: Calculez la probabilité d'obtenir la moitié du nombre de têtes comme des lancers de pièces.


La solution publiée avait deux techniques d'obscurcissement appliquées, suivies de plusieurs couches de la même technique d'obscurcissement. Une fois les premières astuces passées, il est devenu simple (si fastidieux!) D'extraire la fonction réelle:

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

Il a fallu un certain temps pour réaliser ce que je regardais (pendant un moment, je soupçonnais quelque chose à voir avec l'entropie), mais une fois qu'il a brillé, j'ai réussi à trouver la question facilement en recherchant la «probabilité de lancer des pièces».


Depuis que Conor O'Brien a contesté une explication approfondie de son code, voici un aperçu des éléments les plus intéressants:

Il commence par masquer certains appels de fonction intégrés. Ceci est réalisé en codant en base 32 les noms de fonction, puis en les affectant à de nouveaux noms d'espace de noms globaux d'un seul caractère. Seul «atob» est réellement utilisé; les 2 autres sont juste des red-herrings (eval prend le même raccourci que atob, seulement pour être remplacé, et btoa n'est tout simplement pas utilisé).

_=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)]
    }
);

Ensuite, il y a quelques mélanges de chaînes triviaux pour masquer le code. Ceux-ci sont facilement inversés:

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 majeure partie de l'obscurcissement est l'utilisation de la gfonction, qui définit simplement de nouvelles fonctions. Ceci est appliqué de manière récursive, avec des fonctions renvoyant de nouvelles fonctions, ou nécessitant des fonctions en tant que paramètres, mais finalement simplifie tout de suite. La fonction la plus intéressante qui en ressort est:

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)
}

Il y a aussi une dernière astuce avec cette ligne:

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"

Bien que le bit suivant soit ".pow (T, a)", il était toujours assez probable que ce soit "Math"!

Les étapes que j'ai suivies tout au long du processus d'extension des fonctions étaient les suivantes:

// 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 structure de l'imbrication des fonctions est basée sur l'utilité; la fonction "D" / "j" la plus externe calcule un rapport, puis les fonctions "C" / "h" et "E" (en ligne) internes calculent le nombre de tours de pièces nécessaires. La fonction "F", supprimée lors de la troisième passe, est chargée de les relier entre eux en un tout utilisable. De même, la fonction "k" est chargée de choisir le nombre de têtes à observer; une tâche qu'il délègue à la fonction de rapport "D" / "j" via la fonction de liaison de paramètres "L"; utilisé ici pour le paramètre fixe bà T(ici toujours 2, étant le nombre d'états de la pièce peut prendre).

Au final, on obtient:

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)
}

Bon travail! Ceci est légèrement incorrect - eval est défini sur f. Mais le reste est correct! En outre, un peu d'élaboration sur la façon dont RESULTest dérivé pourrait être digne;)
Conor O'Brien

@ ConorO'Brien bien sûr; J'ai ajouté mes notes et une explication de l'utilité de chaque fonction avant de les réduire toutes.
Dave

@ ConorO'Brien merci pour la prime!
Dave

Toujours un plaisir :)
Conor O'Brien

3

MATL, Luis Mendo , Compter le nombre de décimales importantes entre 2 nombres

&:"@FYAYm7>vs

J'ai compris ce qu'il faisait en jouant avec les entrées, mais je ne pouvais pas comprendre pour quel défi vous auriez à calculer le nombre d'entiers dans une plage dont la somme était supérieure à 7 fois le nombre de chiffres. Après avoir lu les documents MATL, j'ai rassemblé une explication approximative de ce que cela fait:

&    % 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

Je suis ensuite passé de la recherche de "somme de chiffres supérieure à 7 fois la longueur" à "moyenne de chiffres supérieure à 7", ce qui a provoqué le défi que je cherchais.





2

Perl, Gabriel Benamy , vérificateur de palindrome pratique

Le code était évidemment une sorte de palindrome. Une fois que j'ai choisi la y- - -structure et remarqué ce qui était translittéré, je savais quel défi c'était.


Vous m'avez battu de quelques secondes ... mais il a fallu si longtemps pour télécharger perl.
Laikoni

@Laikoni Honnêtement, après quelques essais sur Ideone, j'ai abandonné l'exécution du code et j'ai plutôt essayé de le lire. ;)
DLosc





1

Rubis, histocrate , implémente une machine de vérité

Le code définit un système de fonction itéré f(n) = n*(3*n-1)/2qui s'exécute jusqu'à ce que le nmod 7 soit 0. L'entrée de 0se termine donc immédiatement (après avoir imprimé 0une fois). Entrée de 1donne 1, conduisant à une boucle d'impression infinie 1. Les autres entrées se terminent après 1 à 3 étapes si l'initiale nest congruente à 0, 2, 3, 5 ou 6 mod 7, ou croît pour toujours si elles sont congruentes à 1 ou 4 mod 7. Mais ce n'est pas pertinent.


1

Hexagonie, 548 octets, Martin Ender

C'est le " Imprimer chaque caractère que votre programme n'a pas défi "!

Tirages:

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

Ce qui est très similaire à la sortie de celui-ci . L'indice ici était que le dernier .n'était pas imprimé. De plus, le code lui-même n'avait pas de lettres, et nous savons tous que les phrases dans la sortie contiennent toutes les lettres de l'alphabet.



0

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

Utilisez la formule de xkcd pour approximer la population mondiale

Je viens de chercher des défis qui impliquaient des années bissextiles (en raison de la divisibilité décodée par quatre vérificateurs) et qui n'ont pris aucune entrée.


Oui! Je savais que ce serait évident à cause du %4et du strftime, mais bon travail pour repérer les parties importantes du code (la plupart étaient du charabia)
FlipTack

Ah dangit, je m'approchais aussi. J'avais compris que cela avait quelque chose à voir avec les dates, c'était pour 2005 et 2016/2017. Bon travail.
Yodle

Je suis surpris qu'aucun de vous n'ait simplement exécuté le code, qui génère la sortie 7.3 328, et recherché cela. Le défi vient tout de suite.
FlipTack



0

Rubis, wat , 400e Question Celebration / Challenge

C'est la première chose que j'ai trouvée en recherchant "400". Cela dit, le défi semble être mal interprété et devrait être un popcon et devrait probablement également être fermé pour ne pas avoir d'exigences objectives.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.